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

0 Members and 1 Guest are viewing this topic.

Offline SeriyMaNTopic starter

  • Newbie
  • *
  • Posts: 4
  • Karma: 0
Господа, столкнулся с весьма занятной проблемой.

Использую Миранду в связке с 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

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

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

Offline ghazan

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

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

Offline SeriyMaNTopic starter

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

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