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=45c7d6a67d68bb2e5316e7e3ce268690cf0f2c6d;hp=424b8b23c68c7686837348bfe79de5fde716d5e6;hpb=c5fa035468228d1f87ab5431a3fad17403eee1c3;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 424b8b23c..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 @@ -3,22 +3,21 @@ 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.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.cms.ui.CmsImageManager; import org.argeo.cms.ui.CmsView; import org.argeo.cms.ui.UxContext; 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.NodeAuthenticated; +import org.argeo.node.NodeConstants; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.EntryPoint; import org.eclipse.swt.events.SelectionListener; @@ -26,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(AuthConstants.LOGIN_CONTEXT_USER, - subject, new HttpRequestCallbackHandler(getRequest())); + loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, loginShell); loginContext.login(); - } catch (CredentialNotFoundException e) { - CmsLoginShell loginShell = createCmsLoginShell(); + } 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(); @@ -88,11 +93,9 @@ public class LoginEntryPoint implements EntryPoint, CmsView { } @Override - protected void extendsCredentialsBlock(Composite credentialsBlock, - Locale selectedLocale, + protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale, SelectionListener loginSelectionListener) { - LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock, - selectedLocale, loginSelectionListener); + LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock, selectedLocale, loginSelectionListener); } }; @@ -108,8 +111,8 @@ public class LoginEntryPoint implements EntryPoint, CmsView { login.defaultCreateContents(parent); } - protected void extendsCredentialsBlock(Composite credentialsBlock, - Locale selectedLocale, SelectionListener loginSelectionListener) { + protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale, + SelectionListener loginSelectionListener) { } @@ -121,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; } @@ -129,23 +141,33 @@ 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 exception(Throwable e) { // TODO Auto-generated method stub } + // @Override + // public LoginContext getLoginContext() { + // return loginContext; + // } + + protected Subject getSubject() { + return loginContext.getSubject(); + } + + @Override + public boolean isAnonymous() { + return CurrentUser.isAnonymous(getSubject()); + } + @Override public CmsImageManager getImageManager() { // TODO Auto-generated method stub @@ -156,5 +178,4 @@ public class LoginEntryPoint implements EntryPoint, CmsView { public UxContext getUxContext() { return uxContext; } - -} +} \ No newline at end of file