auth_ldap.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:5k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** auth_ldap.c
  3. **
  4. ** Copyright (c) 1999 Dr. Roland Kaltefleiter <rk@netuse.de>
  5. ** Based on auth_file.c which is ** Copyright (c) 1994-1997 Peter Eriksson <pen@signum.se>
  6. **
  7. ** This program is free software; you can redistribute it and/or modify
  8. ** it under the terms of the GNU General Public License as published by
  9. ** the Free Software Foundation; either version 2 of the License, or
  10. ** (at your option) any later version.
  11. **
  12. ** This program is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. ** GNU General Public License for more details.
  16. ** You should have received a copy of the GNU General Public License
  17. ** along with this program; if not, write to the Free Software
  18. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <crypt.h>
  23. #include <lber.h>
  24. #include <ldap.h>
  25. #include "phttpd.h"
  26. static char *ldap_server;
  27. static int  ldap_port = 389;
  28. static struct table *auth_base_dn_table = NULL;
  29. static struct options authfile_cfg_table[] =
  30. {
  31.     { "ldap-server", T_STRING, &ldap_server,  NULL },
  32.     { "ldap-port", T_NUMBER, &ldap_port,  NULL },
  33.     { "base-dn", T_TABLE, &auth_base_dn_table,  NULL },
  34.     { NULL,             -1,       NULL, NULL }
  35. };
  36. int pm_init(const char **argv)
  37. {
  38.     char *cfg_path, *cp;
  39.     const char *name = argv[0];
  40.     int clen;
  41.     
  42.     if (debug > 1)
  43. fprintf(stderr, "*** auth_file/pm_init("%s") called ***n", name);
  44.     clen = strlen(name)+6;
  45.     cfg_path = s_malloc(clen);
  46.     s_strcpy(cfg_path, clen, name);
  47.     
  48.     cp = strrchr(cfg_path, '.');
  49.     if (cp && strcmp(cp, ".so") == 0)
  50. *cp = '';
  51.     
  52.     s_strcat(cfg_path, clen, ".conf");
  53.     if (config_parse_file(cfg_path, authfile_cfg_table, 0) < 0)
  54. return -1;
  55.     
  56.     if (config_parse_argv(argv+1, authfile_cfg_table) < 0)
  57. return -1;
  58.     if ( ldap_server==NULL ) { ldap_server=s_strdup("localhost"); }
  59.     
  60.     return 0;
  61. }
  62. void pm_exit(void)
  63. {
  64.     if (debug > 1)
  65. fprintf(stderr, "*** auth_file/pm_exit() called ***n");
  66.     
  67.     s_free(ldap_server);
  68.     tbl_free(auth_base_dn_table,s_free);
  69.     s_free(auth_base_dn_table);
  70. }
  71. static int check_ldap(char *base_dn,
  72.       struct authinfo *aip,
  73.       struct connectioninfo *cip)
  74. {
  75.     LDAP *pl;
  76.     LDAPMessage *result = NULL;
  77.     LDAPMessage *e;
  78.     char ldap_filter[1024];
  79.     char *dn;
  80.     char *ldap_attrs[] = { "dn", "uid", NULL };
  81.     int anzahl;
  82.     char *username, *password;
  83.     if (aip == NULL ||
  84. aip->type == NULL ||
  85. strcasecmp(aip->type, "basic") != 0 ||
  86. aip->u.basic.username == NULL ||
  87. aip->u.basic.password == NULL)
  88.     {
  89. /* Unknown/bad authentication */
  90. return -1;
  91.     }
  92.     username = aip->u.basic.username;
  93.     password = aip->u.basic.password;
  94. /* Setup the ldap_filter */
  95.     s_sprintf(ldap_filter,1024,"uid=%s",username);
  96.     if (debug > 3 ) fprintf(stderr, "*** auth_ldap/check_ldap: filter= %sn",ldap_filter);
  97. /* Now connect to the LDAP-Server */
  98.   if ( (pl=ldap_init(ldap_server, ldap_port)) == NULL )
  99. { fprintf(stderr,"ldap_init failedn"); 
  100.   return(0); }
  101.   if ( LDAP_SUCCESS!=ldap_search_s(pl,base_dn,LDAP_SCOPE_ONELEVEL,ldap_filter,ldap_attrs,0,&result))
  102. { fprintf(stderr,"    ldap_search_s: Not found %s in %sn",ldap_filter,base_dn); 
  103.   ldap_unbind(pl);
  104.   return(0); }
  105.   if ( (anzahl=ldap_count_entries(pl, result)) == 0)
  106. { fprintf(stderr,"    ldap_search_s: No such user %sn",ldap_filter); 
  107.   ldap_msgfree(result);
  108.   ldap_unbind(pl);
  109.   return(0); }
  110.   if ( anzahl!=1 )
  111. { fprintf(stderr,"    ldap_search_s: uid (%s) not unique - failedn",username); 
  112.   ldap_msgfree(result);
  113.   ldap_unbind(pl);
  114.   return(0); }
  115.   if ( (e = ldap_first_entry(pl, result)) == NULL )
  116. { fprintf(stderr,"    ldap_first_entry failed ???n");
  117.   ldap_msgfree(result);
  118.   ldap_unbind(pl);
  119.   return(0); }
  120. /* Get the DN ? */
  121.   if ( (dn = ldap_get_dn(pl, e )) == NULL )
  122. { fprintf(stderr,"    ldap_get_dn: no DN found for uid / dn: %s / %sn",username,base_dn);
  123.   ldap_msgfree(result);
  124.   ldap_msgfree(e);
  125.   ldap_unbind(pl);
  126.   return(0); }
  127.   if ( ldap_simple_bind_s(pl, dn, password) == LDAP_SUCCESS && strlen(password)>0 )
  128. { /* YES WE ARE OK */
  129. if ( debug > 3 ) fprintf(stderr," LDAP-AUTH: success dn=%sn",dn);
  130. aip->validated_username = s_strdup(aip->u.basic.username);
  131. ldap_memfree(dn);
  132. ldap_msgfree(e);
  133. ldap_msgfree(result);
  134. ldap_unbind(pl);
  135. return(1);
  136. }
  137.   if ( dn!=NULL ) ldap_memfree(dn);
  138.   ldap_msgfree(e);
  139.   ldap_msgfree(result);
  140.   ldap_unbind(pl);
  141.   return 0;
  142. }
  143. int pm_auth(struct authinfo *aip, struct connectioninfo *cip,
  144.     const char *domain)
  145. {
  146.     char dn_pattern[1024];
  147.     int status=0;
  148.     struct httpinfo *hip = cip->hip;
  149.     
  150.     if (debug > 1)
  151. fprintf(stderr, "*** auth_file/pm_auth(%s)n",
  152. domain);
  153.     if ( auth_base_dn_table )
  154.     {
  155. if ( url_match(auth_base_dn_table,hip->url,dn_pattern, sizeof(dn_pattern)) )
  156.      status = check_ldap(dn_pattern,aip, cip);
  157. else
  158. fprintf(stderr,"No dn in table for url=%sn",hip->url);
  159.     }
  160.     else
  161. fprintf(stderr, " ... no base-dn in cfgn");
  162.     return status;
  163. }