ejabberd - Comments for "mod_shared_roster_ldap, не могу вывести имена пользователей в нормальном виде" https://www.ejabberd.im/node/7754 en Здравствуйте! У меня немного https://www.ejabberd.im/node/7754#comment-59134 <p>Здравствуйте!<br /> У меня немного другая ситуация.Самба хранит учетные записи в LDAP, однако домена нет, поэтому unix-группы не "примапплены" к доменным группам и в LDAP хранятся только записи о unix-группах, а не о доменных. То есть unix-пользователи имеют доп атрибуты Samba-пользователей, а вот unix-группы нет, они в чистом виде unix-групп, к примеру:</p> <div class="codeblock"><code>dn: cn=Admins,ou=Groups,dc=urfu<br />objectClass: posixGroup<br />cn: Admins<br />gidNumber: 10007<br />description: Group account<br />structuralObjectClass: posixGroup<br />entryUUID: d62149e8-a874-1031-87c4-a99e1628b3e4<br />creatorsName: cn=admin,dc=urfu<br />createTimestamp: 20121012045549Z<br />entryCSN: 20121012045549.600062Z#000000#000#000000<br />modifiersName: cn=admin,dc=urfu<br />modifyTimestamp: 20121012045549Z</code></div> <p>Возможно, это решение на основе доменных групп мне поможет в дальнейшем, вдруг где-то нужен будет именно домен на Samba. А сегодня я протестировал ваше первое решение - все великолепно работает, в pidgin все пользователи вывелись по cn. Большое Спасибо! =)</p> Mon, 15 Oct 2012 04:00:28 +0000 gard comment 59134 at https://www.ejabberd.im Я тут погуглил по поводу https://www.ejabberd.im/node/7754#comment-59131 <p>Я тут погуглил по поводу групп в самболдапе. Если не ошибаюсь, группа выглядит примерно так (взято из <noindex><a href="http://lists.samba.org/archive/samba/2010-January/153134.html" title="http://lists.samba.org/archive/samba/2010-January/153134.html" rel="nofollow" >http://lists.samba.org/archive/samba/2010-January/153134.html</a></noindex>):</p> <div class="codeblock"><code>dn: cn=Domain Admins,ou=Group,dc=themusiclink,dc=net<br />description: Netbios Domain Administrators<br />sambaSID: S-1-5-21-957249707-1866601452-441284377-512<br />sambaGroupType: 2<br />displayName: Domain Admins<br />structuralObjectClass: posixGroup<br />entryUUID: 1a60146c-cfad-102d-96b0-6fd9fc452718<br />creatorsName: cn=Manager,dc=themusiclink,dc=net<br />createTimestamp: 20090507234700Z<br />gidNumber: 512<br />cn: Domain Admins<br />userPassword:: e2NyeXB0fXg=<br />objectClass: posixGroup<br />objectClass: top<br />objectClass: sambaGroupMapping<br />memberUid:<br />memberUid:<br />memberUid:<br />entryCSN: 20091028001757Z#000001#00#000000<br />modifiersName: cn=Manager,dc=themusiclink,dc=net<br />modifyTimestamp: 20091028001757Z</code></div> <p>Если это так, то Вам вовсе не надо было идти такими извилистыми путями.<br /> Самое главное - что в этом объекте есть множественный атрибут memberUid.<br /> Тогда всё делается так:</p> <div class="codeblock"><code>{mod_shared_roster_ldap,[<br /> {ldap_base, &quot;ou=Users,dc=urfu&quot;},<br />%1. Избавьтесь от бессмысленных дефолтов:<br />{ldap_filter, &quot;&quot;},<br />%2. Определите список групп, т.е. получите те объекты, из которых потом вычлените идентификаторы групп<br />{ldap_rfilter, &quot;(objectClass=sambaGroupMapping)&quot;},<br />%3. Какой атрибут полученных объектов собственно содержит идентификаторы групп<br />{ldap_groupattr, &quot;gidNumber&quot;},<br />%4. Теперь модуль собрал все возможные gidNumber&#039;ы в единый список и будет по одному опрашивать каждую группу на предмет её имени и её списка пользователей. Определим запрос к отдельной группе:<br />{ldap_gfilter, &quot;(&amp;(objectClass=sambaGroupMapping)(gidNumber=%g))&quot;},<br />%5. Чтобы узнать отображаемое имя, зададим соответствующий атрибут.<br />{ldap_groupdesc, &quot;displayName&quot;},<br />%6. Определим, где хранятся идентификаторы пользователей-членов данной группы<br />{ldap_memberattr, &quot;memberUid&quot;},<br />%7. Теперь у нас есть список групп с их именами, и для каждой группы есть список идентификаторов пользователей. Надо опросить каждого пользователя на предмет его отображаемого имени<br />{ldap_ufilter, &quot;(&amp;(objectClass=sambaSamAccount)(uid=%u))&quot;},<br />%8. Где у этого пользователя идентификатор (идёт в jid, должен соответствовать ldap_memberattr), и где отображаемое имя<br />{ldap_useruid, &quot;uid&quot;},<br />{ldap_userdesc, &quot;cn&quot;}<br />%The end<br />]}</code></div> <p>Преимущества этого подхода:<br /> 1. Определяются имена групп.<br /> 2. Производительность: в первом подходе каждый пользователь возвращался трижды: при построении списка групп возвращались все пользователи, при опросе группы возвращались все пользователи группы, и при опросе пользователей. Здесь при построении списка групп возвращаются два объекта-группы, при опросе групп возвращается один объект-текущая группа, а пользователи опрашиваются только в третьей стадии. (Ну, конечно, при десяти пользователях это не принципиально, но если их сто тысяч...)</p> Sun, 14 Oct 2012 06:16:51 +0000 mikekaganski comment 59131 at https://www.ejabberd.im Простите, ковырял конфиг на https://www.ejabberd.im/node/7754#comment-59128 <p>Простите, ковырял конфиг на работе, пришел домой, а конфиг то не взял. Придется ждать до понедельника, когда смогу добратья до рабочего компьютера. Но кое что сказать могу. В jid попадает uid пользователя, то есть для вышеприведенной записи в LDAP это будет <noindex><a href="mailto:bukinist@smb.urfu" rel="nofollow" >bukinist@smb.urfu</a></noindex>. Под таким именем пользователь прекрасно логинится на ejabberd-сервер. Насчет gidNumber - не совсем одинаковый. К примеру пока что есть две группы: Admins (gidNumber: 10007) и Office (gidNumber: 10008). Обе группы пользователей должны и могут логиниться в ejabberd. Чтобы в ростере не было групп с именами 10007 и 10008 я банально использовал {ldap_groupdesc, "description"}, который у каждого пользователя одинаково содержит строку "User Account". То есть групп много, а в ростере просто одна. Я просто не знаю как jabber'у передать не номера групп, а их реальные имена, т.к. в атрибутах пользователя присутствует только номер группы, а не ее имя. Имя группы содержится в LDAP-записи для этой группы, а это уже совсем другая запись. Но в принципе мне хватит и плоского списка пользователей, потому что пользователей всего-ничего, около десятка человек.</p> <p>Посмотрел листинг вашего решения, кажется понял логику работы модуля. Судя по всему все именно так, и это должно сработать. На выходе как я понимаю так и получится плоский список пользователей в одной группе "User account", если же убрать {ldap_groupdesc, "description"}, то получится 2 группы, обозванные как 10007 и 10008. Спасибо большое! Жаль, что испытать получится только в понедельник. По результатам - отпишусь. =)</p> Fri, 12 Oct 2012 12:01:24 +0000 gard comment 59128 at https://www.ejabberd.im Вы не указали, что отсюда https://www.ejabberd.im/node/7754#comment-59127 <p>Вы не указали, что отсюда должно идти в jid. Для ясности следовало привести здесь вашу работающую секцию аутентификации через LDAP. Предположу, что это - uid.</p> <p>Также неясно, у всех ли пользователей одинаковые gidNumber, и всегда ли description однозначно соответствует gidNumber'у. Предположу, что есть взаимно однозначное соответствие.</p> <p>Ваш случай особый - по-видимому, Ваши группы не отображаются в LDAP, так что всё, что у нас есть - это плоский список пользователей, не объединённый в группы. Поскольку модулю по-любому требуются список групп и доступ к отдельной группе, придётся действовать немного не по руководству.</p> <div class="codeblock"><code>{mod_shared_roster_ldap,[<br /> {ldap_base, &quot;ou=Users,dc=urfu&quot;},<br />%1. Избавьтесь от бессмысленных дефолтов:<br />{ldap_filter, &quot;&quot;},<br />%2. Определите список групп, т.е. получите те объекты, из которых потом вычлените идентификаторы групп<br />{ldap_rfilter, &quot;(objectClass=sambaSamAccount)&quot;},<br />%3. Какой атрибут полученных объектов собственно содержит идентификаторы групп<br />{ldap_groupattr, &quot;gidNumber&quot;},<br />%4. Теперь модуль собрал все возможные gidNumber&#039;ы в единый список и будет по одному опрашивать каждую группу на предмет её имени и её списка пользователей. Определим запрос к отдельной группе:<br />{ldap_gfilter, &quot;(&amp;(objectClass=sambaSamAccount)(gidNumber=%g))&quot;},<br />%5. Этот запрос фактически (в Вашем случае) выдаст список пользователей с одинаковым gidNumber. Чтобы узнать отображаемое имя, зададим соответствующий атрибут. Обратите внимание: нам нужно одно имя, а будет получено множество строк (по одной на каждого пользователя). Модуль в этом случае просто возьмёт то, которое окажется последним в списке.<br />{ldap_groupdesc, &quot;description&quot;},<br />%6. Определим, где хранятся идентификаторы пользователей-членов данной группы<br />{ldap_memberattr, &quot;uid&quot;},<br />%7. Теперь у нас есть список групп с их именами, и для каждой группы есть список идентификаторов пользователей. Надо опросить каждого пользователя на предмет его отображаемого имени<br />{ldap_ufilter, &quot;(&amp;(objectClass=sambaSamAccount)(uid=%u))&quot;},<br />%8. Где у этого пользователя идентификатор (идёт в jid, должен соответствовать ldap_memberattr), и где отображаемое имя<br />{ldap_useruid, &quot;uid&quot;},<br />{ldap_userdesc, &quot;cn&quot;}<br />%The end<br />]}</code></div> Fri, 12 Oct 2012 11:29:10 +0000 mikekaganski comment 59127 at https://www.ejabberd.im