User Tools

Site Tools


ldap:addressbook

Existant commercial

Le modèle actuel grand public semble être http://www.plaxo.com/

Ça ne fonctionne pour l'instant que sous Windows avec Outlook, mais il y a un hack pour l'utiliser avec Linux: Plaxo on Linux? Il y a aussi une mailing list de développement Plaxo Developers forum Il y aura une API pour permettre à d'autres applications de se connecter à plaxo. Sortie prévue pour le 2e trimestre 2005. Il y a aussi des gens qui n'apprécient pas: Had enough of Plaxo, et al.

Mon plan maison

Documentation

Je vais suivre pas à pas le tutoriel suivant: Building an Address Book with OpenLDAP, 27/03/2003

Installation

aptitude install slapd ldap-utils

Configuration

vi ou.ldif

contenant:

dn:     ou=Contacts, dc=zongo, dc=tla
objectClass:    top
objectClass:    organizationalUnit
ou:     Contacts

Puis j'ai eu des problèmes (d'authentification je crois, sans doute le -x, cf. infra) et je me suis dégonflé.

11/09/06: je reprends les choses en main avec le même tutoriel: Building an Address Book with OpenLDAP.

J'ajoute une ligne

rootpw   secret

et je redémarre slapd:

sudo /etc/init.d/slapd restart

et j'ai l'erreur suivante:

Stopping OpenLDAP: slapd.
Starting OpenLDAP: running BDB recovery, slapd - failed.
The operation failed but no output was produced. For hints on what went
wrong please refer to the system's logfiles (e.g. /var/log/syslog) or
try running the daemon in Debug mode like via "slapd -d 16383" (warning:
this will create copious output).

Je regarde dans /var/log/syslog:

Sep 11 10:32:05 narsil slapd[14999]: daemon: IPv6 socket() failed errno=97 (Address family not supported by protocol)

C'est pas grave: http://www.openldap.org/faq/data/cache/652.html

Par contre, la première ligne:

Starting OpenLDAP: running BDB recovery, slapd - failed.

c'est plus grave: il ne tourne pas. Lorsque j'enlève la ligne avec rootpw, ça refonctionne:

ldapsearch -x -b "dc=zongo,dc=be"
# extended LDIF
#
# LDAPv3
# base <dc=zongo,dc=be> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# zongo.be
dn: dc=zongo,dc=be
objectClass: top
objectClass: dcObject
objectClass: organization
o: ZongoNation
dc: zongo

# admin, zongo.be
dn: cn=admin,dc=zongo,dc=be
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Il fallait mettre ces 2 lignes sous la 1ere ligne commençant par directory:

rootdn "cn=admin,dc=zongo,dc=be"
rootpw secret

source: Very basic how-to/introduction for Open LDAP (slapd) as addressbook

Comme j'ai perdu le mot de passe admin, je reconfigure:

sudo /usr/sbin/dpkg-reconfigure -plow slapd

Mais rien n'y fait: quand j'essaye de créer le carnet d'adresse, ça foire:

ldapadd -D 'dc=zongo, dc=be' -f directory.ldif -W
Enter LDAP Password: 
SASL/DIGEST-MD5 authentication started
ldap_sasl_interactive_bind_s: Internal (implementation specific) error (80)
additional info: SASL(-13): user not found: no secret in database

C'est parce que j'essaye de m'authentifier avec SASL, pour éviter cela, il faut utiliser le paramètre -x (source), ce qui donne:

ldapadd -x -D 'dc=zongo, dc=be' -f directory.ldif -W
Enter LDAP Password: 
ldap_bind: Invalid credentials (49)

C'est parce que j'avais pas mis cn=admin:

ldapadd -x -D 'cn=admin,dc=zongo, dc=be' -f directory.ldif -W
Enter LDAP Password: 
adding new entry "dc=zongo, dc=be"
ldap_add: Invalid syntax (21)
        additional info: objectClass: value #2 invalid per syntax

Donc, il y a une erreur dans mon fichier directory.ldif:

dn:     dc=zongo, dc=be
objectClass:    top
objectClass:    dcObject
objectClass:    organisation
dc:     zongo
o:      Zongo Nation

dn:     ou=addressbook, dc=zongo, dc=be
objectClass:    top
objectClass:    organizationalUnit
ou:     addressbook

En remplaçant organisation par organization, ça passe mieux, mais il me dit qu'il existe déjà:

ldap_add: Already exists (68)

Donc je commente avec # les 6 premières lignes, je relance la commande, et c'est bon: l'output est:

adding new entry "ou=addressbook, dc=zongo, dc=be"

Vérification:

ldapsearch -x -b "dc=zongo,dc=be"# extended LDIF
#
# LDAPv3
# base <dc=zongo,dc=be> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# zongo.be
dn: dc=zongo,dc=be
objectClass: top
objectClass: dcObject
objectClass: organization
o: Zongo Nation
dc: zongo

