Remove node data model, home areas based on workspaces instead.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / auth / CmsSession.java
index 0785430205ca6a683654548c556582b9824a5cee..b9798006b4ca040fa3ecb3d543cf27f639dcc967 100644 (file)
@@ -1,12 +1,17 @@
 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. */
@@ -15,8 +20,6 @@ public interface CmsSession {
        final static String SESSION_UUID = LdapAttrs.entryUUID.name();
        final static String SESSION_LOCAL_ID = LdapAttrs.uniqueIdentifier.name();
 
-       // public String getId();
-
        UUID getUuid();
 
        LdapName getUserDn();
@@ -35,12 +38,25 @@ public interface CmsSession {
 
        boolean isValid();
 
-       // public Session getDataSession(String cn, String workspace, Repository
-       // repository);
-       //
-       // public void releaseDataSession(String cn, Session session);
-
-       // public void addHttpSession(HttpServletRequest request);
-
-       // 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);
+       }
 }