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;
+/** Basic authorization. */
+class LdifAuthorization implements Authorization {
+ private final String name;
+ private final String displayName;
+ private final List<String> allRoles;
- public LdifAuthorization(LdifUser user) {
- this.user = user;
+ @SuppressWarnings("unchecked")
+ 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(LdifName.displayName);
+ if (displayName == null)
+ displayName = props.get(LdifName.cn);
+ if (displayName == null)
+ displayName = props.get(LdifName.uid);
+ if (displayName == null)
+ displayName = user.getName();
+ if (displayName == null)
+ throw new UserDirectoryException("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() {
- 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();
- String[] res = new String[allRoles.size() + 1];
- res[0] = user.getName();
- for (int i = 0; i < allRoles.size(); i++)
- res[i + 1] = allRoles.get(i).getName();
- return res;
+ return allRoles.toArray(new String[allRoles.size()]);
}
- List<Role> getAllRoles() {
- List<Role> allRoles = new ArrayList<Role>();
- collectRoles(user, 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());
}
+ @Override
+ public String toString() {
+ return displayName;
+ }
}