aboutsummaryrefslogtreecommitdiffstats
path: root/addressbook/backend
diff options
context:
space:
mode:
authorChris Toshok <toshok@ximian.com>2002-03-01 04:20:42 +0800
committerChris Toshok <toshok@src.gnome.org>2002-03-01 04:20:42 +0800
commit2d731c96fcbb5b628f14659283217973a988b846 (patch)
tree9c26a716816a76029025681fce1d314c06829d81 /addressbook/backend
parentfe651a3d8f7a7d2191917877d127e55c1b2c577d (diff)
downloadgsoc2013-evolution-2d731c96fcbb5b628f14659283217973a988b846.tar.gz
gsoc2013-evolution-2d731c96fcbb5b628f14659283217973a988b846.tar.zst
gsoc2013-evolution-2d731c96fcbb5b628f14659283217973a988b846.zip
[fixes bug #20690] the data arg is not GList** anymore, it's
2002-02-27 Chris Toshok <toshok@ximian.com> [fixes bug #20690] * backend/pas/pas-backend-ldap.c (func_and): the data arg is not GList** anymore, it's PASBackendLDAPSExpData*, so use ldap_data->list instead of *list. (func_or): same. (func_not): same. (func_contains): same. (func_is): same. (func_endswith): same. (func_beginswith): same, but also special case the beginswith "fileAs" query type (the one used by the alphabet buttons on the right hand side, so we can deal with entries that don't have fileAs attributes, and return meaningful responses.) (pas_backend_ldap_build_query): initialize the PASBackendLDAPSExpData struct and pass that instead of &list. Also, take the PASBackendLDAP arg to add to the struct in case we need it at some point in the future. (ldap_search_handler): pass in the PASBackendLDAP. svn path=/trunk/; revision=15871
Diffstat (limited to 'addressbook/backend')
-rw-r--r--addressbook/backend/pas/pas-backend-ldap.c117
1 files changed, 65 insertions, 52 deletions
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c
index e99b51c699..3128b79104 100644
--- a/addressbook/backend/pas/pas-backend-ldap.c
+++ b/addressbook/backend/pas/pas-backend-ldap.c
@@ -1813,6 +1813,11 @@ birthday_compare (ECardSimple *ecard1, ECardSimple *ecard2)
return equal;
}
+typedef struct {
+ GList *list;
+ PASBackendLDAP *bl;
+} PASBackendLDAPSExpData;
+
#define IS_RFC2254_CHAR(c) ((c) == '*' || (c) =='\\' || (c) == '(' || (c) == ')' || (c) == '\0')
static char *
rfc2254_escape(char *str)
@@ -1850,7 +1855,7 @@ rfc2254_escape(char *str)
static ESExpResult *
func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
char ** strings;
@@ -1862,15 +1867,15 @@ func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
strings[argc+3 - 2] = g_strdup (")");
for (i = 0; i < argc; i ++) {
- GList *list_head = *list;
+ GList *list_head = ldap_data->list;
if (!list_head)
break;
strings[argc - i] = list_head->data;
- *list = g_list_remove_link(list_head, list_head);
+ ldap_data->list = g_list_remove_link(list_head, list_head);
g_list_free_1(list_head);
}
- *list = g_list_prepend(*list, g_strjoinv(" ", strings));
+ ldap_data->list = g_list_prepend(ldap_data->list, g_strjoinv(" ", strings));
for (i = 0 ; i < argc + 2; i ++)
g_free (strings[i]);
@@ -1887,7 +1892,7 @@ func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
static ESExpResult *
func_or(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
char ** strings;
@@ -1899,15 +1904,15 @@ func_or(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
strings[argc+3 - 2] = g_strdup (")");
for (i = 0; i < argc; i ++) {
- GList *list_head = *list;
+ GList *list_head = ldap_data->list;
if (!list_head)
break;
strings[argc - i] = list_head->data;
- *list = g_list_remove_link(list_head, list_head);
+ ldap_data->list = g_list_remove_link(list_head, list_head);
g_list_free_1(list_head);
}
- *list = g_list_prepend(*list, g_strjoinv(" ", strings));
+ ldap_data->list = g_list_prepend(ldap_data->list, g_strjoinv(" ", strings));
for (i = 0 ; i < argc + 2; i ++)
g_free (strings[i]);
@@ -1924,13 +1929,13 @@ func_or(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
static ESExpResult *
func_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
/* just replace the head of the list with the NOT of it. */
if (argc > 0) {
- char *term = (*list)->data;
- (*list)->data = g_strdup_printf("(!%s)", term);
+ char *term = ldap_data->list->data;
+ ldap_data->list->data = g_strdup_printf("(!%s)", term);
g_free (term);
}
@@ -1943,7 +1948,7 @@ func_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
static ESExpResult *
func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
if (argc == 2
@@ -1980,7 +1985,7 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
}
strcat (big_query, ")");
- *list = g_list_prepend(*list, big_query);
+ ldap_data->list = g_list_prepend(ldap_data->list, big_query);
g_free (match_str);
}
@@ -1988,11 +1993,11 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
char *ldap_attr = query_prop_to_ldap(propname);
if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=*%s%s)",
- ldap_attr,
- str,
- one_star ? "" : "*"));
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup_printf("(%s=*%s%s)",
+ ldap_attr,
+ str,
+ one_star ? "" : "*"));
}
g_free (str);
@@ -2007,7 +2012,7 @@ func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
static ESExpResult *
func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
if (argc == 2
@@ -2018,14 +2023,14 @@ func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
char *ldap_attr = query_prop_to_ldap(propname);
if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=%s)",
- ldap_attr, str));
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup_printf("(%s=%s)",
+ ldap_attr, str));
else {
g_warning ("unknown query property\n");
/* we want something that'll always be false */
- *list = g_list_prepend(*list,
- g_strdup("objectClass=MyBarnIsBiggerThanYourBarn"));
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup("objectClass=MyBarnIsBiggerThanYourBarn"));
}
g_free (str);
@@ -2040,7 +2045,7 @@ func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
static ESExpResult *
func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
if (argc == 2
@@ -2049,16 +2054,25 @@ func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *da
char *propname = argv[0]->value.string;
char *str = rfc2254_escape(argv[1]->value.string);
char *ldap_attr = query_prop_to_ldap(propname);
- gboolean one_star = FALSE;
- if (strlen(str) == 0)
- one_star = TRUE;
+ /* insert hack for fileAs queries, since we need to do
+ the right thing if the server supports them or not,
+ and for entries that have no fileAs attribute. */
+ if (ldap_attr) {
+ if (!strcmp (ldap_attr, "fileAs")) {
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup_printf(
+ "(|(fileAs=%s*)(&(!(fileAs=*))(sn=%s*)))",
+ str, str));
+ }
+ else {
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup_printf("(%s=%s*)",
+ ldap_attr,
+ str));
+ }
+ }
- if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=%s*)",
- ldap_attr,
- str));
g_free (str);
}
@@ -2071,7 +2085,7 @@ func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *da
static ESExpResult *
func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data)
{
- GList **list = data;
+ PASBackendLDAPSExpData *ldap_data = data;
ESExpResult *r;
if (argc == 2
@@ -2080,16 +2094,12 @@ func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data
char *propname = argv[0]->value.string;
char *str = rfc2254_escape(argv[1]->value.string);
char *ldap_attr = query_prop_to_ldap(propname);
- gboolean one_star = FALSE;
-
- if (strlen(str) == 0)
- one_star = TRUE;
if (ldap_attr)
- *list = g_list_prepend(*list,
- g_strdup_printf("(%s=*%s)",
- ldap_attr,
- str));
+ ldap_data->list = g_list_prepend(ldap_data->list,
+ g_strdup_printf("(%s=*%s)",
+ ldap_attr,
+ str));
g_free (str);
}
@@ -2116,23 +2126,26 @@ static struct {
};
static gchar *
-pas_backend_ldap_build_query (gchar *query)
+pas_backend_ldap_build_query (PASBackendLDAP *bl, gchar *query)
{
ESExp *sexp;
ESExpResult *r;
gchar *retval;
- GList *list = NULL;
+ PASBackendLDAPSExpData data;
int i;
+ data.list = NULL;
+ data.bl = bl;
+
sexp = e_sexp_new();
for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) {
if (symbols[i].type == 1) {
e_sexp_add_ifunction(sexp, 0, symbols[i].name,
- (ESExpIFunc *)symbols[i].func, &list);
+ (ESExpIFunc *)symbols[i].func, &data);
} else {
e_sexp_add_function(sexp, 0, symbols[i].name,
- symbols[i].func, &list);
+ symbols[i].func, &data);
}
}
@@ -2144,14 +2157,14 @@ pas_backend_ldap_build_query (gchar *query)
e_sexp_result_free(sexp, r);
e_sexp_unref (sexp);
- if (list) {
- if (list->next) {
+ if (data.list) {
+ if (data.list->next) {
g_warning ("conversion to ldap query string failed");
retval = NULL;
- g_list_foreach (list, (GFunc)g_free, NULL);
+ g_list_foreach (data.list, (GFunc)g_free, NULL);
}
else {
- retval = list->data;
+ retval = data.list->data;
}
}
else {
@@ -2159,7 +2172,7 @@ pas_backend_ldap_build_query (gchar *query)
retval = NULL;
}
- g_list_free (list);
+ g_list_free (data.list);
return retval;
}
@@ -2365,7 +2378,7 @@ ldap_search_handler (PASBackend *backend, LDAPOp *op)
/* it might not be NULL if we've been restarted */
if (search_op->ldap_query == NULL)
- search_op->ldap_query = pas_backend_ldap_build_query(search_op->view->search);
+ search_op->ldap_query = pas_backend_ldap_build_query(PAS_BACKEND_LDAP (backend), search_op->view->search);
if (search_op->ldap_query != NULL) {
PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend);