rpms/autofs/devel autofs-5.0.2-add-ldap-schema-discovery.patch, 1.1, 1.2 autofs.spec, 1.221, 1.222
Ian Kent (iankent)
fedora-extras-commits at redhat.com
Wed Sep 5 05:11:47 UTC 2007
Author: iankent
Update of /cvs/pkgs/rpms/autofs/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv23125
Modified Files:
autofs-5.0.2-add-ldap-schema-discovery.patch autofs.spec
Log Message:
* Wed Sep 5 2007 Ian Kent <ikent at redhat.com> - 5.0.2-15
- fix LDAP schema discovery.
autofs-5.0.2-add-ldap-schema-discovery.patch:
Index: autofs-5.0.2-add-ldap-schema-discovery.patch
===================================================================
RCS file: /cvs/pkgs/rpms/autofs/devel/autofs-5.0.2-add-ldap-schema-discovery.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- autofs-5.0.2-add-ldap-schema-discovery.patch 28 Aug 2007 05:45:31 -0000 1.1
+++ autofs-5.0.2-add-ldap-schema-discovery.patch 5 Sep 2007 05:11:13 -0000 1.2
@@ -1,25 +1,6 @@
-diff --git a/include/defaults.h b/include/defaults.h
-index ef58467..9aec11a 100644
---- a/include/defaults.h
-+++ b/include/defaults.h
-@@ -43,11 +43,8 @@ unsigned int defaults_get_timeout(void);
- unsigned int defaults_get_browse_mode(void);
- unsigned int defaults_get_logging(void);
- const char *defaults_get_ldap_server(void);
--const char *defaults_get_map_obj_class(void);
--const char *defaults_get_entry_obj_class(void);
--const char *defaults_get_map_attr(void);
--const char *defaults_get_entry_attr(void);
--const char *defaults_get_value_attr(void);
-+struct ldap_schema *defaults_get_default_schema(void);
-+struct ldap_schema *defaults_get_schema(void);
- unsigned int defaults_get_append_options(void);
- const char *defaults_get_auth_conf_file(void);
-
-diff --git a/include/lookup_ldap.h b/include/lookup_ldap.h
-index 0a9deca..1378b9e 100644
---- a/include/lookup_ldap.h
-+++ b/include/lookup_ldap.h
+diff -up autofs-5.0.2/include/lookup_ldap.h.add-ldap-schema-discovery autofs-5.0.2/include/lookup_ldap.h
+--- autofs-5.0.2/include/lookup_ldap.h.add-ldap-schema-discovery 2007-09-05 12:52:35.000000000 +0800
++++ autofs-5.0.2/include/lookup_ldap.h 2007-09-05 12:52:35.000000000 +0800
@@ -10,6 +10,14 @@
#include <krb5.h>
#endif
@@ -48,164 +29,158 @@
/* TLS and SASL authentication information */
char *auth_conf;
-diff --git a/lib/defaults.c b/lib/defaults.c
-index 4b4acba..b146f13 100644
---- a/lib/defaults.c
-+++ b/lib/defaults.c
-@@ -18,6 +18,7 @@
- #include <string.h>
+diff -up autofs-5.0.2/include/defaults.h.add-ldap-schema-discovery autofs-5.0.2/include/defaults.h
+--- autofs-5.0.2/include/defaults.h.add-ldap-schema-discovery 2007-06-18 15:18:08.000000000 +0800
++++ autofs-5.0.2/include/defaults.h 2007-09-05 12:52:35.000000000 +0800
+@@ -43,11 +43,8 @@ unsigned int defaults_get_timeout(void);
+ unsigned int defaults_get_browse_mode(void);
+ unsigned int defaults_get_logging(void);
+ const char *defaults_get_ldap_server(void);
+-const char *defaults_get_map_obj_class(void);
+-const char *defaults_get_entry_obj_class(void);
+-const char *defaults_get_map_attr(void);
+-const char *defaults_get_entry_attr(void);
+-const char *defaults_get_value_attr(void);
++struct ldap_schema *defaults_get_default_schema(void);
++struct ldap_schema *defaults_get_schema(void);
+ unsigned int defaults_get_append_options(void);
+ const char *defaults_get_auth_conf_file(void);
- #include "defaults.h"
-+#include "lookup_ldap.h"
- #include "log.h"
+diff -up autofs-5.0.2/modules/lookup_ldap.c.add-ldap-schema-discovery autofs-5.0.2/modules/lookup_ldap.c
+--- autofs-5.0.2/modules/lookup_ldap.c.add-ldap-schema-discovery 2007-09-05 12:52:35.000000000 +0800
++++ autofs-5.0.2/modules/lookup_ldap.c 2007-09-05 12:53:10.000000000 +0800
+@@ -42,6 +42,13 @@
- #define DEFAULTS_CONFIG_FILE AUTOFS_CONF_DIR "/autofs"
-@@ -41,16 +42,8 @@
- #define ENV_AUTH_CONF_FILE "AUTH_CONF_FILE"
+ int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
- static const char *default_master_map_name = DEFAULT_MASTER_MAP_NAME;
++static struct ldap_schema common_schema[] = {
++ {"nisMap", "nisMapName", "nisObject", "cn", "nisMapEntry"},
++ {"automountMap", "ou", "automount", "cn", "automountInformation"},
++ {"automountMap", "automountMapName", "automount", "automountKey", "automountInformation"},
++};
++static unsigned int common_schema_count = sizeof(common_schema)/sizeof(struct ldap_schema);
++
+ int bind_ldap_anonymous(LDAP *ldap, struct lookup_context *ctxt)
+ {
+ int rv;
+@@ -738,54 +745,15 @@ done:
+ return 1;
+ }
+
+-static int get_default_schema(struct lookup_context *ctxt)
+-{
+- ctxt->map_obj_class = (char *) defaults_get_map_obj_class();
+- if (!ctxt->map_obj_class)
+- return 0;
-
--static const char *default_ldap_server = DEFAULT_LDAP_SERVER;
+- ctxt->entry_obj_class = (char *) defaults_get_entry_obj_class();
+- if (!ctxt->entry_obj_class)
+- goto free_moc;
-
--static const char *default_map_obj_class = DEFAULT_MAP_OBJ_CLASS;
--static const char *default_entry_obj_class = DEFAULT_ENTRY_OBJ_CLASS;
--static const char *default_map_attr = DEFAULT_MAP_ATTR;
--static const char *default_entry_attr = DEFAULT_ENTRY_ATTR;
--static const char *default_value_attr = DEFAULT_VALUE_ATTR;
+- ctxt->map_attr = (char *) defaults_get_map_attr();
+- if (!ctxt->map_attr)
+- goto free_eoc;
-
--static const char *default_auth_conf_file = DEFAULT_AUTH_CONF_FILE;
-+static const char *default_ldap_server = DEFAULT_LDAP_SERVER;
-+static const char *default_auth_conf_file = DEFAULT_AUTH_CONF_FILE;
-
- static char *get_env_string(const char *name)
+- ctxt->entry_attr = (char *) defaults_get_entry_attr();
+- if (!ctxt->entry_attr)
+- goto free_ma;
+-
+- ctxt->value_attr = (char *) defaults_get_value_attr();
+- if (!ctxt->value_attr)
+- goto free_ea;
+-
+- return 1;
+-
+-free_ea:
+- free(ctxt->entry_attr);
+-free_ma:
+- free(ctxt->map_attr);
+-free_eoc:
+- free(ctxt->entry_obj_class);
+-free_moc:
+- free(ctxt->map_obj_class);
+-
+- ctxt->map_obj_class = NULL;
+- ctxt->entry_obj_class = NULL;
+- ctxt->map_attr = NULL;
+- ctxt->entry_attr = NULL;
+-
+- return 0;
+-}
+-
+ static void free_context(struct lookup_context *ctxt)
{
-@@ -285,59 +278,120 @@ const char *defaults_get_ldap_server(void)
- return (const char *) server;
+- if (ctxt->map_obj_class) {
+- free(ctxt->map_obj_class);
+- free(ctxt->entry_obj_class);
+- free(ctxt->map_attr);
+- free(ctxt->entry_attr);
++ if (ctxt->schema) {
++ free(ctxt->schema->map_class);
++ free(ctxt->schema->map_attr);
++ free(ctxt->schema->entry_class);
++ free(ctxt->schema->entry_attr);
++ free(ctxt->schema->value_attr);
++ free(ctxt->schema);
+ }
+ if (ctxt->auth_conf)
+ free(ctxt->auth_conf);
+@@ -808,19 +776,15 @@ static void free_context(struct lookup_c
+ return;
}
--const char *defaults_get_map_obj_class(void)
-+struct ldap_schema *defaults_get_default_schema(void)
+-static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt)
++static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *class, const char *key)
{
-- char *moc;
-+ struct ldap_schema *schema;
-+ char *mc, *ma, *ec, *ea, *va;
-
-- moc = get_env_string(ENV_NAME_MAP_OBJ_CLASS);
-- if (!moc)
-- return strdup(default_map_obj_class);
-+ mc = strdup(DEFAULT_MAP_OBJ_CLASS);
-+ if (!mc)
-+ return NULL;
-
-- return (const char *) moc;
--}
-+ ma = strdup(DEFAULT_MAP_ATTR);
-+ if (!ma) {
-+ free(mc);
-+ return NULL;
-+ }
-
--const char *defaults_get_entry_obj_class(void)
--{
-- char *eoc;
-+ ec = strdup(DEFAULT_ENTRY_OBJ_CLASS);
-+ if (!ec) {
-+ free(mc);
-+ free(ma);
-+ return NULL;
-+ }
-
-- eoc = get_env_string(ENV_NAME_ENTRY_OBJ_CLASS);
-- if (!eoc)
-- return strdup(default_entry_obj_class);
-+ ea = strdup(DEFAULT_ENTRY_ATTR);
-+ if (!ea) {
-+ free(mc);
-+ free(ma);
-+ free(ec);
-+ return NULL;
-+ }
-
-- return (const char *) eoc;
--}
-+ va = strdup(DEFAULT_VALUE_ATTR);
-+ if (!va) {
-+ free(mc);
-+ free(ma);
-+ free(ec);
-+ free(ea);
-+ return NULL;
-+ }
-
--const char *defaults_get_map_attr(void)
--{
-- char *ma;
-+ schema = malloc(sizeof(struct ldap_schema));
-+ if (!schema) {
-+ free(mc);
-+ free(ma);
-+ free(ec);
-+ free(ea);
-+ free(va);
-+ return NULL;
-+ }
+ char buf[PARSE_MAX_BUF];
+ char *query, *dn;
+ LDAPMessage *result, *e;
+- char *class, *key;
+ char *attrs[2];
+ int scope;
+ int rv, l;
-- ma = get_env_string(ENV_NAME_MAP_ATTR);
-- if (!ma)
-- return strdup(default_map_attr);
-+ schema->map_class = mc;
-+ schema->map_attr = ma;
-+ schema->entry_class = ec;
-+ schema->entry_attr = ea;
-+ schema->value_attr = va;
+- class = ctxt->map_obj_class;
+- key = ctxt->map_attr;
+-
+ attrs[0] = LDAP_NO_ATTRS;
+ attrs[1] = NULL;
-- return (const char *) ma;
-+ return schema;
+@@ -890,6 +854,90 @@ static int get_query_dn(LDAP *ldap, stru
+ return 1;
}
--const char *defaults_get_entry_attr(void)
-+struct ldap_schema *defaults_get_schema(void)
- {
-- char *ea;
++static struct ldap_schema *alloc_common_schema(struct ldap_schema *s)
++{
+ struct ldap_schema *schema;
+ char *mc, *ma, *ec, *ea, *va;
-
-- ea = get_env_string(ENV_NAME_ENTRY_ATTR);
-- if (!ea)
-- return strdup(default_entry_attr);
-+ mc = get_env_string(ENV_NAME_MAP_OBJ_CLASS);
++
++ mc = strdup(s->map_class);
+ if (!mc)
+ return NULL;
-
-- return (const char *) ea;
--}
-+ ma = get_env_string(ENV_NAME_MAP_ATTR);
++
++ ma = strdup(s->map_attr);
+ if (!ma) {
+ free(mc);
+ return NULL;
+ }
-
--const char *defaults_get_value_attr(void)
--{
-- char *va;
-+ ec = get_env_string(ENV_NAME_ENTRY_OBJ_CLASS);
++
++ ec = strdup(s->entry_class);
+ if (!ec) {
+ free(mc);
+ free(ma);
+ return NULL;
+ }
+
-+ ea = get_env_string(ENV_NAME_ENTRY_ATTR);
++ ea = strdup(s->entry_attr);
+ if (!ea) {
+ free(mc);
+ free(ma);
+ free(ec);
+ return NULL;
+ }
-
- va = get_env_string(ENV_NAME_VALUE_ATTR);
-- if (!va)
-- return strdup(default_value_attr);
++
++ va = strdup(s->value_attr);
+ if (!va) {
+ free(mc);
+ free(ma);
@@ -229,287 +204,287 @@
+ schema->entry_class = ec;
+ schema->entry_attr = ea;
+ schema->value_attr = va;
-
-- return (const char *) va;
++
+ return schema;
- }
-
- unsigned int defaults_get_append_options(void)
-diff --git a/man/auto.master.5.in b/man/auto.master.5.in
-index 69c796e..249c9a7 100644
---- a/man/auto.master.5.in
-+++ b/man/auto.master.5.in
-@@ -191,17 +191,25 @@ The old style
- is also understood. Alternatively, the type can be obtained from the Name Service Switch
- configuration, in which case the map name alone must be given.
- .P
--The default LDAP schema is the NIS schema described in RFC 2307.
--Entries in the nisMap schema are \fBnisObject\fP objects in
-+If no schema is set in the autofs configuration then autofs will check
-+each of the commonly used schema for a valid entry and if one is found
-+it will used for subsequent lookups.
-+.P
-+There are three common schemas in use:
-+.TP
-+.I nisMap
-+Entries in the \fBnisMap\fP schema are \fBnisObject\fP objects in
- the specified subtree, where the \fBcn\fP attribute is the key
- (the wildcard key is "/"), and the \fBnisMapEntry\fP attribute
- contains the information used by the automounter.
--.P
--Entries in the automountMap schema are \fBautomount\fP objects in
--the specified subtree, where the \fBcn\fP or \fBautomountKey\fP attribute
--(depending on local usage) is the key (the wildcard key is "/"), and the
--\fBautomountInformation\fP attribute contains the information used by the
--automounter.
-+.TP
-+.I automountMap
-+The \fBautomountMap\fP schema has two variations that differ in the attribute
-+used for the map key. Entries in the automountMap schema are \fBautomount\fP
-+objects in the specified subtree, where the \fBcn\fP or \fBautomountKey\fP
-+attribute (depending on local usage) is the key (the wildcard key is "/"),
-+and the \fBautomountInformation\fP attribute contains the information used
-+by the automounter. Note that the \fBcn\fP attribute is case insensitive.
- .P
- The object classes and attributes used for accessing automount maps in
- LDAP can be changed by setting entries in the autofs configuration
-@@ -209,61 +217,44 @@ located in
- .nh
- .BR @@autofsconfdir@@/autofs .
- .hy
-+.TP
-+.B NOTE:
-+If a schema is given in the configuration then all the schema configuration
-+values must be set, any partial schema specification will be ignored.
- .P
- The configuration settings available are:
- .TP
--\fBMAP_OBJECT_CLASS\fP
--The map object class. Its Default value is "nisMap". In the
--.nh
--automountMap
--.hy
--schema this corresponds to the class
--.nh
--.BR automountMap .
--.hy
-+.B MAP_OBJECT_CLASS
-+The map object class. In the \fBnisMap\fP schema this corresponds to the class
-+\fBnisMap\fP and in the \fBautomountMap\fP schema it corresponds to the class
-+\fBautomountMap\fP.
- .TP
- .B ENTRY_OBJECT_CLASS
--The map entry object class. Its default value is \fBnisObject\fP.
--In the automountMap schema this corresponds to the class
--.nh
--.BR automount .
--.hy
-+The map entry object class. In the \fBnisMap\fP schema this corresponds
-+to the class \fBnisObject\fP and in the \fBautomountMap\fP schema it
-+corresponds to the class \fBautomount\fP.
- .TP
- .B MAP_ATTRIBUTE
- The attribute used to identify the name of the map to which this
--entry belongs. Its default value is
--.nh
--.BR nisMapName .
--.hy
--In the
--.nh
--automountMap
--.hy
--schema this corresponds to the attributes \fBou\fP or
--.nh
--.BR automountMapName .
--.hy
-+entry belongs. In the \fBnisMap\fP schema this corresponds to the attribute
-+\fBnisMapName\fP and in the \fBautomountMap\fP schema it corresponds to the
-+attribute \fBou\fP or \fBautomountMapName\fP.
- .TP
- .B ENTRY_ATTRIBUTE
--The attribute used to identify a map key. Its default value is
--In the
--.nh
--automountMap
--.hy
--schema this corresponds to the attribute
--.nh
--.BR automountKey .
--.hy
-+The attribute used to identify a map key. In the \fBnisMap\fP schema this
-+corresponds to the attribute \fBcn\fP and in the \fBautomountMap\fP schema
-+it corresponds to the attribute \fBautomountKey\fP.
- .TP
- .B VALUE_ATTRIBUTE
--The attribute used to identify the value of the map entry. Its default
--value is
--.nh
--.BR BnisMapEntry .
--.hy
--In the automountMap schema this corresponds to the attribute
--.nh
--.BR automountInformation .
-+The attribute used to identify the value of the map entry. In the \fBnisMap\fP
-+schema this corresponds to the attribute \fBnisMapEntry\fP and in the \fBautomountMap\fP
-+schema it corresponds to the attribute \fBautomountInformation\fP.
-+.TP
-+.B NOTE:
-+It is essential that entries use class and attribute in a consistent
-+manner for correct operation of autofs. For example mixing \fBcn\fP and
-+\fBautomountKey\fP attributes in \fBautomount\fP schema map entries won't
-+work as expected.
- .SH LDAP AUTHENTICATION, ENCRYPTED AND CERTIFIED CONNECTIONS
- LDAP authenticated binds, TLS encrypted connections and certification
- may be used by setting appropriate values in the autofs authentication
-diff --git a/man/automount.8 b/man/automount.8
-index fc1846a..da67a5c 100644
---- a/man/automount.8
-+++ b/man/automount.8
-@@ -102,6 +102,8 @@ started they will be recoverd unless they are no longer present in
- the map in which case they need to umounted manually.
- .SH "SEE ALSO"
- .BR autofs (5),
-+.BR autofs (8),
-+.BR auto.master (5),
- .BR mount (8).
- .SH BUGS
- Don't know, I've fixed everything I know about.
-diff --git a/modules/lookup_ldap.c b/modules/lookup_ldap.c
-index a412797..d5e666b 100644
---- a/modules/lookup_ldap.c
-+++ b/modules/lookup_ldap.c
-@@ -42,6 +42,13 @@
-
- int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
-
-+static struct ldap_schema common_schema[] = {
-+ {"nisMap", "nisMapName", "nisObject", "cn", "nisMapEntry"},
-+ {"automountMap", "ou", "automount", "cn", "automountInformation"},
-+ {"automountMap", "automountMapName", "automount", "automountKey", "automountInformation"},
-+};
-+static unsigned int common_schema_count = sizeof(common_schema)/sizeof(struct ldap_schema);
++}
+
- int bind_ldap_anonymous(LDAP *ldap, struct lookup_context *ctxt)
- {
- int rv;
-@@ -738,54 +745,15 @@ done:
- return 1;
- }
++static int find_query_dn(LDAP *ldap, struct lookup_context *ctxt)
++{
++ struct ldap_schema *schema;
++ unsigned int i;
++
++ if (ctxt->schema)
++ return 0;
++
++ for (i = 0; i < common_schema_count; i++) {
++ const char *class = common_schema[i].map_class;
++ const char *key = common_schema[i].map_attr;
++ if (get_query_dn(ldap, ctxt, class, key)) {
++ schema = alloc_common_schema(&common_schema[i]);
++ if (!schema) {
++ error(LOGOPT_ANY,
++ MODPREFIX "failed to allocate schema");
++ return 0;
++ }
++ ctxt->schema = schema;
++ return 1;
++ }
++ }
++
++ return 0;
++}
++
+ /*
+ * This initializes a context (persistent non-global data) for queries to
+ * this module. Return zero if we succeed.
+@@ -926,13 +974,6 @@ int lookup_init(const char *mapfmt, int
+ return 1;
+ }
--static int get_default_schema(struct lookup_context *ctxt)
--{
-- ctxt->map_obj_class = (char *) defaults_get_map_obj_class();
-- if (!ctxt->map_obj_class)
-- return 0;
--
-- ctxt->entry_obj_class = (char *) defaults_get_entry_obj_class();
-- if (!ctxt->entry_obj_class)
-- goto free_moc;
--
-- ctxt->map_attr = (char *) defaults_get_map_attr();
-- if (!ctxt->map_attr)
-- goto free_eoc;
--
-- ctxt->entry_attr = (char *) defaults_get_entry_attr();
-- if (!ctxt->entry_attr)
-- goto free_ma;
--
-- ctxt->value_attr = (char *) defaults_get_value_attr();
-- if (!ctxt->value_attr)
-- goto free_ea;
--
-- return 1;
+- /* Get default schema for queries */
+- if (!get_default_schema(ctxt)) {
+- error(LOGOPT_ANY, MODPREFIX "cannot set default schema");
+- free_context(ctxt);
+- return 1;
+- }
-
--free_ea:
-- free(ctxt->entry_attr);
--free_ma:
-- free(ctxt->map_attr);
--free_eoc:
-- free(ctxt->entry_obj_class);
--free_moc:
-- free(ctxt->map_obj_class);
+ #ifdef WITH_SASL
+ /*
+ * Determine which authentication mechanism to use. We sanity-
+@@ -954,13 +995,31 @@ int lookup_init(const char *mapfmt, int
+ return 1;
+ }
+
+- ret = get_query_dn(ldap, ctxt);
+- unbind_ldap_connection(ldap, ctxt);
+- if (!ret) {
+- error(LOGOPT_ANY, MODPREFIX "failed to get query dn");
+- free_context(ctxt);
+- return 1;
++ /*
++ * Get default schema for queries.
++ * If the schema isn't defined in the configuration then check for
++ * presence of a map dn in the common schemas.
++ */
++ ctxt->schema = defaults_get_schema();
++ if (!ctxt->schema) {
++ if (!find_query_dn(ldap, ctxt)) {
++ unbind_ldap_connection(ldap, ctxt);
++ error(LOGOPT_ANY,
++ MODPREFIX "failed to find valid query dn");
++ free_context(ctxt);
++ return 1;
++ }
++ } else {
++ const char *class = ctxt->schema->map_class;
++ const char *key = ctxt->schema->map_attr;
++ if (!get_query_dn(ldap, ctxt, class, key)) {
++ unbind_ldap_connection(ldap, ctxt);
++ error(LOGOPT_ANY, MODPREFIX "failed to get query dn");
++ free_context(ctxt);
++ return 1;
++ }
+ }
++ unbind_ldap_connection(ldap, ctxt);
+
+ /* Open the parser, if we can. */
+ ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1);
+@@ -990,9 +1049,9 @@ int lookup_read_master(struct master *ma
+ int scope = LDAP_SCOPE_SUBTREE;
+ LDAP *ldap;
+
+- class = ctxt->entry_obj_class;
+- entry = ctxt->entry_attr;
+- info = ctxt->value_attr;
++ class = ctxt->schema->entry_class;
++ entry = ctxt->schema->entry_attr;
++ info = ctxt->schema->value_attr;
+
+ attrs[0] = entry;
+ attrs[1] = info;
+@@ -1141,9 +1200,9 @@ static int read_one_map(struct autofs_po
+
+ mc = source->mc;
+
+- class = ctxt->entry_obj_class;
+- entry = ctxt->entry_attr;
+- info = ctxt->value_attr;
++ class = ctxt->schema->entry_class;
++ entry = ctxt->schema->entry_attr;
++ info = ctxt->schema->value_attr;
+
+ attrs[0] = entry;
+ attrs[1] = info;
+@@ -1438,9 +1497,9 @@ static int lookup_one(struct autofs_poin
+ return CHE_FAIL;
+ }
+
+- class = ctxt->entry_obj_class;
+- entry = ctxt->entry_attr;
+- info = ctxt->value_attr;
++ class = ctxt->schema->entry_class;
++ entry = ctxt->schema->entry_attr;
++ info = ctxt->schema->value_attr;
+
+ attrs[0] = entry;
+ attrs[1] = info;
+diff -up autofs-5.0.2/lib/defaults.c.add-ldap-schema-discovery autofs-5.0.2/lib/defaults.c
+--- autofs-5.0.2/lib/defaults.c.add-ldap-schema-discovery 2007-06-18 15:18:08.000000000 +0800
++++ autofs-5.0.2/lib/defaults.c 2007-09-05 12:52:35.000000000 +0800
+@@ -18,6 +18,7 @@
+ #include <string.h>
+
+ #include "defaults.h"
++#include "lookup_ldap.h"
+ #include "log.h"
+
+ #define DEFAULTS_CONFIG_FILE AUTOFS_CONF_DIR "/autofs"
+@@ -41,16 +42,8 @@
+ #define ENV_AUTH_CONF_FILE "AUTH_CONF_FILE"
+
+ static const char *default_master_map_name = DEFAULT_MASTER_MAP_NAME;
-
-- ctxt->map_obj_class = NULL;
-- ctxt->entry_obj_class = NULL;
-- ctxt->map_attr = NULL;
-- ctxt->entry_attr = NULL;
+-static const char *default_ldap_server = DEFAULT_LDAP_SERVER;
-
-- return 0;
--}
+-static const char *default_map_obj_class = DEFAULT_MAP_OBJ_CLASS;
+-static const char *default_entry_obj_class = DEFAULT_ENTRY_OBJ_CLASS;
+-static const char *default_map_attr = DEFAULT_MAP_ATTR;
+-static const char *default_entry_attr = DEFAULT_ENTRY_ATTR;
+-static const char *default_value_attr = DEFAULT_VALUE_ATTR;
-
- static void free_context(struct lookup_context *ctxt)
+-static const char *default_auth_conf_file = DEFAULT_AUTH_CONF_FILE;
++static const char *default_ldap_server = DEFAULT_LDAP_SERVER;
++static const char *default_auth_conf_file = DEFAULT_AUTH_CONF_FILE;
+
+ static char *get_env_string(const char *name)
{
-- if (ctxt->map_obj_class) {
-- free(ctxt->map_obj_class);
-- free(ctxt->entry_obj_class);
-- free(ctxt->map_attr);
-- free(ctxt->entry_attr);
-+ if (ctxt->schema) {
-+ free(ctxt->schema->map_class);
-+ free(ctxt->schema->map_attr);
-+ free(ctxt->schema->entry_class);
-+ free(ctxt->schema->entry_attr);
-+ free(ctxt->schema->value_attr);
-+ free(ctxt->schema);
- }
- if (ctxt->auth_conf)
- free(ctxt->auth_conf);
-@@ -808,19 +776,15 @@ static void free_context(struct lookup_context *ctxt)
- return;
+@@ -285,59 +278,120 @@ const char *defaults_get_ldap_server(voi
+ return (const char *) server;
}
--static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt)
-+static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt, const char *class, const char *key)
+-const char *defaults_get_map_obj_class(void)
++struct ldap_schema *defaults_get_default_schema(void)
{
- char buf[PARSE_MAX_BUF];
- char *query, *dn;
- LDAPMessage *result, *e;
-- char *class, *key;
- char *attrs[2];
- int scope;
- int rv, l;
+- char *moc;
++ struct ldap_schema *schema;
++ char *mc, *ma, *ec, *ea, *va;
-- class = ctxt->map_obj_class;
-- key = ctxt->map_attr;
--
- attrs[0] = LDAP_NO_ATTRS;
- attrs[1] = NULL;
+- moc = get_env_string(ENV_NAME_MAP_OBJ_CLASS);
+- if (!moc)
+- return strdup(default_map_obj_class);
++ mc = strdup(DEFAULT_MAP_OBJ_CLASS);
++ if (!mc)
++ return NULL;
-@@ -890,6 +854,90 @@ static int get_query_dn(LDAP *ldap, struct lookup_context *ctxt)
- return 1;
+- return (const char *) moc;
+-}
++ ma = strdup(DEFAULT_MAP_ATTR);
++ if (!ma) {
++ free(mc);
++ return NULL;
++ }
+
+-const char *defaults_get_entry_obj_class(void)
+-{
+- char *eoc;
++ ec = strdup(DEFAULT_ENTRY_OBJ_CLASS);
++ if (!ec) {
++ free(mc);
++ free(ma);
++ return NULL;
++ }
+
+- eoc = get_env_string(ENV_NAME_ENTRY_OBJ_CLASS);
+- if (!eoc)
+- return strdup(default_entry_obj_class);
++ ea = strdup(DEFAULT_ENTRY_ATTR);
++ if (!ea) {
++ free(mc);
++ free(ma);
++ free(ec);
++ return NULL;
++ }
+
+- return (const char *) eoc;
+-}
++ va = strdup(DEFAULT_VALUE_ATTR);
++ if (!va) {
++ free(mc);
++ free(ma);
++ free(ec);
++ free(ea);
++ return NULL;
++ }
+
+-const char *defaults_get_map_attr(void)
+-{
+- char *ma;
++ schema = malloc(sizeof(struct ldap_schema));
++ if (!schema) {
++ free(mc);
++ free(ma);
++ free(ec);
++ free(ea);
++ free(va);
++ return NULL;
++ }
+
+- ma = get_env_string(ENV_NAME_MAP_ATTR);
+- if (!ma)
+- return strdup(default_map_attr);
++ schema->map_class = mc;
++ schema->map_attr = ma;
++ schema->entry_class = ec;
++ schema->entry_attr = ea;
++ schema->value_attr = va;
+
+- return (const char *) ma;
++ return schema;
}
-+static struct ldap_schema *alloc_common_schema(struct ldap_schema *s)
-+{
+-const char *defaults_get_entry_attr(void)
++struct ldap_schema *defaults_get_schema(void)
+ {
+- char *ea;
+ struct ldap_schema *schema;
+ char *mc, *ma, *ec, *ea, *va;
-+
-+ mc = strdup(s->map_class);
+
+- ea = get_env_string(ENV_NAME_ENTRY_ATTR);
+- if (!ea)
+- return strdup(default_entry_attr);
++ mc = get_env_string(ENV_NAME_MAP_OBJ_CLASS);
+ if (!mc)
+ return NULL;
-+
-+ ma = strdup(s->map_attr);
+
+- return (const char *) ea;
+-}
++ ma = get_env_string(ENV_NAME_MAP_ATTR);
+ if (!ma) {
+ free(mc);
+ return NULL;
-+ }
-+
-+ ec = strdup(s->entry_class);
++ }
+
+-const char *defaults_get_value_attr(void)
+-{
+- char *va;
++ ec = get_env_string(ENV_NAME_ENTRY_OBJ_CLASS);
+ if (!ec) {
+ free(mc);
+ free(ma);
+ return NULL;
+ }
+
-+ ea = strdup(s->entry_attr);
++ ea = get_env_string(ENV_NAME_ENTRY_ATTR);
+ if (!ea) {
+ free(mc);
+ free(ma);
+ free(ec);
+ return NULL;
+ }
-+
-+ va = strdup(s->value_attr);
+
+ va = get_env_string(ENV_NAME_VALUE_ATTR);
+- if (!va)
+- return strdup(default_value_attr);
+ if (!va) {
+ free(mc);
+ free(ma);
@@ -533,118 +508,146 @@
+ schema->entry_class = ec;
+ schema->entry_attr = ea;
+ schema->value_attr = va;
-+
-+ return schema;
-+}
-+
-+static int find_query_dn(LDAP *ldap, struct lookup_context *ctxt)
-+{
-+ struct ldap_schema *schema;
-+ unsigned int i;
-+
-+ if (ctxt->schema)
-+ return 0;
-+
-+ for (i = 0; i < common_schema_count; i++) {
-+ const char *class = common_schema[i].map_class;
-+ const char *key = common_schema[i].map_attr;
-+ if (get_query_dn(ldap, ctxt, class, key)) {
-+ schema = alloc_common_schema(&common_schema[i]);
-+ if (!schema) {
-+ error(LOGOPT_ANY,
-+ MODPREFIX "failed to allocate schema");
-+ return 0;
-+ }
-+ ctxt->schema = schema;
-+ return 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
- /*
- * This initializes a context (persistent non-global data) for queries to
- * this module. Return zero if we succeed.
-@@ -926,13 +974,6 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co
- return 1;
- }
-
-- /* Get default schema for queries */
-- if (!get_default_schema(ctxt)) {
-- error(LOGOPT_ANY, MODPREFIX "cannot set default schema");
-- free_context(ctxt);
-- return 1;
-- }
--
- #ifdef WITH_SASL
- /*
- * Determine which authentication mechanism to use. We sanity-
-@@ -954,13 +995,22 @@ int lookup_init(const char *mapfmt, int argc, const char *const *argv, void **co
- return 1;
- }
-
-- ret = get_query_dn(ldap, ctxt);
-- unbind_ldap_connection(ldap, ctxt);
-- if (!ret) {
-- error(LOGOPT_ANY, MODPREFIX "failed to get query dn");
-- free_context(ctxt);
-- return 1;
-+ /*
-+ * Get default schema for queries.
-+ * If the schema isn't defined in the configuration then check for
-+ * presence of a map dn in the common schemas.
-+ */
-+ ctxt->schema = defaults_get_schema();
-+ if (!ctxt->schema) {
-+ if (!find_query_dn(ldap, ctxt)) {
-+ unbind_ldap_connection(ldap, ctxt);
-+ error(LOGOPT_ANY,
-+ MODPREFIX "failed to find valid query dn");
-+ free_context(ctxt);
-+ return 1;
-+ }
- }
-+ unbind_ldap_connection(ldap, ctxt);
-
- /* Open the parser, if we can. */
- ctxt->parse = open_parse(mapfmt, MODPREFIX, argc - 1, argv + 1);
-@@ -990,9 +1040,9 @@ int lookup_read_master(struct master *master, time_t age, void *context)
- int scope = LDAP_SCOPE_SUBTREE;
- LDAP *ldap;
-
-- class = ctxt->entry_obj_class;
-- entry = ctxt->entry_attr;
-- info = ctxt->value_attr;
-+ class = ctxt->schema->entry_class;
-+ entry = ctxt->schema->entry_attr;
-+ info = ctxt->schema->value_attr;
-
- attrs[0] = entry;
- attrs[1] = info;
-@@ -1141,9 +1191,9 @@ static int read_one_map(struct autofs_point *ap,
-
- mc = source->mc;
-
-- class = ctxt->entry_obj_class;
-- entry = ctxt->entry_attr;
-- info = ctxt->value_attr;
-+ class = ctxt->schema->entry_class;
-+ entry = ctxt->schema->entry_attr;
-+ info = ctxt->schema->value_attr;
-
- attrs[0] = entry;
- attrs[1] = info;
-@@ -1438,9 +1488,9 @@ static int lookup_one(struct autofs_point *ap,
- return CHE_FAIL;
- }
-- class = ctxt->entry_obj_class;
-- entry = ctxt->entry_attr;
-- info = ctxt->value_attr;
-+ class = ctxt->schema->entry_class;
-+ entry = ctxt->schema->entry_attr;
-+ info = ctxt->schema->value_attr;
+- return (const char *) va;
++ return schema;
+ }
- attrs[0] = entry;
- attrs[1] = info;
+ unsigned int defaults_get_append_options(void)
+diff -up autofs-5.0.2/man/auto.master.5.in.add-ldap-schema-discovery autofs-5.0.2/man/auto.master.5.in
+--- autofs-5.0.2/man/auto.master.5.in.add-ldap-schema-discovery 2007-09-05 12:52:35.000000000 +0800
++++ autofs-5.0.2/man/auto.master.5.in 2007-09-05 12:52:35.000000000 +0800
+@@ -191,17 +191,25 @@ The old style
+ is also understood. Alternatively, the type can be obtained from the Name Service Switch
+ configuration, in which case the map name alone must be given.
+ .P
+-The default LDAP schema is the NIS schema described in RFC 2307.
+-Entries in the nisMap schema are \fBnisObject\fP objects in
++If no schema is set in the autofs configuration then autofs will check
++each of the commonly used schema for a valid entry and if one is found
++it will used for subsequent lookups.
++.P
++There are three common schemas in use:
++.TP
++.I nisMap
++Entries in the \fBnisMap\fP schema are \fBnisObject\fP objects in
+ the specified subtree, where the \fBcn\fP attribute is the key
+ (the wildcard key is "/"), and the \fBnisMapEntry\fP attribute
+ contains the information used by the automounter.
+-.P
+-Entries in the automountMap schema are \fBautomount\fP objects in
+-the specified subtree, where the \fBcn\fP or \fBautomountKey\fP attribute
+-(depending on local usage) is the key (the wildcard key is "/"), and the
+-\fBautomountInformation\fP attribute contains the information used by the
+-automounter.
++.TP
++.I automountMap
++The \fBautomountMap\fP schema has two variations that differ in the attribute
++used for the map key. Entries in the automountMap schema are \fBautomount\fP
++objects in the specified subtree, where the \fBcn\fP or \fBautomountKey\fP
++attribute (depending on local usage) is the key (the wildcard key is "/"),
++and the \fBautomountInformation\fP attribute contains the information used
++by the automounter. Note that the \fBcn\fP attribute is case insensitive.
+ .P
+ The object classes and attributes used for accessing automount maps in
+ LDAP can be changed by setting entries in the autofs configuration
+@@ -209,61 +217,44 @@ located in
+ .nh
+ .BR @@autofsconfdir@@/autofs .
+ .hy
++.TP
++.B NOTE:
++If a schema is given in the configuration then all the schema configuration
++values must be set, any partial schema specification will be ignored.
+ .P
+ The configuration settings available are:
+ .TP
+-\fBMAP_OBJECT_CLASS\fP
+-The map object class. Its Default value is "nisMap". In the
+-.nh
+-automountMap
+-.hy
+-schema this corresponds to the class
+-.nh
+-.BR automountMap .
+-.hy
++.B MAP_OBJECT_CLASS
++The map object class. In the \fBnisMap\fP schema this corresponds to the class
++\fBnisMap\fP and in the \fBautomountMap\fP schema it corresponds to the class
++\fBautomountMap\fP.
+ .TP
+ .B ENTRY_OBJECT_CLASS
+-The map entry object class. Its default value is \fBnisObject\fP.
+-In the automountMap schema this corresponds to the class
+-.nh
+-.BR automount .
+-.hy
++The map entry object class. In the \fBnisMap\fP schema this corresponds
++to the class \fBnisObject\fP and in the \fBautomountMap\fP schema it
++corresponds to the class \fBautomount\fP.
+ .TP
+ .B MAP_ATTRIBUTE
+ The attribute used to identify the name of the map to which this
+-entry belongs. Its default value is
+-.nh
+-.BR nisMapName .
+-.hy
+-In the
+-.nh
+-automountMap
+-.hy
+-schema this corresponds to the attributes \fBou\fP or
+-.nh
+-.BR automountMapName .
+-.hy
++entry belongs. In the \fBnisMap\fP schema this corresponds to the attribute
++\fBnisMapName\fP and in the \fBautomountMap\fP schema it corresponds to the
++attribute \fBou\fP or \fBautomountMapName\fP.
+ .TP
+ .B ENTRY_ATTRIBUTE
+-The attribute used to identify a map key. Its default value is
+-In the
+-.nh
+-automountMap
+-.hy
+-schema this corresponds to the attribute
+-.nh
+-.BR automountKey .
+-.hy
++The attribute used to identify a map key. In the \fBnisMap\fP schema this
++corresponds to the attribute \fBcn\fP and in the \fBautomountMap\fP schema
++it corresponds to the attribute \fBautomountKey\fP.
+ .TP
+ .B VALUE_ATTRIBUTE
+-The attribute used to identify the value of the map entry. Its default
+-value is
+-.nh
+-.BR BnisMapEntry .
+-.hy
+-In the automountMap schema this corresponds to the attribute
+-.nh
+-.BR automountInformation .
++The attribute used to identify the value of the map entry. In the \fBnisMap\fP
++schema this corresponds to the attribute \fBnisMapEntry\fP and in the \fBautomountMap\fP
++schema it corresponds to the attribute \fBautomountInformation\fP.
++.TP
++.B NOTE:
++It is essential that entries use class and attribute in a consistent
++manner for correct operation of autofs. For example mixing \fBcn\fP and
++\fBautomountKey\fP attributes in \fBautomount\fP schema map entries won't
++work as expected.
+ .SH LDAP AUTHENTICATION, ENCRYPTED AND CERTIFIED CONNECTIONS
+ LDAP authenticated binds, TLS encrypted connections and certification
+ may be used by setting appropriate values in the autofs authentication
+diff -up autofs-5.0.2/man/automount.8.add-ldap-schema-discovery autofs-5.0.2/man/automount.8
+--- autofs-5.0.2/man/automount.8.add-ldap-schema-discovery 2007-09-05 12:52:35.000000000 +0800
++++ autofs-5.0.2/man/automount.8 2007-09-05 12:52:35.000000000 +0800
+@@ -102,6 +102,8 @@ started they will be recoverd unless the
+ the map in which case they need to umounted manually.
+ .SH "SEE ALSO"
+ .BR autofs (5),
++.BR autofs (8),
++.BR auto.master (5),
+ .BR mount (8).
+ .SH BUGS
+ Don't know, I've fixed everything I know about.
Index: autofs.spec
===================================================================
RCS file: /cvs/pkgs/rpms/autofs/devel/autofs.spec,v
retrieving revision 1.221
retrieving revision 1.222
diff -u -r1.221 -r1.222
--- autofs.spec 28 Aug 2007 06:14:02 -0000 1.221
+++ autofs.spec 5 Sep 2007 05:11:13 -0000 1.222
@@ -4,7 +4,7 @@
Summary: A tool for automatically mounting and unmounting filesystems
Name: autofs
Version: 5.0.2
-Release: 14
+Release: 15
Epoch: 1
License: GPL
Group: System Environment/Daemons
@@ -139,6 +139,9 @@
%{_libdir}/autofs/
%changelog
+* Wed Sep 5 2007 Ian Kent <ikent at redhat.com> - 5.0.2-15
+- fix LDAP schema discovery.
+
* Tue Aug 28 2007 Ian Kent <ikent at redhat.com> - 5.0.2-14
- update patch to prevent failure on empty master map.
- if there's no "automount" entry in nsswitch.conf use "files" source.
More information about the fedora-extras-commits
mailing list