# admin, zongo.be
dn: cn=admin,dc=zongo,dc=be
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# addressbook, zongo.be
dn: ou=addressbook,dc=zongo,dc=be
objectClass: top
objectClass: organizationalUnit
ou: addressbook

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Je peux enfin continuer le tutoriel…

Population

Il faut ensuite créer une fiche, contact.ldif:

dn: cn=Carl Devos,ou=addressbook,dc=zongo,dc=be
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Carl Devos
gn: Carl
sn: Devos
mail: carl@devos.com
postalAddress: Chaussee de Watermael 79
l: Auderghem
ou: addressbook
postalCode: 1160
telephoneNumber: 02/5150456
mobile: 0484/246007
homePhone: 02/6486410

Finalement, il faut l'ajouter dans le répertoire:

ldapadd -x -D 'cn=admin,dc=zongo,dc=be' -f contact.ldif -W
Enter LDAP Password: 
adding new entry "cn=Carl Devos,ou=addressbook,dc=zongo,dc=be"

N.B:

  • on peut mettre plusieurs fiches dans le même fichier ldif, il suffit de séparer les fiches pas une ligne vide
  • ne pas laisser pas d'espace à la fin d'une ligne
  • ne pas oublier l'espace après les 2 points
  • ne pas ajouter d'espace après la virgule dans la définition de dn
  • pas de champ sans valeur, sinon ça foire:
o:

Accès

A distance

Il reste à y accéder à distance. Donc, il faut que j'essaye d'abord en ligne de commande depuis une machine distante:

ldapsearch -x -h 192.168.44.101 -b "dc=zongo,dc=be"

Et ça marche.

Mozilla Thunderbird

Alors, j'ai essayé avec MozillaThunderbird, et ça marche aussi.

  • Thunderbird → Preferences → Composition → Adressing → cocher Directory Server
  • clic sur Edit Directories… → Add:
hostname: nom ou IP de la machine
Base DN: ou=addressbook,dc=zongo,dc=be
Port Number: 389
  • ne pas remplir Bind DN
  • OK, vérifier que le nouveau directory est bien sélectionné.
  • OK
  • Tools → Account settings… → dans le compte → Composition & Addressing → Addressing → Use a different LDAP server → sélectionner celui créé à l'instant → OK

C'est fait, vérifier:

  • Tools → Address Book
  • sélectionner l'address book LDAP et taper qqch dans la search box → on a la réponse.

Evolution

Addressbook.app

J'ai essayé avec Addressbook (macos X), ça marche également (il faut faire une recherche pour qu'il affiche qqch).

Squirrelmail

Il faut refaire tourner le script de squirrelmail ( source):

sudo /usr/share/squirrelmail/config/conf.pl

