ejabberd +ldap[SOLVED]

Настраиваю сабж, хочу чтобы ежабберд брал группы из лдапа с помошью модуля mod_shared_roster_ldap, почиатал по этому поводу:
http://www.tinuviel.ru/share/ejabberd112ad.html
Скачал файл, скомпилил в эрланге, вписал в конфиг. Нифига не хочет работать, возможно это от того, что я не понимаю, какие параметры для этого модуля прописывать.

Фрагмент моего конфига

   {mod_shared_roster_ldap,     [{ldap_groupattr,"cn"},
                                {ldap_groupdesc,"description"},
                                {ldap_rfilter,"(memberOf=cn=Users,ou=Groups,ou=Jabber,ou=Services,dc=xxx,dc=yyy,dc=com)"},
                                {ldap_memberattr,"memberUid"},
                                {ldap_userdesc,"cn"}]},

Но впри включенном дебаге в лдапе, почему-то

Jan 17 11:33:39 padonag slapd[16789]: conn=42 op=3 SRCH base="dc=xxx,dc=yyyy,dc=com" scope=2 deref=0 filter="(?=undefined)"
Jan 17 11:33:39 padonag slapd[16789]: conn=42 op=3 SRCH attr=cn
Jan 17 11:33:39 padonag slapd[16789]: conn=42 op=3 SEARCH RESULT tag=101 err=0 nentries=0 text=

Как будто фильтр пуст. Но если в ldap_rfilter внести другой параметр, например ObjectClass, то он нормально ищет по нему. Но я сёравно не очень понимаю что и куда прописывать, чтобы заработало.
Кто настраивал данную связку, помогите разобраться.

Сам во всём

Сам во всём разобрался после несколькочасового простмотра исходника этого модуля и вкуриванья в него. Пришлось немного поправить этот исходник, т.к. он был заточен почему-то под АД. И теперь у меня всё прекрасно работает с опенладпом!
Если кого интересует что там и как- обращайтесь!

Можешь diff

Можешь diff выложить исправлений?
А то как-то в исходники лезть лень с моим незнанием ерланга :(

Диффы писать не

Диффы писать не умею, там надо поправить пару строк всеголишь, к томуже я сам ерланга не знаю :)
Смотри что надо поправить в mod_shared_roster_ldap.erl:
[code]
........
492 SubFilter = "(&("++UIDAttr++"="++UIDAttrFormat++")("++GroupAttr++"=%g))",
493 SubFilter1 = "(&(uid="++UIDAttrFormat++")("++GroupAttr++"=%g))",#это я добавил чтобы избавиться от мешающего "++UIDAttr++", ибо он тут постоянно при поиске пользователя в лдапе впихивал в фильтер "memberUid=траляля". А UIDAttr он брал из конфига из опции "{ldap_memberattr,"memberUid"}" так как отличие опенлапа от АД в том, что у него мету атрибута "memberOf" у пользователя, а наоборот есть атрибут "memberUid" в группах.
494 UserSubFilter = eldap_filter:do_sub(SubFilter1, [{"%g", "*"}]),# тут соотв исправлено на новую переменную
495 GroupSubFilter = eldap_filter:do_sub(SubFilter, [{"%u", "*"}]),
........
[code]
Вообщем ежели интересно могу рассказать поподробнее, как жабер осуществляет поиск для постоения ростера. Или можешь сам посмотреть ао дебагу своего лдапа.

В rfilter надо

В rfilter надо прописывать фильтрацию тех, кого надо сортировать. Например, хочешь только тех, кто в группе Jabber:

{ldap_rfilter, "(memberOf=Jabber)"}.

Соответсвенно, тебе надо было писать
{ldap_rfilter, "(uid=<somename>)"}.
Но такая конструкция лишена смысла - в ростере будет только один пользователь.

Вот работающий конфиг, сортирующий по городам для OpenLDAP:

...
  {mod_shared_roster_ldap,
        [{ldap_groupattr, "l"},
        {ldap_groupdesc, "City"},
        {ldap_rfilter, "(objectClass=inetOrgPerson)"},
        {ldap_memberattr, "uid"},
        {ldap_userdesc, "uid"}]},
