Kaw's Lair Kolejny blog do marudzenia

11Kwi/112

Gadu-Gadu i zrywanie połączenia

Jak zapewne część z Was zaobserwowała, od paru dni alternatywne komunikatory miały (a część wciąż ma) pewne problemy ze zrywaniem połączenia do serwerów Gadu-Gadu. Problem wystąpił wraz ze zmianą certyfikatów SSL używanych na serwerach GG. Pierwszym komunikatorem, który sobie z tym poradził było AQQ (prawdopodobnie dzięki beheritowi), ostatnio dołączyło do tego grona WTW. Pewnie więc nie możecie się doczekać, by dowiedzieć się o co właściwie chodzi. Wbrew części podejrzeń, to nie ma związku z TLS. Ale może do rzeczy?

Zacznijmy może od czegoś co w zasadzie lubię, dowalania się do szczegółów, a potem Wam wyjaśnię o co chodzi. Cytując:

"fakt, błędu krytycznego który pojawił się po zmianach na serwerach GG. Nasza wtyczka odpowiedzialna za obsługę tej sieci zaczęła dublować wiadomości, a co gorsze - rozłączać się z siecią.".

Na serwerach Gadu w praktyce niczego nie zmieniano ciekawego, a przynajmniej nic co by wpływało na prawidłową implementację protokołu. Problem polega na tym, że ja, Oconnel, twórcy Mirandy i paru innych ludzi implementując protokół bazowało na opisie z libgadu. A ten jak się ostatnio okazało zawiera przynajmniej jeszcze jeden błąd. Otóż, protokół ten ma pewną funkcję, która  pilnuje tego abyście otrzymywali wszystkie wiadomości jakie serwer do Was wysyła. Działa to tak, że kiedy otrzymujecie wiadomość, Wasz komunikator wysyła do serwera informację, iż tę wiadomość otrzymał. Jeśli serwery nie otrzymają tego potwierdzenia (lub jest ono nieprawidłowe) to po paru sekundach zrywają połączenia, a te wiadomości, na które nie dostarczyliśmy potwierdzenia zostaną nam dostarczone po ponownym połączeniu, sprytne prawda? I lepiej zrobione niż w XMPP czy tlenie.

Teraz, wypowiedzi mają w/g nomenklatury z libgadu numerek sekwencyjny, "seq". Po tym wiadomości są w miarę jednoznacznie interpretowane. Tutaj muszę stwierdzić, ze jestem "dumbass", że takiej oczywistej oczywistości nie zauważyłem jak pierwszy raz (w sobotę) na to patrzyłem, a co zauważyłem po 3 sekundach dziś patrząc na ten sam log. Libgadu mówi, że pole "seq" w potwierdzeniu to:

/* liczba odebranych wiadomości podczas tego połączenia */

Okazało się, że jest dość, jednak, trochę inaczej. Otóż, osoba opisująca ten pakiet założyła chyba, że seq w otrzymywanej wiadomości jest niemodyfikowany przez serwer, i dostajemy taki seq jak klient  z drugiej strony wysłał. Co nawet ciekawe, nikt do tej pory nie zauważył, że serwer modyfikuje seq w wiadomościach jakie dostajemy i uwaga... wstawiał w niego ilość wysłanych do nas wiadomości podczas danego połączenia. Tak musiało być od początku, gdyż ponieważ, bo: oryginalny klient spokojnie przetrwał "zmiany na serwerach". Domyśliliście się? W potwierdzeniu wiadomości nie wysyłamy "liczby wiadomości otrzymanych" tylko seq wiadomości, która przybyła. (A która do tej pory, przypadkowo pokrywała się z ilością odebranych, cóż, teraz czasem przestała.)

Przy ostatniej zmianie certyfikatów, serwery zaczęły się dziwnie zachowywać, wysyłały do nas wiadomości nie jak do tej pory ze zwiększającym się zawsze seq o jeden, tylko czasem sobie dodawały dwa. My odpowiadaliśmy ilością wiadomości (+1), i... tadah, bah. Serwer nie dostawał potwierdzenia prawidłowej wiadomości i co robił? Zrywał połączenie. I te zdublowane wiadomości brały się właśnie z tego, brak potwierdzenia = wysłać wiadomość jeszcze raz po ponownym połączeniu.

Tutaj wypada mi trochę przeprosić ekipę programistów Gadu za zjechanie ich na blipie, acz jednak trochę im się należy, bo w tym wszystkim i tak czai się jakiś bug. Widzicie, po zmiany zachowania klienta naszego, wszystko zaczyna działać prawidłowo u jakichś 99,9%, niektórzy ludzie jednak wciąż mają problem. Jakbym miał zgadywać, to to całe zachowanie to jednak jest bug, acz mieszczący się w implementacji protokołu, a problem u pozostałych szkodników to te wypadki, kiedy ten bug przerasta soft serwera. Ah no i poza tym, to wciąż nie naprawili buga który powoduje tajemnicze giniecie wiadomości, szczególnie jeśli zawierają linki.

Praktycznie wszystkie klienty, których autorzy czytali "protocol.html" (i zaimplementowali potwierdzenia, bo samo libgadu wydaje się ich nie używać) są podatne na takie niefajne zachowania.

Proste, prawda? ;)

Zakres tematyczny: Gadu-Gadu, Komunikatory, WTW Dodaj komentarz
Komentarze (2) Trackbacks (0)
  1. Małe sprostowanie – ja tylko poinformowałem Oconnela o problemie i jego wysokim priorytecie, podałem prawdopodobną przyczynę (którą to wyczytałem z Blipa), następnie po paru minutach OC przesłał mi naprawioną wersję wtyczki GG ;) W głównej mierze to jego zasługa, ja tylko przyczyniłem się do bardzo szybkiej reakcji :)

  2. Ale nie podziękował *prych* ;) poza tym IMO wciąż kwalifikuje się to jako „dzięki beheritowi”.


Leave a comment

Brak trackbacków.