Ticket #1535: lighttpd-1.5.0_pre1992-ldap.patch

File lighttpd-1.5.0_pre1992-ldap.patch, 15.8 kB (added by dev-zero, 9 months ago)
  • src/http_auth.c

     
    5454 */ 
    5555 
    5656handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s); 
     57void auth_ldap_cleanup(ldap_plugin_config *p); 
    5758 
    5859static const char base64_pad = '='; 
    5960 
     
    697698                } 
    698699        } else if (p->conf.auth_backend == AUTH_BACKEND_LDAP) { 
    699700#ifdef USE_LDAP 
    700                 LDAP *ldap; 
    701                 LDAPMessage *lm, *first; 
    702                 char *dn; 
    703                 int ret; 
     701                LDAP *ldap = NULL; 
     702                LDAPMessage *lm = NULL, *first = NULL; 
     703                struct berval credentials; 
     704                char *dn = NULL; 
     705                int ret = 0; 
    704706                char *attrs[] = { LDAP_NO_ATTRS, NULL }; 
    705                 size_t i; 
     707                size_t i = 0; 
    706708 
    707709                /* for now we stay synchronous */ 
    708710 
     
    737739                if (p->conf.auth_ldap_allow_empty_pw != 1 && pw[0] == '\0') 
    738740                        return -1; 
    739741 
     742                /* 2. */ 
     743 
     744                if (p->conf.ldap->ldap == NULL) { 
     745                        if(auth_ldap_init(srv, &p->conf) != HANDLER_GO_ON) 
     746                                return -1; 
     747                } 
     748 
    740749                /* build filter */ 
    741                 buffer_copy_string_buffer(p->ldap_filter, p->conf.ldap_filter_pre); 
     750                buffer_copy_string_buffer(p->ldap_filter, p->conf.ldap->ldap_filter_pre); 
    742751                buffer_append_string_buffer(p->ldap_filter, username); 
    743                 buffer_append_string_buffer(p->ldap_filter, p->conf.ldap_filter_post); 
     752                buffer_append_string_buffer(p->ldap_filter, p->conf.ldap->ldap_filter_post); 
    744753 
     754                ret = ldap_search_ext_s(p->conf.ldap->ldap, p->conf.auth_ldap_basedn->ptr, LDAP_SCOPE_SUBTREE, p->ldap_filter->ptr, attrs, 0, NULL, NULL, NULL, 0, &lm); 
    745755 
    746                 /* 2. */ 
    747                 if (p->conf.ldap == NULL || 
    748                     LDAP_SUCCESS != (ret = ldap_search_s(p->conf.ldap, p->conf.auth_ldap_basedn->ptr, LDAP_SCOPE_SUBTREE, p->ldap_filter->ptr, attrs, 0, &lm))) { 
    749                         if (auth_ldap_init(srv, &p->conf) != HANDLER_GO_ON) 
     756                if (ret == LDAP_SERVER_DOWN) { 
     757                        log_error_write(srv, __FILE__, __LINE__, "s", 
     758                                "ldap: server down, try to reconnect"); 
     759 
     760                        auth_ldap_cleanup(p->conf.ldap); 
     761 
     762                        if(auth_ldap_init(srv, &p->conf) != HANDLER_GO_ON) 
    750763                                return -1; 
    751                         if (LDAP_SUCCESS != (ret = ldap_search_s(p->conf.ldap, p->conf.auth_ldap_basedn->ptr, LDAP_SCOPE_SUBTREE, p->ldap_filter->ptr, attrs, 0, &lm))) { 
    752764 
     765                        log_error_write(srv, __FILE__, __LINE__, "s", 
     766                                "ldap: successfully reconnected"); 
     767                } 
     768 
     769                if (ret != LDAP_SUCCESS) { 
    753770                        log_error_write(srv, __FILE__, __LINE__, "sssb", 
    754                                         "ldap:", ldap_err2string(ret), "filter:", p->ldap_filter); 
     771                                        "ldap:", ldap_err2string(ret), ", filter:", p->ldap_filter); 
    755772 
    756773                        return -1; 
    757                         } 
    758774                } 
    759775 
    760                 if (NULL == (first = ldap_first_entry(p->conf.ldap, lm))) { 
    761                         log_error_write(srv, __FILE__, __LINE__, "s", "ldap ..."); 
     776                if (ldap_count_entries(p->conf.ldap->ldap, lm) > 1) { 
     777                        log_error_write(srv, __FILE__, __LINE__, "ssb", 
     778                                "ldap:", "more than one record returned, you might have to refine the filter:", p->ldap_filter); 
     779                } 
    762780 
     781                first = ldap_first_entry(p->conf.ldap->ldap, lm); 
     782                if (first == NULL) { 
     783                        ldap_get_option(p->conf.ldap->ldap, LDAP_OPT_ERROR_NUMBER, &ret); 
     784                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
     785 
    763786                        ldap_msgfree(lm); 
    764787 
    765788                        return -1; 
    766789                } 
    767790 
    768                 if (NULL == (dn = ldap_get_dn(p->conf.ldap, first))) { 
    769                         log_error_write(srv, __FILE__, __LINE__, "s", "ldap ..."); 
     791                dn = ldap_get_dn(p->conf.ldap->ldap, first); 
     792                if (dn == NULL) { 
     793                        ldap_get_option(p->conf.ldap->ldap, LDAP_OPT_ERROR_NUMBER, &ret); 
     794                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    770795 
    771796                        ldap_msgfree(lm); 
    772797 
     
    775800 
    776801                ldap_msgfree(lm); 
    777802 
     803                /* 3. */ 
     804                ret = ldap_initialize(&ldap, p->conf.auth_ldap_url->ptr); 
     805                if (ret) { 
     806                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    778807 
    779                 /* 3. */ 
    780                 if (NULL == (ldap = ldap_init(p->conf.auth_ldap_hostname->ptr, LDAP_PORT))) { 
    781                         log_error_write(srv, __FILE__, __LINE__, "ss", "ldap ...", strerror(errno)); 
     808                        ldap_memfree(dn); 
     809 
    782810                        return -1; 
    783811                } 
    784812 
    785                 ret = LDAP_VERSION3; 
    786                 if (LDAP_OPT_SUCCESS != (ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ret))) { 
     813                const int ldap_version = LDAP_VERSION3; 
     814                ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version); 
     815                if (ret != LDAP_OPT_SUCCESS) { 
    787816                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    788817 
    789                         ldap_unbind_s(ldap); 
     818                        ldap_memfree(ldap); 
     819                        ldap_memfree(dn); 
    790820 
    791821                        return -1; 
    792822                } 
    793823 
    794824                if (p->conf.auth_ldap_starttls == 1) { 
    795                         if (LDAP_OPT_SUCCESS != (ret = ldap_start_tls_s(ldap, NULL,  NULL))) { 
     825                        ret = ldap_start_tls_s(ldap, NULL,  NULL); 
     826                        if (ret != LDAP_OPT_SUCCESS) { 
    796827                                log_error_write(srv, __FILE__, __LINE__, "ss", "ldap startTLS failed:", ldap_err2string(ret)); 
    797828 
    798                                 ldap_unbind_s(ldap); 
     829                                ldap_memfree(ldap); 
     830                                ldap_memfree(dn); 
    799831 
    800832                                return -1; 
    801833                        } 
    802834                } 
    803835 
     836                /* Don't initialize it using " = {...}" since upstream doesn't 
     837                 * guarantee an order and the compiler only issues a warning when 
     838                 * passing an int as the pointer and vice-versa. 
     839                 * We have to cast away the const since berval is a general struct, 
     840                 * but ldap_sasl_bind_s doesn't write to the *pw location 
     841                 */ 
     842                credentials.bv_val = (char*)pw; 
     843                credentials.bv_len = strlen(pw); 
    804844 
    805                 if (LDAP_SUCCESS != (ret = ldap_simple_bind_s(ldap, dn, pw))) { 
     845                /* TODO: add funtionality to specify LDAP_SASL_EXTERNAL (or GSS-SPNEGO, etc.) */ 
     846                ret = ldap_sasl_bind_s(ldap, dn, LDAP_SASL_SIMPLE, &credentials, NULL, NULL, NULL); 
     847                if (ret != LDAP_SUCCESS) { 
    806848                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    807849 
    808                         ldap_unbind_s(ldap); 
     850                        ldap_memfree(ldap); 
     851                        ldap_memfree(dn); 
    809852 
    810853                        return -1; 
    811854                } 
    812855 
    813856                /* 5. */ 
    814                 ldap_unbind_s(ldap); 
     857                ldap_unbind_ext_s(ldap, NULL, NULL); 
     858                ldap_memfree(dn); 
    815859 
    816860                /* everything worked, good, access granted */ 
    817861 
  • src/http_auth.h

     
    1717        AUTH_BACKEND_HTDIGEST 
    1818} auth_backend_t; 
    1919 
     20#ifdef USE_LDAP 
    2021typedef struct { 
     22        LDAP *ldap; 
     23 
     24        buffer *ldap_filter_pre; 
     25        buffer *ldap_filter_post; 
     26} ldap_plugin_config; 
     27#endif 
     28 
     29typedef struct { 
    2130        /* auth */ 
    2231        array  *auth_require; 
    2332 
     
    2938 
    3039        buffer *auth_backend_conf; 
    3140 
    32         buffer *auth_ldap_hostname; 
     41        buffer *auth_ldap_url; 
    3342        buffer *auth_ldap_basedn; 
    3443        buffer *auth_ldap_binddn; 
    3544        buffer *auth_ldap_bindpw; 
     
    4655        auth_backend_t auth_backend; 
    4756 
    4857#ifdef USE_LDAP 
    49         LDAP *ldap; 
    50  
    51         buffer *ldap_filter_pre; 
    52         buffer *ldap_filter_post; 
     58        ldap_plugin_config *ldap; 
    5359#endif 
    5460} mod_auth_plugin_config; 
    5561 
  • src/mod_auth.c

     
    1616#include "sys-files.h" 
    1717 
    1818handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s); 
     19void auth_ldap_cleanup(ldap_plugin_config* p); 
    1920 
    20  
    2121/** 
    2222 * the basic and digest auth framework 
    2323 * 
     
    7474                        buffer_free(s->auth_htpasswd_userfile); 
    7575                        buffer_free(s->auth_backend_conf); 
    7676 
    77                         buffer_free(s->auth_ldap_hostname); 
     77                        buffer_free(s->auth_ldap_url); 
    7878                        buffer_free(s->auth_ldap_basedn); 
    7979                        buffer_free(s->auth_ldap_binddn); 
    8080                        buffer_free(s->auth_ldap_bindpw); 
     
    8484                        buffer_free(s->auth_ldap_key); 
    8585 
    8686#ifdef USE_LDAP 
    87                         buffer_free(s->ldap_filter_pre); 
    88                         buffer_free(s->ldap_filter_post); 
     87                        buffer_free(s->ldap->ldap_filter_pre); 
     88                        buffer_free(s->ldap->ldap_filter_post); 
    8989 
    90                         if (s->ldap) ldap_unbind_s(s->ldap); 
     90                        auth_ldap_cleanup(s->ldap); 
     91                        free(s->ldap); 
    9192#endif 
    9293 
    9394                        free(s); 
     
    111112        PATCH_OPTION(auth_htpasswd_userfile); 
    112113        PATCH_OPTION(auth_require); 
    113114        PATCH_OPTION(auth_debug); 
    114         PATCH_OPTION(auth_ldap_hostname); 
     115        PATCH_OPTION(auth_ldap_url); 
    115116        PATCH_OPTION(auth_ldap_basedn); 
    116117        PATCH_OPTION(auth_ldap_binddn); 
    117118        PATCH_OPTION(auth_ldap_bindpw); 
     
    123124        PATCH_OPTION(auth_ldap_allow_empty_pw); 
    124125#ifdef USE_LDAP 
    125126        PATCH_OPTION(ldap); 
    126         PATCH_OPTION(ldap_filter_pre); 
    127         PATCH_OPTION(ldap_filter_post); 
    128127#endif 
    129128 
    130129        /* skip the first, the global context */ 
     
    153152                                PATCH_OPTION(auth_require); 
    154153                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.debug"))) { 
    155154                                PATCH_OPTION(auth_debug); 
    156                         } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.hostname"))) { 
    157                                 PATCH_OPTION(auth_ldap_hostname); 
     155                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.url"))) { 
     156                                PATCH_OPTION(auth_ldap_url); 
    158157#ifdef USE_LDAP 
    159158                                PATCH_OPTION(ldap); 
    160                                 PATCH_OPTION(ldap_filter_pre); 
    161                                 PATCH_OPTION(ldap_filter_post); 
    162159#endif 
    163160                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.base-dn"))) { 
    164161                                PATCH_OPTION(auth_ldap_basedn); 
     162                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.bind-dn"))) { 
     163                                PATCH_OPTION(auth_ldap_binddn); 
     164                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.bind-pw"))) { 
     165                                PATCH_OPTION(auth_ldap_bindpw); 
    165166                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.filter"))) { 
    166167                                PATCH_OPTION(auth_ldap_filter); 
    167168                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("auth.backend.ldap.ca-file"))) { 
     
    318319                { "auth.backend.plain.groupfile",   NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 1 */ 
    319320                { "auth.backend.plain.userfile",    NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 2 */ 
    320321                { "auth.require",                   NULL, T_CONFIG_LOCAL, T_CONFIG_SCOPE_CONNECTION },  /* 3 */ 
    321                 { "auth.backend.ldap.hostname",     NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 4 */ 
     322                { "auth.backend.ldap.url"     ,     NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 4 */ 
    322323                { "auth.backend.ldap.base-dn",      NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 5 */ 
    323324                { "auth.backend.ldap.filter",       NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 6 */ 
    324325                { "auth.backend.ldap.ca-file",      NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION }, /* 7 */ 
     
    349350                s->auth_htpasswd_userfile = buffer_init(); 
    350351                s->auth_backend_conf = buffer_init(); 
    351352 
    352                 s->auth_ldap_hostname = buffer_init(); 
     353                s->auth_ldap_url    = buffer_init(); 
    353354                s->auth_ldap_basedn = buffer_init(); 
    354355                s->auth_ldap_binddn = buffer_init(); 
    355356                s->auth_ldap_bindpw = buffer_init(); 
     
    363364                s->auth_require = array_init(); 
    364365 
    365366#ifdef USE_LDAP 
    366                 s->ldap_filter_pre = buffer_init(); 
    367                 s->ldap_filter_post = buffer_init(); 
    368                 s->ldap = NULL; 
     367                s->ldap = malloc (sizeof(ldap_plugin_config)); 
     368                s->ldap->ldap_filter_pre = buffer_init(); 
     369                s->ldap->ldap_filter_post = buffer_init(); 
     370                s->ldap->ldap = NULL; 
    369371#endif 
    370372 
    371373                cv[0].destination = s->auth_backend_conf; 
    372374                cv[1].destination = s->auth_plain_groupfile; 
    373375                cv[2].destination = s->auth_plain_userfile; 
    374376                cv[3].destination = s->auth_require; 
    375                 cv[4].destination = s->auth_ldap_hostname; 
     377                cv[4].destination = s->auth_ldap_url; 
    376378                cv[5].destination = s->auth_ldap_basedn; 
    377379                cv[6].destination = s->auth_ldap_filter; 
    378380                cv[7].destination = s->auth_ldap_cafile; 
     
    519521                                array_insert_unique(s->auth_require, (data_unset *)a); 
    520522                        } 
    521523                } 
     524        } 
    522525 
    523                 switch(s->auth_backend) { 
    524                 case AUTH_BACKEND_LDAP: { 
    525                         handler_t ret = auth_ldap_init(srv, s); 
    526                         if (ret == HANDLER_ERROR) 
    527                                 return (ret); 
    528                         break; 
    529                 } 
    530                 default: 
    531                         break; 
    532                 } 
    533         } 
    534  
    535         return HANDLER_GO_ON; 
     526        return HANDLER_GO_ON; 
    536527} 
    537528 
    538529handler_t auth_ldap_init(server *srv, mod_auth_plugin_config *s) { 
    539530#ifdef USE_LDAP 
    540531                        int ret; 
    541 #if 0 
    542                         if (s->auth_ldap_basedn->used == 0) { 
    543                                 log_error_write(srv, __FILE__, __LINE__, "s", "ldap: auth.backend.ldap.base-dn has to be set"); 
     532                        struct berval credentials; 
     533                        char *binddn_ptr = NULL; 
    544534 
    545                                 return HANDLER_ERROR; 
    546                         } 
    547 #endif 
    548  
    549535                        if (s->auth_ldap_filter->used) { 
    550536                                char *dollar; 
    551537 
     
    557543                                        return HANDLER_ERROR; 
    558544                                } 
    559545 
    560                                 buffer_copy_string_len(s->ldap_filter_pre, s->auth_ldap_filter->ptr, dollar - s->auth_ldap_filter->ptr); 
    561                                 buffer_copy_string(s->ldap_filter_post, dollar+1); 
     546                                buffer_copy_string_len(s->ldap->ldap_filter_pre, s->auth_ldap_filter->ptr, dollar - s->auth_ldap_filter->ptr); 
     547                                buffer_copy_string(s->ldap->ldap_filter_post, dollar+1); 
    562548                        } 
    563549 
    564                         if (s->auth_ldap_hostname->used) { 
    565                                 if (NULL == (s->ldap = ldap_init(s->auth_ldap_hostname->ptr, LDAP_PORT))) { 
    566                                         log_error_write(srv, __FILE__, __LINE__, "ss", "ldap ...", strerror(errno)); 
     550                        if (s->auth_ldap_url->used) { 
     551                                if ((ret = ldap_initialize(&s->ldap->ldap, s->auth_ldap_url->ptr))) { 
     552                                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    567553 
    568554                                        return HANDLER_ERROR; 
    569555                                } 
    570556 
    571                                 ret = LDAP_VERSION3; 
    572                                 if (LDAP_OPT_SUCCESS != (ret = ldap_set_option(s->ldap, LDAP_OPT_PROTOCOL_VERSION, &ret))) { 
     557                                const int ldap_version = LDAP_VERSION3; 
     558                                ret = ldap_set_option(s->ldap->ldap, LDAP_OPT_PROTOCOL_VERSION, &ldap_version); 
     559                                if (ret != LDAP_OPT_SUCCESS) { 
    573560                                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    574561 
     562                                        ldap_memfree(s->ldap->ldap); 
     563                                        s->ldap->ldap = NULL; 
     564 
    575565                                        return HANDLER_ERROR; 
    576566                                } 
    577567 
    578                                 if (s->auth_ldap_starttls) { 
     568                                if (s->auth_ldap_starttls == 1) { 
    579569                                        /* if no CA file is given, it is ok, as we will use encryption 
    580570                                         * if the server requires a CAfile it will tell us */ 
    581571                                        if (!buffer_is_empty(s->auth_ldap_cafile)) { 
     
    584574                                                        log_error_write(srv, __FILE__, __LINE__, "ss", 
    585575                                                                        "Loading CA certificate failed:", ldap_err2string(ret)); 
    586576 
     577                                                        ldap_memfree(s->ldap->ldap); 
     578                                                        s->ldap->ldap = NULL; 
     579 
    587580                                                        return HANDLER_ERROR; 
    588581                                                } 
    589582                                        } 
     
    594587                                                        log_error_write(srv, __FILE__, __LINE__, "ss", 
    595588                                                                        "Loading TLS certificate failed:", ldap_err2string(ret)); 
    596589 
     590                                                        ldap_memfree(s->ldap->ldap); 
     591                                                        s->ldap->ldap = NULL; 
     592 
    597593                                                        return HANDLER_ERROR; 
    598594                                                } 
    599595                                        } 
     
    604600                                                        log_error_write(srv, __FILE__, __LINE__, "ss", 
    605601                                                                        "Loading TLS key certificate failed:", ldap_err2string(ret)); 
    606602 
     603                                                        ldap_memfree(s->ldap->ldap); 
     604                                                        s->ldap->ldap = NULL; 
     605 
    607606                                                        return HANDLER_ERROR; 
    608607                                                } 
    609608                                        } 
    610609 
    611                                         if (LDAP_OPT_SUCCESS != (ret = ldap_start_tls_s(s->ldap, NULL,  NULL))) { 
     610                                        if (LDAP_OPT_SUCCESS != (ret = ldap_start_tls_s(s->ldap->ldap, NULL,  NULL))) { 
    612611                                                log_error_write(srv, __FILE__, __LINE__, "ss", "ldap startTLS failed:", ldap_err2string(ret)); 
    613612 
     613                                                ldap_memfree(s->ldap->ldap); 
     614                                                s->ldap->ldap = NULL; 
     615 
    614616                                                return HANDLER_ERROR; 
    615617                                        } 
    616618                                } 
     
    618620 
    619621                                /* 1. */ 
    620622                                if (s->auth_ldap_binddn->used) { 
    621                                         if (LDAP_SUCCESS != (ret = ldap_simple_bind_s(s->ldap, s->auth_ldap_binddn->ptr, s->auth_ldap_bindpw->ptr))) { 
    622                                                 log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    623  
    624                                                 return HANDLER_ERROR; 
    625                                         } 
     623                                        credentials.bv_val = s->auth_ldap_bindpw->ptr; 
     624                                        credentials.bv_len = s->auth_ldap_bindpw->used; 
     625                                        binddn_ptr = s->auth_ldap_binddn->ptr; 
    626626                                } else { 
    627                                         if (LDAP_SUCCESS != (ret = ldap_simple_bind_s(s->ldap, NULL, NULL))) { 
    628                                                 log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
     627                                        credentials.bv_val = NULL; 
     628                                        credentials.bv_len = 0; 
     629                                        binddn_ptr = NULL; 
     630                                } 
     631                                ret = ldap_sasl_bind_s(s->ldap->ldap, s->auth_ldap_binddn->ptr, LDAP_SASL_SIMPLE, &credentials, NULL, NULL, NULL); 
     632                                if(ret != LDAP_SUCCESS) { 
     633                                        log_error_write(srv, __FILE__, __LINE__, "ss", "ldap:", ldap_err2string(ret)); 
    629634 
    630                                                 return HANDLER_ERROR; 
    631                                         } 
     635                                        ldap_memfree(s->ldap->ldap); 
     636                                        s->ldap->ldap = NULL; 
     637                                        return HANDLER_ERROR; 
    632638                                } 
    633639                        } 
    634640#else 
     
    639645                return HANDLER_GO_ON; 
    640646} 
    641647 
     648void auth_ldap_cleanup(ldap_plugin_config *p) { 
     649        if (p->ldap != NULL) 
     650                ldap_unbind_ext_s(p->ldap, NULL, NULL); 
     651        p->ldap = NULL; 
     652} 
     653 
    642654LI_EXPORT int mod_auth_plugin_init(plugin *p) { 
    643655        p->version     = LIGHTTPD_VERSION_ID; 
    644656        p->name        = buffer_init_string("auth");