- Introduce PKI utils
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / osgi / useradmin / LdifAuthorization.java
index 8f167c3683c58f7e7537194f50b14881cd6aaae9..3600866af77aa8e8d32f74ff5525bce9fdf4c1e3 100644 (file)
@@ -1,64 +1,80 @@
 package org.argeo.osgi.useradmin;
 
-import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Dictionary;
 import java.util.List;
 
 import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
 
-public class LdifAuthorization implements Authorization {
-       private final LdifUser user;
+public class LdifAuthorization implements Authorization, LdapNames {
+       private final String name;
+       private final String displayName;
+       private final List<String> allRoles;
 
-       public LdifAuthorization(LdifUser user) {
-               this.user = user;
+       public LdifAuthorization(User user, List<Role> allRoles) {
+               if (user == null) {
+                       this.name = null;
+                       this.displayName = "anonymous";
+               } else {
+                       this.name = user.getName();
+                       Dictionary<String, Object> props = user.getProperties();
+                       Object displayName = props.get(LDAP_DISPLAY_NAME);
+                       if (displayName == null)
+                               displayName = props.get(LDAP_CN);
+                       if (displayName == null)
+                               displayName = props.get(LDAP_UID);
+                       if (displayName == null)
+                               displayName = user.getName();
+                       if (displayName == null)
+                               throw new ArgeoUserAdminException(
+                                               "Cannot set display name for " + user);
+                       this.displayName = displayName.toString();
+               }
+               // roles
+               String[] roles = new String[allRoles.size()];
+               for (int i = 0; i < allRoles.size(); i++) {
+                       roles[i] = allRoles.get(i).getName();
+               }
+               this.allRoles = Collections.unmodifiableList(Arrays.asList(roles));
        }
 
        @Override
        public String getName() {
-               if (user == null)
-                       return null;
-               return user.getName();
+               return name;
        }
 
        @Override
        public boolean hasRole(String name) {
-               for (Role role : getAllRoles()) {
-                       if (role.getName().equals(name))
-                               return true;
-               }
-               return false;
+               return allRoles.contains(name);
        }
 
        @Override
        public String[] getRoles() {
-               List<Role> allRoles = getAllRoles();
-               if (user != null)
-                       allRoles.add(0, user);
-               String[] res = new String[allRoles.size()];
-               for (int i = 0; i < allRoles.size(); i++)
-                       res[i] = allRoles.get(i).getName();
-               return res;
+               return allRoles.toArray(new String[allRoles.size()]);
        }
 
-       List<Role> getAllRoles() {
-               List<Role> allRoles = new ArrayList<Role>();
-               if (user != null)
-                       collectRoles(user, allRoles);
-               else
-                       collectAnonymousRoles(allRoles);
-               return allRoles;
+       @Override
+       public int hashCode() {
+               if (name == null)
+                       return super.hashCode();
+               return name.hashCode();
        }
 
-       private void collectRoles(LdifUser user, List<Role> allRoles) {
-               for (LdifGroup group : user.directMemberOf) {
-                       // TODO check for loops
-                       allRoles.add(group);
-                       collectRoles(group, allRoles);
-               }
+       @Override
+       public boolean equals(Object obj) {
+               if (!(obj instanceof Authorization))
+                       return false;
+               Authorization that = (Authorization) obj;
+               if (name == null)
+                       return that.getName() == null;
+               return name.equals(that.getName());
        }
 
-       private void collectAnonymousRoles(List<Role> allRoles) {
-               // TODO gather anonymous roles
+       @Override
+       public String toString() {
+               return displayName;
        }
-
 }