X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.enterprise%2Fsrc%2Forg%2Fargeo%2Fosgi%2Fuseradmin%2FUserAdminConf.java;h=bb7345f0b1ca51854434db0aad51348915763fab;hb=438237c2b8c995d4f9562d53bfe4ea63c4442054;hp=093b443702474c0d50ab19e6dec8b540e4b7d4d8;hpb=6decc943ce5bca1b57ef407b7e9c6bb6ad6f3c97;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.enterprise/src/org/argeo/osgi/useradmin/UserAdminConf.java b/org.argeo.enterprise/src/org/argeo/osgi/useradmin/UserAdminConf.java index 093b44370..bb7345f0b 100644 --- a/org.argeo.enterprise/src/org/argeo/osgi/useradmin/UserAdminConf.java +++ b/org.argeo.enterprise/src/org/argeo/osgi/useradmin/UserAdminConf.java @@ -1,25 +1,22 @@ package org.argeo.osgi.useradmin; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; -import java.net.URLDecoder; +import java.net.UnknownHostException; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; -import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.naming.Context; import javax.naming.NamingException; +import javax.naming.ldap.LdapName; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.naming.DnsBrowser; +import org.argeo.naming.NamingUtils; import org.osgi.framework.Constants; /** Properties used to configure user admins. */ @@ -45,11 +42,18 @@ public enum UserAdminConf { /** Read-only source */ readOnly(null), + /** Disabled source */ + disabled(null), + /** Authentication realm */ realm(null); public final static String FACTORY_PID = "org.argeo.osgi.useradmin.config"; - private final static Log log = LogFactory.getLog(UserAdminConf.class); + + public final static String SCHEME_LDAP = "ldap"; + public final static String SCHEME_FILE = "file"; + public final static String SCHEME_OS = "os"; + public final static String SCHEME_IPA = "ipa"; /** The default value. */ private Object def; @@ -127,30 +131,39 @@ public enum UserAdminConf { Hashtable res = new Hashtable(); URI u = new URI(uriStr); String scheme = u.getScheme(); - if (scheme != null && scheme.equals("ipa")) { + if (scheme != null && scheme.equals(SCHEME_IPA)) { u = convertIpaConfig(u); scheme = u.getScheme(); } String path = u.getPath(); + // base DN String bDn = path.substring(path.lastIndexOf('/') + 1, path.length()); + if (bDn.equals("") && SCHEME_OS.equals(scheme)) { + bDn = getBaseDnFromHostname(); + } + if (bDn.endsWith(".ldif")) bDn = bDn.substring(0, bDn.length() - ".ldif".length()); + // Normalize base DN as LDAP name + bDn = new LdapName(bDn).toString(); + String principal = null; String credentials = null; if (scheme != null) - if (scheme.equals("ldap") || scheme.equals("ldaps")) { + if (scheme.equals(SCHEME_LDAP) || scheme.equals("ldaps")) { // TODO additional checks if (u.getUserInfo() != null) { String[] userInfo = u.getUserInfo().split(":"); principal = userInfo.length > 0 ? userInfo[0] : null; credentials = userInfo.length > 1 ? userInfo[1] : null; } - } else if (scheme.equals("file")) { - } else if (scheme.equals("ipa")) { + } else if (scheme.equals(SCHEME_FILE)) { + } else if (scheme.equals(SCHEME_IPA)) { + } else if (scheme.equals(SCHEME_OS)) { } else throw new UserDirectoryException("Unsupported scheme " + scheme); - Map> query = splitQuery(u.getQuery()); + Map> query = NamingUtils.queryToMap(u); for (String key : query.keySet()) { UserAdminConf ldapProp = UserAdminConf.valueOf(key); List values = query.get(key); @@ -161,14 +174,20 @@ public enum UserAdminConf { } } res.put(baseDn.name(), bDn); + if (SCHEME_OS.equals(scheme)) + res.put(readOnly.name(), "true"); if (principal != null) res.put(Context.SECURITY_PRINCIPAL, principal); if (credentials != null) res.put(Context.SECURITY_CREDENTIALS, credentials); - if (scheme != null) { - URI bareUri = new URI(scheme, null, u.getHost(), u.getPort(), - scheme.equals("file") ? u.getPath() : null, null, null); - res.put(uri.name(), bareUri.toString()); + if (scheme != null) {// relative URIs are dealt with externally + if (SCHEME_OS.equals(scheme)) { + res.put(uri.name(), SCHEME_OS + ":///"); + } else { + URI bareUri = new URI(scheme, null, u.getHost(), u.getPort(), + scheme.equals(SCHEME_FILE) ? u.getPath() : null, null, null); + res.put(uri.name(), bareUri.toString()); + } } return res; } catch (Exception e) { @@ -198,9 +217,7 @@ public enum UserAdminConf { } } URI convertedUri = new URI( - "ldap://" + ldapHostsStr + "/" + IpaUtils.domainToUserDirectoryConfigPath(kerberosRealm)); - if (log.isDebugEnabled()) - log.debug("Converted " + uri + " to " + convertedUri); + SCHEME_LDAP + "://" + ldapHostsStr + "/" + IpaUtils.domainToUserDirectoryConfigPath(kerberosRealm)); return convertedUri; } catch (NamingException | IOException | URISyntaxException e) { throw new UserDirectoryException("cannot convert IPA uri " + uri, e); @@ -221,35 +238,32 @@ public enum UserAdminConf { } - private static Map> splitQuery(String query) throws UnsupportedEncodingException { - final Map> query_pairs = new LinkedHashMap>(); - if (query == null) - return query_pairs; - final String[] pairs = query.split("&"); - for (String pair : pairs) { - final int idx = pair.indexOf("="); - final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair; - if (!query_pairs.containsKey(key)) { - query_pairs.put(key, new LinkedList()); - } - final String value = idx > 0 && pair.length() > idx + 1 - ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null; - query_pairs.get(key).add(value); + private static String getBaseDnFromHostname() { + String hostname; + try { + hostname = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + hostname = "localhost.localdomain"; + } + int dotIdx = hostname.indexOf('.'); + if (dotIdx >= 0) { + String domain = hostname.substring(dotIdx + 1, hostname.length()); + String bDn = ("." + domain).replaceAll("\\.", ",dc="); + bDn = bDn.substring(1, bDn.length()); + return bDn; + } else { + return "dc=" + hostname; } - return query_pairs; } - public static void main(String[] args) { - Dictionary props = uriAsProperties("ldap://" + "uid=admin,ou=system:secret@localhost:10389" - + "/dc=example,dc=com" + "?readOnly=false&userObjectClass=person"); - System.out.println(props); - System.out.println(propertiesAsUri(props)); - - System.out.println(uriAsProperties("file://some/dir/dc=example,dc=com.ldif")); - - props = uriAsProperties( - "/dc=example,dc=com.ldif?readOnly=true" + "&userBase=ou=CoWorkers,ou=People&groupBase=ou=Roles"); - System.out.println(props); - System.out.println(propertiesAsUri(props)); + /** + * Hash the base DN in order to have a deterministic string to be used as a cn + * for the underlying user directory. + */ + public static String baseDnHash(Dictionary properties) { + String bDn = (String) properties.get(baseDn.name()); + if (bDn == null) + throw new UserDirectoryException("No baseDn in " + properties); + return DigestUtils.sha1str(bDn); } }