]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/util/LoginEntryPoint.java
Merge security.ui bundle in the cms.ui.workbench bundle
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / util / LoginEntryPoint.java
index f3597de776adc760e028fd95a04b5af7229efb42..2ccb3ca06b2d8349db91859358a9ff9957038a10 100644 (file)
 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.argeo.cms.CmsException;
+import org.argeo.cms.CmsImageManager;
+import org.argeo.cms.CmsView;
 import org.argeo.cms.auth.AuthConstants;
-import org.argeo.cms.widgets.auth.CompositeCallbackHandler;
-import org.eclipse.rap.rwt.application.AbstractEntryPoint;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
+import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+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.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.application.EntryPoint;
+import org.eclipse.swt.events.SelectionListener;
 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();
+       private LoginContext loginContext;
+       private UxContext uxContext = null;
+
+       @Override
+       public int createUI() {
+               final Display display = createDisplay();
+               UiContext.setData(CmsView.KEY, this);
+               try {
+                       // try pre-auth
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+                                       subject, new HttpRequestCallbackHandler(getRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       CmsLoginShell loginShell = createCmsLoginShell();
+                       loginShell.open();
+                       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)
+                       return -1;
+               uxContext = new SimpleUxContext();
+               return postLogin();
+       }
+
+       protected Display createDisplay() {
+               return new Display();
+       }
+
+       protected int postLogin() {
+               return 0;
+       }
+
+       protected HttpServletRequest getRequest() {
+               return RWT.getRequest();
+       }
+
+       protected CmsLoginShell createCmsLoginShell() {
+               return new CmsLoginShell(this) {
+
+                       @Override
+                       public void createContents(Composite parent) {
+                               LoginEntryPoint.this.createLoginPage(parent, this);
+                       }
+
+                       @Override
+                       protected void extendsCredentialsBlock(Composite credentialsBlock,
+                                       Locale selectedLocale,
+                                       SelectionListener loginSelectionListener) {
+                               LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock,
+                                               selectedLocale, loginSelectionListener);
+                       }
+
+               };
+       }
+
+       /**
+        * To be overridden. CmsLogin#createCredentialsBlock() should be called at
+        * some point in order to create the credentials composite. In order to use
+        * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
+        * CmsLogin#createContent(), since it would lead to a stack overflow.
+        */
+       protected void createLoginPage(Composite parent, CmsLogin login) {
+               login.defaultCreateContents(parent);
+       }
+
+       protected void extendsCredentialsBlock(Composite credentialsBlock,
+                       Locale selectedLocale, SelectionListener loginSelectionListener) {
+
+       }
 
-public class LoginEntryPoint extends AbstractEntryPoint {
-       @Override
-       public void createContents(Composite parent) {
-               parent.setLayout(new GridLayout());
-               // CompositeCallbackHandler cch = new CompositeCallbackHandler(parent,
-               // SWT.NONE);
-               UserMenu userMenu = new UserMenu(parent, false);
-
-//             Subject subject = new Subject();
-//             try {
-//                     LoginContext lc = new LoginContext(
-//                                     AuthConstants.LOGIN_CONTEXT_USER, subject, userMenu);
-//                     lc.login();
-//             } catch (LoginException e1) {
-//                     throw new CmsException("Cannot logint", e1);
-//             }
+       @Override
+       public void navigateTo(String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+               this.loginContext = loginContext;
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not bet null");
+               try {
+                       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 CmsImageManager getImageManager() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public UxContext getUxContext() {
+               return uxContext;
        }
 
 }