From: Mathieu Date: Sat, 12 Nov 2022 07:46:56 +0000 (+0100) Subject: Clarify implementation-specific APIs X-Git-Tag: v2.3.11~18 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=0e533d2562def311fdd7aa71f1d0d704e466861e Clarify implementation-specific APIs --- diff --git a/org.argeo.cms.ee/src/org/argeo/cms/integration/CmsLogoutServlet.java b/org.argeo.cms.ee/src/org/argeo/cms/integration/CmsLogoutServlet.java index 0628eae36..d18637d3f 100644 --- a/org.argeo.cms.ee/src/org/argeo/cms/integration/CmsLogoutServlet.java +++ b/org.argeo.cms.ee/src/org/argeo/cms/integration/CmsLogoutServlet.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletResponse; import org.argeo.api.cms.CmsAuth; import org.argeo.api.cms.CmsSessionId; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.auth.RemoteAuthCallback; import org.argeo.cms.auth.RemoteAuthCallbackHandler; import org.argeo.cms.servlet.ServletHttpRequest; diff --git a/org.argeo.cms/src/org/argeo/cms/CurrentUser.java b/org.argeo.cms/src/org/argeo/cms/CurrentUser.java new file mode 100644 index 000000000..53a33fc34 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/CurrentUser.java @@ -0,0 +1,185 @@ +package org.argeo.cms; + +import java.security.Principal; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Locale; +import java.util.Set; +import java.util.UUID; + +import javax.security.auth.Subject; +import javax.security.auth.x500.X500Principal; + +import org.argeo.api.acr.NamespaceUtils; +import org.argeo.api.cms.CmsConstants; +import org.argeo.api.cms.CmsSession; +import org.argeo.api.cms.CmsSessionId; +import org.argeo.cms.internal.auth.CmsSessionImpl; +import org.argeo.cms.internal.auth.ImpliedByPrincipal; +import org.argeo.cms.internal.runtime.CmsContextImpl; +import org.argeo.cms.util.CurrentSubject; +import org.osgi.service.useradmin.Authorization; + +/** + * Programmatic access to the currently authenticated user, within a CMS + * context. + */ +public final class CurrentUser { + /* + * CURRENT USER API + */ + + /** + * Technical username of the currently authenticated user. + * + * @return the authenticated username or null if not authenticated / anonymous + */ + public static String getUsername() { + return getUsername(currentSubject()); + } + + /** + * Human readable name of the currently authenticated user (typically first name + * and last name). + */ + public static String getDisplayName() { + return getDisplayName(currentSubject()); + } + + /** Whether a user is currently authenticated. */ + public static boolean isAnonymous() { + return isAnonymous(currentSubject()); + } + + /** Locale of the current user */ + public final static Locale locale() { + return locale(currentSubject()); + } + + /** Roles of the currently logged-in user */ + public final static Set roles() { + return roles(currentSubject()); + } + + /** Returns true if the current user is in the specified role */ + public static boolean isInRole(String role) { + Set roles = roles(); + return roles.contains(role); + } + + /** Implies this {@link SystemRole} in this context. */ + public final static boolean implies(SystemRole role, String context) { + return role.implied(currentSubject(), context); + } + + /** Implies this role name, also independently of the context. */ + public final static boolean implies(String role, String context) { + return SystemRole.implied(NamespaceUtils.parsePrefixedName(role), currentSubject(), context); + } + + /** Executes as the current user */ + public final static T doAs(PrivilegedAction action) { + return Subject.doAs(currentSubject(), action); + } + + /** Executes as the current user */ + public final static T tryAs(PrivilegedExceptionAction action) throws PrivilegedActionException { + return Subject.doAs(currentSubject(), action); + } + + /* + * WRAPPERS + */ + + public final static String getUsername(Subject subject) { + if (subject == null) + throw new IllegalArgumentException("Subject cannot be null"); + if (subject.getPrincipals(X500Principal.class).size() != 1) + return CmsConstants.ROLE_ANONYMOUS; + Principal principal = subject.getPrincipals(X500Principal.class).iterator().next(); + return principal.getName(); + } + + public final static String getDisplayName(Subject subject) { + return getAuthorization(subject).toString(); + } + + public final static Set roles(Subject subject) { + Set roles = new HashSet(); + roles.add(getUsername(subject)); + for (Principal group : subject.getPrincipals(ImpliedByPrincipal.class)) { + roles.add(group.getName()); + } + return roles; + } + + public final static Locale locale(Subject subject) { + Set locales = subject.getPublicCredentials(Locale.class); + if (locales.isEmpty()) { + Locale defaultLocale = CmsContextImpl.getCmsContext().getDefaultLocale(); + return defaultLocale; + } else + return locales.iterator().next(); + } + + /** Whether this user is currently authenticated. */ + public static boolean isAnonymous(Subject subject) { + if (subject == null) + return true; + String username = getUsername(subject); + return username == null || username.equalsIgnoreCase(CmsConstants.ROLE_ANONYMOUS); + } + + public static CmsSession getCmsSession() { + Subject subject = currentSubject(); + Iterator it = subject.getPrivateCredentials(CmsSessionId.class).iterator(); + if (!it.hasNext()) + throw new IllegalStateException("No CMS session id available for " + subject); + CmsSessionId cmsSessionId = it.next(); + if (it.hasNext()) + throw new IllegalStateException("More than one CMS session id available for " + subject); + return CmsContextImpl.getCmsContext().getCmsSessionByUuid(cmsSessionId.getUuid()); + } + + public static boolean isAvailable() { + return CurrentSubject.current() != null; + } + + /* + * HELPERS + */ + private static Subject currentSubject() { + Subject subject = CurrentSubject.current(); + if (subject == null) + throw new IllegalStateException("Cannot find related subject"); + return subject; + } + + private static Authorization getAuthorization(Subject subject) { + return subject.getPrivateCredentials(Authorization.class).iterator().next(); + } + + public static boolean logoutCmsSession(Subject subject) { + UUID nodeSessionId; + if (subject.getPrivateCredentials(CmsSessionId.class).size() == 1) + nodeSessionId = subject.getPrivateCredentials(CmsSessionId.class).iterator().next().getUuid(); + else + return false; + CmsSessionImpl cmsSession = CmsContextImpl.getCmsContext().getCmsSessionByUuid(nodeSessionId); + + // FIXME logout all views + // TODO check why it is sometimes null + if (cmsSession != null) + cmsSession.close(); + // if (log.isDebugEnabled()) + // log.debug("Logged out CMS session " + cmsSession.getUuid()); + return true; + } + + /** singleton */ + private CurrentUser() { + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java b/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java index 4bfda139d..8aca8768a 100644 --- a/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java @@ -4,7 +4,6 @@ import java.util.Locale; import java.util.ResourceBundle; import org.argeo.api.cms.CmsLog; -import org.argeo.cms.auth.CurrentUser; /** Utilities simplifying the development of localization enums. */ public class LocaleUtils { diff --git a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java index 2b4de14da..3b47c1630 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java @@ -15,7 +15,7 @@ import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.CmsState; import org.argeo.api.cms.DataAdminPrincipal; import org.argeo.api.uuid.UuidFactory; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.internal.runtime.CmsContextImpl; import org.argeo.cms.util.CurrentSubject; diff --git a/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java b/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java deleted file mode 100644 index 41a6a880d..000000000 --- a/org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java +++ /dev/null @@ -1,186 +0,0 @@ -package org.argeo.cms.auth; - -import java.security.Principal; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Locale; -import java.util.Set; -import java.util.UUID; - -import javax.security.auth.Subject; -import javax.security.auth.x500.X500Principal; - -import org.argeo.api.acr.NamespaceUtils; -import org.argeo.api.cms.CmsConstants; -import org.argeo.api.cms.CmsSession; -import org.argeo.api.cms.CmsSessionId; -import org.argeo.cms.SystemRole; -import org.argeo.cms.internal.auth.CmsSessionImpl; -import org.argeo.cms.internal.auth.ImpliedByPrincipal; -import org.argeo.cms.internal.runtime.CmsContextImpl; -import org.argeo.cms.util.CurrentSubject; -import org.osgi.service.useradmin.Authorization; - -/** - * Programmatic access to the currently authenticated user, within a CMS - * context. - */ -public final class CurrentUser { - /* - * CURRENT USER API - */ - - /** - * Technical username of the currently authenticated user. - * - * @return the authenticated username or null if not authenticated / anonymous - */ - public static String getUsername() { - return getUsername(currentSubject()); - } - - /** - * Human readable name of the currently authenticated user (typically first name - * and last name). - */ - public static String getDisplayName() { - return getDisplayName(currentSubject()); - } - - /** Whether a user is currently authenticated. */ - public static boolean isAnonymous() { - return isAnonymous(currentSubject()); - } - - /** Locale of the current user */ - public final static Locale locale() { - return locale(currentSubject()); - } - - /** Roles of the currently logged-in user */ - public final static Set roles() { - return roles(currentSubject()); - } - - /** Returns true if the current user is in the specified role */ - public static boolean isInRole(String role) { - Set roles = roles(); - return roles.contains(role); - } - - /** Implies this {@link SystemRole} in this context. */ - public final static boolean implies(SystemRole role, String context) { - return role.implied(currentSubject(), context); - } - - /** Implies this role name, also independently of the context. */ - public final static boolean implies(String role, String context) { - return SystemRole.implied(NamespaceUtils.parsePrefixedName(role), currentSubject(), context); - } - - /** Executes as the current user */ - public final static T doAs(PrivilegedAction action) { - return Subject.doAs(currentSubject(), action); - } - - /** Executes as the current user */ - public final static T tryAs(PrivilegedExceptionAction action) throws PrivilegedActionException { - return Subject.doAs(currentSubject(), action); - } - - /* - * WRAPPERS - */ - - public final static String getUsername(Subject subject) { - if (subject == null) - throw new IllegalArgumentException("Subject cannot be null"); - if (subject.getPrincipals(X500Principal.class).size() != 1) - return CmsConstants.ROLE_ANONYMOUS; - Principal principal = subject.getPrincipals(X500Principal.class).iterator().next(); - return principal.getName(); - } - - public final static String getDisplayName(Subject subject) { - return getAuthorization(subject).toString(); - } - - public final static Set roles(Subject subject) { - Set roles = new HashSet(); - roles.add(getUsername(subject)); - for (Principal group : subject.getPrincipals(ImpliedByPrincipal.class)) { - roles.add(group.getName()); - } - return roles; - } - - public final static Locale locale(Subject subject) { - Set locales = subject.getPublicCredentials(Locale.class); - if (locales.isEmpty()) { - Locale defaultLocale = CmsContextImpl.getCmsContext().getDefaultLocale(); - return defaultLocale; - } else - return locales.iterator().next(); - } - - /** Whether this user is currently authenticated. */ - public static boolean isAnonymous(Subject subject) { - if (subject == null) - return true; - String username = getUsername(subject); - return username == null || username.equalsIgnoreCase(CmsConstants.ROLE_ANONYMOUS); - } - - public static CmsSession getCmsSession() { - Subject subject = currentSubject(); - Iterator it = subject.getPrivateCredentials(CmsSessionId.class).iterator(); - if (!it.hasNext()) - throw new IllegalStateException("No CMS session id available for " + subject); - CmsSessionId cmsSessionId = it.next(); - if (it.hasNext()) - throw new IllegalStateException("More than one CMS session id available for " + subject); - return CmsContextImpl.getCmsContext().getCmsSessionByUuid(cmsSessionId.getUuid()); - } - - public static boolean isAvailable() { - return CurrentSubject.current() != null; - } - - /* - * HELPERS - */ - private static Subject currentSubject() { - Subject subject = CurrentSubject.current(); - if (subject == null) - throw new IllegalStateException("Cannot find related subject"); - return subject; - } - - private static Authorization getAuthorization(Subject subject) { - return subject.getPrivateCredentials(Authorization.class).iterator().next(); - } - - public static boolean logoutCmsSession(Subject subject) { - UUID nodeSessionId; - if (subject.getPrivateCredentials(CmsSessionId.class).size() == 1) - nodeSessionId = subject.getPrivateCredentials(CmsSessionId.class).iterator().next().getUuid(); - else - return false; - CmsSessionImpl cmsSession = CmsContextImpl.getCmsContext().getCmsSessionByUuid(nodeSessionId); - - // FIXME logout all views - // TODO check why it is sometimes null - if (cmsSession != null) - cmsSession.close(); - // if (log.isDebugEnabled()) - // log.debug("Logged out CMS session " + cmsSession.getUuid()); - return true; - } - - /** singleton */ - private CurrentUser() { - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminUtils.java b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminUtils.java index 47d2eeb41..3c24f98af 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminUtils.java @@ -8,6 +8,7 @@ import javax.naming.ldap.Rdn; import org.argeo.api.acr.ldap.LdapAttrs; import org.argeo.api.cms.CmsConstants; +import org.argeo.cms.CurrentUser; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java index caa781009..e17a089fe 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java @@ -5,7 +5,7 @@ import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; import org.argeo.api.cms.CmsAuth; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.auth.RemoteAuthCallbackHandler; import org.argeo.cms.auth.RemoteAuthRequest; import org.argeo.cms.auth.RemoteAuthResponse; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserManagerImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserManagerImpl.java index 6c6001563..a17bf0210 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserManagerImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserManagerImpl.java @@ -36,7 +36,7 @@ import org.argeo.api.cms.directory.CmsUserManager; import org.argeo.api.cms.directory.HierarchyUnit; import org.argeo.api.cms.directory.UserDirectory; import org.argeo.api.cms.transaction.WorkTransaction; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.auth.UserAdminUtils; import org.argeo.cms.directory.ldap.LdapEntry; import org.argeo.cms.directory.ldap.SharedSecret; diff --git a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java index 37f1c0233..66a5ec8c7 100644 --- a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java +++ b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java @@ -8,7 +8,7 @@ import javax.security.auth.Subject; import javax.servlet.http.HttpServletRequest; import org.argeo.api.cms.CmsLog; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.CmsException; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.ui.MElementContainer; diff --git a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java index dd761267d..8309a42c5 100644 --- a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java +++ b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java @@ -14,7 +14,7 @@ import javax.naming.ldap.LdapName; import org.argeo.api.cms.keyring.CryptoKeyring; import org.argeo.api.cms.transaction.WorkTransaction; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.dialogs.CmsFeedback; import org.argeo.cms.swt.dialogs.CmsMessageDialog; import org.eclipse.e4.core.di.annotations.Execute; diff --git a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java index 91070f222..cce18020d 100644 --- a/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java +++ b/swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java @@ -2,7 +2,7 @@ package org.argeo.cms.e4.handlers; import javax.security.auth.Subject; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.util.CurrentSubject; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.workbench.IWorkbench; diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/AbstractSwtCmsView.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/AbstractSwtCmsView.java index 59624f93c..06bb9be37 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/AbstractSwtCmsView.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/AbstractSwtCmsView.java @@ -17,7 +17,7 @@ import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.api.cms.ux.CmsUi; import org.argeo.api.cms.ux.CmsView; import org.argeo.api.cms.ux.UxContext; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.util.CurrentSubject; import org.eclipse.swt.widgets.Display; diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/AbstractPageViewer.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/AbstractPageViewer.java index 2427c7610..cf05f6f64 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/AbstractPageViewer.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/AbstractPageViewer.java @@ -9,7 +9,7 @@ import org.argeo.api.acr.ContentSession; import org.argeo.api.acr.spi.ProvidedContent; import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.ux.CmsEditable; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.SwtEditablePart; import org.argeo.cms.swt.widgets.ScrolledPage; import org.eclipse.swt.SWT; diff --git a/swt/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java b/swt/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java index 7d4cd8331..cdd87fd3f 100644 --- a/swt/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java +++ b/swt/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java @@ -15,7 +15,7 @@ import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.api.cms.ux.CmsView; import org.argeo.api.cms.ux.UxContext; -import org.argeo.cms.auth.CurrentUser; +import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.SimpleSwtUxContext; import org.argeo.cms.swt.acr.AcrSwtImageManager; diff --git a/swt/rap/org.argeo.cms.swt.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java b/swt/rap/org.argeo.cms.swt.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java index d63aeeea5..4d91cf8e2 100644 --- a/swt/rap/org.argeo.cms.swt.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java +++ b/swt/rap/org.argeo.cms.swt.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java @@ -17,8 +17,8 @@ import org.argeo.api.cms.CmsLog; import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.api.cms.ux.CmsView; +import org.argeo.cms.CurrentUser; import org.argeo.cms.LocaleUtils; -import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.auth.RemoteAuthCallbackHandler; import org.argeo.cms.servlet.ServletHttpRequest; import org.argeo.cms.servlet.ServletHttpResponse; diff --git a/swt/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java b/swt/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java index 16d3ca8d2..3861597aa 100644 --- a/swt/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java +++ b/swt/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java @@ -12,8 +12,7 @@ import org.argeo.api.cms.CmsAuth; import org.argeo.api.cms.ux.CmsImageManager; import org.argeo.api.cms.ux.CmsView; import org.argeo.api.cms.ux.UxContext; -import org.argeo.cms.auth.CurrentUser; -import org.argeo.cms.swt.CmsException; +import org.argeo.cms.CurrentUser; import org.argeo.cms.swt.CmsSwtUtils; import org.argeo.cms.swt.SimpleSwtUxContext; import org.argeo.cms.swt.auth.CmsLoginShell; @@ -156,7 +155,7 @@ public class CmsE4Application implements IApplication, CmsView { @Override public void authChange(LoginContext loginContext) { if (loginContext == null) - throw new CmsException("Login context cannot be null"); + throw new IllegalStateException("Login context cannot be null"); // logout previous login context // if (this.loginContext != null) // try { @@ -170,12 +169,12 @@ public class CmsE4Application implements IApplication, CmsView { @Override public void logout() { if (loginContext == null) - throw new CmsException("Login context should not bet null"); + throw new IllegalStateException("Login context should not bet null"); try { CurrentUser.logoutCmsSession(loginContext.getSubject()); loginContext.logout(); } catch (LoginException e) { - throw new CmsException("Cannot log out", e); + throw new IllegalStateException("Cannot log out", e); } }