Make username and user role more consistent.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / auth / CmsSession.java
index 118f875891a8782ed8248d6633b730bb689cc600..a0ea6a63fd552b452f2e5e45f7765c24f72fa2a8 100644 (file)
@@ -1,22 +1,29 @@
 package org.argeo.cms.auth;
 
 import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.Locale;
 import java.util.UUID;
 
 import javax.naming.ldap.LdapName;
+import javax.security.auth.Subject;
 
 import org.argeo.naming.LdapAttrs;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.useradmin.Authorization;
 
+/** An authenticated user session. */
 public interface CmsSession {
        final static String USER_DN = LdapAttrs.DN;
        final static String SESSION_UUID = LdapAttrs.entryUUID.name();
        final static String SESSION_LOCAL_ID = LdapAttrs.uniqueIdentifier.name();
 
-       // public String getId();
-
        UUID getUuid();
 
+       String getUserRole();
+       
        LdapName getUserDn();
 
        String getLocalId();
@@ -26,16 +33,34 @@ public interface CmsSession {
        boolean isAnonymous();
 
        ZonedDateTime getCreationTime();
+
        ZonedDateTime getEnd();
 
-       boolean isValid();
+       Locale getLocale();
 
-       // public Session getDataSession(String cn, String workspace, Repository
-       // repository);
-       //
-       // public void releaseDataSession(String cn, Session session);
+       boolean isValid();
 
-       // public void addHttpSession(HttpServletRequest request);
+       void registerView(String uid, Object view);
 
-       // public void cleanUp();
+       /** @return The {@link CmsSession} for this {@link Subject} or null. */
+       static CmsSession getCmsSession(BundleContext bc, Subject subject) {
+               if (subject.getPrivateCredentials(CmsSessionId.class).isEmpty())
+                       return null;
+               CmsSessionId cmsSessionId = subject.getPrivateCredentials(CmsSessionId.class).iterator().next();
+               String uuid = cmsSessionId.getUuid().toString();
+               Collection<ServiceReference<CmsSession>> sr;
+               try {
+                       sr = bc.getServiceReferences(CmsSession.class, "(" + CmsSession.SESSION_UUID + "=" + uuid + ")");
+               } catch (InvalidSyntaxException e) {
+                       throw new IllegalArgumentException("Cannot get CMS session for uuid " + uuid, e);
+               }
+               ServiceReference<CmsSession> cmsSessionRef;
+               if (sr.size() == 1) {
+                       cmsSessionRef = sr.iterator().next();
+                       return bc.getService(cmsSessionRef);
+               } else if (sr.size() == 0) {
+                       return null;
+               } else
+                       throw new IllegalStateException(sr.size() + " CMS sessions registered for " + uuid);
+       }
 }