X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fauth%2FCmsSession.java;h=b9798006b4ca040fa3ecb3d543cf27f639dcc967;hb=b6cad136dfd4589bc2a8f48ec9168732517f451b;hp=0785430205ca6a683654548c556582b9824a5cee;hpb=48cae516376b12ea619a359450c62479d3e16584;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java b/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java index 078543020..b9798006b 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java @@ -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> 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 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); + } }