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;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.cms.CmsException;
-import org.argeo.cms.auth.AuthConstants;
+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.NodeAuthenticated;
+import org.argeo.node.NodeConstants;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.application.AbstractEntryPoint;
import org.eclipse.rap.rwt.client.WebClient;
/** Manages history and navigation */
public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements CmsView {
+ private static final long serialVersionUID = 906558779562569784L;
+
private final Log log = LogFactory.getLog(AbstractCmsEntryPoint.class);
- private final Subject subject;
+ // private final Subject subject;
private LoginContext loginContext;
private final Repository repository;
this.workspace = workspace;
this.defaultPath = defaultPath;
this.factoryProperties = new HashMap<String, String>(factoryProperties);
- subject = new Subject();
+ // subject = new Subject();
// Initial login
+ LoginContext lc;
try {
- loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER, subject,
- 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(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
- loginContext.login();
+ lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_ANONYMOUS);
+ lc.login();
} catch (LoginException e1) {
- throw new CmsException("Cannot log as anonymous", e);
+ 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);
@Override
protected final void createContents(final Composite parent) {
- UiContext.setData(NodeAuthenticated.KEY, this);
- Subject.doAs(subject, new PrivilegedAction<Void>() {
+ UiContext.setData(CmsView.KEY, this);
+ Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
@Override
public Void run() {
try {
*/
protected Node getDefaultNode(Session session) throws RepositoryException {
if (!session.hasPermission(defaultPath, "read")) {
- if (session.getUserID().equals(AuthConstants.ROLE_ANONYMOUS))
+ String userId = session.getUserID();
+ if (userId.equals(NodeConstants.ROLE_ANONYMOUS))
// TODO throw a special exception
throw new CmsException("Login required");
else
browserNavigation.pushState(state, title);
}
+ // @Override
+ // public synchronized Subject getSubject() {
+ // return subject;
+ // }
+
+ // @Override
+ // public LoginContext getLoginContext() {
+ // return loginContext;
+ // }
+ protected Subject getSubject() {
+ return loginContext.getSubject();
+ }
+
@Override
- public synchronized Subject getSubject() {
- return subject;
+ public boolean isAnonymous() {
+ return CurrentUser.isAnonymous(getSubject());
}
@Override
if (loginContext == null)
throw new CmsException("Login context should not be null");
try {
+ CurrentUser.logoutCmsSession(loginContext.getSubject());
loginContext.logout();
- LoginContext anonymousLc = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
+ 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() {
try {
node = session.getNode(nodePath);
} catch (PathNotFoundException e) {
- // logout();
- // session = repository.login(workspace);
navigateTo("~");
- // throw e;
}
// refresh UI
}
});
-
}
@Override
}
protected synchronized void doRefresh() {
- Subject.doAs(subject, new PrivilegedAction<Void>() {
+ Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
@Override
public Void run() {
refresh();
try {
int firstSlash = state.indexOf('/');
if (firstSlash == 0) {
- if (session.nodeExists(state))
- node = session.getNode(state);
- else
- throw new CmsException("Data " + state + " does not exist");
+ node = session.getNode(state);
page = "";
} else if (firstSlash > 0) {
String prefix = state.substring(0, firstSlash);
return title;
} catch (Exception e) {
log.error("Cannot set state '" + state + "'", e);
+ if (state.equals("") || newState.equals("~") || newState.equals(previousState))
+ return "Unrecoverable exception : " + e.getClass().getSimpleName();
if (previousState.equals(""))
previousState = "~";
navigateTo(previousState);
@Override
public void navigated(BrowserNavigationEvent event) {
setState(event.getState());
- refresh();
+ doRefresh();
}
}
}
\ No newline at end of file