X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fauth%2FCmsSession.java;h=a0ea6a63fd552b452f2e5e45f7765c24f72fa2a8;hb=8633b7d69ebb6e1c5af0b1e170d7b4f2af3567d3;hp=14d6d71f655b54c9a23bc9fd55e1bf0761cbb885;hpb=02a6354c17ddb160513580e9e3c7826d9475b177;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 14d6d71f6..a0ea6a63f 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/CmsSession.java @@ -1,34 +1,66 @@ package org.argeo.cms.auth; +import java.time.ZonedDateTime; +import java.util.Collection; +import java.util.Locale; import java.util.UUID; -import javax.jcr.Repository; -import javax.jcr.Session; 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 { - public final static String USER_DN = LdapAttrs.DN; - public final static String SESSION_UUID = LdapAttrs.entryUUID.name(); - public final static String SESSION_LOCAL_ID = LdapAttrs.uniqueIdentifier.name(); + 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(); - public UUID getUuid(); + String getUserRole(); + + LdapName getUserDn(); - public LdapName getUserDn(); + String getLocalId(); - public String getLocalId(); + Authorization getAuthorization(); - public Authorization getAuthorization(); + boolean isAnonymous(); - public Session getDataSession(String cn, String workspace, Repository repository); + ZonedDateTime getCreationTime(); - public void releaseDataSession(String cn, Session session); + ZonedDateTime getEnd(); - // public void addHttpSession(HttpServletRequest request); + Locale getLocale(); - // public void cleanUp(); + boolean isValid(); + + void registerView(String uid, Object view); + + /** @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); + } }