ldaplist.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:8k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 2000 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /*
  6. ** $Id: ldaplist.c,v 1.1 2000/06/03 05:40:27 mrsam Exp $
  7. */
  8. #include "sqwebmail.h"
  9. #include <stdio.h>
  10. #include <errno.h>
  11. #include <stdlib.h>
  12. #include <ctype.h>
  13. #if HAVE_UNISTD_H
  14. #include <unistd.h>
  15. #endif
  16. #include <string.h>
  17. #include "cgi/cgi.h"
  18. #include "ldapaddressbook/ldapaddressbook.h"
  19. #include "maildir/maildircreate.h"
  20. #include "numlib/numlib.h"
  21. #include "htmllibdir.h"
  22. #include "addressbook.h"
  23. #include "pref.h"
  24. #define LOCALABOOK "sqwebmail-ldapaddressbook"
  25. extern char form_args[];
  26. extern void output_scriptptrget();
  27. extern void output_attrencoded(const char *);
  28. extern void output_attrencoded_oknl(const char *p);
  29. extern void output_urlencoded(const char *);
  30. extern void output_attrencoded_fp(const char *, FILE *);
  31. extern void output_attrencoded_oknl_fp(const char *, FILE *);
  32. void ldaplist()
  33. {
  34. struct ldapabook *abooks[2];
  35. int i;
  36. struct ldapabook *p;
  37. char *delabook=strtok(form_args, "|");
  38. char *sysbook=strtok(0, "|");
  39. if (!delabook) delabook="";
  40. if (!sysbook) sysbook="";
  41. if (*cgi("addabook"))
  42. {
  43. struct ldapabook newbook;
  44. memset(&newbook, 0, sizeof(newbook));
  45. newbook.name=(char *)cgi("name");
  46. newbook.host=(char *)cgi("host");
  47. newbook.port=(char *)cgi("port");
  48. newbook.suffix=(char *)cgi("suffix");
  49. newbook.binddn=(char *)cgi("binddn");
  50. newbook.bindpw=(char *)cgi("bindpw");
  51. if (*newbook.name && *newbook.host &&
  52. ldapabook_add(LOCALABOOK, &newbook) < 0)
  53. {
  54. printf("<pre>n");
  55. perror("ldapabook_add");
  56. printf("</pre>n");
  57. }
  58. }
  59. if (*cgi("delabook"))
  60. {
  61. char *nptr, *tptr;
  62. if (maildir_try_create(".", "abook", 0, &nptr, &tptr) == 0)
  63. {
  64. ldapabook_del(LOCALABOOK, tptr, cgi("ABOOK"));
  65. free(nptr);
  66. free(tptr);
  67. }
  68. }
  69. abooks[0]=ldapabook_read(LDAPADDRESSBOOK);
  70. abooks[1]=ldapabook_read(LOCALABOOK);
  71. printf("<TABLE BORDER=0 CELLPADDING=8 WIDTH="100%%">n");
  72. for (i=0; i<2; i++)
  73. {
  74. for (p=abooks[i]; p; p=p->next)
  75. {
  76. printf("<TR VALIGN=TOP><TD ALIGN=RIGHT>");
  77. printf("<INPUT BORDER=0 TYPE=RADIO NAME=ABOOK");
  78. if (pref_ldap && strcmp(pref_ldap, p->name) == 0)
  79. printf(" CHECKED");
  80. printf(" VALUE="");
  81. output_attrencoded(p->name);
  82. printf(""></TD><TD><FONT SIZE="+1">%s</FONT><BR>"
  83. "&nbsp;&nbsp;&nbsp;<TT><FONT SIZE="-2">ldap://", p->name);
  84. if (*p->binddn || *p->bindpw)
  85. {
  86. printf("%s", p->binddn);
  87. if (*p->bindpw)
  88. printf(":%s", p->bindpw);
  89. printf("@");
  90. }
  91. printf("%s", p->host);
  92. if (atoi(p->port) != 389)
  93. printf(":%s", p->port);
  94. if (*p->suffix)
  95. {
  96. char *q;
  97. printf("/");
  98. q=cgiurlencode_noeq(p->suffix);
  99. if (q)
  100. {
  101. printf("%s", q);
  102. free(q);
  103. }
  104. }
  105. printf("</FONT></TT>%s</TD></TR>",
  106. i ? "":sysbook);
  107. }
  108. }
  109. if (abooks[1])
  110. {
  111. printf("<TR><TD></TD><TD>");
  112. printf("<input type=submit name=delabook value="%s">",
  113. delabook);
  114. printf("</TD></TR>n");
  115. }
  116. printf("</TABLE>n");
  117. ldapabook_free(abooks[0]);
  118. ldapabook_free(abooks[1]);
  119. }
  120. int ldapsearch()
  121. {
  122. if (*cgi("ABOOK") == 0 || *cgi("attr1") == 0 || *cgi("op1") == 0
  123. || *cgi("value1") == 0) return (-1);
  124. return (0);
  125. }
  126. static const char *getattrn(const char *s, unsigned n)
  127. {
  128. char buf1[NUMBUFSIZE+20], bufn[NUMBUFSIZE];
  129. return (cgi(strcat(strcpy(buf1, s), str_size_t(n, bufn))));
  130. }
  131. static char *getfiltern(unsigned n)
  132. {
  133. const char *attrname=getattrn("attr", n);
  134. const char *attrop=getattrn("op", n);
  135. const char *attrval=getattrn("value", n);
  136. char *buf;
  137. if (*attrname == 0 || *attrop == 0 || *attrval == 0) return (0);
  138. buf=malloc(strlen(attrname)+strlen(attrop)+strlen(attrval)+40);
  139. if (!buf) return (0);
  140. strcpy(buf, "(");
  141. strcat(buf, attrname);
  142. strcat(buf, strcmp(attrop, "=*") == 0 ? "=":attrop);
  143. strcat(buf, attrval);
  144. if (strcmp(attrop, "=*") == 0)
  145. strcat(buf, "*");
  146. strcat(buf, ")");
  147. return (buf);
  148. }
  149. static char *getfilter()
  150. {
  151. char *filter=0;
  152. char *s;
  153. unsigned n=atoi(cgi("maxattrs"));
  154. unsigned i;
  155. if (n < 3) n=3;
  156. if (n > 20) n=20; /* sanity check */
  157. for (i=0; i<n; i++)
  158. {
  159. char *p=getfiltern(i+1);
  160. if (!p)
  161. continue;
  162. if (!filter) filter=p;
  163. else
  164. {
  165. s=malloc(strlen(p) + strlen(filter));
  166. if (!s)
  167. {
  168. free(filter);
  169. free(p);
  170. return (0);
  171. }
  172. strcat(strcpy(s, filter), p);
  173. free(filter);
  174. free(p);
  175. filter=s;
  176. }
  177. }
  178. s=malloc(strlen(filter)+sizeof("(&)"));
  179. if (!s)
  180. {
  181. free(filter);
  182. return(0);
  183. }
  184. strcat(strcat(strcpy(s, "(&"), filter), ")");
  185. free(filter);
  186. return (s);
  187. }
  188. static void parsesearch(FILE *, FILE *);
  189. void doldapsearch()
  190. {
  191. char *f;
  192. struct ldapabook *abooks[2];
  193. const struct ldapabook *ptr;
  194. abooks[0]=ldapabook_read(LDAPADDRESSBOOK);
  195. abooks[1]=ldapabook_read(LOCALABOOK);
  196. ptr=ldapabook_find(abooks[0], cgi("ABOOK"));
  197. if (!ptr)
  198. ptr=ldapabook_find(abooks[1], cgi("ABOOK"));
  199. if (ptr && (f=getfilter()) != 0)
  200. {
  201. int fd;
  202. FILE *fpw=0;
  203. char *tmpname=0;
  204. pref_setldap(ptr->name);
  205. printf("<PRE>");
  206. fflush(stdout);
  207. fd=ldapabook_search(ptr, LDAPSEARCH, f, 1);
  208. free(f);
  209.                 if (fd >= 0)
  210. {
  211. FILE *fp=fdopen(fd, "r");
  212. if (fp)
  213. {
  214. char *nptr;
  215. if (maildir_try_create(".", "ldap", 0,
  216. &tmpname, &nptr) == 0)
  217. {
  218. free(nptr);
  219. fpw=fopen(tmpname, "w+");
  220. if (fpw)
  221. parsesearch(fp, fpw);
  222. else
  223. perror(tmpname);
  224. }
  225. fclose(fp);
  226. }
  227. else
  228. perror("fdopen");
  229. close(fd);
  230. }
  231. printf("</PRE>");
  232. if (fpw)
  233. {
  234. int c;
  235. fflush(fpw);
  236. rewind(fpw);
  237. while ((c=getc(fpw)) != EOF)
  238. putchar(c);
  239. fclose(fpw);
  240. }
  241. if (tmpname)
  242. {
  243. unlink(tmpname);
  244. free(tmpname);
  245. }
  246. }
  247. }
  248. static void parsesearch(FILE *r, FILE *w)
  249. {
  250. char buf[BUFSIZ];
  251. char sn[100];
  252. char cn[100];
  253. char o[100];
  254. char l[100];
  255. char ou[100];
  256. char st[100];
  257. char mail[512];
  258. char *p;
  259. char *add1=strtok(form_args, "|");
  260. char *add2=strtok(0, "|");
  261. char *submit=strtok(0, "|");
  262. char numbuf[NUMBUFSIZE];
  263. char numbuf2[NUMBUFSIZE+10];
  264. unsigned counter;
  265. if (!add1) add1="";
  266. if (!add2) add2="";
  267. if (!submit) submit="";
  268. fprintf(w, "<TABLE BORDER=0 CELLPADDING=4>n");
  269. counter=0;
  270. for (;;)
  271. {
  272. if (fgets(buf, sizeof(buf), r) == 0) break;
  273. /* skip dn */
  274. sn[0]=0;
  275. cn[0]=0;
  276. o[0]=0;
  277. l[0]=0;
  278. ou[0]=0;
  279. st[0]=0;
  280. mail[0]=0;
  281. for (;;)
  282. {
  283. if (fgets(buf, sizeof(buf), r) == 0) break;
  284. if ((p=strchr(buf, 'n')) != 0) *p=0;
  285. if (buf[0] == 0) break;
  286. for (p=buf; *p; p++)
  287. {
  288. if (*p == '=')
  289. {
  290. *p++=0;
  291. break;
  292. }
  293. *p=tolower((int)(unsigned char)*p);
  294. }
  295. #define SAFECAT(b,buf) strncat(b, buf, sizeof(b)-1-strlen(b))
  296. #define SAVE(n,b) if (strcmp(buf, n) == 0) 
  297. { if (b[0]) SAFECAT(b, "n"); SAFECAT(b, p); }
  298. SAVE("sn", sn)
  299. SAVE("cn", cn)
  300. SAVE("givenname", cn)
  301. SAVE("o", o)
  302. SAVE("ou", ou)
  303. SAVE("l", l)
  304. SAVE("st", st)
  305. SAVE("mail", mail)
  306. }
  307. if (mail[0] == 0) continue;
  308. for (p=mail; (p=strtok(p, "n")) != 0; p=0)
  309. {
  310. char *q;
  311. fprintf(w, "<TR VALIGN=TOP><TD><INPUT TYPE=CHECKBOX "
  312. "NAME="%s" VALUE="&lt;",
  313. strcat(strcpy(numbuf2, "ADDY"),
  314. str_size_t(counter++, numbuf)));
  315. output_attrencoded_fp(p, w);
  316. fprintf(w, "&gt;");
  317. q=cn;
  318. if (*q == 0) q=sn;
  319. if (*q)
  320. {
  321. fprintf(w, " &quot;");
  322. output_attrencoded_fp(q, w);
  323. fprintf(w, "&quot;");
  324. }
  325. fprintf(w, ""></TD><TD><FONT SIZE="+1">");
  326. if (*q)
  327. {
  328. fprintf(w, """);
  329. output_attrencoded_fp(q, w);
  330. fprintf(w, "" ");
  331. }
  332. fprintf(w, "&lt;");
  333. output_attrencoded_fp(p, w);
  334. fprintf(w, "&gt;</FONT>");
  335. if (ou[0])
  336. {
  337. fprintf(w, "<BR>");
  338. output_attrencoded_oknl_fp(ou, w);
  339. }
  340. if (o[0])
  341. {
  342. fprintf(w, "<BR>");
  343. output_attrencoded_oknl_fp(o, w);
  344. }
  345. if (l[0])
  346. {
  347. fprintf(w, "<BR>");
  348. output_attrencoded_oknl_fp(l, w);
  349. }
  350. if (st[0])
  351. {
  352. fprintf(w, "<BR>");
  353. output_attrencoded_oknl_fp(st, w);
  354. }
  355. fprintf(w, "</TD></TR>n");
  356. }
  357. }
  358. fprintf(w, "<TR><TD COLSPAN=2><HR WIDTH="90%%">"
  359. "<INPUT TYPE=HIDDEN NAME=ADDYCNT VALUE=%u>n"
  360. "</TD></TR>n", counter);
  361. fprintf(w, "<TR><TD COLSPAN=2><TABLE>");
  362. fprintf(w, "<TR><TD ALIGN=RIGHT>%s</TD><TD>"
  363. "<SELECT NAME=nick1><OPTION>n", add1);
  364. ab_listselect_fp(w);
  365. fprintf(w, "</SELECT></TD></TR>n");
  366. fprintf(w, "<TR><TD ALIGN=RIGHT>%s</TD><TD>"
  367. "<INPUT TYPE=TEXT NAME=nick2></TD></TR>n", add2);
  368. fprintf(w, "<TR><TD></TD><TD>"
  369. "<INPUT TYPE=SUBMIT NAME=import VALUE="%s"></TD></TR>",
  370. submit);
  371. fprintf(w, "</TABLE></TD></TR></TABLE>n");
  372. }