]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java
Improve ACR.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / auth / CmsSessionImpl.java
index b0824e84bb1924835d0232c1691a7609d8de1807..164d319f197ae92074b2c5965233deb6f7c1be5c 100644 (file)
@@ -5,13 +5,16 @@ import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.time.ZonedDateTime;
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
-import java.util.Hashtable;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
+import java.util.function.Consumer;
 
 import javax.crypto.SecretKey;
 import javax.naming.InvalidNameException;
@@ -21,21 +24,18 @@ import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 import javax.security.auth.x500.X500Principal;
 
-import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.CmsAuth;
 import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.cms.internal.runtime.CmsContextImpl;
 import org.argeo.cms.security.NodeSecurityUtils;
-import org.argeo.api.cms.CmsAuth;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.useradmin.Authorization;
 
 /** Default CMS session implementation. */
 public class CmsSessionImpl implements CmsSession, Serializable {
        private static final long serialVersionUID = 1867719354246307225L;
-       private final static BundleContext bc = FrameworkUtil.getBundle(CmsSessionImpl.class).getBundleContext();
+//     private final static BundleContext bc = FrameworkUtil.getBundle(CmsSessionImpl.class).getBundleContext();
        private final static CmsLog log = CmsLog.getLog(CmsSessionImpl.class);
 
        // private final Subject initialSubject;
@@ -54,7 +54,12 @@ public class CmsSessionImpl implements CmsSession, Serializable {
 
        private Map<String, Object> views = new HashMap<>();
 
-       public CmsSessionImpl(Subject initialSubject, Authorization authorization, Locale locale, String localSessionId) {
+       private List<Consumer<CmsSession>> onCloseCallbacks = Collections.synchronizedList(new ArrayList<>());
+
+       public CmsSessionImpl(UUID uuid, Subject initialSubject, Authorization authorization, Locale locale,
+                       String localSessionId) {
+               Objects.requireNonNull(uuid);
+
                this.creationTime = ZonedDateTime.now();
                this.locale = locale;
                this.accessControlContext = Subject.doAs(initialSubject, new PrivilegedAction<AccessControlContext>() {
@@ -79,18 +84,17 @@ public class CmsSessionImpl implements CmsSession, Serializable {
                        this.userDn = NodeSecurityUtils.ROLE_ANONYMOUS_NAME;
                        this.anonymous = true;
                }
-               this.uuid = UUID.randomUUID();
-               // register as service
-               Hashtable<String, String> props = new Hashtable<>();
-               props.put(CmsSession.USER_DN, userDn.toString());
-               props.put(CmsSession.SESSION_UUID, uuid.toString());
-               props.put(CmsSession.SESSION_LOCAL_ID, localSessionId);
-               serviceRegistration = bc.registerService(CmsSession.class, this, props);
+               this.uuid = uuid;
        }
 
        public void close() {
                end = ZonedDateTime.now();
-               serviceRegistration.unregister();
+               CmsContextImpl.getCmsContext().unregisterCmsSession(this);
+//             serviceRegistration.unregister();
+
+               for (Consumer<CmsSession> onClose : onCloseCallbacks) {
+                       onClose.accept(this);
+               }
 
                try {
                        LoginContext lc;
@@ -108,6 +112,11 @@ public class CmsSessionImpl implements CmsSession, Serializable {
                log.debug("Closed " + this);
        }
 
+       @Override
+       public void addOnCloseCallback(Consumer<CmsSession> onClose) {
+               onCloseCallbacks.add(onClose);
+       }
+
        public Subject getSubject() {
                return Subject.getSubject(accessControlContext);
        }
@@ -190,59 +199,6 @@ public class CmsSessionImpl implements CmsSession, Serializable {
        }
 
        public String toString() {
-               return "CMS Session " + userDn + " local=" + localSessionId + ", uuid=" + uuid;
-       }
-
-       public static CmsSessionImpl getByLocalId(String localId) {
-               Collection<ServiceReference<CmsSession>> sr;
-               try {
-                       sr = bc.getServiceReferences(CmsSession.class, "(" + CmsSession.SESSION_LOCAL_ID + "=" + localId + ")");
-               } catch (InvalidSyntaxException e) {
-                       throw new IllegalArgumentException("Cannot get CMS session for id " + localId, e);
-               }
-               ServiceReference<CmsSession> cmsSessionRef;
-               if (sr.size() == 1) {
-                       cmsSessionRef = sr.iterator().next();
-                       return (CmsSessionImpl) bc.getService(cmsSessionRef);
-               } else if (sr.size() == 0) {
-                       return null;
-               } else
-                       throw new IllegalStateException(sr.size() + " CMS sessions registered for " + localId);
-
-       }
-
-       public static CmsSessionImpl getByUuid(Object uuid) {
-               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 (CmsSessionImpl) bc.getService(cmsSessionRef);
-               } else if (sr.size() == 0) {
-                       return null;
-               } else
-                       throw new IllegalStateException(sr.size() + " CMS sessions registered for " + uuid);
-
-       }
-
-       public static void closeInvalidSessions() {
-               Collection<ServiceReference<CmsSession>> srs;
-               try {
-                       srs = bc.getServiceReferences(CmsSession.class, null);
-                       for (ServiceReference<CmsSession> sr : srs) {
-                               CmsSession cmsSession = bc.getService(sr);
-                               if (!cmsSession.isValid()) {
-                                       ((CmsSessionImpl) cmsSession).close();
-                                       if (log.isDebugEnabled())
-                                               log.debug("Closed expired CMS session " + cmsSession);
-                               }
-                       }
-               } catch (InvalidSyntaxException e) {
-                       throw new IllegalArgumentException("Cannot get CMS sessions", e);
-               }
+               return "CMS Session " + userDn + " localId=" + localSessionId + ", uuid=" + uuid;
        }
 }