From: Mathieu Baudier Date: Wed, 14 Oct 2015 09:30:28 +0000 (+0000) Subject: Make CMS login UI more extensible X-Git-Tag: argeo-commons-2.1.30~97 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=94c0a695c972463b613d919f615f3d92642c75d5;p=lgpl%2Fargeo-commons.git Make CMS login UI more extensible git-svn-id: https://svn.argeo.org/commons/trunk@8480 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java index 366e80c2b..3f784407a 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/auth/CmsLogin.java @@ -49,7 +49,11 @@ public class CmsLogin implements CmsStyles, CallbackHandler { return CurrentUser.isAnonymous(cmsView.getSubject()); } - protected void createContents(Composite parent) { + public void createContents(Composite parent) { + defaultCreateContents(parent); + } + + public final void defaultCreateContents(Composite parent) { parent.setLayout(CmsUtils.noSpaceGridLayout()); Composite credentialsBlock = createCredentialsBlock(parent); if (parent instanceof Shell) { @@ -58,7 +62,7 @@ public class CmsLogin implements CmsStyles, CallbackHandler { } } - protected final Composite createCredentialsBlock(Composite parent) { + public final Composite createCredentialsBlock(Composite parent) { if (isAnonymous()) { return anonymousUi(parent); } else { diff --git a/org.argeo.eclipse.ui.workbench/pom.xml b/org.argeo.eclipse.ui.workbench/pom.xml index a16c5f9df..0b49fe37d 100644 --- a/org.argeo.eclipse.ui.workbench/pom.xml +++ b/org.argeo.eclipse.ui.workbench/pom.xml @@ -19,11 +19,5 @@ org.argeo.eclipse.ui 2.1.29-SNAPSHOT - - org.argeo.commons - org.argeo.eclipse.ui.rap - 2.1.29-SNAPSHOT - provided - \ No newline at end of file diff --git a/org.argeo.security.ui.rap/plugin.xml b/org.argeo.security.ui.rap/plugin.xml index d383dbf39..f2fae3c50 100644 --- a/org.argeo.security.ui.rap/plugin.xml +++ b/org.argeo.security.ui.rap/plugin.xml @@ -17,7 +17,7 @@ diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java deleted file mode 100644 index bc66b164f..000000000 --- a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapLoginEntryPoint.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.argeo.security.ui.rap; - -import javax.servlet.http.HttpServletRequest; - -import org.argeo.security.ui.login.WorkbenchLogin; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.rap.rwt.client.service.JavaScriptExecutor; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.PlatformUI; - -public class RapLoginEntryPoint extends WorkbenchLogin { - - @Override - protected int createAndRunWorkbench(Display display, String username) { - RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username); - return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor); - } - - /** Override to provide an application specific workbench advisor */ - protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) { - return new RapWorkbenchAdvisor(username); - } - - protected HttpServletRequest getRequest() { - return RWT.getRequest(); - } - - @Override - public int createUI() { - JavaScriptExecutor jsExecutor = RWT.getClient().getService( - JavaScriptExecutor.class); - int returnCode = super.createUI(); - jsExecutor.execute("location.reload()"); - return returnCode; - } - -} diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java new file mode 100644 index 000000000..1f4914ace --- /dev/null +++ b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/RapWorkbenchLogin.java @@ -0,0 +1,30 @@ +package org.argeo.security.ui.rap; + +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.client.service.JavaScriptExecutor; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; + +public class RapWorkbenchLogin extends WorkbenchLogin { + + @Override + protected int createAndRunWorkbench(Display display, String username) { + RapWorkbenchAdvisor workbenchAdvisor = createRapWorkbenchAdvisor(username); + return PlatformUI.createAndRunWorkbench(display, workbenchAdvisor); + } + + /** Override to provide an application specific workbench advisor */ + protected RapWorkbenchAdvisor createRapWorkbenchAdvisor(String username) { + return new RapWorkbenchAdvisor(username); + } + + @Override + public int createUI() { + JavaScriptExecutor jsExecutor = RWT.getClient().getService( + JavaScriptExecutor.class); + int returnCode = super.createUI(); + jsExecutor.execute("location.reload()"); + return returnCode; + } + +} diff --git a/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java new file mode 100644 index 000000000..e7a5c0c35 --- /dev/null +++ b/org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java @@ -0,0 +1,137 @@ +package org.argeo.security.ui.rap; + +import java.security.PrivilegedAction; + +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.ArgeoException; +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.auth.CurrentUser; +import org.argeo.cms.auth.HttpRequestCallbackHandler; +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.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; + +abstract class WorkbenchLogin implements EntryPoint, CmsView { + // private final static Log log = LogFactory.getLog(WorkbenchLogin.class); + private final Subject subject = new Subject(); + private LoginContext loginContext; + + @Override + public int createUI() { + final Display display = PlatformUI.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()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + } catch (LoginException e) { + throw new ArgeoException("Cannot log in", e); + } + // + // RUN THE WORKBENCH + // + Integer returnCode = null; + try { + returnCode = Subject.doAs(subject, new PrivilegedAction() { + public Integer run() { + int result = createAndRunWorkbench(display, + CurrentUser.getUsername(subject)); + return new Integer(result); + } + }); + // explicit workbench closing + logout(); + } finally { + display.dispose(); + } + return returnCode; + } + + protected abstract int createAndRunWorkbench(Display display, + String username); + + protected HttpServletRequest getRequest() { + return RWT.getRequest(); + } + + protected CmsLoginShell createCmsLoginShell() { + return new CmsLoginShell(this) { + + @Override + public void createContents(Composite parent) { + createLoginPage(parent, this); + } + }; + } + + /** + * 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 not + * CmsLogin#createContent(), since it would lead to a stack overflow. + */ + protected void createLoginPage(Composite parent, CmsLogin login) { + login.defaultCreateContents(parent); + } + + @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; + } +} diff --git a/org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java b/org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java deleted file mode 100644 index 2baedaf77..000000000 --- a/org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.argeo.security.ui.login; - -import java.security.PrivilegedAction; - -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.ArgeoException; -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.auth.CurrentUser; -import org.argeo.cms.auth.HttpRequestCallbackHandler; -import org.argeo.cms.widgets.auth.CmsLoginShell; -import org.argeo.eclipse.ui.specific.UiContext; -import org.eclipse.rap.rwt.application.EntryPoint; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.PlatformUI; - -public abstract class WorkbenchLogin implements EntryPoint, CmsView { - // private final static Log log = LogFactory.getLog(WorkbenchLogin.class); - private final Subject subject = new Subject(); - private LoginContext loginContext; - - @Override - public int createUI() { - final Display display = PlatformUI.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()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - } catch (LoginException e) { - throw new ArgeoException("Cannot log in", e); - } - // - // RUN THE WORKBENCH - // - Integer returnCode = null; - try { - returnCode = Subject.doAs(subject, new PrivilegedAction() { - public Integer run() { - int result = createAndRunWorkbench(display, - CurrentUser.getUsername(subject)); - return new Integer(result); - } - }); - // explicit workbench closing - logout(); - } finally { - display.dispose(); - } - return returnCode; - } - - protected abstract int createAndRunWorkbench(Display display, - String username); - - protected HttpServletRequest getRequest() { - return UiContext.getHttpRequest(); - } - - protected CmsLoginShell createCmsLoginShell() { - return new CmsLoginShell(this); - } - - @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; - } -}