транспорт

gateway short circuit

Изображение пользователя oleg_mmm@jabber.ru.


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 вида:

original_jid jit_jid active registered
user1@jabber uin1@icq.jabber yes yes
user2@jabber uin2@icq.jabber no yes
user3@jabber uin3@icq.jabber yes yes
... ... ... ...


Тогда, воспользовавшись ею, можно проводить преобразование адреса получателя при условии, что поля 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)
original_jid jit_jid active registered
user1@jabber uin1@icq.jabber no yes
user2@jabber uin2@icq.jabber no yes
user3@jabber uin3@icq.jabber no 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 [ ]