diff options
Diffstat (limited to 'addressbook/backend')
-rw-r--r-- | addressbook/backend/pas/pas-backend-ldap.c | 117 |
1 files changed, 79 insertions, 38 deletions
diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c index 1132c6fb14..561ed64153 100644 --- a/addressbook/backend/pas/pas-backend-ldap.c +++ b/addressbook/backend/pas/pas-backend-ldap.c @@ -29,9 +29,11 @@ #define OPENLDAP1 #endif +#if 0 #ifdef OPENLDAP1 #define LDAP_NAME_ERROR(x) NAME_ERROR(x) #endif +#endif #ifdef OPENLDAP2 #include "ldap_schema.h" @@ -46,9 +48,12 @@ #define LDAP_MAX_SEARCH_RESPONSES 100 -#define INETORGPERSON "inetOrgPerson" -#define EVOLVEPERSON "evolvePerson" - +/* the objectClasses we need */ +#define TOP "top" +#define PERSON "person" +#define ORGANIZATIONALPERSON "organizationalPerson" +#define INETORGPERSON "inetOrgPerson" +#define EVOLVEPERSON "evolvePerson" static gchar *query_prop_to_ldap(gchar *query_prop); @@ -69,6 +74,8 @@ struct _PASBackendLDAPPrivate { LDAP *ldap; + EList *supported_fields; + /* whether or not there's support for the objectclass we need to store all our additional fields */ gboolean evolvePersonSupported; @@ -269,17 +276,59 @@ view_destroy(GtkObject *object, gpointer data) } static void -check_for_evolve_person (PASBackendLDAP *bl) +add_to_supported_fields (PASBackendLDAP *bl, char **attrs, GHashTable *attr_hash) +{ + int i; + for (i = 0; attrs[i]; i ++) { + char *query_prop = g_hash_table_lookup (attr_hash, attrs[i]); + + if (query_prop) { + e_list_append (bl->priv->supported_fields, g_strdup(query_prop)); + + /* handle the list attributes here */ + if (!strcmp (query_prop, "email")) { + e_list_append (bl->priv->supported_fields, g_strdup("email_2")); + e_list_append (bl->priv->supported_fields, g_strdup("email_3")); + } + else if (!strcmp (query_prop, "business_phone")) { + e_list_append (bl->priv->supported_fields, g_strdup("business_phone_2")); + } + else if (!strcmp (query_prop, "home_phone")) { + e_list_append (bl->priv->supported_fields, g_strdup("home_phone_2")); + } + } + } +} + +static void +add_oc_attributes_to_supported_fields (PASBackendLDAP *bl, LDAPObjectClass *oc) +{ + int i; + GHashTable *attr_hash = g_hash_table_new (g_str_hash, g_str_equal); + + for (i = 0; i < num_prop_infos; i ++) + g_hash_table_insert (attr_hash, prop_info[i].ldap_attr, prop_info[i].query_prop); + + if (oc->oc_at_oids_must) + add_to_supported_fields (bl, oc->oc_at_oids_must, attr_hash); + + if (oc->oc_at_oids_may) + add_to_supported_fields (bl, oc->oc_at_oids_may, attr_hash); + + g_hash_table_destroy (attr_hash); +} + +static void +check_schema_support (PASBackendLDAP *bl) { -#ifdef OPENLDAP2 char *attrs[2]; LDAPMessage *resp; LDAP *ldap = bl->priv->ldap; -#endif bl->priv->evolvePersonChecked = TRUE; -#ifdef OPENLDAP2 + bl->priv->supported_fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); + attrs[0] = "objectClasses"; attrs[1] = NULL; @@ -297,6 +346,7 @@ check_for_evolve_person (PASBackendLDAP *bl) int code; const char *err; LDAPObjectClass *oc = ldap_str2objectclass (values[i], &code, &err, 0); + if (!oc) continue; @@ -304,16 +354,19 @@ check_for_evolve_person (PASBackendLDAP *bl) if (!g_strcasecmp (oc->oc_names[j], EVOLVEPERSON)) { g_print ("support found on ldap server for objectclass evolvePerson\n"); bl->priv->evolvePersonSupported = TRUE; - ldap_objectclass_free (oc); - goto done; + + add_oc_attributes_to_supported_fields (bl, oc); + } + else if (!g_strcasecmp (oc->oc_names[j], INETORGPERSON) + || !g_strcasecmp (oc->oc_names[j], ORGANIZATIONALPERSON) + || !g_strcasecmp (oc->oc_names[j], PERSON)) { + add_oc_attributes_to_supported_fields (bl, oc); } ldap_objectclass_free (oc); } - done: } } -#endif } static void @@ -327,13 +380,11 @@ pas_backend_ldap_connect (PASBackendLDAP *bl) blpriv->ldap = ldap_open (blpriv->ldap_host, blpriv->ldap_port); #ifdef DEBUG -#ifdef OPENLDAP2 { int debug_level = ~0; ldap_set_option (blpriv->ldap, LDAP_OPT_DEBUG_LEVEL, &debug_level); } #endif -#endif if (NULL != blpriv->ldap) { ldap_simple_bind_s(blpriv->ldap, @@ -352,7 +403,7 @@ pas_backend_ldap_connect (PASBackendLDAP *bl) /* check to see if evolvePerson is supported, if we can (me might not be able to if we can't authenticate. if we can't, try again in auth_user.) */ - check_for_evolve_person (bl); + check_schema_support (bl); } static void @@ -656,14 +707,17 @@ add_objectclass_mod (PASBackendLDAP *bl, GPtrArray *mod_array) objectclass_mod = g_new (LDAPMod, 1); objectclass_mod->mod_op = LDAP_MOD_ADD; objectclass_mod->mod_type = g_strdup ("objectClass"); - objectclass_mod->mod_values = g_new (char*, bl->priv->evolvePersonSupported ? 3 : 2); - objectclass_mod->mod_values[0] = g_strdup (INETORGPERSON); + objectclass_mod->mod_values = g_new (char*, bl->priv->evolvePersonSupported ? 6 : 5); + objectclass_mod->mod_values[0] = g_strdup (TOP); + objectclass_mod->mod_values[1] = g_strdup (PERSON); + objectclass_mod->mod_values[2] = g_strdup (ORGANIZATIONALPERSON); + objectclass_mod->mod_values[3] = g_strdup (INETORGPERSON); if (bl->priv->evolvePersonSupported) { - objectclass_mod->mod_values[1] = g_strdup (EVOLVEPERSON); - objectclass_mod->mod_values[2] = NULL; + objectclass_mod->mod_values[4] = g_strdup (EVOLVEPERSON); + objectclass_mod->mod_values[5] = NULL; } else { - objectclass_mod->mod_values[1] = NULL; + objectclass_mod->mod_values[4] = NULL; } g_ptr_array_add (mod_array, objectclass_mod); } @@ -961,11 +1015,7 @@ modify_card_handler (PASBackend *backend, LDAPOp *op) ldap_mods = (LDAPMod**)mod_array->pdata; /* actually perform the ldap modify */ -#ifdef OPENLDAP2 ldap_error = ldap_modify_ext_s (ldap, id, ldap_mods, NULL, NULL); -#else - ldap_error = ldap_modify (ldap, id, ldap_mods); -#endif if (ldap_error != LDAP_SUCCESS) ldap_perror (ldap, "ldap_modify_s"); } @@ -1844,7 +1894,6 @@ ldap_search_handler (PASBackend *backend, LDAPOp *op) LDAP *ldap = bl->priv->ldap; int ldap_err; -#ifdef OPENLDAP2 ldap_err = ldap_search_ext (ldap, bl->priv->ldap_rootdn, bl->priv->ldap_scope, search_op->ldap_query, @@ -1858,15 +1907,6 @@ ldap_search_handler (PASBackend *backend, LDAPOp *op) pas_book_view_notify_status_message (view->book_view, ldap_err2string(ldap_err)); return TRUE; /* act synchronous in this case */ } -#else - ldap->ld_sizelimit = LDAP_MAX_SEARCH_RESPONSES; - ldap->ld_deref = LDAP_DEREF_ALWAYS; - view->search_msgid = ldap_search (ldap, bl->priv->ldap_rootdn, - bl->priv->ldap_scope, - search_op->ldap_query, - NULL, 0); - ldap_err = ldap->ld_errno; -#endif if (view->search_msgid == -1) { pas_book_view_notify_status_message (view->book_view, ldap_err2string(ldap_err)); @@ -1988,7 +2028,7 @@ pas_backend_ldap_process_authenticate_user (PASBackend *backend, ldap_error_to_response (ldap_error)); if (!bl->priv->evolvePersonChecked) - check_for_evolve_person (bl); + check_schema_support (bl); } static void @@ -1997,13 +2037,11 @@ pas_backend_ldap_process_get_supported_fields (PASBackend *backend, PASRequest *req) { - EList *fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); - - printf ("in pas_backend_ldap_get_supported_fields\n"); + PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); pas_book_respond_get_supported_fields (book, GNOME_Evolution_Addressbook_BookListener_Success, - fields); + bl->priv->supported_fields); } static gboolean @@ -2281,6 +2319,9 @@ pas_backend_ldap_destroy (GtkObject *object) g_list_foreach (bl->priv->pending_ops, (GFunc)call_dtor, NULL); g_list_free (bl->priv->pending_ops); + if (bl->priv->supported_fields) + gtk_object_unref (GTK_OBJECT (bl->priv->supported_fields)); + g_free (bl->priv->uri); GTK_OBJECT_CLASS (pas_backend_ldap_parent_class)->destroy (object); |