Адресная книга LDAP с дополнительными полями в Roundcube

Поставил на работе себе Roundcube в качестве Mail клента. Удобно — из любой машинки внутрисети по WEB имею доступ к своей почте 🙂 Установка самого Roundcube совсем тривиальная. Опишу очень коротко. Действуем по схеме:

  • Скачать последнюю версию из офсайта: http://www.roundcube.net/download Рекомендую качать версию stable — она гарантированно рабочая! За остальное никто не ручается 🙂
  • Розпаковать туда куда вам нужно.
  • Настроить apache
  • Установить Roundcube. Действовать согласно описанию из файлика INSTALL который есть в архиве с roundcube.

В результате проделанного выше программка у нас уже стоит — осталось только чуть настроить! Я установил себе roundcube в /opt/rouncube/ далее это будет видно 🙂

Прога у меня заработала после всего выше проделанного без каких бы то ни было проблем. Все отлично. Читаем почту … отправляем. Рулим сообщениями, папками, подписями и тд. Все очень удобно и шустро. Есть адресная книга … но локальная! А захотелось всетаки LDAP-ную книгу 🙂 Вот тут и начались танцы с бубном. Менял много чего в файлике main.inc.php для того чтобы настроить саму связь с сервером LDAP и поля которые одтуда надо брать. Итак, что имеем:

Работающий roundcube версии 3.1 а хотим ничего не сломав получить еще и LDAP Address Book 🙂 желательно  с автодополнением.

Пользователь ldapuser@my.domain с паролем 123. Доменный пользователь, которому достаточно дать права только на чтение LDAP и все! Это может быть просто технический пользователь … специально созданный для таких задач 🙂

LDAP Server — controller.my.domain

Приведу изначальный вид конфига main.inc.php чтобы понять откуда надо двигаться в настройке. Вот часть которая нас интуресует:

// In order to enable public ldap search, configure an array like the Verisign
// example further below. if you would like to test, simply uncomment the example.
$rcmail_config['ldap_public'] = array();

//
// If you are going to use LDAP for individual address books, you will need to
// set 'user_specific' to true and use the variables to generate the appropriate DNs to access it.
//
// The recommended directory structure for LDAP is to store all the address book entries
// under the users main entry, e.g.:
//
//  o=root
//   ou=people
//    uid=user@domain
//  mail=contact@contactdomain
//
// So the base_dn would be uid=%fu,ou=people,o=root
// The bind_dn would be the same as based_dn or some super user login.
/*
* example config for Verisign directory
*
$rcmail_config['ldap_public']['Verisign'] = array(
  'name'          => 'Verisign.com',
  'hosts'         => array('directory.verisign.com'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => '',
  'bind_dn'       => '',
  'bind_pass'     => '',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  // LDAP_Object_Classes, required_fields, LDAP_rdn
  'LDAP_Object_Classes' => array("top", "inetOrgPerson"), // To create a new contact these are the object classes to specify (or any other classes you wish to use).
  'required_fields'     => array("cn", "sn", "mail"),     // The required fields needed to build a new contact as required by the object classes (can include additional fields not required by the object classes).
  'LDAP_rdn'      => 'mail', // The RDN field that is used for new entries, this field needs to be one of the search_fields, the base of base_dn is appended to the RDN to insert into the LDAP directory.
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '',      // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search
*/


// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql');

Теперь все это дело надо настроить под наши нужды. Привожу свой рабочий кусок конфига, уже даже с допольнительными полями для моб. телефона, рабочего телефона, названия компании и должности. Вот:

$rcmail_config['ldap_public']['WORK'] = array(
  'name'          => 'WORK',
  'hosts'         => array('controller.my.domain'),
  'port'          => 389,
  'use_tls'        => false,
  'user_specific' => false,   // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
  // %fu - The full username provided, assumes the username is an email
  //       address, uses the username_domain value if not an email address.
  // %u  - The username prior to the '@'.
  // %d  - The domain name after the '@'.
  'base_dn'       => 'ou="Domain Users", dc=my, dc=domain',
  'bind_dn'       => 'ldapuser@my.domain',
  'bind_pass'     => '123',
  'writable'      => false,   // Indicates if we can write to the LDAP directory or not.
  // If writable is true then these fields need to be populated:
  'ldap_version'  => 3,       // using LDAPv3
  'search_fields' => array('mail', 'cn'),  // fields to search in
  'name_field'    => 'cn',    // this field represents the contact's name
  'email_field'   => 'mail',  // this field represents the contact's e-mail
  'surname_field' => 'sn',    // this field represents the contact's last name
  'firstname_field' => 'gn',  // this field represents the contact's first name
  'phone_field'   => 'telephoneNumber', // telephone
  'mobile_field'  => 'mobile', //added by black_13 (mobile number)
  'company_field' => 'company', //added by black_13 (company)
  'title_field'   => 'title',
  'sort'          => 'cn',    // The field to sort the listing by.
  'scope'         => 'sub',   // search mode: sub|base|list
  'filter'        => '(&(mail=*))', // used for basic listing (if not empty) and will be used with search queries. example: status=act
  'fuzzy_search'  => true);   // server allows wildcard search

