Improve authentication and logging.
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Oct 2015 11:52:16 +0000 (11:52 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 17 Oct 2015 11:52:16 +0000 (11:52 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8501 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

13 files changed:
demo/argeo_node_cms.properties
demo/log4j.properties
dep/org.argeo.dep.cms/pom.xml
org.argeo.cms/src/org/argeo/cms/auth/HttpRequestCallback.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/DataHttp.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeLogger.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/UserUi.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/util/LoginEntryPoint.java [new file with mode: 0644]
org.argeo.eclipse.ui.rap/src/org/argeo/eclipse/ui/specific/UiContext.java
org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java
org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java [deleted file]

index 899bb120190a77acc6fc04c441629123d68ccef0..1ccc216abbfddf4c6d37bdf4bfefa09c5863e059 100644 (file)
@@ -9,14 +9,14 @@ argeo.osgi.start.4.node=\
 org.eclipse.rap.rwt.osgi,\
 org.eclipse.gemini.blueprint.extender
 
-argeo.osgi.start.4.cms=\
-org.argeo.cms.core
+#argeo.osgi.start.4.cms=\
+#org.argeo.cms.core
 
-argeo.osgi.start.4.workbench=\
-org.eclipse.equinox.http.registry,\
+#argeo.osgi.start.4.workbench=\
+#org.eclipse.equinox.http.registry,\
 
-argeo.osgi.start.5.cms=\
-org.argeo.cms.demo
+#argeo.osgi.start.5.cms=\
+#org.argeo.cms.demo
 
 org.osgi.service.http.port=7070
 #org.osgi.service.http.port.secure=7073
index 62d1c06e9eeaed8fbf87e7eff2b116e5bd9ef21e..94c48c3d771400cfb88305605e6705eba91b49f9 100644 (file)
@@ -1,4 +1,4 @@
-log4j.rootLogger=WARN, development
+log4j.rootLogger=WARN, console
 
 log4j.logger.org.argeo=DEBUG
 log4j.logger.org.argeo.cms.internal.kernel=TRACE
index 602ffabea448e9932e868b8f75a9269951cf8b1e..b55e3ae5269cc357464e3c28693dc4b10954060d 100644 (file)
                        <artifactId>org.argeo.util</artifactId>
                        <version>2.1.29-SNAPSHOT</version>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
+                       <version>2.1.29-SNAPSHOT</version>
+               </dependency>
 
                <!-- Complete target platform -->
                <dependency>
index eb3368d05c904d6f02d30ea038c07c280f493aef..dbc2aeee98c21a9c720fa0aa33d2bf7858bde7ed 100644 (file)
@@ -13,5 +13,13 @@ public class HttpRequestCallback implements Callback {
        public void setRequest(HttpServletRequest request) {
                this.request = request;
        }
+       // private X509Certificate extractCertificate(HttpServletRequest req) {
+       // X509Certificate[] certs = (X509Certificate[]) req
+       // .getAttribute("javax.servlet.request.X509Certificate");
+       // if (null != certs && certs.length > 0) {
+       // return certs[0];
+       // }
+       // return null;
+       // }
 
 }
index ab9211a5439fc0ab02368107628ffe53d8a18fb8..ebf483a7a24b087bd80bf991301a16a7918ecc6b 100644 (file)
@@ -21,7 +21,6 @@ import javax.security.auth.callback.PasswordCallback;
 import javax.security.auth.login.CredentialNotFoundException;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
-import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -65,11 +64,11 @@ class DataHttp implements KernelConstants, ArgeoJcrConstants {
        DataHttp(HttpService httpService, NodeRepository node) {
                this.httpService = httpService;
                sessionProvider = new OpenInViewSessionProvider();
-               registerRepositoryServlets(ALIAS_NODE, node);
+               // registerRepositoryServlets(ALIAS_NODE, node);
        }
 
        public void destroy() {
-               unregisterRepositoryServlets(ALIAS_NODE);
+               // unregisterRepositoryServlets(ALIAS_NODE);
        }
 
        void registerRepositoryServlets(String alias, Repository repository) {
@@ -97,10 +96,7 @@ class DataHttp implements KernelConstants, ArgeoJcrConstants {
                Properties ip = new Properties();
                ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, WEBDAV_CONFIG);
                ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, path);
-               // httpService.registerFilter(path, anonymous ? new AnonymousFilter()
-               // : new DavFilter(), null, null);
-               // Cast to servlet because of a weird behaviour in Eclipse
-               httpService.registerServlet(path, (Servlet) webdavServlet, ip,
+               httpService.registerServlet(path, webdavServlet, ip,
                                new DataHttpContext(anonymous));
        }
 
@@ -119,22 +115,10 @@ class DataHttp implements KernelConstants, ArgeoJcrConstants {
                ip.setProperty(RemotingServlet.INIT_PARAM_TMP_DIRECTORY, "remoting");
                // in order to avoid annoying warning.
                ip.setProperty(RemotingServlet.INIT_PARAM_PROTECTED_HANDLERS_CONFIG, "");
-               // Cast to servlet because of a weird behaviour in Eclipse
-               // httpService.registerFilter(path, anonymous ? new AnonymousFilter()
-               // : new DavFilter(), null, null);
-               httpService.registerServlet(path, (Servlet) remotingServlet, ip,
+               httpService.registerServlet(path, remotingServlet, ip,
                                new DataHttpContext(anonymous));
        }
 
-//     private X509Certificate extractCertificate(HttpServletRequest req) {
-//             X509Certificate[] certs = (X509Certificate[]) req
-//                             .getAttribute("javax.servlet.request.X509Certificate");
-//             if (null != certs && certs.length > 0) {
-//                     return certs[0];
-//             }
-//             return null;
-//     }
-
        private Subject subjectFromRequest(HttpServletRequest request) {
                Authorization authorization = (Authorization) request
                                .getAttribute(HttpContext.AUTHORIZATION);
@@ -172,7 +156,8 @@ class DataHttp implements KernelConstants, ArgeoJcrConstants {
                                return true;
                        }
 
-                       KernelUtils.logRequestHeaders(log, request);
+                       if (log.isTraceEnabled())
+                               KernelUtils.logRequestHeaders(log, request);
                        try {
                                new LoginContext(LOGIN_CONTEXT_USER,
                                                new HttpRequestCallbackHandler(request)).login();
index 1002304007ff3e64d42a86834a8de8a64fa95f6a..8a1cf8e96c5655442caef71be8cb84586f36a721 100644 (file)
@@ -40,6 +40,7 @@ import org.argeo.jcr.ArgeoJcrConstants;
 import org.eclipse.equinox.http.jetty.JettyConfigurator;
 import org.eclipse.equinox.http.jetty.JettyConstants;
 import org.eclipse.equinox.http.servlet.ExtendedHttpService;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
@@ -47,7 +48,9 @@ import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.log.LogReaderService;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.util.tracker.ServiceTracker;
 
 import bitronix.tm.BitronixTransactionManager;
 import bitronix.tm.BitronixTransactionSynchronizationRegistry;
@@ -133,7 +136,12 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
                        defaultLocale = new Locale(getFrameworkProp(I18N_DEFAULT_LOCALE,
                                        ENGLISH.getLanguage()));
                        locales = asLocaleList(getFrameworkProp(I18N_LOCALES));
-                       logger = new NodeLogger();
+
+                       ServiceTracker<LogReaderService, LogReaderService> logReaderService = new ServiceTracker<LogReaderService, LogReaderService>(
+                                       bc, LogReaderService.class, null);
+                       logReaderService.open();
+                       logger = new NodeLogger(logReaderService.getService());
+                       logReaderService.close();
 
                        // Initialise services
                        initTransactionManager();
@@ -148,6 +156,11 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
                        if (sr != null)
                                addHttpService(sr);
 
+                       UserUi userUi = new UserUi();
+                       Hashtable<String, String> props = new Hashtable<String, String>();
+                       props.put("contextName", "user");
+                       bc.registerService(ApplicationConfiguration.class, userUi, props);
+
                        // Kernel thread
                        kernelThread = new KernelThread(this);
                        kernelThread.setContextClassLoader(Kernel.class.getClassLoader());
index 1d15e2a3ae041911c95f963e69042c6833877416..cce1c4ff9fbba627e2f6e1f4e624c867ef1c3780 100644 (file)
@@ -139,6 +139,7 @@ class KernelUtils implements KernelConstants {
                        Object headerValue = request.getHeader(headerName);
                        log.debug(headerName + ": " + headerValue);
                }
+               log.debug("");
        }
 
        static void logFrameworkProperties(Log log) {
index 1264b2452d6a8ae06e0aa3d9592c9d949350d381..ac0c8469f9297f42329945e96ffa6188f0dc9969 100644 (file)
  */
 package org.argeo.cms.internal.kernel;
 
+import java.security.SignatureException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -27,6 +29,8 @@ import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
@@ -37,9 +41,13 @@ import org.argeo.ArgeoException;
 import org.argeo.ArgeoLogListener;
 import org.argeo.ArgeoLogger;
 import org.argeo.cms.auth.CurrentUser;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
 
 /** Not meant to be used directly in standard log4j config */
-class NodeLogger implements ArgeoLogger {
+class NodeLogger implements ArgeoLogger, LogListener {
 
        private Boolean disabled = false;
 
@@ -73,6 +81,14 @@ class NodeLogger implements ArgeoLogger {
                }
        };
 
+       @SuppressWarnings("unchecked")
+       public NodeLogger(LogReaderService lrs) {
+               Enumeration<LogEntry> logEntries = lrs.getLog();
+               while (logEntries.hasMoreElements())
+                       logged(logEntries.nextElement());
+               lrs.addLogListener(this);
+       }
+
        public void init() {
                try {
                        events = new LinkedBlockingQueue<LogEvent>();
@@ -108,6 +124,30 @@ class NodeLogger implements ArgeoLogger {
        // this.layout = layout;
        // }
 
+       //
+       // OSGi LOGGER
+       //
+       @Override
+       public void logged(LogEntry status) {
+               Log pluginLog = LogFactory.getLog(status.getBundle().getSymbolicName());
+               Integer severity = status.getLevel();
+               if (severity == LogService.LOG_ERROR) {
+                       // FIXME Fix Argeo TP
+                       if (status.getException() instanceof SignatureException)
+                               return;
+                       pluginLog.error(status.getMessage(), status.getException());
+               } else if (severity == LogService.LOG_WARNING)
+                       pluginLog.warn(status.getMessage(), status.getException());
+               else if (severity == LogService.LOG_INFO && pluginLog.isDebugEnabled())
+                       pluginLog.debug(status.getMessage(), status.getException());
+               else if (severity == LogService.LOG_DEBUG && pluginLog.isTraceEnabled())
+                       pluginLog.trace(status.getMessage(), status.getException());
+       }
+
+       //
+       // ARGEO LOGGER
+       //
+
        public synchronized void register(ArgeoLogListener listener,
                        Integer numberOfPreviousEvents) {
                String username = CurrentUser.getUsername();
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/UserUi.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/UserUi.java
new file mode 100644 (file)
index 0000000..936882a
--- /dev/null
@@ -0,0 +1,26 @@
+package org.argeo.cms.internal.kernel;
+
+import org.argeo.cms.util.LoginEntryPoint;
+import org.eclipse.rap.rwt.application.Application;
+import org.eclipse.rap.rwt.application.ApplicationConfiguration;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.rap.rwt.application.EntryPointFactory;
+import org.eclipse.rap.rwt.application.Application.OperationMode;
+
+public class UserUi implements ApplicationConfiguration {
+
+       @Override
+       public void configure(Application application) {
+               application.setOperationMode(OperationMode.SWT_COMPATIBILITY);
+               application.addEntryPoint("/login", LoginEntryPoint.class, null);
+       }
+
+       private class LoginEpf implements EntryPointFactory {
+
+               @Override
+               public EntryPoint create() {
+                       return new LoginEntryPoint();
+               }
+
+       }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/util/LoginEntryPoint.java b/org.argeo.cms/src/org/argeo/cms/util/LoginEntryPoint.java
new file mode 100644 (file)
index 0000000..4ccedd1
--- /dev/null
@@ -0,0 +1,148 @@
+package org.argeo.cms.util;
+
+import java.util.Locale;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.CredentialNotFoundException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.CmsImageManager;
+import org.argeo.cms.CmsView;
+import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.cms.widgets.auth.CmsLogin;
+import org.argeo.cms.widgets.auth.CmsLoginShell;
+import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+public class LoginEntryPoint implements EntryPoint, CmsView {
+       // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
+       private final Subject subject = new Subject();
+       private LoginContext loginContext;
+
+       @Override
+       public int createUI() {
+               final Display display = createDisplay();
+               UiContext.setData(CmsView.KEY, this);
+               try {
+                       // try pre-auth
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+                                       subject, new HttpRequestCallbackHandler(getRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       CmsLoginShell loginShell = createCmsLoginShell();
+                       loginShell.open();
+                       while (!loginShell.getShell().isDisposed()) {
+                               try {
+                                       if (!display.readAndDispatch())
+                                               display.sleep();
+                               } catch (Exception e1) {
+                                       try {
+                                               Thread.sleep(3000);
+                                       } catch (InterruptedException e2) {
+                                               // silent
+                                       }
+                                       ErrorFeedback.show("Login failed", e1);
+                                       return -1;
+                               }
+                       }
+               } catch (LoginException e) {
+                       throw new ArgeoException("Cannot log in", e);
+               }
+               return postLogin();
+       }
+
+       protected Display createDisplay() {
+               return new Display();
+       }
+
+       protected int postLogin() {
+               return 0;
+       }
+
+       protected HttpServletRequest getRequest() {
+               return RWT.getRequest();
+       }
+
+       protected CmsLoginShell createCmsLoginShell() {
+               return new CmsLoginShell(this) {
+
+                       @Override
+                       public void createContents(Composite parent) {
+                               LoginEntryPoint.this.createLoginPage(parent, this);
+                       }
+
+                       @Override
+                       protected void extendsCredentialsBlock(Composite credentialsBlock,
+                                       Locale selectedLocale,
+                                       SelectionListener loginSelectionListener) {
+                               LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock,
+                                               selectedLocale, loginSelectionListener);
+                       }
+
+               };
+       }
+
+       /**
+        * To be overridden. CmsLogin#createCredentialsBlock() should be called at
+        * some point in order to create the credentials composite. In order to use
+        * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
+        * CmsLogin#createContent(), since it would lead to a stack overflow.
+        */
+       protected void createLoginPage(Composite parent, CmsLogin login) {
+               login.defaultCreateContents(parent);
+       }
+
+       protected void extendsCredentialsBlock(Composite credentialsBlock,
+                       Locale selectedLocale, SelectionListener loginSelectionListener) {
+
+       }
+
+       @Override
+       public void navigateTo(String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+               this.loginContext = loginContext;
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not bet null");
+               try {
+                       loginContext.logout();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot log out", e);
+               }
+       }
+
+       @Override
+       public final Subject getSubject() {
+               return subject;
+       }
+
+       @Override
+       public void exception(Throwable e) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public CmsImageManager getImageManager() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+}
index 82b60612404b565875b3faeb51e0dc77bf810b2b..ebececf154cae3d0bed8b6f2d209761cf56c5ad7 100644 (file)
@@ -19,7 +19,8 @@ public class UiContext {
        }
 
        public static void setLocale(Locale locale) {
-               RWT.getUISession().setLocale(locale);
+               if (Display.getCurrent() != null)
+                       RWT.getUISession().setLocale(locale);
        }
 
        /** Can always be null */
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();
+       }
+
 }
diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java
deleted file mode 100644 (file)
index a074ed9..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.argeo.security.ui.rap;
-
-import java.security.PrivilegedAction;
-import java.util.Locale;
-
-import javax.security.auth.Subject;
-import javax.security.auth.login.CredentialNotFoundException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
-
-import org.argeo.ArgeoException;
-import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
-import org.argeo.cms.CmsView;
-import org.argeo.cms.auth.AuthConstants;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.cms.widgets.auth.CmsLogin;
-import org.argeo.cms.widgets.auth.CmsLoginShell;
-import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.application.EntryPoint;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-abstract class WorkbenchLogin implements EntryPoint, CmsView {
-       // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
-       private final Subject subject = new Subject();
-       private LoginContext loginContext;
-
-       @Override
-       public int createUI() {
-               final Display display = PlatformUI.createDisplay();
-               UiContext.setData(CmsView.KEY, this);
-               try {
-                       // try pre-auth
-                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
-                                       subject, new HttpRequestCallbackHandler(getRequest()));
-                       loginContext.login();
-               } catch (CredentialNotFoundException e) {
-                       CmsLoginShell loginShell = createCmsLoginShell();
-                       loginShell.open();
-                       while (!loginShell.getShell().isDisposed()) {
-                               try {
-                                       if (!display.readAndDispatch())
-                                               display.sleep();
-                               } catch (Exception e1) {
-                                       try {
-                                               Thread.sleep(3000);
-                                       } catch (InterruptedException e2) {
-                                               // silent
-                                       }
-                                       ErrorFeedback.show("Login failed", e1);
-                                       return -1;
-                               }
-                       }
-               } catch (LoginException e) {
-                       throw new ArgeoException("Cannot log in", e);
-               }
-               //
-               // RUN THE WORKBENCH
-               //
-               Integer returnCode = null;
-               try {
-                       returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
-                               public Integer run() {
-                                       int result = createAndRunWorkbench(display,
-                                                       CurrentUser.getUsername(subject));
-                                       return new Integer(result);
-                               }
-                       });
-                       // explicit workbench closing
-                       logout();
-               } finally {
-                       display.dispose();
-               }
-               return returnCode;
-       }
-
-       protected abstract int createAndRunWorkbench(Display display,
-                       String username);
-
-       protected HttpServletRequest getRequest() {
-               return RWT.getRequest();
-       }
-
-       protected CmsLoginShell createCmsLoginShell() {
-               return new CmsLoginShell(this) {
-
-                       @Override
-                       public void createContents(Composite parent) {
-                               WorkbenchLogin.this.createLoginPage(parent, this);
-                       }
-
-                       @Override
-                       protected void extendsCredentialsBlock(Composite credentialsBlock,
-                                       Locale selectedLocale,
-                                       SelectionListener loginSelectionListener) {
-                               WorkbenchLogin.this.extendsCredentialsBlock(credentialsBlock,
-                                               selectedLocale, loginSelectionListener);
-                       }
-
-               };
-       }
-
-       /**
-        * To be overridden. CmsLogin#createCredentialsBlock() should be called at
-        * some point in order to create the credentials composite. In order to use
-        * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
-        * CmsLogin#createContent(), since it would lead to a stack overflow.
-        */
-       protected void createLoginPage(Composite parent, CmsLogin login) {
-               login.defaultCreateContents(parent);
-       }
-
-       protected void extendsCredentialsBlock(Composite credentialsBlock,
-                       Locale selectedLocale, SelectionListener loginSelectionListener) {
-
-       }
-
-       @Override
-       public void navigateTo(String state) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public void authChange(LoginContext loginContext) {
-               this.loginContext = loginContext;
-       }
-
-       @Override
-       public void logout() {
-               if (loginContext == null)
-                       throw new CmsException("Login context should not bet null");
-               try {
-                       loginContext.logout();
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot log out", e);
-               }
-       }
-
-       @Override
-       public final Subject getSubject() {
-               return subject;
-       }
-
-       @Override
-       public void exception(Throwable e) {
-               // TODO Auto-generated method stub
-
-       }
-
-       @Override
-       public CmsImageManager getImageManager() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-}