...

_______________________
From Siberia with Love!

А я вот считаю

winterheart написал(а):
В rfilter надо прописывать фильтрацию тех, кого надо сортировать. Например, хочешь только тех, кто в группе Jabber:
{ldap_rfilter, "(memberOf=Jabber)"}.
Соответсвенно, тебе надо было писать
{ldap_rfilter, "(uid=<somename>)"}.
Но такая конструкция лишена смысла - в ростере будет только один пользователь.

Ну нету в опенлдапе атрибута "memberOf". Он есть в АД, поэтому этот модуль работает без проблем с АД, он под него изначально заточен был.
Самое начало исходника

......
%%%----------------------------------------------------------------------
%%% Some changes to make it AD friendly and more usable :-)
%%%                                               
%%%----------------------------------------------------------------------
.......

Я считаю, что ldap_rfilter - это параметр ростер фильтр, т.е. критерий для фильтра при выводе списка групп в контакт-лист. Цитата из исходника модуля строка 523: "rfilter = RosterFilter".
Вот мой рабочий конфиг(с исправленным исходником модуля):

   {mod_shared_roster_ldap,     [{ldap_base, "dc=xxx,dc=yyy"},
                                {ldap_uidattr, "uid"},
                                {ldap_groupattr,"cn"},
                                {ldap_groupdesc,""},
                                {ldap_rfilter,"(description=Jabber Group)"},
                                {ldap_filter,"(ObjectClass=*)"},
                                {ldap_memberattr,"memberUid"},
                                {ldap_userdesc,"gecos"}
                                ]},

Вот алгорим работы модуля
1. Searh_result1-выводит имена групп $ldap_groupattr
Найти в базе base="dc=xxx,dc=yyy,dc=com" атрибут attr=$ldap_groupattr и отсеять по фильтру filter="($ldap_rfilter)"

2. Searh_result2-ищет юзеров по атрибутам(в моём случае ищет все значения "memberUid" у каждой найденной ранее группы) $ldap_memberattr и отсеивает по именам групп из 1-й интерации
Найти в базе base="dc=xxx,dc=yyy,dc=com" атрибут attr=$ldap_memberattr и отсеять по фильтру filter="(&(&($ldap_memberattr=*)($ldap_groupattr=$Searh_result1))(objectClass=shadowAccount))"

3. Search_result3-выводит имена юзеров
Найти в базе base="dc=xxx,dc=yyy,dc=com" всё подпадающие под фильтр filter="(&($ldap_memberattr=$Searh_result2)(objectClass=shadowAccount))"

Выделенное- это то, что я исправил в исходнике на uid. Т.е в исходнике оно "UIDAttr"(в конфиге - "ldap_memberattr"), в конфиге он приравнивает её к "memberUid", и в результате модуль нифига не находит, если не править исходник.

А что

А что обязательно лезть в исходники вместо того, чтобы в ldap_memberattr вместо memberUid поставить просто uid? Нету memberOf, есть memberUid, кака разница? Автором этот модуль делался для AD, но кто сказал, что не пойдет для OpenLDAP? Вникай в конфиг, каждый из параметров предельно ясен из названия.
_______________________
From Siberia with Love!

Ну не знаю как

Ну не знаю как тебе сказать. Если исходить из того что алгоритм работы модуля я правильно понял, то в моёи случае(с моей структурой дерева лдапа) без правки исходников нельзя было обойтись.
Если как ты говоришь "...в ldap_memberattr вместо memberUid поставить просто uid....", то ниодного пользователя он не найдёт, ибо в группе пользователи пеперчисляются в атрибуте memberUid! Если же ldap_memberattr вы ставить равным memberUid то, тогда он их найдёт в группе, но не найдёт в базе лдапа и не выведет в контакт лист в 3-й интерции(см. алгоритм) ибо буит искать ldap_uidattr, но добавится к фильтру параметр memberUid=, которого в записи пользователя быть не может. Понимаешь? Противоричие. Поетому я немного поправил исходник. И не такое уж это зло. Если у честь, что модуль отдельно идёт и в пакет не входит.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".