// An ordered array of the ids of the addressbooks that should be searched
// when populating address autocomplete fields server-side. ex: array('sql','Verisign');
$rcmail_config['autocomplete_addressbooks'] = array('sql','WORK');

После того как поправили вот таким образом и сохранили, пробуем перезайти в roundcube Теперь если зайти в Контакты (справа вверху) у нас должно появиться еще одна группа с названием WORK. Выбираем ее и видим список контактов взятых с LDAP. Но дополнительные поля пока что отображаться не будут … только cn, mail, sn и gn. Чтобы отобразились допольнительные поля нужно сделать следующее. Правим конфиг /opt/rouncube/program/localization/ru_RU/labels.inc Точнее добавляем туда несколько строк, я добавил в конец, перед ?> вот такое:

$labels['mobile'] = 'Мобильный телефон';
$labels['phone'] = 'Городской телефон';
$labels['company'] = 'Компания';
$labels['title'] = 'Должность';

Дальше, переходим в папку /opt/rouncube/program/steps/addressbook/ и открываем для редактирования файл show.inc В нем находим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

Меняем на

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

В нужной вам последовательности.

Тоже самое повторяем с конфигами save.inc. Находим строчку:

$a_save_cols = array('name', 'firstname', 'surname', 'email');

И меняем на

$a_save_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

Повторяем этот же финт с файликом edit.inc Правим строчку:

$a_show_cols = array('name', 'firstname', 'surname', 'email');

до вида:

$a_show_cols = array('company', 'title', 'name', 'firstname', 'surname', 'email', 'phone', 'mobile');

На этом настройка закончена 🙂 Вот скриншот того что получилось:

Чуток пришлось в GIMP помазать скрин — чтобы палива поменьше было, но вобщем результат налицо 🙂 Посути никто нас не заставляет ограничиваться только этими полями. Просто мне они показались важными. Вы можете настроить под себя отображение нужных вам полей и их последовательность.

Главное что мы усвоили как это настраивается 🙂 За сим все … удачи!

    • Unknown
    • Июль 25th, 2011 2:36пп

    Мне как раз предстоит настроить это дело. У Вас уже ldap был настроен или вы его устанавливали после Круглокуба? Если можно выложите конфиг ladp. Спасибо!

    • admin
    • Август 1st, 2011 11:20дп

    Домен на Win 2008 R2 настроен 🙂

    • xn
    • Ноябрь 24th, 2011 9:10пп

    появилась папка WORK, но внутри пусто((
    вот здесь:
    ‘bind_dn’ => ‘ldapuser@my.domain’,
    ‘bind_pass’ => ‘123’,
    написал пользователя, под которым захожу в phpldapadmin, верно?

    • admin
    • Ноябрь 24th, 2011 11:20пп

    bind_dn — имя пользователя которому розрешено читать ldap
    bind_pass — его доменный пароль

    • stanislav
    • Июль 16th, 2012 1:46пп

    admin :
    Домен на Win 2008 R2 настроен

    у меня домен на 2003, все сделал по вашей статье, в адрессной книге пусто =( в логах тоже пусто, юзер есть в АД под которым чтение происходит. Что еще можно посмотреть?

    • admin
    • Июль 18th, 2012 9:53пп

    Можно попробовать просто php скриптом протестить работу php + ldap Возможно всетаки какаято лажа в этой связке. Готовых скриптов в инете навалом, обычно только user/pass свой подставить надо.

    • Макс
    • Июнь 15th, 2017 5:42пп

    а у меня в файлах из /opt/rouncube/program/steps/addressbook/ нету таких секций. Как тогда заставить круглокуб отображать необходимые мне поля?

  1. Трэкбэков пока нет.

Why ask?