]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsEntryPoint.java
Remove dependency between CMS and CMS UI
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / AbstractCmsEntryPoint.java
index 9f7811aa4d0d08a5c57919c3eb9a03b11fc29e6e..2d83f8ded0ab2c60f80fcb9641c2f09e53b8edbc 100644 (file)
@@ -12,7 +12,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 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;
@@ -20,11 +19,11 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
+import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
 import org.argeo.eclipse.ui.specific.UiContext;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.node.NodeConstants;
-import org.argeo.node.security.NodeAuthenticated;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
 import org.eclipse.rap.rwt.client.WebClient;
@@ -71,21 +70,20 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                // subject = new Subject();
 
                // Initial login
+               LoginContext lc;
                try {
-                       loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER,
-                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest()));
-                       loginContext.login();
-               } catch (CredentialNotFoundException e) {
+                       lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER,
+                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest(), UiContext.getHttpResponse()));
+                       lc.login();
+               } catch (LoginException e) {
                        try {
-                               loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER);
-                               loginContext.login();
+                               lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_ANONYMOUS);
+                               lc.login();
                        } catch (LoginException e1) {
                                throw new CmsException("Cannot log in as anonymous", e1);
                        }
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot initialize subject", e);
                }
-               authChange(loginContext);
+               authChange(lc);
 
                jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class);
                browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
@@ -111,8 +109,8 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
 
        @Override
        protected final void createContents(final Composite parent) {
-               UiContext.setData(NodeAuthenticated.KEY, this);
-               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
+               UiContext.setData(CmsView.KEY, this);
+               Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
                        @Override
                        public Void run() {
                                try {
@@ -164,9 +162,17 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
        // return subject;
        // }
 
+       // @Override
+       // public LoginContext getLoginContext() {
+       // return loginContext;
+       // }
+       protected Subject getSubject() {
+               return loginContext.getSubject();
+       }
+
        @Override
-       public LoginContext getLoginContext() {
-               return loginContext;
+       public boolean isAnonymous() {
+               return CurrentUser.isAnonymous(getSubject());
        }
 
        @Override
@@ -174,21 +180,29 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                if (loginContext == null)
                        throw new CmsException("Login context should not be null");
                try {
+                       CurrentUser.logoutCmsSession(loginContext.getSubject());
                        loginContext.logout();
-                       LoginContext anonymousLc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER);
+                       LoginContext anonymousLc = new LoginContext(NodeConstants.LOGIN_CONTEXT_ANONYMOUS);
                        anonymousLc.login();
                        authChange(anonymousLc);
                } catch (LoginException e) {
-                       throw new CmsException("Cannot logout", e);
+                       log.error("Cannot logout", e);
                }
        }
 
        @Override
-       public synchronized void authChange(LoginContext loginContext) {
-               if (loginContext == null)
+       public synchronized void authChange(LoginContext lc) {
+               if (lc == null)
                        throw new CmsException("Login context cannot be null");
-               this.loginContext = loginContext;
-               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
+               // logout previous login context
+               if (this.loginContext != null)
+                       try {
+                               this.loginContext.logout();
+                       } catch (LoginException e1) {
+                               log.warn("Could not log out: " + e1);
+                       }
+               this.loginContext = lc;
+               Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
 
                        @Override
                        public Void run() {
@@ -211,7 +225,6 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                        }
 
                });
-
        }
 
        @Override
@@ -222,7 +235,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
        }
 
        protected synchronized void doRefresh() {
-               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
+               Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
                        @Override
                        public Void run() {
                                refresh();
@@ -332,7 +345,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implement
                @Override
                public void navigated(BrowserNavigationEvent event) {
                        setState(event.getState());
-                       refresh();
+                       doRefresh();
                }
        }
 }
\ No newline at end of file