Improve authentication and logging.
[lgpl/argeo-commons.git] / org.argeo.security.ui.rap / src / org / argeo / security / ui / rap / RapWorkbenchLogin.java
index 789874ae3c8b559a2b956eda0cec56280f140408..790e6175d289a7243c4958c65918eb83598ba479 100644 (file)
@@ -1,9 +1,14 @@
 package org.argeo.security.ui.rap;
 
+import java.security.PrivilegedAction;
 import java.util.Locale;
 
+import javax.security.auth.Subject;
+
 import org.argeo.cms.CmsMsg;
+import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.util.CmsUtils;
+import org.argeo.cms.util.LoginEntryPoint;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
 import org.eclipse.swt.SWT;
@@ -13,16 +18,10 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.PlatformUI;
 
-public class RapWorkbenchLogin extends WorkbenchLogin {
+public class RapWorkbenchLogin extends LoginEntryPoint {
        // private final static Log log =
        // LogFactory.getLog(RapWorkbenchLogin.class);
 
-       @Override
-       protected int createAndRunWorkbench(Display display, String username) {
-               RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
-               return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
-       }
-
        /** Override to provide an application specific workbench advisor */
        protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) {
                return new RapWorkbenchAdvisor(username);
@@ -42,6 +41,35 @@ public class RapWorkbenchLogin extends WorkbenchLogin {
                return returnCode;
        }
 
+       @Override
+       protected int postLogin() {
+               final Display display = Display.getCurrent();
+               //
+               // RUN THE WORKBENCH
+               //
+               Integer returnCode = null;
+               try {
+                       returnCode = Subject.doAs(getSubject(),
+                                       new PrivilegedAction<Integer>() {
+                                               public Integer run() {
+                                                       int result = createAndRunWorkbench(display,
+                                                                       CurrentUser.getUsername(getSubject()));
+                                                       return new Integer(result);
+                                               }
+                                       });
+                       // explicit workbench closing
+                       logout();
+               } finally {
+                       display.dispose();
+               }
+               return returnCode;
+       }
+
+       protected int createAndRunWorkbench(Display display, String username) {
+               RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username);
+               return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor);
+       }
+
        @Override
        protected void extendsCredentialsBlock(Composite credentialsBlock,
                        Locale selectedLocale, SelectionListener loginSelectionListener) {
@@ -51,4 +79,9 @@ public class RapWorkbenchLogin extends WorkbenchLogin {
                loginButton.addSelectionListener(loginSelectionListener);
        }
 
+       @Override
+       protected Display createDisplay() {
+               return PlatformUI.createDisplay();
+       }
+
 }