diff options
Diffstat (limited to 'sqwebmail/ldaplist.c')
| -rw-r--r-- | sqwebmail/ldaplist.c | 316 | 
1 files changed, 316 insertions, 0 deletions
| diff --git a/sqwebmail/ldaplist.c b/sqwebmail/ldaplist.c new file mode 100644 index 0000000..e584294 --- /dev/null +++ b/sqwebmail/ldaplist.c @@ -0,0 +1,316 @@ +#include "config.h" +/* +** Copyright 2000-2006 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + +/* +*/ +#include	"sqwebmail.h" +#include	<stdio.h> +#include	<errno.h> +#include	<stdlib.h> +#include	<ctype.h> +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif +#include	<string.h> +#include	"cgi/cgi.h" +#include	"ldapaddressbook/ldapaddressbook.h" +#include	"maildir/maildircreate.h" +#include	"numlib/numlib.h" +#include	"htmllibdir.h" +#include	"addressbook.h" +#include	"pref.h" +#include	"rfc2045/base64.h" + +#define	LOCALABOOK	"sqwebmail-ldapaddressbook" + +extern void output_scriptptrget(); +extern void output_attrencoded(const char *); +extern void output_attrencoded_oknl(const char *p); +extern void output_urlencoded(const char *); +extern void output_attrencoded_fp(const char *, FILE *); +extern void output_attrencoded_oknl_fp(const char *, FILE *); + +extern const char *sqwebmail_content_charset; + +#include	"unicode/unicode.h" + +void	ldaplist() +{ +struct ldapabook *abooks[2]; +int	i; +struct ldapabook *p; +const char	*delabook=getarg("DELABOOK"); +const char	*sysbook=getarg("SYSBOOK"); + +	if (!delabook)	delabook=""; +	if (!sysbook)	sysbook=""; + +	if (*cgi("addabook")) +	{ +		struct ldapabook newbook; + +		memset(&newbook, 0, sizeof(newbook)); + +		newbook.name=(char *)cgi("name"); +		newbook.host=(char *)cgi("host"); +		newbook.port=(char *)cgi("port"); +		newbook.suffix=(char *)cgi("suffix"); + +		if (*newbook.name && *newbook.host && +			ldapabook_add(LOCALABOOK, &newbook) < 0) +		{ +			printf("<pre>\n"); +			perror("ldapabook_add"); +			printf("</pre>\n"); +		} +	} + +	if (*cgi("delabook")) +	{ +		struct maildir_tmpcreate_info createInfo; +		int fd; +		maildir_tmpcreate_init(&createInfo); + +		createInfo.uniq="abook"; + +		if ((fd=maildir_tmpcreate_fd(&createInfo)) >= 0) +		{ +			close(fd); +			unlink(createInfo.tmpname); +			ldapabook_del(LOCALABOOK, createInfo.tmpname, +				      cgi("ABOOK")); +			maildir_tmpcreate_free(&createInfo); +		} +	} + +	abooks[0]=ldapabook_read(LDAPADDRESSBOOK); +	abooks[1]=ldapabook_read(LOCALABOOK); + +	printf("<table border=\"0\" cellpadding=\"8\" width=\"100%%\">\n"); +	for (i=0; i<2; i++) +	{ +		for (p=abooks[i]; p; p=p->next) +		{ +			printf("<tr valign=\"top\"><td align=\"right\">"); +			printf("<input type=\"radio\" name=\"ABOOK\""); + +			if (pref_ldap && strcmp(pref_ldap, p->name) == 0) +				printf(" checked=\"checked\""); + +			printf(" value=\""); +			output_attrencoded(p->name); +			printf("\" /></td><td><font size=\"+1\"" +			       " class=\"ldaplist-name\">%s</font><br />" +			       "   <span class=\"tt\"><font size=\"-2\"" +			       " class=\"ldaplist-ldapurl\">ldap://", p->name); +			if (*p->binddn || *p->bindpw) +			{ +				printf("%s", p->binddn); +				if (*p->bindpw) +					printf(":%s", p->bindpw); +				printf("@"); +			} +			printf("%s", p->host); +			if (atoi(p->port) != 389) +				printf(":%s", p->port); +			if (*p->suffix) +			{ +			char	*q; + +				printf("/"); +				q=cgiurlencode_noeq(p->suffix); +				if (q) +				{ +					printf("%s", q); +					free(q); +				} +			} +			printf("</font></span>%s</td></tr>", +				i ? "":sysbook); +		} +	} + +	if (abooks[1]) +	{ +		printf("<tr><td></td><td>"); +		printf("<input type=\"submit\" name=\"delabook\" value=\"%s\" />", +				delabook); +		printf("</td></tr>\n"); +	} +	printf("</table>\n"); +	ldapabook_free(abooks[0]); +	ldapabook_free(abooks[1]); +} + +static char *getfilter() +{ +	const char *p; + +	if (!*cgi("ldapsearch")) +		return NULL; + +	p=cgi("value"); + +	if (!*p) +		return NULL; + +	return libmail_u_convert_toutf8(p, sqwebmail_content_charset, NULL); +} + +struct search_info { +	FILE *fpw; +	char errmsgbuf[1024]; +	unsigned counter; +}; + +int	ldapsearch() +{ +	char *p; + +	if (*cgi("ABOOK") == 0) return (-1); + +	if ((p=getfilter()) == NULL) +		return -1; +	free(p); +	return 0; +} + +static void save_errmsg(const char *errmsg, +			void *voidarg) +{ +	struct search_info *si=(struct search_info *)voidarg; + +	si->errmsgbuf[0]=0; +	strncat(si->errmsgbuf, errmsg, sizeof(si->errmsgbuf)-1); +} + + +static int parsesearch(const char *cn, const char *mail, +		       void *voidarg) +{ +	struct search_info *si=(struct search_info *)voidarg; + +	char	numbuf[NUMBUFSIZE]; +	char	numbuf2[NUMBUFSIZE+10]; + +	char *cn_native; + +	cn_native=libmail_u_convert_fromutf8(cn, sqwebmail_content_charset, +					     NULL); + +	if (cn_native) +		cn=cn_native; +  +	fprintf(si->fpw, "<tr valign=\"top\"><td><input type=\"checkbox\" " +				"name=\"%s\" value=\"<", +		strcat(strcpy(numbuf2, "ADDY"), +		       libmail_str_size_t(si->counter++, numbuf))); + +	output_attrencoded_fp(mail, si->fpw); +	fprintf(si->fpw, ">"); + +	output_attrencoded_fp(cn, si->fpw); + +	fprintf(si->fpw, ""\" /></td><td><font size=\"+1\" class=\"ldapsearch-name\">\""); + +	output_attrencoded_fp(cn, si->fpw); +	fprintf(si->fpw, +		"\"</font><font size=\"+1\" class=\"ldapsearch-addr\"><"); +	output_attrencoded_fp(mail, si->fpw); +	fprintf(si->fpw, "></font>"); +	fprintf(si->fpw, "</td></tr>\n"); + +	if (cn_native) +		free(cn_native); +	return 0; +} + +void	doldapsearch() +{ +char	*f; +struct ldapabook *abooks[2]; +const struct ldapabook *ptr; + +	abooks[0]=ldapabook_read(LDAPADDRESSBOOK); +	abooks[1]=ldapabook_read(LOCALABOOK); + +	ptr=ldapabook_find(abooks[0], cgi("ABOOK")); +	if (!ptr) +		ptr=ldapabook_find(abooks[1], cgi("ABOOK")); + +	if (ptr && (f=getfilter()) != 0) +	{ +		char	*tmpname=0; +		struct search_info si; +		struct maildir_tmpcreate_info createInfo; + +		pref_setldap(ptr->name); +		printf("<pre>"); +		fflush(stdout); + + +		si.fpw=NULL; +		si.errmsgbuf[0]=0; +		si.counter=0; + +		maildir_tmpcreate_init(&createInfo); +		createInfo.uniq="ldap"; +		createInfo.doordie=1; + +		si.fpw=maildir_tmpcreate_fp(&createInfo); + +		tmpname=createInfo.tmpname; +		createInfo.tmpname=NULL; +		maildir_tmpcreate_free(&createInfo); + +		if (ldapabook_search(ptr, LDAPSEARCH, f, parsesearch, +				     save_errmsg, &si) == 0) +		{ +			int	c; + +			printf("</pre>"); + +			if (si.counter == 0) +				printf("%s", getarg("NOTFOUND")); + +			printf("<table border=\"0\" cellpadding=\"4\">\n"); +		 +			fflush(si.fpw); +			rewind(si.fpw); +			while ((c=getc(si.fpw)) != EOF) +				putchar(c); + +			printf("<tr><td colspan=\"2\"><hr width=\"90%%\" />" +			       "<input type=\"hidden\" name=\"ADDYCNT\" value=\"%u\" />\n" +			       "</td></tr>\n", si.counter); +			printf("<tr><td colspan=\"2\"><table>"); + +			printf("<tr><td align=\"right\">%s</td><td>" +			       "<select name=\"nick1\"><option value=\"\"></option>\n", getarg("ADD")); +			ab_listselect_fp(stdout); +			printf("</select></td></tr>\n"); +			printf("<tr><td align=\"right\">%s</td><td>" +			       "<input type=\"text\" name=\"nick2\" /></td></tr>\n", getarg("CREATE")); +			printf("<tr><td></td><td>" +			       "<input type=\"submit\" name=\"import\" value=\"%s\" /></td></tr>", +			       getarg("SUBMIT")); +			printf("</table></td></tr></table>\n"); +		} +		else if (si.errmsgbuf[0]) +		{ +			output_attrencoded_oknl(si.errmsgbuf); +			printf("</pre>"); + +		} +		fclose(si.fpw); + +		if (tmpname) +		{ +			unlink(tmpname); +			free(tmpname); +		} +	} +} | 
