Psi - kient XMPP

XMPP/Jabber

Ciekawą i interesującą usługą jest Instant Message, a konkretniej protokół XMPP. O protokole tym i jego bolączkach wieku dziecięcego wspomniałem już wcześniej.

Główna bolączką XMPP wydaje się być opóźnienie implementacji w stosunku co do standardów. W przypadku serwerów nie jest bardzo tragicznie (większość funkcjonalności jest dostępna w formie dodatkowych modułów lub łatek), natomiast w przypadku klientów braki są liczniejsze (tutaj jednak zawsze można sobie poradzić komunikując się z nieobsługiwaną w kliencie funcjonalnością przy pomocy konsoli XML).

Najciekawszym w chwili obecnej serwerem tej usługi wydaje się być ejabberd. Zamieszczam jego przykładową konfigurację - ejabberd.cfg.

Warto zainteresować się również łatkami do tego serwera zwiększającymi jego funkcjonalność mod_archive_odbc-release, dodającym implementację Message Archiving (XEP-0136), jest także jego nowsza wersja pod nazwą mod_archive2 (wersja odbc używana z PSQL 8.4.12 i erland R14 może wymagać załatania mod_archive_webview - spodziewa się tekstowej postaci czasu UTC, ale otrzymuje z bazy postać numeryczną - patch mojego autorstwa). Kolejnym ciekawym patchem jest mod_multicast implementujący wieloadresowanie Extended Stanza Addressing (XEP-0033) oraz patcjh implementujący XEP-0079: Advanced Message Processing. Zainteresować się można również patch'ami umożliwiającymi: dostęp do MUC przez IRC, zapis informacji użytkowników do HTML, logowanie pakietów jako XML, filtrowanie dostępu. Ciekawe wydają się także moduły do współpracy z serwerem VoIP Asterisk - mod_asterisk i mod_client_asterisk.

Wiecej patchy znaleźć można na: ejabberd.im. Wiele z opisywanych łatek jest do pobrania poprzez: svn co https://svn.process-one.net/ejabberd-modules i budowane są one niezależnie od samego ejabberda. Jednak patche mojega autorstwa związane z aliasami JID ("ejabberd_log_offline_message.diff" i "ejabberd_alias_forward.diff") wymagają pobrania źródeł ejabberda (apt-get source ejabberd) zapatchowania go (cd ejabberd-*/src; patch -p0 < ../../ejabberd_*.diff) i zbudowania (./configure && make lub cd ..; dpkg-buildpackage -rfakeroot).

Polecam także mój system powiadomień XMPP/SMTP zawierający m.in. łatką "ejabberd_log_offline_message.diff" powodującą zapisywanie wiadomości trybu offline także do plików tekstowych, które wykorzystuje w moim systemie do przesyłania powiadomień o nowych IM na e-mail. Zachęcam także do zapoznania się z zestawem moich patch'y do serwera ejabberd implementujących JID aliases.

Innymi wartymi zainteresowania uzupełnieniami serwera xmpp są z pewnością: transport xmpp2xmpp (ułatwia on między innymi bycie on-line na kilku kontach równocześnie, korzystanie z adresu na innym serwerze i usług takich jak archiwizacja na innym - JID aliasing) oraz system prezentacji i zarządzania historią rozmów - Jorge.

