import javax.naming.InvalidNameException;
import javax.naming.ldap.LdapName;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
import org.argeo.cms.KernelHeader;
-import org.argeo.osgi.useradmin.ArgeoUserAdminException;
+import org.argeo.osgi.useradmin.AbstractUserDirectory;
import org.argeo.osgi.useradmin.UserAdminAggregator;
+import org.argeo.osgi.useradmin.UserDirectoryException;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.useradmin.Authorization;
import org.osgi.service.useradmin.Role;
try {
ROLES_BASE = new LdapName(KernelHeader.ROLES_BASEDN);
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Cannot initialize "
+ throw new UserDirectoryException("Cannot initialize "
+ NodeUserAdmin.class, e);
}
}
private UserAdmin nodeRoles = null;
private Map<LdapName, UserAdmin> userAdmins = new HashMap<LdapName, UserAdmin>();
+ private TransactionSynchronizationRegistry syncRegistry;
+ private TransactionManager transactionManager;
+
@Override
public Role createRole(String name, int type) {
return findUserAdmin(name).createRole(name, type);
@Override
public Authorization getAuthorization(User user) {
UserAdmin userAdmin = findUserAdmin(user.getName());
- // FIXME clarify assumptions
- return userAdmin.getAuthorization(user);
- // String[] roles = auth.getRoles();
- // // Gather system roles
- // Set<String> systemRoles = new HashSet<String>();
- // for(String businessRole:roles){
- //
- // }
- // return null;
+ Authorization rawAuthorization = userAdmin.getAuthorization(user);
+ // gather system roles
+ Set<String> systemRoles = new HashSet<String>();
+ for (String role : rawAuthorization.getRoles()) {
+ Authorization auth = nodeRoles.getAuthorization((User) userAdmin
+ .getRole(role));
+ systemRoles.addAll(Arrays.asList(auth.getRoles()));
+ }
+ return new NodeAuthorization(rawAuthorization.getName(),
+ rawAuthorization.toString(), systemRoles,
+ rawAuthorization.getRoles());
}
//
//
@Override
public synchronized void addUserAdmin(String baseDn, UserAdmin userAdmin) {
+ if (userAdmin instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) userAdmin).setSyncRegistry(syncRegistry);
+
if (baseDn.equals(KernelHeader.ROLES_BASEDN)) {
nodeRoles = userAdmin;
return;
}
if (userAdmins.containsKey(baseDn))
- throw new ArgeoUserAdminException(
+ throw new UserDirectoryException(
"There is already a user admin for " + baseDn);
try {
userAdmins.put(new LdapName(baseDn), userAdmin);
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Badly formatted base DN "
+ throw new UserDirectoryException("Badly formatted base DN "
+ baseDn, e);
}
}
@Override
public synchronized void removeUserAdmin(String baseDn) {
if (baseDn.equals(KernelHeader.ROLES_BASEDN))
- throw new ArgeoUserAdminException("Node roles cannot be removed.");
+ throw new UserDirectoryException("Node roles cannot be removed.");
LdapName base;
try {
base = new LdapName(baseDn);
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Badly formatted base DN "
+ throw new UserDirectoryException("Badly formatted base DN "
+ baseDn, e);
}
if (!userAdmins.containsKey(base))
- throw new ArgeoUserAdminException("There is no user admin for "
+ throw new UserDirectoryException("There is no user admin for "
+ base);
- userAdmins.remove(base);
+ UserAdmin userAdmin = userAdmins.remove(base);
+ if (userAdmin instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) userAdmin).setSyncRegistry(null);
}
private UserAdmin findUserAdmin(String name) {
try {
return findUserAdmin(new LdapName(name));
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Badly formatted name " + name, e);
+ throw new UserDirectoryException("Badly formatted name " + name, e);
}
}
res.add(userAdmins.get(baseDn));
}
if (res.size() == 0)
- throw new ArgeoUserAdminException("Cannot find user admin for "
+ throw new UserDirectoryException("Cannot find user admin for "
+ name);
if (res.size() > 1)
- throw new ArgeoUserAdminException("Multiple user admin found for "
+ throw new UserDirectoryException("Multiple user admin found for "
+ name);
return res.get(0);
}
+
+ public void setTransactionManager(TransactionManager transactionManager) {
+ this.transactionManager = transactionManager;
+ if (nodeRoles instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) nodeRoles)
+ .setTransactionManager(transactionManager);
+ for (UserAdmin userAdmin : userAdmins.values()) {
+ if (userAdmin instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) userAdmin)
+ .setTransactionManager(transactionManager);
+ }
+ }
+
+ public void setSyncRegistry(TransactionSynchronizationRegistry syncRegistry) {
+ this.syncRegistry = syncRegistry;
+ if (nodeRoles instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) nodeRoles).setSyncRegistry(syncRegistry);
+ for (UserAdmin userAdmin : userAdmins.values()) {
+ if (userAdmin instanceof AbstractUserDirectory)
+ ((AbstractUserDirectory) userAdmin)
+ .setSyncRegistry(syncRegistry);
+ }
+ }
+
}