Author Topic: Jabber. Атрибут ID в XML сообщениях.  (Read 3788 times)

0 Members and 1 Guest are viewing this topic.

Offline SeriyMaN

Господа, столкнулся с весьма занятной проблемой.

Использую Миранду в связке с ejabberd в корпоративной среде. У некоторых пользователей есть потребность в мобильном клиенте. Используется клиент Bria Mobile. Других вариантов нет, т.к. на телефонах нужен SIP и общая управляемая адресная книга. На андроид еще можно куда-то рыпнуться, на айфонах больше вариантов нет никаких. Это была преамбула, теперь по сути проблемы.

Периодически не доходят сообщения из миранды в bria. Причем, оба клиента онлайн. Из других клиентов (пробовал другую bria, jitsi, pidgin) сообщения прекрасно доходят. Из bria в миранду сообщения так же доходят без проблем. Из миранды в другие клиенты так же никаких нареканий. Проблема возникает только в направлении миранда -> бриа.

После долгих мучений при диагностике выяснилось следующее. При формировании XML-сообщения в качестве атрибута id тега message проставляется "mir_" + порядковый номер, который, как я понял, начинается с 1 при каждом запуске миранды. У bria, в свою очередь, есть база данных с архивом сообщений. После просмотра андроидовского logcat в процессе работы bria выяснилось, что она берет значение id, кладет его в базу в поле, на котором стоит ограничение уникальности. Возникают ошибки такого содержания:

Code: [Select]
04-09 12:44:44.614 29314 29314 D ImLocalStorage: add to db: mir_39, conv: 1     [common.controller.im.refactoring.ImLocalStorage.addMessage:226]
04-09 12:44:44.630 29314 29206 E ImLocalStorage: Error has occurred during Put operation. object = com.bria.common.controller.im.refactoring.db.entities.InstantMessageData@523f28f     [common.controller.im.refactoring.ImLocalStorage.lambda$addMessage$5:248]
04-09 12:44:44.634 29314 29206 E ImLocalStorage: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: Messages.externalId (code 2067)   [common.controller.im.refactoring.ImLocalStorage.lambda$addMessage$5:249]

И действительно, после того, как я в bria очистил историю, сообщения стали прекрасно доходить. После перезапуска миранды, когда счетчик id обнулился, снова стали возникать проблемы.

В связи с этим у меня вопрос к сообществу: есть ли возможность сделать так, чтобы счетчик начинался не с 1, а, например, с какого-то случайного значения или с unix-time для того, чтобы обеспечить его уникальность в рамках всей переписки?

Например, я обратил внимание, что у pidgin id выглядит "purple74d1eff8", "purple74d1effa", т.е. там какое-то длинное hex число, которое так же в каждом последующем сообщении увеличивается на 1. У jitsi наоборот, при каждом запуске случайным образом формируется префикс, например: "99q5a-98", "VNNGo-1641". Поэтому с ними таких проблем не возникает. Но эти клиенты невозможно использовать ввиду отсутствия необходимого функционала.

Понятно, что в спецификации XMPP нет указания, что поле id должно быть уникально в рамках всей переписки, но, как оказалось, могут возникать проблемы. Здесь, конечно, практически полностью вина разработчиков bria, которым взбрело в голову в качестве ключа ставить id сообщения, которое может быть не уникальным, но боюсь они вряд ли будут переделывать схему в обозримом будущем, а проблема очень сильно напрягает.

Спасибо.
 

Offline ghazan

Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #1 on: 13 04 2019, 11:14:46 »
мрачно. дело в том, что вся обработка iq в миранде сделана на базе этих самых id, из которых миранда выкусывает буквы mir, а число использует как номер пакета в очереди на обработку (сюда же попадает и expire, т.е. отслеживание того, что сервер не прислал ответ на пакет).

можно попробовать вообще не отправлять id в пакетах типа message, потому что они необязательны, но как тогда отслеживать реакцию на доставку... можно, конечно, запоминать этот id между сессиями  :-\
 

Offline ghazan

Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #2 on: 13 04 2019, 14:57:47 »
SeriyMaN,
сделал некоторый костыль, который будет генерировать уникальный id в рамках конкретного профиля миранды.
есть минус - если учеток несколько, то есть таки шанс сгенерировать неуникальный packet id на разных соединениях, но это маловероятно, чтобы оно прилетело в один и тот же bria :)

девелоперская версия сейчас соберется
 

Offline SeriyMaN

Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #3 on: 15 04 2019, 09:55:15 »
Обновил. Действительно, id стали генерироваться вида mira67befc8e1c72a50_16, при каждом запуске разные. В принципе, как раз то, что нужно. У меня нигде не используется схема с двумя учетками в одном профиле и, в принципе, не планируется, так что это не проблема.

На самом деле, я на той неделе сам попробовал поковырять код, добавил к mir_ случайный набор символов фиксированной длины, чтобы не поломать функцию получения числового id (там просто пришлось поправить смещение). Поскольку я в С++ разбираюсь чуть менее, чем никак, получилось криво, но для теста прокатило. Теперь решение есть и в официальной версии, за что вам большое спасибо.
 

Offline blokva

  • Newbie
  • *
  • Posts: 25
  • Country: by
Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #4 on: 02 10 2019, 08:00:57 »

Из других клиентов (пробовал другую bria, jitsi, pidgin) сообщения прекрасно доходят.
Здравствуйте!
Как я понял у Вас подключена миранда к Jitsi. Я пробую это сделать, настроив в Миранде новый аккаунт типа jabber но у меня ничего не получается :(
Может подскажите какие отличия в настройках от обычно Jaber?
 

Offline SeriyMaN

Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #5 on: 02 10 2019, 08:15:26 »
Как я понял у Вас подключена миранда к Jitsi.

Не совсем так. У меня и Миранда, и Jitsi подключены к одному jabber-серверу (Ejabberd) в качестве клиентов. Настройки в Миранде и Jitsi - стандартные для jabber.

А что значит "подключена Миранда к Jitsi"? Имеется ввиду, Jitsi meet, что ли? Так он, вроде, ничего общего с протоколом jabber не имеет...
 

Offline blokva

  • Newbie
  • *
  • Posts: 25
  • Country: by
Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #6 on: 02 10 2019, 12:18:08 »

Имеется ввиду, Jitsi meet, что ли?
Нет спросил у админа, говорит что это Jabber? конкретно протокол XMPP.
Я полностью повторил настройки аккаунта из клиента Jitsi но ничего не получается.
 

Offline SeriyMaN

Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #7 on: 02 10 2019, 14:02:45 »
Да там настроек-то никаких нет почти... Разве что в Jitsi имя пользователя задается как user@domain, а в Миранде указываются отдельно имя пользователя (без @domain), пароль, домен/сервер в соответствующих полях. Ну и проверяем порт и настройки шифрования.


Если ничего не помогает, можно копнуть лог миранды.
 
The following users thanked this post: blokva

Offline blokva

  • Newbie
  • *
  • Posts: 25
  • Country: by
Re: Jabber. Атрибут ID в XML сообщениях.
« Reply #8 on: 08 10 2019, 10:10:58 »

Если ничего не помогает, можно копнуть лог миранды.
Последовал Вашему совету, и увидел что оно лезет в прокси ... а сеть внутренняя! Прокси был включен для skype и ICQ. Но отключил прокси в миранде и все заработало!
Спасибо за совет!


ps: кстати и скайп и аська тоже запустились с выключенным прокси...