ejabberd LDAP и mod_shared_roster [почти SOLVED]

В общем всё получилось, из LDAP берутся пользователи, в общем ростере всех видно, но хотелось бы видеть не JIDы, а ники, потому как пользователи в английском не ориентируются. mod_vcard_ldap включен, если заглядывать в vcard'ы пользователей, то ники есть, но в ростере только JID'ы. Не в ручную же их вписывать.

Для версии 1.1.2 был специальный mod_shared_roster_ldap, в настройках которого можно было прописать получение ника, и, если я правильно помню это работало корректно, т.е. shared roster выдавался клиенту с заполненными никами. Но он уже заброшен, неизвестно как он работает во второй версии.

Может кто-то знает как это можно сделать не допиливая старый костыль?

PS: Забыл, клиент будет gajim, т.к. я его "допилил", на счёт "автоконфигурирования".

Не знаю как во 2-й версии, а

Не знаю как во 2-й версии, а в 1-й+мод(у мя до сих пор стоит на работе) работает нормально.
Вот почитай про моё допиливание.
http://www.gentoo.ru/node/9399

Честно говоря, откатываться

Честно говоря, откатываться на старый ejabberd не хочется совсем, интересны именно приёмы получения приемлемого результата со свежей версией.

А вот у свежей версии я, к

А вот у свежей версии я, к сожалению, не знаю как дела обстоят с mod_shared_roster_ldap. Может ребяты с которые для gentoo.ru поднимали ejabberd+ldap подскажут.

"Курнул" сейчас исходники

"Курнул" сейчас исходники ёжика, в общем это ущербность самого mod_shared_roster, вот как там написано:

%% Export items in roster format:
    SRItems = [#roster{usj = {U, S, {U1, S1, ""}},
                     us = US,
                     jid = {U1, S1, ""},
                     name = "",
                     subscription = both,
                     ask = none,
                     groups = GroupNames} ||
                     {{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)],
    SRItems ++ NewItems1. 

Т.е. name в котором передаётся ник всегда пустой, для примера, тот же кусок кода в mod_shared_roster_ldap:

 %% Export items in roster format:
    SRItems = [#roster{usj = {U, S, {U1, S1, ""}},
                     us = US,
                     jid = {U1, S1, ""},
                     name = get_user_name(U1,S1),
                     subscription = both,
                     ask = none,
                     groups = GroupNames} ||
                     {{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)],
    SRItems ++ NewItems1.

Вот и весь хрен хрен копейки...

Ну вот и отличненько, правь

Ну вот и отличненько, правь исходник :). Отпишись по результату только.

Что-то мне подсказывает, что

Что-то мне подсказывает, что интеграция mod_shared_roster_ldap окажется проще чем исправление mod_shared_roster, т.к. функция возвращающая имя пользователя описана только в mod_shared_roster_ldap и завязана на обращения к ldap. Я не знаком со структурой данных в ёжике настолько, что бы дописать существующий mod_shared_roster, и боюсь это не получится вообще, что-то мне подсказывает что vcard и roster вещи в еже параллельные.

Чем закончились попытки улучшить mod_shared_roster_ldap у тебя?

Попытки закончились

Попытки закончились успешно.
Усё работает.
Опять же см. http://www.gentoo.ru/node/9399 -там описан алгоритм(как я его понял) работы mod_shared_rostre_ldap

В общем хожу по старым

В общем хожу по старым граблям. Всё те же проблемы с не соответствием AD схемы и той что используется для авторизации в *nix'ах.

Как я понял, в AD в ветке пользователя прописаны все группы членом которых он является. У меня членство в группах хранится в ветках групп. Если сделать как думал автор оригинального mod_shared_roster_ldap, то заставить работать всё это можно, с вот такими настройками:

{mod_shared_roster_ldap,[
                    {ldap_base, "dc=xxx,dc=ru"},
                    {ldap_rfilter, "(cn=Domain Users)"},
                    {ldap_filter,"(ObjectClass=*)"},
                    {ldap_groupattr,"cn"},
                    {ldap_groupdesc,"description"},
                    {ldap_memberattr,"memberUid"},
                    {ldap_memberattr_format,"%u"},
                    {ldap_userdesc,"displayName"}
                 ]},

Т.к. будет производиться поиск только в ou=Groups (у меня группы отдельно от пользователей), а у самих групп есть и cn и memberUid, но displayName мы не увидим, т.к. выборка имени для пользователя делается так:

handle_call({get_user_name, User}, _From, State) ->
UserDescAttr = State#state.user_desc,
Reply = case eldap_filter:parse(State#state.ufilter, [{"%u", User}]) of
		{ok, EldapFilter} ->
			case eldap:search(State#state.eldap_id, [
					{base, State#state.base},
					{filter, EldapFilter},
					{attributes, [UserDescAttr]}]) of
				#eldap_search_result{entries = [
						#eldap_entry{attributes =
							[{UserDescAttr, UserName} | _]}
						]} ->
					UserName;
				_ ->
					User
			end;
		_ ->
			User
	end,
	{reply, Reply, State};

ufilter при указанных настройках будет таким: '&(&(memberUid=%u)(cn=%g))(ObjectClass=*)', т.е. displayName в результате этого запроса не вернётся, совсем, нет у группы такого атрибута и пользователя с cn равным имени группы тоже нет. :-( Но и не правильным это поведение не назовёшь, всё-таки для AD этот запрос отработает верно.

Вернулись туда откуда пришли, снова вместо имен пользователей их логины получились.

Ок. Вроде получилось. Добавил

Ок. Вроде получилось. Добавил ещё один параметр в конфиг для mod_shared_roster_ldap ldap_ufilter если его не трогать, то будет подставлено то чисто ADшное решение которое было изначально, для не ADшников достаточно будет указать (uid=%u).

У меня заработало с такими настройками:

{mod_shared_roster_ldap,[
                    {ldap_base, "dc=xxx,dc=ru"},
                    {ldap_rfilter, "(cn=Domain Users)"},
                    {ldap_filter,"(ObjectClass=*)"},
                    {ldap_ufilter,"(uid=%u)"},
                    {ldap_groupattr,"cn"},
                    {ldap_groupdesc,"description"},
                    {ldap_memberattr,"memberUid"},
                    {ldap_memberattr_format,"%u"},
                    {ldap_userdesc,"cn"}
                 ]},

Завтра буду проверять на наличие проблем с доступностью пользователей. Кого видно кого не видно...

До сих пор проблем не

До сих пор проблем не обнаружено, надо бы где-нибудь выложить патч и описание.

к не лдап-версия есть вот

к не лдап-версия есть вот такой патч, нужно ещё поискать.
https://support.process-one.net/browse/EJAB-114

Эх! Раньше бы в эту сторону

Эх! Раньше бы в эту сторону толкнули...
Всё равно "будем посмотреть", я правильно понял, из ldap он не сможет данные получать?

я её искал фиг знает сколько,

я её искал фиг знает сколько, у меня есть ворох патченных сборок ежа, по теме 2 патча - один этот, воторой задевает mod_roster и mod_roster_odbc там похожие изменения, но я от этого отказался когда в psi откопал примерно туже функцию - они начали конфликтовать. думаю это можно и в лдап прикрутить просто посмотреть как другие атрибуты из лдапа достаются в mod_shared_roster и немного переписать... но я не программер. возможно лучше поискать/спросить на форуме ejabberd.im

Если не сложно покажите

Если не сложно покажите пожалуйста свой конфиг. Неполучаеться настроить

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

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