Ensuite, il faut décommenter (enlever le #) dans la ligne suivante de /etc/ldap/slapd.conf (http://www.openldap.org/lists/openldap-software/200212/msg00168.html source):

#allow bind_v2

Finalement, redémarrer le service:

sudo /etc/init.d/slapd restart

Pour essayer: Compose → Addresses → sélectionner l'addressbook LDAP dans la dropdown box → list all.

Mapping

Problème: toutes les applications ne mappent pas les schemas de la même façon.

Schémas LDAP

Il faut maintenant choisir un schema qui convienne aux applications que je vais utiliser pour me connecter à l'annuaire, à savoir MailApp, Evolution et peut-être bien mutt.

J'ai essayé avec mozillaOrgPerson.schema (copié dans /etc/ldap/schema/, puis ajouté un include dans /etc/ldap/slapd.conf, puis redémarrer le service). Mais ça marche pas avec address book.

inetorgperson:

dn:cn=Lucas Dandois,ou=addressbook,dc=zongo,dc=be
cn: Lucas Dandois
givenName: Lucas
sn: Dandois
l: Bruxelles
postalCode: 1030
street: Av du Suffrage universel 35
mobile: 0485/997418
mail: lucas.dandois@gmail.com
objectClass: top
objectClass: inetOrgPerson

marche avec address book et thunderbird

Faire une table avec tous les attributs de inetorgperson et voir si ça marche dans thunderbird, addressbook et evolution.

Convertir un .csv en .ldif

#!/usr/bin/perl
# importcsv.pl : Create LDIF file from CSV addressbook
# Marcel Gagné, Oct 10, 2001
open (LDIF,"+>/tmp/loadfile.ldif");
##  This is our temporary LDIF file.
$csv_file = @ARGV[0];
open (CSVFILE,"$csv_file");
##  Open the CSV file.
while ($line = <CSVFILE>)
  {
     chomp $line;
     ($dn, $ou, $objectClass, $cn, $givenName, $sn, $o, $l, $postalCode,  $street, $telephoneNumber, $facsimileTelephoneNumber, $mobile, $mail, $description,
 $homePhone, $displayName, $homePostalAddress, $initials, $postOfficeBox, $title, $labeledURI, $jpegPhoto)
        = split (";", $line, 23);
     printf LDIF ("%s","dn: $dn\n");
     printf LDIF ("%s","ou: $ou\n");
     printf LDIF ("%s","objectclass: $objectClass\n");
     printf LDIF ("%s","cn: $cn\n");
     printf LDIF ("%s","givenName: $givenName\n");
     printf LDIF ("%s","sn: $sn\n");
     printf LDIF ("%s","o: $o\n");
     printf LDIF ("%s","l: $l\n");
     printf LDIF ("%s","postalCode: $postalCode\n");
     printf LDIF ("%s","street: $street\n");
     printf LDIF ("%s","telephoneNumber: $telephoneNumber\n");
     printf LDIF ("%s","facsimileTelephoneNumber: $facsimileTelephoneNumber\n");
     printf LDIF ("%s","mobile: $mobile\n");
     printf LDIF ("%s","mail: $mail\n");
     printf LDIF ("%s","description: $description\n");
     printf LDIF ("%s","homePhone: $homePhone\n");
     printf LDIF ("%s","displayName: $displayName\n");
     printf LDIF ("%s","homePostalAddress: $homePostalAddress\n");
     printf LDIF ("%s","initials: $initials\n");
     printf LDIF ("%s","postOfficeBox: $postOfficeBox\n");
     printf LDIF ("%s","title: $title\n");
     printf LDIF ("%s","labeledURI: $labeledURI\n");
     printf LDIF ("%s","jpegPhoto: $jpegPhoto\n");
  }
close CSVFILE;
exit (0);

rendre exécutable:

chmod u+x importcsv.pl

usage:

./importcsv.pl ldap.csv

Le résultat dans /tmp/loadfile.ldif.

( source)

Extrait du fichier .csv (une ligne, sans photo):

cn=Firstname Lastname,ou=addressbook,dc=zongo,dc=be;;top | inetOrgPerson;Firstname Lastname;Firstname;Lastname;Organisation;city;1000;adress 1;02/5555555;02/
5998877;0495/123456;email@example.com | email2@example.com;description;02/6602145;Display name;homePostalAddress1;Initials1;2000;title;uri;

Réinstallation

Depuis que je suis passé au Mac Mini Intel, je n'ai pas remis l'annuaire LDAP. Ce 7 avril 2010, je tente le coup.

Installer slapd et phpldapadmin:

sudo install slapd ldap-utils phpldapadmin

Dans /etc/ldap/slapd.conf, ajouter sous la ligne commençant par directory:

rootdn "cn=admin,dc=example,dc=com"
rootpw secret

secret est le mot de passe de l'administrateur de la base (et changer example et com).

Redémarrer slapd:

sudo /etc/init.d/slapd restart

Dans /etc/apache2/sites-enabled/000-default, rajouter dans le domaine après DocumentRoot la ligne:

Include /etc/phpldapadmin/apache.conf

Relancer Apache2:

sudo /etc/init.d/apache reload

Dans /etc/phpldapadmin/config.php, commenter la ligne 170 (pour ne pas avoir example.com comme base), ce qui donne:

#$ldapservers->SetValue($i,'server','base',array('dc=example,dc=com']];

phpldapadmin est maintenant accessible, il est possible de s'identifier.

Ensuite, il faut importer le fichier LDIF. Problème: il y a des champs en trop, il faut les enlever pour chaque fiche…

Pour l'addressbook, ces lignes dans un fichier directory.ldif:

dn: ou=addressbook,dc=zongo,dc=be
objectClass: top
objectClass: organizationalUnit
ou: addressbook

Insérer:

ldapadd -x -D 'cn=admin,dc=zongo, dc=be' -f directory.ldif -W

Pour les fiches, les mettre dans un fichier séparé par une ligne vide:

dn: cn=Ana Heredia,ou=addressbook,dc=zongo,dc=be
ou: addressbook
objectClass: top
objectClass: inetOrgPerson
cn: Ana Heredia
givenName: Ana
sn: Heredia
mail: heredia.a@gmail.com

dn: cn=Anne Charlier,ou=addressbook,dc=zongo,dc=be
cn: Anne Charlier
givenName: Anne
sn: Charlier
l: Bousignies Sur Roc
postalCode: 59149
street: Grand Place 123
objectClass: top
objectClass: inetOrgPerson

etc.

Les sauver dans un fichier rep.ldif et les insérer:

ldapadd -x -D 'cn=admin,dc=zongo, dc=be' -f rep.ldif -W

Il reste à mettre le schéma inetOrgPerson dans slapd pour avoir tous les champs lorsqu'on édite ou insère une fiche avec phpldapadmin.

Le schéma des déjà là: /etc/ldap/schema/inetorgperson.schema Dans phpldapadmin, c'est apparemment addressbook.

Problème: lorsque j'essaie d'introduire une nouvelle fiche dans phpldapadmin (en choisissant le modèle default, puis inetorgperson), il me donne l'erreur suivante:

The Rdn attribute () does not exist.
ldap/addressbook.txt · Last modified: 2013/01/30 17:51 by 127.0.0.1