НавигацияВход для пользователейОблачко |
транспортgateway short circuit![]() UPDATE: Нечто похожее теперь реализовано в JIT 1.1.7 (Link) 0. Описание проблемы.Очень часто происходит следующее: пользователи переходят с ICQ на Jabber, импортируют контакты с сервера ICQ и продолжают общаться, используя старые контакты, причем несколько пользователей могут использовать один транспорт. Имеем такой путь прохождения сообщения: На клиенте: [user1@jabber]->[uin2@icq.jabber] На JIT происходит преобразование сообщения от user1@jabber в сообщения протокола ICQ от uin1. Далее сообщение идет на сервер ICQ в Америку, потом возвращается на тот же транспорт. Происходит обратное преобразование, на выходе транспорта получаем: [uin1@icq.jabber]->[user2@jabber] Задача: "спрямить" путь таких сообщений, т.е. получить нечто вроде [user1@jabber]->[user2@jabber] Update: Аналогично можно сделать для транспортов MSN и Yahoo. Update: Можно предусмотреть отключение преобразования сообщений для особо нервных пользователей. 1. Способ реализации.Будем рассматривать связку ejabberd + JIT, при этом не желательно вносить изменения в код JIT. Схема связки ([ejabberd] - [ejabberd_service]) - [JIT] Реализовать задачу можно, изменив пакет (получателя сообщения, поле to ) на этапе [ejabberd_service] Допустим, измененная схема будет выглядеть так: ([ejabberd] - [ejabberd_service_jit]) - [JIT] 2. Структура таблицыПредположим, что имеется таблица соответствия jid и uin вида:
Тогда, воспользовавшись ею, можно проводить преобразование адреса получателя при условии, что поля active=yes и registered=yes, т.е. например, заменять в поле to uin3@icq.jabber на user3@jabber на этапе [ejabberd_service_jit]. Как это выглядит для пользователей: user1@jabber зарегистрировался на сервере jabber, на JIT, получил контакты своих приятелей с сервера ICQ. user3@jabber пользуется jabber и ICQ через JIT, но еще не знает, что user1 пользуется jabber. user1@jabber отправляет своему приятелю uin3@icq.jabber сообщение (например, "привет, user3, как дела"), которое преобразуется, и его получает user3@jabber, в поле from стоит адрес user1@jabber, в поле to - user3@jabber, т.е. сообщение выглядит как обычное. Update: В принципе, можно добавлять в тело сообщения что-то вроде "From ICQ user uin1@icq.jabber \n" во избежаниe путаницы, но возможна ситуация, когда подобные сообщения будут подделаны. user3@jabber отвечает user1@jabber (например,"ой, да ты тоже в jabber, не пользуйся ICQ больше, давай болтать тут" :). В общем, они нашли друг друга :) Если вдруг, по каким-либо причинам, один из них пользуется родным протоколом ICQ, то он будет неактивным active=no в таблице и сообщения пойдут через JIT и далее через сервер ICQ. 3. Составление таблицы активности.Предположим, что у нас есть таблица соответствия jid и uin, но в ней все пользователи помечены неактивными. Это тоже можно реализовать на этапе [ejabberd_service_jit]. Достаточно отслеживать Статус активности: <presence from='icq.jabber/registered' to='user@jabber/resource'><status/><show>online</show></presence> Статус неативности: <presence from='icq.jabber/registered' to='user@jabber/resource' type='unavailable'> Примечание: Почему-то jit (Jabber: Jabberd 1.1.2 stable / with real threads / by Lukas Karwacki ICQ: 1.1.6) на моем сервере на посылает 'unavailable'... Тогда, по идее, можно отслеживать <presence from='user@jabber/resource' to='icq.jabber/registered' type='unavailable'> Поправьте меня, если я ошибаюсь... 4. Составление таблицы соответствия.Добавление пользователя в таблицу: ---- Нужно перехватить регистрацию пользователя на транспорте. <iq from='user@jabber' id='14' to='icq.jabber' type='set'><query xmlns='jabber:iq:register'><x xmlns='jabber:x:data' type='submit'><field var='username'><value>uin</value></field><field var='password'><value>password</value></field><field var='key'><value>36d8e402d047474567d73ea5ec7e876d6de4788e</value></field><field var='registered'><value/></field></x></query></iq> Из этого запроса получаем uin и jid и помещаем их в таблицу, причем ставим поле registered=no. И ответ транспорта: <iq from='icq.jabber' to='user@jabber/resource' id='14' type='result'> <presence from='icq.jabber/registered' to='user@jabber/resource' type='subscribe'/> После получения этого устанавливаем поле registered=yes. ---- Удаление регистрации ---- <presence from='user@jabber' to='icq.jabber/registered' type='unsubscribe'/> устанавливаем поле registered=no. 5. Если транспорт JIT уже работает и на нем зарегистрированы пользователи.Достаточно воспользоваться скриптом, который читает информацию из файлов spool транспорта JIT и составляет таблицу вида (для всех установлен active=no и registered=yes)
Планирую чуть позже выложить тут ссылку на такой скрипт. Update: можно заставить [ejabberd_service_jit] запрашивать авторизацию. Насколько это трудно реализовать, не знаю. OUT: <iq type="get" from='user@jabber/resource' to="icq.jabber" id="j15"><query xmlns="jabber:iq:register"/></iq> IN: <iq from='icq.jabber' to='user@jabber/resource' type='result' id='j15'> <query xmlns='jabber:iq:register'><username>uin</username><registered/><password/> <key>bc1837e16e0de9f64e2cea996713c647b79fffcb</key> <instructions>Введите Ваш UIN и пароль</instructions> <registered/><x type='form' xmlns='jabber:x:data'> <title>Registration in JIT</title> <instructions>Введите Ваш UIN и пароль</instructions> <field type='text-single' var='username' label='UIN'> <value>uin</value></field> <field type='text-private' var='password' label='Password'> <value/></field><field type='hidden' var='key'> <value>bc1837e16e0de9f64e2cea996713c647b79fffcb</value> </field><field type='hidden' var='registered'><value/> </field></x></query></iq> Прошу мнения
Опубликовано oleg_mmm@jabber.ru в пн, 2005-05-02 11:21. categories [ ]
|
Последние комментарии
1 день 19 часов назад
5 дней 10 часов назад
6 дней 22 часа назад
1 неделя 25 минут назад
3 дня 23 часа назад
1 неделя 10 часов назад
1 неделя 10 часов назад
1 неделя 10 часов назад
1 неделя 10 часов назад
1 неделя 11 часов назад