Mercurial > pidgin
diff src/protocols/gg/protocol.txt @ 2806:1ffac7cf4e94
[gaim-migrate @ 2819]
thanks Arkadiusz Miskiewicz:
Here is patch that adds ,,delete userlist from server'', updates
protocol.txt and makes small cleanup with freeing webdata + with
function names (all agg_ names are reserved for struct prpl
functions ;)
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Tue, 27 Nov 2001 22:54:32 +0000 |
parents | a7ecfd3f7714 |
children | 40d04a6570de |
line wrap: on
line diff
--- a/src/protocols/gg/protocol.txt Tue Nov 27 22:46:03 2001 +0000 +++ b/src/protocols/gg/protocol.txt Tue Nov 27 22:54:32 2001 +0000 @@ -1,12 +1,20 @@ --------------------------------------------------------------------------- - protokół g*du-g*du 4.x - (c) copyright 2001 by wojtek kaniewski <wojtekka@irc.pl> + Protokół G*du-G*du 4.x + + (C) Copyright 2001 by Wojtek Kaniewski <wojtekka@irc.pl>, + Robert J. Woźny <speedy@atman.pl>, + Tomasz Jarzynka <tomee@cpi.pl>, + Adam Ludwikowski <adam.ludwikowski@wp.pl>, + Marek Kozina <klith@hybrid.art.pl>, + Rafał Florek <raf@regionet.regionet.pl>, + Igor Popik <igipop@wsfiz.edu.pl> --- 0) disclaimer --------------------------------------------------------- -wszystkie informacje bazują na doświadczeniach przeprowadzonych na moim -domowym komputerze. żaden klient g*du-g*du nie został skrzywdzony podczas +opis protokołu bazują na doświadczeniach przeprowadzonych na moim +domowym komputerze oraz informacjach przysłanych do mnie przez różnych +ludzi. żaden klient g*du-g*du nie został skrzywdzony podczas przeprowadzania badań, blabla. --- 1) transmisja, format wszystkich pakietów ----------------------------- @@ -37,7 +45,19 @@ User-Agent: Mozilla/4.7 [en] (Win98; I) Pragma: no-cache -na co powinniśmy dostać odpowiedź w stylu: +oryginalny klient może wysłać jeden z podanych identyfikatorów przeglądarki: + + Mozilla/4.04 [en] (Win95; I ;Nav) + Mozilla/4.7 [en] (Win98; I) + Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) + Mozilla/4.0 (compatible; MSIE 5.0; Windows NT) + Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) + Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) + +nowsze wersje klienta do zapytania dodają również `version=...' opisujące, +z jakim klientem serwer ma do czynienia. jednak ze względu na możliwe +różnice w protokole, lepiej pomijać ten parametr i uwagać GG 4.0. w każdym +razie na to zapytanie serwer powinien odpowiedzieć: HTTP/1.0 200 OK @@ -47,10 +67,12 @@ przemyślany i w przyszłości będzie można używać różnych serwerów do różnych rzeczy, typu szukanie, obsługa klientów itd. póki co, łączyć się trzeba na pierwszy adres (tak, ten z portem). +Jeżeli połączenie z portem 8074 nie wyjdzie z jakiś specyficznych powodów - +można się łączyć na port 443. --- 3) logowanie się ------------------------------------------------------- -po połączeniu się portem 8074 serwera g*du-g*du, dostajemy pakiet typu 0x0001, +po połączeniu się portem serwera g*du-g*du, dostajemy pakiet typu 0x0001, który na potrzeby tego dokumentu nazwiemy: #define GG_WELCOME 0x0001 @@ -72,7 +94,7 @@ int uin; /* twój numerek */ int hash; /* hash hasła */ int status; /* status na dzień dobry */ - int dunno1; /* == 0x0b */ + int version; /* wersja klienta */ int local_ip; /* mój adres ip */ short local_port; /* port, na którym słucham */ }; @@ -84,8 +106,19 @@ for (hash = 1; *passwd; passwd++) hash *= (*passwd) + 1; -zrozumiałe, racja? jeśli wszystko się powiedzie, dostaniemy w odpowiedzi -pakiet typu +zrozumiałe, racja? liczba oznaczająca wersję może być jedną z poniższych: + + 0x11 - 4.6.1 + 0x10 - 4.5.22, 4.5.21, 4.5.19, 4.5.17, 4.5.15 + 0x0f - 4.5.12 + 0x0b - 4.0.30, 4.0.29, 4.0.28, 4.0.25 + +oczywiście nie są to wszystkie możliwe wersje klientów, lecz te, które +udało się sprawdzić. najbezpieczniej będzie przedstawiać się jako ta +wersja, której ficzerów używamy. wiadomo, że 4.0.x nie obsługiwały trybu +ukrytego, ani tylko dla znajomych itd. + +jeśli wszystko się powiedzie, dostaniemy w odpowiedzi pakiet typu #define GG_LOGIN_OK 0x0003 @@ -137,14 +170,16 @@ int status; /* status danej osoby */ int remote_ip; /* adres ip delikwenta */ short remote_port; /* port, na którym słucha klient */ - int dunno1; /* == 0x0b */ - short dunno2; /* znowu port? */ + int version; /* wersja klienta */ + short dunno1; /* znowu port? */ }; jeśli klient nie obsługuje połączeń między klientami (np. g*du-g*du 3.x) -zamiast adresu ip jest 0, zamiast portu jest 2. nieważne ;) w każdym razie, -jeśli ktoś się pojawi w trakcie pracy, również zostanie przysłany ten -pakiet. proste? proste :) +zamiast adresu ip jest 0, zamiast portu może być 0, 1, 2... nieważne ;) +port może przyjmować wartość 1, jeśli klient znajduje się za jakimś +firewallem lub innym urządzeniem robiącym NAT. w każdym razie, jeśli ktoś +się pojawi w trakcie pracy, również zostanie przysłany ten pakiet. +proste? proste :) żeby dodać kogoś do listy w trakcie pracy, trzeba wysłać niżej opisany pakiet. jego format jest identyczny jak przy GG_NOTIFY. @@ -171,8 +206,10 @@ #define GG_SEND_MSG 0x000b + #define GG_CLASS_QUEUED 0x0001 /* tylko przy odbieraniu */ #define GG_CLASS_MSG 0x0004 #define GG_CLASS_CHAT 0x0008 + #define GG_CLASS_UNKNOWN_1 0x0020 struct gg_send_msg { int recipient; @@ -186,8 +223,27 @@ rozmowy za pomocą części bajtów, ale raczej nie ma znaczenia. klasa wiadomości pozwala odróżnić, czy wiadomość ma się pokazać w osobym okienku czy jako kolejna linijka w okienku rozmowy. wygląda na to, -że to jakaś bitmapa, więc najlepiej olać inne bity niż 0x0f. (czasem -klienty wysyłają 0x04, czasem 0x24) +że to jakaś bitmapa, więc najlepiej olać inne bity niż 0x0e. (czasem +klienty wysyłają 0x04, czasem 0x24 -- widocznie 0x20 to też jakaś +flaga). jeśli odbiorca był niedostępny podczas wysyłania wiadomości, +zostanie zaznaczony bit 0x01. + +oryginalny klient wysyłając wiadomość do kilku użytkowników, wysyła po +prostu kilka takich samych pakietów z różnymi numerkami odbiorców. nie +ma osobnego pakietu do tego. natomiast jeśli chodzi o ,,konferencyjnę'' +do pakietu doklejana jest za ,,char message[];'' następująca struktura: + + struct gg_send_recipients { + char flag; /* == 1 */ + int count; /* ilość odbiorców */ + int recipients[]; /* tablica odbiorców */ + }; + +na przykład, by wysłać do trzech ludzi, należy wysłać pakiet: + + - -- --- --+--+--+--+--+--+--+-----------+-----------+ + treść |\0|\1| 0x02 | uin1 | uin2 | + - -- -- ---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ serwer po otrzymaniu wiadomości odsyła informację o tym. przy okazji mówi, czy wiadomość dotarła do odbiorcy (status == GG_ACK_DELIVERED), @@ -208,26 +264,29 @@ --- 7) otrzymywanie wiadomości --------------------------------------------- -zbyt wiele wyjaśnień chyba nie trzeba. wiadomo od kogo. nieznane pola to -coś a'la numer sekwencyjny albo identyfikator okienka z rozmową albo nowe -dane dla setiathome. klasa wiadomości taka sama jak przy wysyłaniu: +zbyt wiele wyjaśnień chyba nie trzeba. wiadomo od kogo. drugie pole to +najprawdopodobniej jakiś numerek sekwencyjny. trzecie oznacza czas nadania +wiadomości. klasa wiadomości taka sama jak przy wysyłaniu: #define GG_RECV_MSG 0x000a struct gg_recv_msg { int sender; - int dunno1; - int dunno2; + int seq; + int time; int class; char message[]; }; ---- 8) otrzymywanie wiadomości --------------------------------------------- +w przypadku pakietów ,,konferencyjnych'' na koncu pakietu doklejona jest +struktura identyczna ze struct gg_send_recipients zawierająca pozostałych +rozmówców. + +--- 8) ping/pong ----------------------------------------------------------- od czasu do czasu klient wysyła pakiet a'la ping do serwera i dostaje pustą -odpowiedź. ciężko stwierdzić, czy serwer wywala, jeśli nie dostanie pinga -przez jakiś czas, czy klient się rozłącza, jeśli serwer mu nie odpowie. -jakoś nie chce mi się sprawdzać ;) +odpowiedź. o ile dobrze pamiętam, serwer rozłącza się po upływie 5 minut od +otrzymania ostatniej informacji. #define GG_PING 0x0008 @@ -239,10 +298,21 @@ --- 9) podziękowania ------------------------------------------------------- -swój wkład w poznanie protokołu miał Robert Woźny, który opisał nowości -w GG 4.6. +swój wkład w poznanie protokołu mieli: + - Robert J. Woźny <speedy@atman.pl>: + opis nowości w protokole GG 4.6, + - Tomasz Jarzynka <tomee@cpi.pl>: + badanie timeoutów, + - Adam Ludwikowski <adam.ludwikowski@wp.pl>: + wiele różnych poprawek do tekstu, badanie wersji, + - Marek Kozina <klith@hybrid.art.pl>: + czas otrzymania wiadomości, + - Rafał Florek <raf@regionet.regionet.pl>: + konferencje, + - Igor Popik <igipop@wsfiz.edu.pl>: + klasy wiadomości przy odbieraniu zakolejkowanej. ---------------------------------------------------------------------------- -$Id: protocol.txt 2406 2001-09-29 23:06:30Z warmenhoven $ +$Id: protocol.txt 2819 2001-11-27 22:54:32Z warmenhoven $