Fix various RAP lifecycle issues
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 23 Mar 2011 20:15:48 +0000 (20:15 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 23 Mar 2011 20:15:48 +0000 (20:15 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4354 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

16 files changed:
eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/EclipseUiUtils.java
eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java
security/modules/org.argeo.security.dao.ldap/META-INF/spring/ldap.xml
security/modules/org.argeo.security.dao.ldap/ldap.properties
security/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/SpringLoginModule.java
security/plugins/org.argeo.security.ui.admin/META-INF/spring/commands.xml
security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/commands/NewUser.java
security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/wizards/MainUserInfoWizardPage.java
security/plugins/org.argeo.security.ui.admin/src/main/java/org/argeo/security/ui/admin/wizards/NewUserWizard.java
security/plugins/org.argeo.security.ui.rap/src/main/java/org/argeo/security/ui/rap/RapSecureWorkbenchWindowAdvisor.java
security/plugins/org.argeo.security.ui.rap/src/main/java/org/argeo/security/ui/rap/SecureActionBarAdvisor.java
security/plugins/org.argeo.security.ui.rap/src/main/java/org/argeo/security/ui/rap/SecureEntryPoint.java
security/plugins/org.argeo.security.ui.rap/src/main/java/org/argeo/security/ui/rap/SecureRapActivator.java
security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/AbstractLoginDialog.java
security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java
security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/ArgeoLdapShaPasswordEncoder.java [new file with mode: 0644]

index 333db5b8899a1b1a732a6b5c0f1110265bf143cb..e70d819d19e69c922a6534256830a5a18d4b89d9 100644 (file)
@@ -28,7 +28,19 @@ public class EclipseUiUtils {
                lbl.setText(label);
                lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
                Text txt = new Text(parent, SWT.LEAD | SWT.BORDER);
-               txt.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+               txt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+               if (txt != null)
+                       txt.addModifyListener(modifyListener);
+               return txt;
+       }
+
+       public static Text createGridLP(Composite parent, String label,
+                       ModifyListener modifyListener) {
+               Label lbl = new Label(parent, SWT.LEAD);
+               lbl.setText(label);
+               lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
+               Text txt = new Text(parent, SWT.LEAD | SWT.BORDER | SWT.PASSWORD);
+               txt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                if (txt != null)
                        txt.addModifyListener(modifyListener);
                return txt;
index 4e6716ecc41c56fae4d673d0c9117c3373e55ad6..4124c541f3abb63ad7d42075f7dac4e27ce0dac1 100644 (file)
@@ -17,7 +17,7 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 
-/** !Generic error dialog to be used in try/catch blocks*/
+/** !Generic error dialog to be used in try/catch blocks */
 public class Error extends TitleAreaDialog {
        private final static Log log = LogFactory.getLog(Error.class);
 
@@ -25,11 +25,11 @@ public class Error extends TitleAreaDialog {
        private final Throwable exception;
 
        public static void show(String message, Throwable e) {
-               new Error(Display.getDefault().getActiveShell(), message, e).open();
+               new Error(Display.getCurrent().getActiveShell(), message, e).open();
        }
 
        public static void show(String message) {
-               new Error(Display.getDefault().getActiveShell(), message, null).open();
+               new Error(Display.getCurrent().getActiveShell(), message, null).open();
        }
 
        public Error(Shell parentShell, String message, Throwable e) {
@@ -60,8 +60,8 @@ public class Error extends TitleAreaDialog {
                                IMessageProvider.ERROR);
 
                if (exception != null) {
-                       Text stack = new Text(composite, SWT.MULTI  | SWT.LEAD
-                                       | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+                       Text stack = new Text(composite, SWT.MULTI | SWT.LEAD | SWT.BORDER
+                                       | SWT.V_SCROLL | SWT.H_SCROLL);
                        stack.setEditable(false);
                        stack.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
                        StringWriter sw = new StringWriter();
index e990cad8b2937789e087fa032f092295314c0118..3891077e0dfac0af54a5fa544748a29e1135c871 100644 (file)
@@ -13,8 +13,9 @@
                </property>
        </bean>
 
-       <bean id="passwordEncoder"
-               class="org.springframework.security.providers.ldap.authenticator.LdapShaPasswordEncoder" />
+       <bean id="passwordEncoder" class="org.argeo.security.ldap.ArgeoLdapShaPasswordEncoder">
+               <property name="useSalt" value="${argeo.ldap.password.useSalt}" />
+       </bean>
 
        <bean id="contextSource"
                class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
index bd6c9159263b4041013b65844ce832e8cd50804d..043b63465251d30dea5d6ed7fcb9facac4960a70 100644 (file)
@@ -19,3 +19,5 @@ argeo.ldap.groupClass=groupOfNames
 argeo.ldap.groupBase=ou=Roles
 argeo.ldap.groupRoleAttribute=cn
 argeo.ldap.groupMemberAttribute=member
+
+argeo.ldap.password.useSalt=false
\ No newline at end of file
index 716cb6d855afa8eb5a2486d2657b278daa4a6077..7631dade1831978fb569e6a13a62edd2dd570ef5 100644 (file)
@@ -69,7 +69,8 @@ public class SpringLoginModule extends SecurityContextLoginModule {
                NameCallback nameCallback = new NameCallback("User");
                PasswordCallback passwordCallback = new PasswordCallback("Password",
                                false);
-               NameCallback urlCallback = new NameCallback("Site URL");
+
+               // NameCallback urlCallback = new NameCallback("Site URL");
 
                if (callbackHandler == null) {
                        throw new LoginException("No call back handler available");
@@ -77,7 +78,7 @@ public class SpringLoginModule extends SecurityContextLoginModule {
                }
                try {
                        callbackHandler.handle(new Callback[] { label, nameCallback,
-                                       passwordCallback, urlCallback });
+                                       passwordCallback });
                } catch (Exception e) {
                        LoginException le = new LoginException("Callback handling failed");
                        le.initCause(e);
@@ -90,15 +91,13 @@ public class SpringLoginModule extends SecurityContextLoginModule {
                if (passwordCallback.getPassword() != null) {
                        password = String.valueOf(passwordCallback.getPassword());
                }
-               String url = urlCallback.getName();
+
+               // String url = urlCallback.getName();
                // TODO: set it via system properties
                String workspace = null;
 
-               // UsernamePasswordAuthenticationToken credentials = new
-               // UsernamePasswordAuthenticationToken(
-               // username, password);
                SiteAuthenticationToken credentials = new SiteAuthenticationToken(
-                               username, password, url, workspace);
+                               username, password, null, workspace);
 
                try {
                        Authentication authentication = authenticationManager
index 36aefbe036cd12ea344bde473edc26e187b47437..46d3b058c72b3e4ffa5f5b5b0920e8a17bec00d7 100644 (file)
@@ -7,12 +7,18 @@
        <bean id="openArgeoUserEditor"
                class="org.argeo.security.ui.admin.commands.OpenArgeoUserEditor"
                scope="prototype" />
+
        <bean id="newArgeoUserEditor" class="org.argeo.security.ui.admin.commands.NewUser"
-               scope="prototype" />
+               scope="prototype">
+               <property name="session" ref="nodeSession" />
+               <property name="userDetailsManager" ref="userDetailsManager" />
+       </bean>
+
        <bean id="addRole" class="org.argeo.security.ui.admin.commands.AddRole"
                scope="prototype">
                <property name="userAdminService" ref="userAdminService" />
        </bean>
+
        <bean id="refreshUsersList" class="org.argeo.security.ui.admin.commands.RefreshUsersList"
                scope="prototype" />
 </beans>
index de8dc9b54ae79a8520ac948f42681ac646730f15..2c7b8bf57c61411e66e7291e82c2bea16398fa91 100644 (file)
@@ -1,18 +1,24 @@
 package org.argeo.security.ui.admin.commands;
 
+import javax.jcr.Session;
+
 import org.argeo.security.ui.admin.wizards.NewUserWizard;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.ui.handlers.HandlerUtil;
+import org.springframework.security.userdetails.UserDetailsManager;
 
 /** Command handler to set visible or open a Argeo user. */
 public class NewUser extends AbstractHandler {
+       private Session session;
+       private UserDetailsManager userDetailsManager;
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
                try {
-                       NewUserWizard newUserWizard = new NewUserWizard();
+                       NewUserWizard newUserWizard = new NewUserWizard(session,
+                                       userDetailsManager);
                        WizardDialog dialog = new WizardDialog(
                                        HandlerUtil.getActiveShell(event), newUserWizard);
                        dialog.open();
@@ -21,4 +27,13 @@ public class NewUser extends AbstractHandler {
                }
                return null;
        }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+
+       public void setUserDetailsManager(UserDetailsManager userDetailsManager) {
+               this.userDetailsManager = userDetailsManager;
+       }
+
 }
index cf11f8517740685a7e021e4a47fcf2de79124e5e..066c376a1d3f27b9ec9d8bfc43e6b6852cc8f5f0 100644 (file)
@@ -1,19 +1,25 @@
 package org.argeo.security.ui.admin.wizards;
 
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.UserAdminService;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Text;
 
 public class MainUserInfoWizardPage extends WizardPage implements
-               ModifyListener {
-       private Text username, firstName, lastName, primaryEmail;
+               ModifyListener, ArgeoNames {
+       private Text username, firstName, lastName, primaryEmail, password1,
+                       password2;
 
        public MainUserInfoWizardPage() {
                super("Main");
@@ -22,13 +28,15 @@ public class MainUserInfoWizardPage extends WizardPage implements
 
        @Override
        public void createControl(Composite parent) {
-               parent.setLayout(new FillLayout());
                Composite composite = new Composite(parent, SWT.NONE);
                composite.setLayout(new GridLayout(2, false));
                username = EclipseUiUtils.createGridLT(composite, "Username", this);
                primaryEmail = EclipseUiUtils.createGridLT(composite, "Email", this);
                firstName = EclipseUiUtils.createGridLT(composite, "First name", this);
                lastName = EclipseUiUtils.createGridLT(composite, "Last name", this);
+               password1 = EclipseUiUtils.createGridLP(composite, "Password", this);
+               password2 = EclipseUiUtils.createGridLP(composite, "Repeat password",
+                               this);
                setControl(composite);
        }
 
@@ -53,19 +61,36 @@ public class MainUserInfoWizardPage extends WizardPage implements
                        return "Specify a first name";
                if (lastName.getText().trim().equals(""))
                        return "Specify a last name";
+               if (password1.getText().trim().equals(""))
+                       return "Specify a password";
+               if (password2.getText().trim().equals(""))
+                       return "Repeat the password";
+               if (!password2.getText().equals(password1.getText()))
+                       return "Passwords are different";
                return null;
        }
 
-       @Override
-       public boolean canFlipToNextPage() {
-               // TODO Auto-generated method stub
-               return super.canFlipToNextPage();
+       public String getUsername() {
+               return username.getText();
        }
 
-       @Override
-       public boolean isPageComplete() {
-               // TODO Auto-generated method stub
-               return super.isPageComplete();
+       public String getPassword() {
+               return password1.getText();
        }
 
+       public void mapToProfileNode(Node up) {
+               try {
+                       up.setProperty(ARGEO_PRIMARY_EMAIL, primaryEmail.getText());
+                       up.setProperty(ARGEO_FIRST_NAME, firstName.getText());
+                       up.setProperty(ARGEO_LAST_NAME, lastName.getText());
+
+                       // derived values
+                       // TODO add wizard pages to do it
+                       up.setProperty(Property.JCR_TITLE, firstName.getText() + " "
+                                       + lastName.getText());
+                       up.setProperty(Property.JCR_DESCRIPTION, "");
+               } catch (RepositoryException e) {
+                       throw new ArgeoException("Cannot map to " + up, e);
+               }
+       }
 }
index 6e9704a4961f9b2a4be1d0e0b73d9d47851c4825..6c894d62a57bedf3315a6c44754e00c9342abbfc 100644 (file)
@@ -1,10 +1,30 @@
 package org.argeo.security.ui.admin.wizards;
 
+import javax.jcr.Node;
+import javax.jcr.Session;
+
+import org.argeo.eclipse.ui.dialogs.Error;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.security.jcr.JcrUserDetails;
 import org.eclipse.jface.wizard.Wizard;
+import org.springframework.security.GrantedAuthority;
+import org.springframework.security.userdetails.UserDetailsManager;
 
+/** Wizard to create a new user */
 public class NewUserWizard extends Wizard {
+       private String homeBasePath = "/home";
+       private Session session;
+       private UserDetailsManager userDetailsManager;
+
+       // pages
        private MainUserInfoWizardPage mainUserInfo;
 
+       public NewUserWizard(Session session, UserDetailsManager userDetailsManager) {
+               this.session = session;
+               this.userDetailsManager = userDetailsManager;
+       }
+
        @Override
        public void addPages() {
                mainUserInfo = new MainUserInfoWizardPage();
@@ -13,7 +33,28 @@ public class NewUserWizard extends Wizard {
 
        @Override
        public boolean performFinish() {
-               return false;
+               try {
+                       String username = mainUserInfo.getUsername();
+                       Node userHome = JcrUtils.createUserHome(session, homeBasePath,
+                                       username);
+                       Node userProfile = userHome.getNode(ArgeoNames.ARGEO_PROFILE);
+                       mainUserInfo.mapToProfileNode(userProfile);
+                       String password = mainUserInfo.getPassword();
+                       JcrUserDetails jcrUserDetails = new JcrUserDetails(
+                                       userHome.getPath(), username, password, true, true, true,
+                                       true, new GrantedAuthority[0]);
+                       session.save();
+                       userDetailsManager.createUser(jcrUserDetails);
+                       return true;
+               } catch (Exception e) {
+                       JcrUtils.discardQuietly(session);
+                       Error.show("Cannot create new user", e);
+                       return false;
+               }
+       }
+
+       public void setSession(Session session) {
+               this.session = session;
        }
 
 }
index 805dcf16841757ff3aa838e278b5d1f9a91e2edd..2875aa3ecec4d5578afdcd93d62461a54479efef 100644 (file)
@@ -30,7 +30,7 @@ public class RapSecureWorkbenchWindowAdvisor extends
                // Full screen, see
                // http://dev.eclipse.org/newslists/news.eclipse.technology.rap/msg02697.html
                configurer.setShellStyle(SWT.NONE);
-               Rectangle bounds = Display.getDefault().getBounds();
+               Rectangle bounds = Display.getCurrent().getBounds();
                configurer.setInitialSize(new Point(bounds.width, bounds.height));
        }
 
index 98a9c64dba2d596f239496465901c986d0e50b61..88836f4669f29e205520e8bc62ba218bc0bc1813 100644 (file)
@@ -1,22 +1,37 @@
 package org.argeo.security.ui.rap;
 
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.GroupMarker;
+import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.ICoolBarManager;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.rwt.RWT;
 import org.eclipse.swt.SWT;
 import org.eclipse.ui.IWorkbenchActionConstants;
 import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.ActionFactory;
 import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
 import org.eclipse.ui.application.ActionBarAdvisor;
 import org.eclipse.ui.application.IActionBarConfigurer;
 
 public class SecureActionBarAdvisor extends ActionBarAdvisor {
-       private IWorkbenchAction exitAction;
+       private final static Log log = LogFactory
+                       .getLog(SecureActionBarAdvisor.class);
+
+       private IAction logoutAction;
        private IWorkbenchAction openPerspectiveDialogAction;
        private IWorkbenchAction showViewMenuAction;
        private IWorkbenchAction preferences;
@@ -24,11 +39,8 @@ public class SecureActionBarAdvisor extends ActionBarAdvisor {
        private IWorkbenchAction saveAllAction;
        private IWorkbenchAction closeAllAction;
 
-       // private final Boolean isRcp;
-
        public SecureActionBarAdvisor(IActionBarConfigurer configurer, Boolean isRcp) {
                super(configurer);
-               // this.isRcp = isRcp;
        }
 
        protected void makeActions(IWorkbenchWindow window) {
@@ -40,10 +52,48 @@ public class SecureActionBarAdvisor extends ActionBarAdvisor {
                showViewMenuAction = ActionFactory.SHOW_VIEW_MENU.create(window);
                register(showViewMenuAction);
 
-               exitAction = ActionFactory.QUIT.create(window);
-               register(exitAction);
+               // logoutAction = ActionFactory.QUIT.create(window);
+
+               Subject subject = null;
+               try {
+                       subject = SecureRapActivator.getLoginContext().getSubject();
+               } catch (LoginException e1) {
+                       throw new ArgeoException("Cannot retrieve subject", e1);
+               }
+               final Principal principal = subject.getPrincipals().iterator().next();
+
+               logoutAction = new Action() {
+                       public String getId() {
+                               return SecureRapActivator.ID + ".logoutAction";
+                       }
+
+                       public String getText() {
+                               return "Logout " + principal.getName();
+                       }
+
+                       public void run() {
+                               try {
+                                       Subject subject = SecureRapActivator.getLoginContext()
+                                                       .getSubject();
+                                       String subjectStr = subject.toString();
+                                       SecureRapActivator.getLoginContext().logout();
+                                       log.info(subjectStr + " logged out");
+                               } catch (LoginException e) {
+                                       log.error("Error when logging out", e);
+                               }
+                               try {
+                                       RWT.getRequest().getSession().setMaxInactiveInterval(1);
+                                       PlatformUI.getWorkbench().close();
+                               } catch (Exception e) {
+                                       if (log.isTraceEnabled())
+                                               log.trace("Error when invalidating session", e);
+                               }
+                       }
+
+               };
+               register(logoutAction);
 
-               // Save semantiocs
+               // Save semantics
                saveAction = ActionFactory.SAVE.create(window);
                register(saveAction);
                saveAllAction = ActionFactory.SAVE_ALL.create(window);
@@ -73,7 +123,7 @@ public class SecureActionBarAdvisor extends ActionBarAdvisor {
                fileMenu.add(closeAllAction);
                fileMenu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
                fileMenu.add(new Separator());
-               fileMenu.add(exitAction);
+               fileMenu.add(logoutAction);
 
                // Edit
                editMenu.add(preferences);
index cfc1ca215d2818765fafa8bbd2164125844e9686..f30f0059bd825516bdc77cff250d9bb6d5ed14f1 100644 (file)
@@ -8,9 +8,6 @@ import javax.security.auth.login.LoginException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.eclipse.ui.dialogs.Error;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.rwt.lifecycle.IEntryPoint;
 import org.eclipse.rwt.service.SessionStoreEvent;
 import org.eclipse.rwt.service.SessionStoreListener;
@@ -50,16 +47,6 @@ public class SecureEntryPoint implements IEntryPoint, SessionStoreListener {
                                }
                        }
 
-                       if (subject == null) {
-                               // IStatus status = new Status(IStatus.ERROR,
-                               // "org.argeo.security.application", "Login is mandatory",
-                               // loginException);
-                               // ErrorDialog.openError(null, "Error", "Shutdown...", status);
-                               // return status.getSeverity();
-
-                               // TODO: log as anonymous
-                       }
-
                        if (subject != null) {
                                returnCode = (Integer) Subject.doAs(subject,
                                                getRunAction(display));
@@ -69,20 +56,17 @@ public class SecureEntryPoint implements IEntryPoint, SessionStoreListener {
                                return -1;
                        }
                } catch (Exception e) {
-                       // e.printStackTrace();
-                       IStatus status = new Status(IStatus.ERROR,
-                                       "org.argeo.security.rcp", "Login failed", e);
-                       ErrorDialog.openError(null, "Error", "Shutdown...", status);
-                       return returnCode;
-               } finally {
-                       display.dispose();
-               }
+                       log.error("Unexpected error",e);
+                       return -1;
+               } 
+//             finally {
+//                     display.dispose();
+//             }
        }
 
        @SuppressWarnings("rawtypes")
        private PrivilegedAction getRunAction(final Display display) {
                return new PrivilegedAction() {
-
                        public Object run() {
                                int result = createAndRunWorkbench(display);
                                return new Integer(result);
index d5d46fe9bca5e3f6fa0afb5dae46d7abff8b8d66..b8c66cda35b92964d0c8ffbc3c4487d95ca7de16 100644 (file)
@@ -10,6 +10,7 @@ import org.osgi.framework.BundleContext;
 
 public class SecureRapActivator implements BundleActivator {
 
+       public final static String ID = "org.argeo.security.ui.rap";
        public final static String CONTEXT_SPRING = "SPRING";
        private static final String JAAS_CONFIG_FILE = "/META-INF/jaas_default.txt";
 
index d3d1be38b5154b785f6ea3b36ac68a43697e1f2e..9316a85d24700ad085d320829acf8a5fd5fbc96c 100644 (file)
@@ -10,7 +10,7 @@ import javax.security.auth.callback.PasswordCallback;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.dialogs.TrayDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.operation.ModalContext;
 import org.eclipse.swt.events.SelectionEvent;
@@ -19,7 +19,7 @@ import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
-public abstract class AbstractLoginDialog extends TitleAreaDialog implements
+public abstract class AbstractLoginDialog extends TrayDialog implements
                CallbackHandler {
 
        boolean processCallbacks = false;
index 7a846f7b54564b66ecc9d4cd49a85a5fe81fc8d0..b21af204941c9c4135bdd3501e7c1b90ab889bb5 100644 (file)
@@ -22,7 +22,7 @@ import org.eclipse.swt.widgets.Text;
 public class DefaultLoginDialog extends AbstractLoginDialog {
 
        public DefaultLoginDialog() {
-               this(Display.getDefault().getActiveShell());
+               this(Display.getCurrent().getActiveShell());
        }
 
        protected DefaultLoginDialog(Shell parentShell) {
@@ -30,7 +30,7 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
        }
 
        protected Point getInitialSize() {
-               return new Point(300, 350);
+               return new Point(300, 150);
        }
 
        protected Control createDialogArea(Composite parent) {
@@ -106,7 +106,7 @@ public class DefaultLoginDialog extends AbstractLoginDialog {
                        dialogMessageType = IMessageProvider.ERROR;
                        break;
                }
-               setMessage(callback.getMessage(), dialogMessageType);
+               //setMessage(callback.getMessage(), dialogMessageType);
        }
 
        public void internalHandle() {
diff --git a/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/ArgeoLdapShaPasswordEncoder.java b/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/ArgeoLdapShaPasswordEncoder.java
new file mode 100644 (file)
index 0000000..03fd50d
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.security.ldap;
+
+import org.springframework.security.providers.ldap.authenticator.LdapShaPasswordEncoder;
+
+/**
+ * {@link LdapShaPasswordEncoder} allowing to configure the usage of salt (APache
+ * Directory Server 1.0 does not support bind with SSHA)
+ */
+public class ArgeoLdapShaPasswordEncoder extends LdapShaPasswordEncoder {
+       private Boolean useSalt = true;
+
+       @Override
+       public String encodePassword(String rawPass, Object salt) {
+               return super.encodePassword(rawPass, useSalt ? salt : null);
+       }
+
+       public void setUseSalt(Boolean useSalt) {
+               this.useSalt = useSalt;
+       }
+
+}