certsearch.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /* LDAP Cert Search */
  34. #include <ldap.h>
  35. #include <stdio.h>
  36. #include <ctype.h>
  37. #include <string.h>
  38. #include "certsearch.h"
  39. /* XXX TRUE & FALSE is not defined (on Unix): get by for now by using this 
  40.  * macro */
  41. #define SSM_LDAP_TRUE 1
  42. #define SSM_LDAP_FALSE 0
  43. int LDAPCertSearch (const char * rcpt_address, const char * server_name,
  44.                     const char * baseDN, int port, int connect_type,
  45.                     const char * certdb_path, const char * auth_dn, 
  46.                     const char * auth_password, const char * mail_attribs,
  47.                     const char * cert_attribs, cert_struct * certs[])
  48. {
  49. int rtnval;
  50. LDAP * ld;
  51. char *filter, *tstr, *tmpstr, *tmpstr1;
  52. int addr_len, attr_count = 0, filter_length = 0;
  53. char mail_array[3][80];
  54. char **cert_attrib_array, **tmp_cert_array;
  55. LDAPMessage *reslt, *entry;
  56. int attrib_name_count, entry_count;
  57. void * cert;
  58. /* First some simple param checking */
  59. if (!server_name || !*server_name)
  60. return 1;
  61. if (!rcpt_address || !*rcpt_address)
  62. return 2;
  63. if (connect_type < CLEAR_ANON || connect_type > SSL_CERTAUTH)
  64. return 3;
  65. if (!cert_attribs || !*cert_attribs)
  66. return 2;
  67. /* Okay, try to init connection to LDAP Server */
  68. if (connect_type == CLEAR_ANON || connect_type == CLEAR_AUTH)
  69. ld = ldap_init(server_name, 389);
  70. #if 0
  71. /* don't bother with SSL yet */
  72. else { /* SSL Connection */
  73. /* First init Client connection to db files needed */
  74. if (connect_type == SSL_CERTAUTH) {
  75. /* don't bother yet.  keydbpath is full path of key3.db file (e.g. ...users/bruces)
  76. if (ldapssl_clientauth_init(certdb_path, NULL, needkeydb, keydbpath, 
  77.                         NULL) < 0)
  78. return 4; */
  79. } else {
  80. if (ldapssl_client_init(certdb_path, NULL) < 0)
  81. return 4;
  82. }
  83. /* Now attempt SSL connection to LDAP Server */
  84. ld = ldapssl_init(server_name, port, 1);
  85. }
  86. #endif
  87. if (!ld)  /* failed to init connection to LDAP server */
  88. return 4;
  89. /* Now bind to server (NULL/Anon bind if not AUTH type connection) */
  90. if (connect_type == CLEAR_ANON || connect_type == SSL_ANON)
  91. rtnval = ldap_simple_bind_s(ld, NULL, NULL);
  92. else if (connect_type == CLEAR_AUTH || connect_type == SSL_AUTH)
  93. rtnval = ldap_simple_bind_s(ld, auth_dn, auth_password);
  94. /* else if (connect_type == SSL_CERTAUTH)
  95. rtnval = ldap_sasl_bind_s(ld, auth_dn, [mechanism], [cred], NULL, 
  96.                           NULL, servercredp) */
  97. if (rtnval != LDAP_SUCCESS)
  98. return 5;
  99. /*
  100. // Now ready to search
  101. */
  102. /* First create the filter from attrib(s) and rcpt_address */
  103. /* first compute size of filter to create, and collect mail attribs */
  104. addr_len = strlen(rcpt_address);
  105. tmpstr1 = (char *)PR_Malloc(strlen(mail_attribs)+1);
  106. strcpy(tmpstr1, mail_attribs);
  107. tmpstr = tmpstr1;
  108. while (tstr = strchr(tmpstr, ',')) {
  109. *tstr = '';
  110. filter_length += addr_len + strlen(tmpstr) + 5;
  111. strcpy(mail_array[attr_count++], tmpstr);
  112. tmpstr = tstr+1;
  113. }
  114. /* and get last mail attribute */
  115. filter_length += addr_len + strlen(tmpstr) + 5;
  116. strcpy(mail_array[attr_count++], tmpstr);
  117. filter = (char *)PR_Malloc(filter_length);
  118. PR_Free(tmpstr1);
  119. /* should figure out way to generalize this :-( */
  120. if (attr_count == 1)
  121. sprintf(filter, "(%s=%s)", mail_array[0], rcpt_address);
  122. else if (attr_count == 2)
  123. sprintf(filter, "(|(%s=%s)(%s=%s))", mail_array[0], rcpt_address,
  124.         mail_array[1], rcpt_address);
  125. else if (attr_count == 3)
  126. sprintf(filter, "(|(%s=%s)(%s=%s)(%s=%s))", mail_array[0], rcpt_address,
  127.         mail_array[1], rcpt_address, mail_array[2], rcpt_address);
  128. else
  129. return 6; /* too many mail attribs (should fix this eventually) */
  130. /* Also get list of Cert attribs */
  131. cert_attrib_array = (char **)PR_Malloc(50); /* space for array of ptrs */
  132. tmp_cert_array = cert_attrib_array;
  133. tmpstr = (char *)PR_Malloc(strlen(cert_attribs)+1);
  134. strcpy(tmpstr, cert_attribs);
  135. tmpstr1 = tmpstr;
  136. while (tstr = strchr(tmpstr, ',')) {
  137. *tstr = '';
  138. *tmp_cert_array = (char *)PR_Malloc(strlen(tmpstr)+1);
  139. strcpy(*tmp_cert_array, tmpstr);
  140. *tmp_cert_array++;
  141. tmpstr = tstr+1;
  142. }
  143. /* get last attribute, and put in NULL entry as end */
  144. *tmp_cert_array = (char *)PR_Malloc(strlen(tmpstr)+1);
  145. strcpy(*tmp_cert_array, tmpstr);
  146. *tmp_cert_array++;
  147. *tmp_cert_array = NULL;
  148. PR_Free(tmpstr1);
  149. /* Now perform the search and check response */
  150. rtnval = ldap_search_s(ld, baseDN, LDAP_SCOPE_SUBTREE, filter,
  151.                        cert_attrib_array, SSM_LDAP_FALSE, &reslt);
  152. PR_Free(filter);
  153. if (rtnval != LDAP_SUCCESS) {
  154. for (tmp_cert_array = cert_attrib_array; *tmp_cert_array; 
  155.      tmp_cert_array++)
  156. PR_Free(*tmp_cert_array);
  157. PR_Free(cert_attrib_array);
  158. return 7; /* LDAP Failure */
  159. }
  160. entry_count = ldap_count_entries(ld, reslt);
  161. if (entry_count == 0) {
  162. for (tmp_cert_array = cert_attrib_array; *tmp_cert_array; 
  163.      tmp_cert_array++)
  164. PR_Free(*tmp_cert_array);
  165. PR_Free(cert_attrib_array);
  166. ldap_msgfree(reslt);
  167. ldap_unbind(ld);
  168. return -1; /* no entry found for rcpt */
  169. }
  170. if (entry_count > 1) {
  171. for (tmp_cert_array = cert_attrib_array; *tmp_cert_array; 
  172.      tmp_cert_array++)
  173. PR_Free(*tmp_cert_array);
  174. PR_Free(cert_attrib_array);
  175. ldap_msgfree(reslt);
  176. ldap_unbind(ld);
  177. return 8; /* multiple entries found for rcpt */
  178. }
  179. /* 
  180.  *Okay, got an entry, check for Cert 
  181.  */
  182. rtnval = 9; /* default is to return no attrib found */
  183. /* Now check each cert attribute type */
  184. entry = ldap_first_entry(ld, reslt);
  185. attrib_name_count = 0;
  186. tmp_cert_array = cert_attrib_array;
  187. while (*tmp_cert_array) {
  188. struct berval cert_attrib_struct;
  189. struct berval **cert_out_list;
  190. struct cert_struct_def * cert_ptr;
  191. int valcount=0;
  192. cert_out_list = ldap_get_values_len(ld, entry, *tmp_cert_array);
  193. if (cert_out_list) { /* Values found for this cert attr */
  194. while (SSM_LDAP_TRUE) { /* just get count for malloc first */
  195. if (!cert_out_list[valcount++])
  196. break;
  197. }
  198. certs[attrib_name_count] = PR_Malloc(valcount * sizeof(cert_struct));
  199. cert_ptr = certs[attrib_name_count];
  200. valcount =0;
  201. while (SSM_LDAP_TRUE) {
  202. if (!cert_out_list[valcount])
  203. break;
  204. cert_attrib_struct = *cert_out_list[valcount++];
  205. cert = PR_Malloc(cert_attrib_struct.bv_len);
  206. memcpy(cert, cert_attrib_struct.bv_val, 
  207.        cert_attrib_struct.bv_len);
  208. cert_ptr->cert = cert;
  209. cert_ptr->cert_len = cert_attrib_struct.bv_len;
  210. cert_ptr++;
  211. rtnval = 0; /* found at least one Cert */
  212. }
  213. cert_ptr->cert_len = 0; /* end list */
  214. }
  215. ldap_value_free_len(cert_out_list);
  216. *tmp_cert_array++;
  217. attrib_name_count++;
  218. }
  219. for (tmp_cert_array = cert_attrib_array; *tmp_cert_array; 
  220.      tmp_cert_array++)
  221. PR_Free(*tmp_cert_array);
  222. PR_Free(cert_attrib_array);
  223. ldap_msgfree(reslt);
  224. ldap_unbind(ld);
  225. return rtnval;
  226. }