[Patch] LDAP address book: use all email attributes
Albrecht Dreß <[email protected]>
| Newsgroups | gmane.comp.gnome.apps.balsa |
|---|---|
| Message-ID | <[email protected]> |
Hi all, I use Balsa at work with an OpenLDAP server, containing all users of the organisation. Not sure if this is standard, but they may have multiple LDAP “mail” attributes. However, Balsa's LDAP address book uses the first mail attribute returned by the server only. The attached simple patch add the following changes to libbalsa/address-book-ldap.c: - libbalsa_address_book_ldap_get_address(): assign the GList of all mail attribute strings to LibBalsaAddress instead of the first one only; - lbabl_get_internet_address(): append separate InternetAddress to a GList instead on returning the first one only. I must admit that this is a quick hack, added this afternoon, but it works perfectly for me… Opinions? Cheers, Albrecht. _______________________________________________ balsa-list mailing list [email protected] https://mail.gnome.org/mailman/listinfo/balsa-list
ldap_multiple_mail_addrs.diff
(text/x-patch, 4.2 KB)
diff --git a/libbalsa/address-book-ldap.c b/libbalsa/address-book-ldap.c
index 67c404530..e13481ea3 100644
--- a/libbalsa/address-book-ldap.c
+++ b/libbalsa/address-book-ldap.c
@@ -448,7 +448,8 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
LDAPMessage * e)
{
LibBalsaAddressBookLdap *ldap_ab;
- gchar *email = NULL, *cn = NULL, *org = NULL, *uid = NULL;
+ GList *email = NULL;
+ gchar *cn = NULL, *org = NULL, *uid = NULL;
gchar *first = NULL, *last = NULL;
LibBalsaAddress *address = NULL;
char *attr;
@@ -475,8 +476,8 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
org = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
if ((g_ascii_strcasecmp(attr, "uid") == 0) && (!uid))
uid = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
- if ((g_ascii_strcasecmp(attr, "mail") == 0) && (!email))
- email = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+ if (g_ascii_strcasecmp(attr, "mail") == 0)
+ email = g_list_prepend(email, g_strndup(vals[i]->bv_val, vals[i]->bv_len));
}
ldap_value_free_len(vals);
}
@@ -485,7 +486,7 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
/*
* Record will have e-mail (searched)
*/
- if(email == NULL) email = g_strdup("none");
+ if(email == NULL) email = g_list_prepend(email, g_strdup("none"));
g_return_val_if_fail(email != NULL, NULL);
address = libbalsa_address_new();
@@ -500,20 +501,21 @@ libbalsa_address_book_ldap_get_address(LibBalsaAddressBook * ab,
address->last_name = last;
address->nick_name = uid;
address->organization = org;
- address->address_list = g_list_prepend(address->address_list, email);
+ address->address_list = email;
return address;
}
-static InternetAddress*
-lbabl_get_internet_address(LDAP *dir, LDAPMessage * e)
+static GList *
+lbabl_get_internet_address(GList *addrs, LDAP *dir, LDAPMessage * e)
{
- InternetAddress *ia;
BerElement *ber = NULL;
char *attr;
struct berval **vals;
int i;
- gchar *email = NULL, *sn = NULL, *cn = NULL, *first = NULL;
+ GList *email = NULL;
+ GList *p;
+ gchar *sn = NULL, *cn = NULL, *first = NULL;
for (attr = ldap_first_attribute(dir, e, &ber);
attr != NULL;
@@ -529,25 +531,23 @@ lbabl_get_internet_address(LDAP *dir, LDAPMessage * e)
cn = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
if ((g_ascii_strcasecmp(attr, "givenName") == 0) && (!first))
first = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
- if ((g_ascii_strcasecmp(attr, "mail") == 0) && (!email))
- email = g_strndup(vals[i]->bv_val, vals[i]->bv_len);
+ if (g_ascii_strcasecmp(attr, "mail") == 0)
+ email = g_list_prepend(email, g_strndup(vals[i]->bv_val, vals[i]->bv_len));
}
ldap_value_free_len(vals);
}
ldap_memfree(attr);
}
- /*
- * Record will have e-mail (searched)
- */
- if(email == NULL) email = g_strdup("none");
- g_return_val_if_fail(email != NULL, NULL);
if(!cn)
cn = create_name(first, sn);
- ia = internet_address_mailbox_new(cn, email);
- g_free(email); g_free(sn); g_free(cn); g_free(first);
+ for (p = email; p != NULL; p = p->next) {
+ addrs = g_list_prepend(addrs, internet_address_mailbox_new(cn, (const gchar *) p->data));
+ }
+ g_list_free_full(email, g_free);
+ g_free(sn); g_free(cn); g_free(first);
- return ia;
+ return addrs;
}
/*
* create_name()
@@ -953,7 +953,6 @@ libbalsa_address_book_ldap_alias_complete(LibBalsaAddressBook * ab,
{
static struct timeval timeout = { 15, 0 }; /* 15 sec timeout */
LibBalsaAddressBookLdap *ldap_ab;
- InternetAddress *addr;
GList *res = NULL;
gchar* filter;
gchar* ldap;
@@ -996,8 +995,7 @@ libbalsa_address_book_ldap_alias_complete(LibBalsaAddressBook * ab,
if (result)
for(e = ldap_first_entry(ldap_ab->directory, result);
e != NULL; e = ldap_next_entry(ldap_ab->directory, e)) {
- addr = lbabl_get_internet_address(ldap_ab->directory, e);
- res = g_list_prepend(res, addr);
+ res = lbabl_get_internet_address(res, ldap_ab->directory, e);
}
case LDAP_SIZELIMIT_EXCEEDED:
case LDAP_TIMELIMIT_EXCEEDED:
signature.asc
(application/pgp-signature, 488 B)
-----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEcCEPemLFTtyGf4zATKlvDmfn2fgFAlxQuOkACgkQTKlvDmfn 2fjrIgf/Yef3HTK7Iteow5Z4zCKfWdmS8fXJeQRONJXqfhWT19JGJi3ER+2m5lbZ HEvnJm2pENvr5Bn7F8VCOb7qgHgqOmzONmFD2zfqmEe2HNDvK4ZK5wsEf/1Iauuj zPb8Vq/VkTxbG92MGni8rMH1tpxLCPQzq5DKhP9vaCCT7cikP3d+8/Hohb3qfADE P8RHhMkqfXfA7jcirYoCfcqqeK2KdKT0rhlHJs2sJs6zK+iCfK9a0SFxZHxvmX1U +MweJFW1h6FvYtSY4ACUsuWTrB1sRBgzbn4bM/0goErmP+HoLdlyVGpC8pwUPwMT D9RQwbhr6u3c+TpUtpvllKkdLhsirw== =1NkB -----END PGP SIGNATURE-----