Блог інженера звіт про доставку повідомлень в jabber (xep-0184 message delivery receipts)

Звіт про доставку повідомлень в jabber (XEP-0184: Message Delivery Receipts)

Сьогодні колега поскаржився на проблему з втратою повідомлень в jabber. Частина наших користувачів підключені до корпоративної мережі через OpenVPN, що працює через інтернет канали різної якості. Якщо у клієнта порушилася нормальна робота OpenVPN підключення, то jabber сервер (ми використовуємо ejabberd) близько двох хвилин може відправляти повідомлення в "порожнечу". Мені незрозуміла логіка втрати повідомлень, тому що для передачі повідомлень використовується TCP. У цьому випадку сервер повинен знати, що повідомлення було недоставлено, але при цьому воно не поміщається в offline storage, а просто видаляється.

Коли я вперше зіткнувся з цією проблемою, то першим поривом було крутити настройки OpenVPN і ejabberd, але після пари запитів Гуглу знайшовся більш інший спосіб.

Він полягає в показі повідомлень про доставлених повідомленнях в jabber клієнта. Ця фіча була реалізована як розширення XMPP протоколу XEP-0184. На даний момент XEP-0184 заявлений як draft standard, але його підтримка є у багатьох клієнтів. Сумно те, що Psi. який використовує більшість користувачів, не підтримує це розширення протоколу.

Подальше гугленіе призвело на сторінку проекту Psi +. який розвивається як набір патчів для Psi і вже містить підтримку звіти про доставку повідомлень (XEP-0184: Message Delivery Receipts). Psi + підтримує імпорт конфігурації з Psi, тому історія повідомлень і ростер з Psi будуть доступні і в новому клієнті.

На відміну від більшості своїх колег, я використовую pidgin як jabber клієнта (крім jabber мені доводиться використовувати icq і yahoo) також мені подобається pidgin за зберігання історії повідомлень у вигляді простого тексту (промінь поносу творцям skype і Міранди), яку я до того ж синхронізує на всіх комп'ютерах, де мені доводиться працювати.

Поки шукав заміну для Psi, нагугліть в багтрекер pidgin тікет. в якому Ferdinand Stehle (noonien) дав посилання на плагін pidgin-xmpp-receipts. який реалізує підтримку XEP-0184 в pidgin. Пари хвилин вистачило, щоб скомпілювати плагін під Debian Squeeze (для компіляції досить встановити пакет pidgin-dev) і активувати його в месенджер.

Для тестування підтримки повідомлень я встановив останній доступний реліз Psi + в Wine (свіжу версію Wine для Debian Squeeze / Wheezy можна знайти в моєму репозитарії) і завів на сервері окремого користувача. При відправці повідомлення з pidgin в psi + у вікні чату pidgin з'являється відмітка про доставку # 10003 ;. але якщо відправляти повідомлення клієнту без підтримки xep-0184, то відмітка відсутня. Все чудово, але є нюанс - якщо симулювати "поломку мережі" у psi + і відправити кілька повідомлень разом, то після відновлення працездатності мережі у psi + в pidgin з'являються позначки, але не навпаки повідомлень, а скопом після останнього рядка.

Далі перейшов до відправки повідомлень з psi + в pidgin і тут мене чекало розчарування - з історії повідомлень ніяк не зрозуміло де повідомлення доставлено, а де ні. В якості останньої міри отруїв повідомлення з psi + в інший psi + і тут з'явилася різниця - якщо повідомлення доставлено, то колір стрілочки в чаті psi + змінюється з рожевого на зелений. Виходить при відправці повідомлень з psi + в pidgin, перший вважає, що всі повідомлення були втрачені, а у зворотний бік все працює.

Схоже знайшов баг, але у кого з них поки неясно. Для просвітлення голови пішов заварив собі кави, відкрив документ в якому описаний XEP-0184, активував консолі налагодження в pidgin і psi + і став дивитися різницю при посилці повідомлення з psi + в pidgin і в зворотний бік.

Після пари тестових повідомлень стала помітна різниця в звіті про доставку, яку генерують psi + і pidgin. Psi + відповідає


А pidgin відповідає


Виходить, що вони по вказують вірний id, на який шле підтвердження, але вказують його в різних місцях. Знову відкриваю опис XEP-0184 і бачу. що правильне підтвердження генерує саме pidgin. Дивно, в psi + підтримка цього розширення з'явилася порівняно давно і якщо це баг, то його вже повинні були виправити. Далі роздуми наводять мене до того, що саме підтримка XEP-0184 з'явилася в psi + раніше, ніж в pidgin, то можливо вони просто реалізують різні ревізії стандарту (адже він досі перебуває в стадії розробки).

Іду дивитися більш ранні ревізії опису розширення і бачу що я мав рацію. Psi + відповідає згідно ревізії v1.0. а відповідь pidgin відповідає останньої ревізії v1.2. Причому pidgin перетравлює більш ранній варіант підтвердження.

Лізу в код плагіна pidgin-xmpp-reciepts дивитися чи можна поміняти його формат підтвердження на той, який буде зрозумілий для psi +. Як виявилося зробити це нескладно, досить в одному рядку поміняти місце, де вказується id.


Після компіляції плагіна з цим патчем повідомлення стали працювати в обох напрямках. Останнім штрихом стала "гібридизація" версій стандарту - я трохи модифікував свій патч, щоб клієнти, які можуть покладатися на нову версію могли її правильно сприймати.


З цим патчем нічого не відвалилося, хоча патч є милицею. Щоб остаточно оформити рішення проблеми з підтримкою XEP-0184 в pidgin, я зібрав пакет для Debian. Його можна встановити з мого сховища.