]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/auth/CurrentUser.java
Introduce node file system provider
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / auth / CurrentUser.java
index 11126014f2aba49e9a85a6ddf16f9242da8792a1..a23822b21fe48c7db3f43a090c059fdccfb4400a 100644 (file)
@@ -25,12 +25,14 @@ import javax.security.auth.Subject;
 import javax.security.auth.x500.X500Principal;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsView;
-import org.argeo.cms.util.CmsUtils;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.argeo.node.NodeConstants;
+import org.argeo.node.security.NodeAuthenticated;
 import org.osgi.service.useradmin.Authorization;
 
 /** Static utilities */
 public final class CurrentUser {
+
        /**
         * @return the authenticated username or null if not authenticated /
         *         anonymous
@@ -47,33 +49,34 @@ public final class CurrentUser {
                return isAnonymous(currentSubject());
        }
 
+       public static boolean isRegistered() {
+               return !isAnonymous();
+       }
+
        public static boolean isAnonymous(Subject subject) {
-               return getUsername(subject).equalsIgnoreCase(
-                               AuthConstants.ROLE_ANONYMOUS);
+               if (subject == null)
+                       return true;
+               String username = getUsername(subject);
+               return username == null
+                               || username.equalsIgnoreCase(NodeConstants.ROLE_ANONYMOUS);
        }
 
-       private static Subject currentSubject() {
-               Subject subject = Subject.getSubject(AccessController.getContext());
-               if (subject != null)
-                       return subject;
-               if (subject == null) {
-                       CmsView cmsView = CmsUtils.getCmsView();
-                       if (cmsView != null)
-                               return cmsView.getSubject();
-               }
-               throw new CmsException("Cannot find related subject");
+       /**
+        * The node authenticated component (typically a CMS view) related to this
+        * display, or null if none is available from this call.
+        */
+       public static NodeAuthenticated getNodeAuthenticated() {
+               return UiContext.getData(NodeAuthenticated.KEY);
        }
 
        public final static String getUsername(Subject subject) {
-               // Subject subject = Subject.getSubject(AccessController.getContext());
-               // if (subject == null)
-               // return null;
+               if (subject == null)
+                       throw new CmsException("Subject cannot be null");
                if (subject.getPrincipals(X500Principal.class).size() != 1)
-                       return null;
+                       return NodeConstants.ROLE_ANONYMOUS;
                Principal principal = subject.getPrincipals(X500Principal.class)
                                .iterator().next();
                return principal.getName();
-
        }
 
        public final static String getDisplayName(Subject subject) {
@@ -89,11 +92,25 @@ public final class CurrentUser {
                return roles(currentSubject());
        }
 
+       private static Subject currentSubject() {
+               NodeAuthenticated cmsView = getNodeAuthenticated();
+               if (cmsView != null)
+                       return cmsView.getLoginContext().getSubject();
+               Subject subject = Subject.getSubject(AccessController.getContext());
+               if (subject != null)
+                       return subject;
+               throw new CmsException("Cannot find related subject");
+       }
+
+       /** 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);
+       }
+
        public final static Set<String> roles(Subject subject) {
                Set<String> roles = new HashSet<String>();
-               X500Principal userPrincipal = subject
-                               .getPrincipals(X500Principal.class).iterator().next();
-               roles.add(userPrincipal.getName());
+               roles.add(getUsername(subject));
                for (Principal group : subject.getPrincipals(Group.class)) {
                        roles.add(group.getName());
                }