Clarify implementation-specific APIs
authorMathieu <mbaudier@argeo.org>
Sat, 12 Nov 2022 07:46:56 +0000 (08:46 +0100)
committerMathieu <mbaudier@argeo.org>
Sat, 12 Nov 2022 07:46:56 +0000 (08:46 +0100)
16 files changed:
org.argeo.cms.ee/src/org/argeo/cms/integration/CmsLogoutServlet.java
org.argeo.cms/src/org/argeo/cms/CurrentUser.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/LocaleUtils.java
org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java
org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java [deleted file]
org.argeo.cms/src/org/argeo/cms/auth/UserAdminUtils.java
org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java
org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsUserManagerImpl.java
swt/org.argeo.cms.e4/src/org/argeo/cms/e4/addons/AuthAddon.java
swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/ChangePassword.java
swt/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/AbstractSwtCmsView.java
swt/org.argeo.cms.swt/src/org/argeo/cms/swt/acr/AbstractPageViewer.java
swt/rap/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java
swt/rap/org.argeo.cms.swt.rap/src/org/argeo/cms/web/CmsWebEntryPoint.java
swt/rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java

index 0628eae3646de9244afab61212b943bf318233ff..d18637d3f805ff9e9055bcb4b5f23192d7ac6e31 100644 (file)
@@ -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 (file)
index 0000000..53a33fc
--- /dev/null
@@ -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<String> roles() {
+               return roles(currentSubject());
+       }
+
+       /** Returns true if the current user is in the specified role */
+       public static boolean isInRole(String role) {
+               Set<String> 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> T doAs(PrivilegedAction<T> action) {
+               return Subject.doAs(currentSubject(), action);
+       }
+
+       /** Executes as the current user */
+       public final static <T> T tryAs(PrivilegedExceptionAction<T> 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<String> roles(Subject subject) {
+               Set<String> roles = new HashSet<String>();
+               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<Locale> 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<CmsSessionId> 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() {
+       }
+}
index 4bfda139d686345f261dd9675de1c500b9cb2eda..8aca8768a04d9e3af196ce9690ea449ba1d7d651 100644 (file)
@@ -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 {
index 2b4de14da254ba933ab409f01dc9464cf3e7a503..3b47c1630aa4f63a41a30d0909d2ace7b13350de 100644 (file)
@@ -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 (file)
index 41a6a88..0000000
+++ /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<String> roles() {
-               return roles(currentSubject());
-       }
-
-       /** Returns true if the current user is in the specified role */
-       public static boolean isInRole(String role) {
-               Set<String> 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> T doAs(PrivilegedAction<T> action) {
-               return Subject.doAs(currentSubject(), action);
-       }
-
-       /** Executes as the current user */
-       public final static <T> T tryAs(PrivilegedExceptionAction<T> 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<String> roles(Subject subject) {
-               Set<String> roles = new HashSet<String>();
-               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<Locale> 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<CmsSessionId> 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() {
-       }
-}
index 47d2eeb4117cdda2f81974a998dd05cb93839169..3c24f98af3574627fc3f1bbe6fdf7762c7e165ba 100644 (file)
@@ -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;
index caa7810098e30d012e02202944b9a52d388d15c3..e17a089fe05e15db48924216a5f3f6c1f998b2c1 100644 (file)
@@ -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;
index 6c6001563ba198c6239a8f856451b9bb0ec25c99..a17bf0210acf067285e813311c4789122a9ef767 100644 (file)
@@ -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;
index 37f1c0233d27eb7b7ad93974cd2988e53d174ea6..66a5ec8c77089a38c1c92375668dd9bffa0d0cbd 100644 (file)
@@ -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;
index dd761267d5e6d3097a88c54fea07c69a15b3cd4d..8309a42c5b7f9d96d1a1cddd9e24ddbdf2f95d5a 100644 (file)
@@ -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;
index 91070f22286617a673ef525735e96943548b5e24..cce18020db355d64681b710f5a526a6b1df9d1f1 100644 (file)
@@ -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;
index 59624f93c48d364e554fd2042fad318e9d8168cb..06bb9be3727c1a81f9ad2dd8f598da15611a38d6 100644 (file)
@@ -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;
 
index 2427c7610bb141e37d5cd7935519ad1bff5744fc..cf05f6f6455d939f7dd4618ad62e3ec9de78677c 100644 (file)
@@ -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;
index 7d4cd83315721d3227e801ddc5ea5bb280b00898..cdd87fd3f54696688270d7751349efbe1b761b96 100644 (file)
@@ -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;
index d63aeeea53471ea6a62731daed32cb47129f7168..4d91cf8e20e8a163740f58e4deeecc39e50abfa1 100644 (file)
@@ -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;
index 16d3ca8d2ff57300e2a1d5e1459cac8b02321f4a..3861597aad00baa1b232366cc923d22e9fb45a60 100644 (file)
@@ -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);
                }
        }