X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.ui%2Fsrc%2Forg%2Fargeo%2Fcms%2Futil%2FLoginEntryPoint.java;h=b7bf9103ab7ce2f0bd9398a596e2012cbba4d936;hb=1d51e20eccc04946705864d447f247018568da69;hp=1f46f100e0c98cbce2a5e45496c7017b10eba5f0;hpb=7e333073d07b780efe681306a1842a750cbea83c;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.ui/src/org/argeo/cms/util/LoginEntryPoint.java b/org.argeo.cms.ui/src/org/argeo/cms/util/LoginEntryPoint.java index 1f46f100e..b7bf9103a 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/util/LoginEntryPoint.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/util/LoginEntryPoint.java @@ -2,11 +2,13 @@ package org.argeo.cms.util; import java.util.Locale; -import javax.security.auth.login.CredentialNotFoundException; +import javax.security.auth.Subject; 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.CurrentUser; import org.argeo.cms.ui.CmsImageManager; @@ -16,7 +18,6 @@ import org.argeo.cms.widgets.auth.CmsLogin; import org.argeo.cms.widgets.auth.CmsLoginShell; import org.argeo.eclipse.ui.specific.UiContext; import org.argeo.node.NodeConstants; -import org.argeo.node.security.NodeAuthenticated; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.EntryPoint; import org.eclipse.swt.events.SelectionListener; @@ -24,42 +25,48 @@ 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(); + protected final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; + protected final static String HEADER_AUTHORIZATION = "Authorization"; + private final static Log log = LogFactory.getLog(LoginEntryPoint.class); private LoginContext loginContext; private UxContext uxContext = null; @Override public int createUI() { final Display display = createDisplay(); - UiContext.setData(NodeAuthenticated.KEY, this); + UiContext.setData(CmsView.KEY, this); CmsLoginShell loginShell = createCmsLoginShell(); try { // try pre-auth loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, loginShell); loginContext.login(); - } catch (CredentialNotFoundException e) { + } catch (LoginException e) { loginShell.createUi(); loginShell.open(); + + // HttpServletRequest request = RWT.getRequest(); + // String authorization = request.getHeader(HEADER_AUTHORIZATION); + // if (authorization == null || + // !authorization.startsWith("Negotiate")) { + // HttpServletResponse response = RWT.getResponse(); + // response.setStatus(401); + // response.setHeader(HEADER_WWW_AUTHENTICATE, "Negotiate"); + // response.setDateHeader("Date", System.currentTimeMillis()); + // response.setDateHeader("Expires", System.currentTimeMillis() + + // (24 * 60 * 60 * 1000)); + // response.setHeader("Accept-Ranges", "bytes"); + // response.setHeader("Connection", "Keep-Alive"); + // response.setHeader("Keep-Alive", "timeout=5, max=97"); + // // response.setContentType("text/html; charset=UTF-8"); + // } + 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 CmsException("Cannot log in", e); } - if (CurrentUser.getUsername() == null) + if (CurrentUser.getUsername(getSubject()) == null) return -1; uxContext = new SimpleUxContext(); return postLogin(); @@ -76,8 +83,6 @@ public class LoginEntryPoint implements EntryPoint, CmsView { protected HttpServletRequest getRequest() { return RWT.getRequest(); } - - protected CmsLoginShell createCmsLoginShell() { return new CmsLoginShell(this) { @@ -119,6 +124,15 @@ public class LoginEntryPoint implements EntryPoint, CmsView { @Override public void authChange(LoginContext loginContext) { + if (loginContext == null) + throw new CmsException("Login context cannot be null"); + // logout previous login context + if (this.loginContext != null) + try { + this.loginContext.logout(); + } catch (LoginException e1) { + log.warn("Could not log out: " + e1); + } this.loginContext = loginContext; } @@ -127,24 +141,12 @@ public class LoginEntryPoint implements EntryPoint, CmsView { if (loginContext == null) throw new CmsException("Login context should not bet null"); try { + CurrentUser.logoutCmsSession(loginContext.getSubject()); loginContext.logout(); } catch (LoginException e) { throw new CmsException("Cannot log out", e); } } - - - - // @Override - // public final Subject getSubject() { - // return subject; - // } - -// @Override -// public void registerCallbackHandler(CallbackHandler callbackHandler) { -// throw new UnsupportedOperationException(); -// -// } @Override public void exception(Throwable e) { @@ -152,9 +154,18 @@ public class LoginEntryPoint implements EntryPoint, CmsView { } + // @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 @@ -167,5 +178,4 @@ public class LoginEntryPoint implements EntryPoint, CmsView { public UxContext getUxContext() { return uxContext; } - -} +} \ No newline at end of file