Table of Contents
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
cf. 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.
- http://macslash.org/article.pl?sid=04/01/13/0857230 : que email, nom, tel
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
où 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.