import javax.naming.directory.BasicAttributes;
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
import org.apache.commons.io.IOUtils;
import org.osgi.framework.Filter;
import org.osgi.service.useradmin.User;
/** User admin implementation using LDIF file(s) as backend. */
-public class LdifUserAdmin extends AbstractLdapUserAdmin {
+public class LdifUserAdmin extends AbstractUserDirectory {
SortedMap<LdapName, LdifUser> users = new TreeMap<LdapName, LdifUser>();
SortedMap<LdapName, LdifGroup> groups = new TreeMap<LdapName, LdifGroup>();
// private Map<LdapName, List<LdifGroup>> directMemberOf = new
// TreeMap<LdapName, List<LdifGroup>>();
+ private XaRes xaRes = new XaRes();
public LdifUserAdmin(String uri) {
- this(uri, true);
+ this(uri, readOnlyDefault(uri));
}
public LdifUserAdmin(String uri, boolean isReadOnly) {
try {
setUri(new URI(uri));
} catch (URISyntaxException e) {
- throw new ArgeoUserAdminException("Invalid URI " + uri, e);
+ throw new UserDirectoryException("Invalid URI " + uri, e);
}
- if (!isReadOnly && !getUri().getScheme().equals("file:"))
+ if (!isReadOnly && !getUri().getScheme().equals("file"))
throw new UnsupportedOperationException(getUri().getScheme()
- + "not supported read-write.");
+ + " not supported read-write.");
+
+ }
+
+ public LdifUserAdmin(URI uri, boolean isReadOnly) {
+ setReadOnly(isReadOnly);
+ setUri(uri);
+ if (!isReadOnly && !getUri().getScheme().equals("file"))
+ throw new UnsupportedOperationException(getUri().getScheme()
+ + " not supported read-write.");
}
setUri(null);
}
+ private static boolean readOnlyDefault(String uriStr) {
+ URI uri;
+ try {
+ uri = new URI(uriStr);
+ } catch (Exception e) {
+ throw new UserDirectoryException("Invalid URI " + uriStr, e);
+ }
+ if (uri.getScheme().equals("file")) {
+ File file = new File(uri);
+ return !file.canWrite();
+ }
+ return true;
+ }
+
public void init() {
try {
load(getUri().toURL().openStream());
} catch (Exception e) {
- throw new ArgeoUserAdminException("Cannot open URL " + getUri(), e);
+ throw new UserDirectoryException("Cannot open URL " + getUri(), e);
}
}
public void save() {
if (getUri() == null || isReadOnly())
- throw new ArgeoUserAdminException("Cannot save LDIF user admin");
+ throw new UserDirectoryException("Cannot save LDIF user admin");
try (FileOutputStream out = new FileOutputStream(new File(getUri()))) {
save(out);
} catch (IOException e) {
- throw new ArgeoUserAdminException("Cannot save user admin to "
+ throw new UserDirectoryException("Cannot save user admin to "
+ getUri(), e);
}
}
objectClasses: while (objectClasses.hasMore()) {
String objectClass = objectClasses.next().toString();
if (objectClass.equals("inetOrgPerson")) {
- users.put(key, new LdifUser(key, attributes));
+ users.put(key, new LdifUser(this, key, attributes));
break objectClasses;
} else if (objectClass.equals("groupOfNames")) {
groups.put(key, new LdifGroup(this, key, attributes));
}
// optimise
-// for (LdifGroup group : groups.values())
-// loadMembers(group);
+ // for (LdifGroup group : groups.values())
+ // loadMembers(group);
// indexes
for (String attr : getIndexedUserProperties())
LdifUser otherUser = userIndexes.get(attr).put(
value.toString(), user);
if (otherUser != null)
- throw new ArgeoUserAdminException("User " + user
+ throw new UserDirectoryException("User " + user
+ " and user " + otherUser
+ " both have property " + attr
+ " set to " + value);
}
}
} catch (Exception e) {
- throw new ArgeoUserAdminException(
+ throw new UserDirectoryException(
"Cannot load user admin service from LDIF", e);
}
}
try {
LdapName dn = new LdapName(name);
if (users.containsKey(dn) || groups.containsKey(dn))
- throw new ArgeoUserAdminException("Already a role " + name);
+ throw new UserDirectoryException("Already a role " + name);
BasicAttributes attrs = new BasicAttributes();
attrs.put("dn", dn.toString());
attrs.put(nameRdn.getType(), nameRdn.getValue());
LdifUser newRole;
if (type == Role.USER) {
- newRole = new LdifUser(dn, attrs);
+ newRole = new LdifUser(this, dn, attrs);
users.put(dn, newRole);
} else if (type == Role.GROUP) {
newRole = new LdifGroup(this, dn, attrs);
groups.put(dn, (LdifGroup) newRole);
} else
- throw new ArgeoUserAdminException("Unsupported type " + type);
+ throw new UserDirectoryException("Unsupported type " + type);
return newRole;
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Cannot create role " + name, e);
+ throw new UserDirectoryException("Cannot create role " + name, e);
}
}
else if (groups.containsKey(dn))
role = groups.remove(dn);
else
- throw new ArgeoUserAdminException("There is no role " + name);
+ throw new UserDirectoryException("There is no role " + name);
if (role == null)
return false;
for (LdifGroup group : getDirectGroups(role)) {
-// group.directMembers.remove(role);
- group.getAttributes().get(group.getMemberAttrName())
+ // group.directMembers.remove(role);
+ group.getAttributes().get(getMemberAttributeId())
.remove(dn.toString());
}
if (role instanceof LdifGroup) {
}
return true;
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Cannot create role " + name, e);
+ throw new UserDirectoryException("Cannot create role " + name, e);
}
}
// throw new UnsupportedOperationException();
}
-// protected void loadMembers(LdifGroup group) {
-// group.directMembers = new ArrayList<Role>();
-// for (LdapName ldapName : group.getMemberNames()) {
-// LdifUser role = null;
-// if (groups.containsKey(ldapName))
-// role = groups.get(ldapName);
-// else if (users.containsKey(ldapName))
-// role = users.get(ldapName);
-// else {
-// if (getExternalRoles() != null)
-// role = (LdifUser) getExternalRoles().getRole(
-// ldapName.toString());
-// if (role == null)
-// throw new ArgeoUserAdminException("No role found for "
-// + ldapName);
-// }
-// // role.directMemberOf.add(group);
-// // if (!directMemberOf.containsKey(role.getDn()))
-// // directMemberOf.put(role.getDn(), new ArrayList<LdifGroup>());
-// // directMemberOf.get(role.getDn()).add(group);
-// group.directMembers.add(role);
-// }
-// }
+ // protected void loadMembers(LdifGroup group) {
+ // group.directMembers = new ArrayList<Role>();
+ // for (LdapName ldapName : group.getMemberNames()) {
+ // LdifUser role = null;
+ // if (groups.containsKey(ldapName))
+ // role = groups.get(ldapName);
+ // else if (users.containsKey(ldapName))
+ // role = users.get(ldapName);
+ // else {
+ // if (getExternalRoles() != null)
+ // role = (LdifUser) getExternalRoles().getRole(
+ // ldapName.toString());
+ // if (role == null)
+ // throw new ArgeoUserAdminException("No role found for "
+ // + ldapName);
+ // }
+ // // role.directMemberOf.add(group);
+ // // if (!directMemberOf.containsKey(role.getDn()))
+ // // directMemberOf.put(role.getDn(), new ArrayList<LdifGroup>());
+ // // directMemberOf.get(role.getDn()).add(group);
+ // group.directMembers.add(role);
+ // }
+ // }
@Override
protected List<LdifGroup> getDirectGroups(User user) {
try {
dn = new LdapName(user.getName());
} catch (InvalidNameException e) {
- throw new ArgeoUserAdminException("Badly formatted user name "
+ throw new UserDirectoryException("Badly formatted user name "
+ user.getName(), e);
}
// return Collections.EMPTY_LIST;
}
+ @Override
+ public XAResource getXAResource() {
+ return xaRes;
+ }
+
+ private class XaRes implements XAResource {
+
+ @Override
+ public void commit(Xid xid, boolean onePhase) throws XAException {
+ save();
+ }
+
+ @Override
+ public void end(Xid xid, int flags) throws XAException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void forget(Xid xid) throws XAException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public int getTransactionTimeout() throws XAException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public boolean isSameRM(XAResource xares) throws XAException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public int prepare(Xid xid) throws XAException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public Xid[] recover(int flag) throws XAException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void rollback(Xid xid) throws XAException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean setTransactionTimeout(int seconds) throws XAException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void start(Xid xid, int flags) throws XAException {
+ // TODO Auto-generated method stub
+
+ }
+
+ }
+
}