Remove fr_connection_delete
[freeradius.git] / src / modules / rlm_ldap / rlm_ldap.c
index 45f5e84..6593303 100644 (file)
@@ -533,6 +533,8 @@ static int parse_sub_section(ldap_instance_t *inst, CONF_SECTION *parent, ldap_a
  */
 static int mod_instantiate(CONF_SECTION *conf, void *instance)
 {
+       static bool version_done;
+
        CONF_SECTION *options;
        ldap_instance_t *inst = instance;
 
@@ -549,6 +551,39 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
        }
 
        /*
+        *      Get version info from the LDAP API.
+        */
+       if (!version_done) {
+               int ldap_errno;
+               LDAPAPIInfo info;
+
+               version_done = true;
+
+               ldap_errno = ldap_get_option(NULL, LDAP_OPT_API_INFO, &info);
+               if (ldap_errno == LDAP_OPT_SUCCESS) {
+                       if (strcmp(info.ldapai_vendor_name, LDAP_VENDOR_NAME) != 0) {
+                               WARN("rlm_ldap: libldap vendor changed since the server was built");
+                               WARN("rlm_ldap: linked: %s built: %s", info.ldapai_vendor_name, LDAP_VENDOR_NAME);
+                       }
+
+                       if (info.ldapai_vendor_version != LDAP_VENDOR_VERSION) {
+                               WARN("rlm_ldap: libldap version changed since the server was built");
+                               WARN("rlm_ldap: linked: %i built: %i",
+                                    info.ldapai_vendor_version, LDAP_VENDOR_VERSION);
+                       }
+
+                       INFO("rlm_ldap: libldap vendor: %s version: %i", info.ldapai_vendor_name,
+                            info.ldapai_vendor_version);
+                       ldap_memfree(info.ldapai_vendor_name);
+                       ldap_memfree(info.ldapai_extensions);
+               } else {
+                       WARN("rlm_ldap: Falling back to build time libldap version info.  Query for LDAP_OPT_API_INFO "
+                            "returned: %i", ldap_errno);
+                       INFO("rlm_ldap: libldap vendor: %s version: %i", LDAP_VENDOR_NAME, LDAP_VENDOR_VERSION);
+               }
+       }
+
+       /*
         *      If the configuration parameters can't be parsed, then fail.
         */
        if ((parse_sub_section(inst, conf, &inst->accounting, RLM_COMPONENT_ACCT) < 0) ||
@@ -597,11 +632,13 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
        /*
         *      Convert dereference strings to enumerated constants
         */
-       inst->dereference = fr_str2int(ldap_dereference, inst->dereference_str, -1);
-       if (inst->dereference < 0) {
-               LDAP_ERR("Invalid 'dereference' value \"%s\", expected 'never', 'searching', 'finding' or 'always'",
-                        inst->dereference_str);
-               goto error;
+       if (inst->dereference_str) {
+               inst->dereference = fr_str2int(ldap_dereference, inst->dereference_str, -1);
+               if (inst->dereference < 0) {
+                       LDAP_ERR("Invalid 'dereference' value \"%s\", expected 'never', 'searching', "
+                                "'finding' or 'always'", inst->dereference_str);
+                       goto error;
+               }
        }
 
 #if LDAP_SET_REBIND_PROC_ARGS != 3
@@ -622,22 +659,37 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
         */
        inst->userobj_scope = fr_str2int(ldap_scope, inst->userobj_scope_str, -1);
        if (inst->userobj_scope < 0) {
-               LDAP_ERR("Invalid 'user.scope' value \"%s\", expected 'sub', 'one', 'base' or 'children'",
-                        inst->userobj_scope_str);
+               LDAP_ERR("Invalid 'user.scope' value \"%s\", expected 'sub', 'one'"
+#ifdef LDAP_SCOPE_CHILDREN
+                        ", 'base' or 'children'"
+#else
+                        " or 'base'"
+#endif
+                        , inst->userobj_scope_str);
                goto error;
        }
 
        inst->groupobj_scope = fr_str2int(ldap_scope, inst->groupobj_scope_str, -1);
        if (inst->groupobj_scope < 0) {
-               LDAP_ERR("Invalid 'group.scope' value \"%s\", expected 'sub', 'one', 'base' or 'children'",
-                        inst->groupobj_scope_str);
+               LDAP_ERR("Invalid 'group.scope' value \"%s\", expected 'sub', 'one'"
+#ifdef LDAP_SCOPE_CHILDREN
+                        ", 'base' or 'children'"
+#else
+                        " or 'base'"
+#endif
+                        , inst->groupobj_scope_str);
                goto error;
        }
 
        inst->clientobj_scope = fr_str2int(ldap_scope, inst->clientobj_scope_str, -1);
        if (inst->clientobj_scope < 0) {
-               LDAP_ERR("Invalid 'client.scope' value \"%s\", expected 'sub', 'one', 'base' or 'children'",
-                        inst->clientobj_scope_str);
+               LDAP_ERR("Invalid 'client.scope' value \"%s\", expected 'sub', 'one'"
+#ifdef LDAP_SCOPE_CHILDREN
+                        ", 'base' or 'children'"
+#else
+                        " or 'base'"
+#endif
+                        , inst->clientobj_scope_str);
                goto error;
        }
 
@@ -717,7 +769,7 @@ static int mod_instantiate(CONF_SECTION *conf, void *instance)
        /*
         *      Initialize the socket pool.
         */
-       inst->pool = fr_connection_pool_init(inst->cs, inst, mod_conn_create, NULL, mod_conn_delete, NULL);
+       inst->pool = fr_connection_pool_init(inst->cs, inst, mod_conn_create, NULL, NULL);
        if (!inst->pool) {
                return -1;
        }