diff options
author | Chris Toshok <toshok@ximian.com> | 2001-08-08 23:17:39 +0800 |
---|---|---|
committer | Chris Toshok <toshok@src.gnome.org> | 2001-08-08 23:17:39 +0800 |
commit | 3e061166215db142aa64f1e67dee36bbaa715771 (patch) | |
tree | 6a578d315946158fcfdfb0569eef5c82c3e9f013 /addressbook/backend/pas/pas-backend-ldap.c | |
parent | 96c6dc75246d83135672536910160a519ed751ef (diff) | |
download | gsoc2013-evolution-3e061166215db142aa64f1e67dee36bbaa715771.tar.gz gsoc2013-evolution-3e061166215db142aa64f1e67dee36bbaa715771.tar.zst gsoc2013-evolution-3e061166215db142aa64f1e67dee36bbaa715771.zip |
escape *, \, (, and ), as per rfc2254. (func_contains): escape the string.
2001-08-08 Chris Toshok <toshok@ximian.com>
* backend/pas/pas-backend-ldap.c (rfc2254_escape): escape *, \, (,
and ), as per rfc2254.
(func_contains): escape the string.
(func_is): same.
(func_beginswith): same.
(func_endswith): same.
svn path=/trunk/; revision=11789
Diffstat (limited to 'addressbook/backend/pas/pas-backend-ldap.c')
-rw-r--r-- | addressbook/backend/pas/pas-backend-ldap.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c index 8d38f22255..43cbe50c3a 100644 --- a/addressbook/backend/pas/pas-backend-ldap.c +++ b/addressbook/backend/pas/pas-backend-ldap.c @@ -1429,6 +1429,43 @@ business_compare (ECardSimple *ecard1, ECardSimple *ecard2) return TRUE; } +#define IS_RFC2254_CHAR(c) ((c) == '*' || (c) =='\\' || (c) == '(' || (c) == ')' || (c) == '\0') +static char hex[] = "0123456789abcdef"; +static char * +rfc2254_escape(char *str) +{ + int i; + int len = strlen(str); + int newlen = 0; + + for (i = 0; i < len; i ++) { + if (IS_RFC2254_CHAR(str[i])) + newlen += 3; + else + newlen ++; + } + + if (len == newlen) { + return g_strdup (str); + } + else { + char *newstr = g_malloc0 (newlen + 1); + int j = 0; + for (i = 0; i < len; i ++) { + if (IS_RFC2254_CHAR(str[i])) { + newstr[j++] = '\\'; + newstr[j++] = hex[(str[i]&0xf0) >> 4]; + newstr[j++] = hex[str[i]&0x0f]; + } + else { + newstr[j++] = str[i]; + } + } + return newstr; + } + +} + static ESExpResult * func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) { @@ -1529,7 +1566,7 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data && argv[0]->type == ESEXP_RES_STRING && argv[1]->type == ESEXP_RES_STRING) { char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; + char *str = rfc2254_escape(argv[1]->value.string); gboolean one_star = FALSE; if (strlen(str) == 0) @@ -1573,6 +1610,8 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data str, one_star ? "" : "*")); } + + g_free (str); } r = e_sexp_result_new(f, ESEXP_RES_BOOL); @@ -1591,7 +1630,7 @@ func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) && argv[0]->type == ESEXP_RES_STRING && argv[1]->type == ESEXP_RES_STRING) { char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; + char *str = rfc2254_escape(argv[1]->value.string); char *ldap_attr = query_prop_to_ldap(propname); if (ldap_attr) @@ -1604,6 +1643,8 @@ func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) *list = g_list_prepend(*list, g_strdup("objectClass=MyBarnIsBiggerThanYourBarn")); } + + g_free (str); } r = e_sexp_result_new(f, ESEXP_RES_BOOL); @@ -1622,7 +1663,7 @@ func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *da && argv[0]->type == ESEXP_RES_STRING && argv[1]->type == ESEXP_RES_STRING) { char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; + char *str = rfc2254_escape(argv[1]->value.string); char *ldap_attr = query_prop_to_ldap(propname); gboolean one_star = FALSE; @@ -1634,6 +1675,7 @@ func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *da g_strdup_printf("(%s=%s*)", ldap_attr, str)); + g_free (str); } r = e_sexp_result_new(f, ESEXP_RES_BOOL); @@ -1652,7 +1694,7 @@ func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data && argv[0]->type == ESEXP_RES_STRING && argv[1]->type == ESEXP_RES_STRING) { char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; + char *str = rfc2254_escape(argv[1]->value.string); char *ldap_attr = query_prop_to_ldap(propname); gboolean one_star = FALSE; @@ -1664,6 +1706,7 @@ func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data g_strdup_printf("(%s=*%s)", ldap_attr, str)); + g_free (str); } r = e_sexp_result_new(f, ESEXP_RES_BOOL); |