X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2FAbstractCmsEntryPoint.java;h=2ff9aff58e9275a043dc28b636a9c453bac53f42;hb=19b5a36f4845c4720554fbe06a8354fbaf842671;hp=a9ad03a12470055dfac85116237bf5f825235dcc;hpb=0b3ea4f2c08f00100e962272bf21f4f32346fd61;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java index a9ad03a12..2ff9aff58 100644 --- a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java +++ b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java @@ -1,30 +1,29 @@ package org.argeo.cms; -import java.security.AccessControlContext; import java.security.PrivilegedAction; import java.util.HashMap; -import java.util.Locale; import java.util.Map; -import java.util.ResourceBundle; import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.Repository; 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.security.auth.x500.X500Principal; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; -import org.argeo.cms.auth.ArgeoLoginContext; -import org.argeo.cms.auth.LoginRequiredException; -import org.argeo.cms.i18n.Msg; +import org.argeo.cms.auth.AuthConstants; +import org.argeo.cms.auth.HttpRequestCallbackHandler; +import org.argeo.cms.util.CmsUtils; +import org.argeo.eclipse.ui.specific.UiContext; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.AbstractEntryPoint; @@ -43,6 +42,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint private final Log log = LogFactory.getLog(AbstractCmsEntryPoint.class); private final Subject subject; + private LoginContext loginContext; private final Repository repository; private final String workspace; @@ -66,36 +66,26 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint this.workspace = workspace; this.defaultPath = defaultPath; this.factoryProperties = new HashMap(factoryProperties); + subject = new Subject(); - // load context from session - HttpServletRequest httpRequest = RWT.getRequest(); - final HttpSession httpSession = httpRequest.getSession(); - AccessControlContext acc = (AccessControlContext) httpSession - .getAttribute(KernelHeader.ACCESS_CONTROL_CONTEXT); - if (acc != null - && Subject.getSubject(acc).getPrincipals(X500Principal.class) - .size() == 1) { - subject = Subject.getSubject(acc); - } else { - subject = new Subject(); - - // Initial login + // Initial login + try { + loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER, + subject, new HttpRequestCallbackHandler( + UiContext.getHttpRequest())); + loginContext.login(); + } catch (CredentialNotFoundException e) { try { - new ArgeoLoginContext(KernelHeader.LOGIN_CONTEXT_USER, subject) - .login(); - } catch (LoginException e) { - // if (log.isTraceEnabled()) - // log.trace("Cannot authenticate user", e); - try { - new ArgeoLoginContext(KernelHeader.LOGIN_CONTEXT_ANONYMOUS, - subject).login(); - } catch (LoginException eAnonymous) { - throw new ArgeoException("Cannot initialize subject", - eAnonymous); - } + loginContext = new LoginContext( + AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject); + loginContext.login(); + } catch (LoginException e1) { + throw new ArgeoException("Cannot log as anonymous", e); } + } catch (LoginException e) { + throw new ArgeoException("Cannot initialize subject", e); } - authChange(); + authChange(loginContext); jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class); browserNavigation = RWT.getClient().getService(BrowserNavigation.class); @@ -122,12 +112,12 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint @Override protected final void createContents(final Composite parent) { - getShell().getDisplay().setData(CmsView.KEY, this); + UiContext.setData(CmsView.KEY, this); Subject.doAs(subject, new PrivilegedAction() { @Override public Void run() { try { - createUi(parent); + initUi(parent); } catch (Exception e) { throw new CmsException("Cannot create entrypoint contents", e); @@ -138,7 +128,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint } /** Create UI */ - protected abstract void createUi(Composite parent); + protected abstract void initUi(Composite parent); /** Recreate UI after navigation or auth change */ protected abstract void refresh(); @@ -149,8 +139,9 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint */ protected Node getDefaultNode(Session session) throws RepositoryException { if (!session.hasPermission(defaultPath, "read")) { - if (session.getUserID().equals("anonymous")) - throw new LoginRequiredException(); + if (session.getUserID().equals(AuthConstants.ROLE_ANONYMOUS)) + // TODO throw a special exception + throw new CmsException("Login required"); else throw new CmsException("Unauthorized"); } @@ -175,7 +166,25 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint } @Override - public void authChange() { + public void logout() { + if (loginContext == null) + throw new CmsException("Login context should not be null"); + try { + loginContext.logout(); + LoginContext anonymousLc = new LoginContext( + AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject); + anonymousLc.login(); + authChange(anonymousLc); + } catch (LoginException e) { + throw new CmsException("Cannot logout", e); + } + } + + @Override + public void authChange(LoginContext loginContext) { + if (loginContext == null) + throw new CmsException("Login context cannot be null"); + this.loginContext = loginContext; Subject.doAs(subject, new PrivilegedAction() { @Override @@ -191,19 +200,7 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint try { node = session.getNode(currentPath); } catch (Exception e) { - try { - // TODO find a less hacky way to log out - new ArgeoLoginContext( - KernelHeader.LOGIN_CONTEXT_ANONYMOUS, - subject).logout(); - new ArgeoLoginContext( - KernelHeader.LOGIN_CONTEXT_ANONYMOUS, - subject).login(); - } catch (LoginException eAnonymous) { - throw new ArgeoException( - "Cannot reset to anonymous", eAnonymous); - } - JcrUtils.logoutQuietly(session); + logout(); session = repository.login(workspace); navigateTo("~"); throw e; @@ -238,18 +235,6 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint }); } - // @Override - // public Object local(Msg msg) { - // String key = msg.getId(); - // int lastDot = key.lastIndexOf('.'); - // String className = key.substring(0, lastDot); - // String fieldName = key.substring(lastDot + 1); - // Locale locale = RWT.getLocale(); - // ResourceBundle rb = ResourceBundle.getBundle(className, locale, - // msg.getClassLoader()); - // return rb.getString(fieldName); - // } - /** Sets the state of the entry point and retrieve the related JCR node. */ protected synchronized String setState(String newState) { String previousState = this.state; @@ -289,7 +274,8 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint + " - " + getBaseTitle(); else title = getBaseTitle(); - jsExecutor.execute("document.title = \"" + title + "\""); + + publishMetaData(title); if (log.isTraceEnabled()) log.trace("node=" + node + ", state=" + state + " (page=" @@ -306,6 +292,37 @@ public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint } } + private void publishMetaData(String title) throws RepositoryException { + HttpServletRequest request = UiContext.getHttpRequest(); + if (request == null) + return; + String url = CmsUtils.getCanonicalUrl(node, request); + String imgUrl = null; + for (NodeIterator it = node.getNodes(); it.hasNext();) { + Node child = it.nextNode(); + if (child.isNodeType(CmsTypes.CMS_IMAGE)) + imgUrl = CmsUtils.getDataUrl(child, request); + } + + StringBuilder js = new StringBuilder(); + js.append("document.title = '" + title + "';"); + js.append("var metas = document.getElementsByTagName('meta');"); + js.append("for (var i=0; i