1 /*
2 ** Copyright 2009 Double Precision, Inc.  See COPYING for
3 ** distribution information.
4 */
5 
6 #if	HAVE_CONFIG_H
7 #include	"courier_auth_config.h"
8 #endif
9 #include	<stdio.h>
10 #include	<stdlib.h>
11 #include	<string.h>
12 #include	<errno.h>
13 #if	HAVE_UNISTD_H
14 #include	<unistd.h>
15 #endif
16 
17 #include	"courierauth.h"
18 
19 
escape_specials(const char * str,char * bufptr,size_t * sizeptr)20 static void escape_specials(const char *str,
21 			    char *bufptr,
22 			    size_t *sizeptr)
23 {
24 	static const char specials[]="*()\\";
25 
26 	while (*str)
27 	{
28 		char buf[10];
29 		char *p;
30 
31 		if (strchr(specials, *str))
32 		{
33 			sprintf(buf, "\\%02x", (int)(unsigned char)*str);
34 		}
35 		else
36 		{
37 			buf[0]=*str;
38 			buf[1]=0;
39 		}
40 
41 		for (p=buf; *p; p++)
42 		{
43 			if (bufptr)
44 				*bufptr++=*p;
45 			if (sizeptr)
46 				++*sizeptr;
47 		}
48 		++str;
49 	}
50 
51 	if (bufptr)
52 		*bufptr=0;
53 }
54 
courier_auth_ldap_escape(const char * str)55 char *courier_auth_ldap_escape(const char *str)
56 {
57 	char *escaped;
58 	size_t escaped_cnt=1;
59 
60 	escape_specials(str, NULL, &escaped_cnt);
61 	escaped=malloc(escaped_cnt);
62 	if (!escaped)
63 		return NULL;
64 
65 	escape_specials(str, escaped, NULL);
66 
67 	return escaped;
68 }
69