LibBalsaAddressBook * libbalsa_address_book_ldap_new(const gchar *name, const gchar *host, const gchar *base_dn, const gchar *bind_dn, const gchar *passwd, const gchar *priv_book_dn, gboolean enable_tls) { LibBalsaAddressBookLdap *ldap; LibBalsaAddressBook *ab; ldap = LIBBALSA_ADDRESS_BOOK_LDAP(g_object_new (LIBBALSA_TYPE_ADDRESS_BOOK_LDAP, NULL)); ab = LIBBALSA_ADDRESS_BOOK(ldap); ab->name = g_strdup(name); ldap->host = g_strdup(host); ldap->base_dn = g_strdup(base_dn); ldap->bind_dn = g_strdup(bind_dn); ldap->priv_book_dn = g_strdup(priv_book_dn ? priv_book_dn : bind_dn); ldap->passwd = g_strdup(passwd); ldap->enable_tls = enable_tls; /* We open on demand... */ ldap->directory = NULL; return ab; }
static void libbalsa_address_book_ldap_init(LibBalsaAddressBookLdap * ab) { ab->host = NULL; ab->base_dn = NULL; ab->bind_dn = NULL; ab->priv_book_dn = NULL; ab->passwd = NULL; ab->enable_tls = FALSE; ab->directory = NULL; LIBBALSA_ADDRESS_BOOK(ab)->is_expensive = TRUE; }
/* Public method */ LibBalsaAddressBook * libbalsa_address_book_vcard_new(const gchar * name, const gchar * path) { LibBalsaAddressBookVcard *abvc; LibBalsaAddressBook *ab; abvc = LIBBALSA_ADDRESS_BOOK_VCARD(g_object_new (LIBBALSA_TYPE_ADDRESS_BOOK_VCARD, NULL)); ab = LIBBALSA_ADDRESS_BOOK(abvc); ab->name = g_strdup(name); LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path); return ab; }
/* Public method */ LibBalsaAddressBook * libbalsa_address_book_ldif_new(const gchar * name, const gchar * path) { LibBalsaAddressBookLdif *ab_ldif; LibBalsaAddressBook *ab; ab_ldif = LIBBALSA_ADDRESS_BOOK_LDIF(g_object_new (LIBBALSA_TYPE_ADDRESS_BOOK_LDIF, NULL)); ab = LIBBALSA_ADDRESS_BOOK(ab_ldif); ab->name = g_strdup(name); LIBBALSA_ADDRESS_BOOK_TEXT(ab)->path = g_strdup(path); return ab; }
/* Public method */ LibBalsaAddressBook * libbalsa_address_book_rubrica_new(const gchar * name, const gchar * path) { LibBalsaAddressBookRubrica *ab_rubrica; LibBalsaAddressBookText *ab_text; LibBalsaAddressBook *ab; ab_rubrica = LIBBALSA_ADDRESS_BOOK_RUBRICA(g_object_new (LIBBALSA_TYPE_ADDRESS_BOOK_RUBRICA, NULL)); ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); ab = LIBBALSA_ADDRESS_BOOK(ab_rubrica); ab->name = g_strdup(name); ab_text->path = g_strdup(path); return ab; }
static int libbalsa_address_book_ldap_open_connection(LibBalsaAddressBookLdap * ab) { int result; static const int version = LDAP_VERSION3; gboolean v3_enabled; LibBalsaAddressBook *lbab = LIBBALSA_ADDRESS_BOOK(ab); g_return_val_if_fail(ab->host != NULL, FALSE); ldap_initialize(&ab->directory, ab->host); if (ab->directory == NULL) { /* very unlikely... */ libbalsa_address_book_set_status(lbab, g_strdup("Host not found")); return LDAP_SERVER_DOWN; } /* ignore error if the V3 LDAP cannot be set */ v3_enabled = ldap_set_option(ab->directory, LDAP_OPT_PROTOCOL_VERSION, &version) == LDAP_OPT_SUCCESS; if(!v3_enabled) printf("Too old LDAP server - interaction may fail.\n"); if(v3_enabled && ab->enable_tls) { #ifdef HAVE_LDAP_TLS /* turn TLS on but what if we have SSL already on? */ result = ldap_start_tls_s(ab->directory, NULL, NULL); if(result != LDAP_SUCCESS) { ldap_unbind_ext(ab->directory, NULL, NULL); ab->directory = NULL; libbalsa_address_book_set_status (lbab, g_strdup(ldap_err2string(result))); return result; } #else /* HAVE_LDAP_TLS */ libbalsa_address_book_set_status(lbab, _("TLS requested but not compiled in")); return LDAP_INAPPRIOPRIATE_AUTH; #endif /* HAVE_LDAP_TLS */ } #ifdef HAVE_CYRUS_SASL result = ldap_sasl_interactive_bind_s(ab->directory, ab->bind_dn, NULL, NULL, NULL, LDAP_SASL_QUIET, abl_interact, ab); #else /* HAVE_CYRUS_SASL */ { struct berval cred; cred.bv_val = ab->passwd; cred.bv_len = ab->passwd ? strlen(ab->passwd) : 0; result = ldap_sasl_bind_s(ab->directory, ab->bind_dn, NULL, &cred, NULL, NULL, NULL); } #endif /* HAVE_CYRUS_SASL */ /* do not follow referrals (OpenLDAP binds anonymously here, which will usually * fail */ if (result == LDAP_SUCCESS) result = ldap_set_option(ab->directory, LDAP_OPT_REFERRALS, (void *)LDAP_OPT_OFF); if (result != LDAP_SUCCESS) { libbalsa_address_book_set_status(lbab, g_strdup(ldap_err2string(result))); ldap_unbind_ext(ab->directory, NULL, NULL); ab->directory = NULL; } return result; }
/* -- helpers -- */ static LibBalsaABErr lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica, xmlDocPtr * docptr) { LibBalsaAddressBookText *ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(ab_rubrica); struct stat stat_buf; int fd; xmlDocPtr doc = NULL; xmlNodePtr root_element = NULL; GList *completion_list; CompletionData *cmp_data; GSList *list; /* init the return pointer (if any) */ if (docptr) *docptr = NULL; /* eject if the file did not change on disk and no document result pointer is passed */ if (!docptr && stat(ab_text->path, &stat_buf) == 0) { if (stat_buf.st_mtime == ab_text->mtime) return LBABERR_OK; else ab_text->mtime = stat_buf.st_mtime; } /* free old data */ g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL); g_slist_free(ab_text->item_list); ab_text->item_list = NULL; g_list_foreach(ab_text->name_complete->items, (GFunc) completion_data_free, NULL); libbalsa_completion_clear_items(ab_text->name_complete); /* try to read the address book */ if ((fd = open(ab_text->path, O_RDONLY)) == -1) return LBABERR_CANNOT_READ; if (libbalsa_lock_file(ab_text->path, fd, FALSE, TRUE, FALSE) < 0) { close(fd); return LBABERR_CANNOT_READ; } doc = xmlParseFile(ab_text->path); libbalsa_unlock_file(ab_text->path, fd, FALSE); close(fd); if (!doc) return LBABERR_CANNOT_READ; /* Get the root element node and extract cards if it is a Rubrica book */ root_element = xmlDocGetRootElement(doc); if (!xmlStrcmp(root_element->name, CXMLCHARP("Rubrica"))) ab_text->item_list = extract_cards(root_element->children); /* return the document if requested of free it */ if (docptr) *docptr = doc; else xmlFreeDoc(doc); /* build the completion list */ // FIXME - Rubrica provides groups... completion_list = NULL; for (list = ab_text->item_list; list; list = list->next) { LibBalsaAddress *address = LIBBALSA_ADDRESS(list->data); GList *l; if (!address) continue; if (address->address_list->next && LIBBALSA_ADDRESS_BOOK(ab_rubrica)->dist_list_mode) { /* Create a group address. */ InternetAddress *ia = internet_address_group_new(address->full_name); InternetAddressGroup *group = (InternetAddressGroup *) ia; for (l = address->address_list; l; l = l->next) { InternetAddress *member = internet_address_mailbox_new(NULL, l->data); internet_address_group_add_member(group, member); g_object_unref(member); } cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } else { /* Create name addresses. */ GList *l; for (l = address->address_list; l; l = l->next) { InternetAddress *ia = internet_address_mailbox_new(address->full_name, l->data); cmp_data = completion_data_new(ia, address->nick_name); completion_list = g_list_prepend(completion_list, cmp_data); g_object_unref(ia); } } } completion_list = g_list_reverse(completion_list); libbalsa_completion_add_items(ab_text->name_complete, completion_list); g_list_free(completion_list); return LBABERR_OK; }