Przy konfiguracji warto zwrócić uwagę na dostęp do MUC (polecam ustawienie umożliwiające udział każdemu a zakładanie tylko swoim - {mod_muc, [{access, muc}, {access_create, muc_create}, {access_admin, muc_admin}] }, polecam ustawić także: {access, muc_admin, [{allow, admin}]}. {access, muc_create, [{allow, local}]}. {access, muc, [{allow, all}]}.. Jeżeli nasz system kożysta z IPv6 należy uruchomić słuchania na tym protkole - wpisy inet6 w konfiguracji portów nasłuchiwania np.: {5222, ejabberd_c2s, [inet6, {access, c2s}, ....]}. W przypadku kożystania z autoryzacji przez PAM (wpis konfiguracyjny {auth_method, pam}.) konieczne może okazać się dodanie użytkownika ejabberd do grupy shadow, warto wtedy także wyłączyć możliwość rejestracji - {access, register, [{deny, all}]}.. Przykładowy konfig: ejabberd.cfg.

Niekiedy (gdy za dużo napsujemy) mogą wystąpić problemy z startem ejabberd'a. Należy wtedy wyeksportować dane konfiguracyjne z jego bazy (ejabberdctl dump), zatrzymać ejabberda, usunąć /var/lib/ejabberd i po ponownym uruchomieniu ejabberda przywrócić z pliku tekstowego(ejabberdctl load). Można także bawić się z podmianą wybranych plików w tym katalogu, jest to przydatne tylko gdy nie możemy uruchomić ejabberd'a a nie posiadamy zrzutu - przenosimy wtedy ten katalog w inne miejsce, odpalamy ejabberda, zatrzymujemy go, pliki LATEST.LOG config.DCD local_config.DCD disco_publish.DAT z nowo utworzonego katalogu kopiujemy do starego, zastępujemy nim nowy i odpalamy ejabberda. Ta metoda w odróżnieniu od pierwszej regeneruje bazę jednorazowo, więc przy następnym starcie też będzie problem.
Jeszcze innym (i chyba najlepszym) rozwiązaniem tych problemów jest wywalenie zawartości /var/lib/ejabberd, odpalenie w celu uzyskania nowego konfigu, przywrócenie poprzedniej zawartości /var/lib/ejabberd i zrobienie cd /path/do/zarhiwizowanego/_nowego_/var/lib/ejabberd/ && cp /tmp/ejabberd/config.DCD /tmp/ejabberd/local_config.DCD /tmp/ejabberd/disco_publish.DAT /var/lib/ejabberd/; chown ejabberd:ejabberd /var/lib/ejabberd/*; /etc/init.d/ejabberd start

Interesującym rozwiązaniem jest także dobrze współpracujący z ejabberd webowy klient xmpp - jwchat. Korzysta on z mechanizmu HTTP Binding (lub HTTP Polling) oprócz włączenia tych mechanizmów w ejabberd (moduł mod_http_bind oraz odpowiednia konfiguracja ejabberd_http) i ustawienia dla nich proxy (m.in. po to aby puszczać to po https) należy szczególną uwagę zwrócić na to iż w url występuje - a w konfiguracji mod_http_bind występuje _.

Zobacz także: Jabber archive web reader, wykaz rozszerzeń / protokołów wspieranych przez ejabberd, wykaz rozszerzeń protokołu (dokumentów XEP), XEP-0209: Metacontacts, XEP-0153: vCard-Based Avatars.

Psi - kient XMPP

Program ten cechuje dośc nieprzyjemna cecha polegająca na niemożności zalogowania się bez podania hasła klucza GPG, gdy taki ustawiliśmy. Prezentuje patch mojego autorstwa zmieniający to zachowanie (pozwalający na zalogowanie bez podpisywania statusu) - patch (szczegóły).

Klient ten nie pozwala obecnie na korzystanie poprzez swój interfejs z archiwizacji wiadomości po stronie serwera (Message Archiving, JEP-0136). Mozna jednak usługę tą aktywować i używać z poziomu konsoli XML. Poniżej zamieszczam krótki przykład jak to robić:

<!-- SPRAWDZENIE -->
<iq type='get' id='save1' from='user@example.net'>
  <save xmlns='http://jabber.org/protocol/archive'/>
</iq>

<!-- WLACZENIE -->
<iq type='set' id='save2' from='user@example.net'>
  <save xmlns='http://jabber.org/protocol/archive'>
    <default save='true'/>
  </save>
</iq>

<!-- POBRANIE SPISU -->
<iq type='get' to='example.net'>
  <list xmlns='http://jabber.org/protocol/archive'
        maxitems='50'/>
</iq>

<!-- POBRANIE ZAPISU ROZMOWY -->
<iq type='get' to='example.net' id='down5'>
  <retrieve xmlns='http://jabber.org/protocol/archive'
            with='testowy@conference.example.net'
            start='2007-04-08T22:00:49Z'/>
</iq>

<!-- USUNIECIE WSZYSTKICH -->
<iq type='set' to='example.net'>
  <remove xmlns='http://jabber.org/protocol/archive'/>
</iq>

XML możemy także wykożystać do ustawienia innego statusu na jednym z transportów - np. na GG: <presence type="available" to="gg.serwer.xmpp"><show>away</show><status>jeżeli możesz pisz na jabbera, JID: rrp@n17.waw.pl</status></presence>



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/usage_and_config/network_services/xmpp) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2015-10-10 11:32:33 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).