comparison 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
comparison
equal deleted inserted replaced
2805:9b3c7d2a6e9a 2806:1ffac7cf4e94
1 --------------------------------------------------------------------------- 1 ---------------------------------------------------------------------------
2 2
3 protokół g*du-g*du 4.x 3 Protokół G*du-G*du 4.x
4 (c) copyright 2001 by wojtek kaniewski <wojtekka@irc.pl> 4
5 (C) Copyright 2001 by Wojtek Kaniewski <wojtekka@irc.pl>,
6 Robert J. Woźny <speedy@atman.pl>,
7 Tomasz Jarzynka <tomee@cpi.pl>,
8 Adam Ludwikowski <adam.ludwikowski@wp.pl>,
9 Marek Kozina <klith@hybrid.art.pl>,
10 Rafał Florek <raf@regionet.regionet.pl>,
11 Igor Popik <igipop@wsfiz.edu.pl>
5 12
6 --- 0) disclaimer --------------------------------------------------------- 13 --- 0) disclaimer ---------------------------------------------------------
7 14
8 wszystkie informacje bazują na doświadczeniach przeprowadzonych na moim 15 opis protokołu bazują na doświadczeniach przeprowadzonych na moim
9 domowym komputerze. żaden klient g*du-g*du nie został skrzywdzony podczas 16 domowym komputerze oraz informacjach przysłanych do mnie przez różnych
17 ludzi. żaden klient g*du-g*du nie został skrzywdzony podczas
10 przeprowadzania badań, blabla. 18 przeprowadzania badań, blabla.
11 19
12 --- 1) transmisja, format wszystkich pakietów ----------------------------- 20 --- 1) transmisja, format wszystkich pakietów -----------------------------
13 21
14 w przeciwieństwie do zabawek typu icq, g*du-g*du korzysta z protokołu tcp. 22 w przeciwieństwie do zabawek typu icq, g*du-g*du korzysta z protokołu tcp.
35 GET /appsvc/appmsg.asp?fmnumber=<tutaj_numerek_gg> HTTP/1.0 43 GET /appsvc/appmsg.asp?fmnumber=<tutaj_numerek_gg> HTTP/1.0
36 Host: appmsg.gadu-gadu.pl 44 Host: appmsg.gadu-gadu.pl
37 User-Agent: Mozilla/4.7 [en] (Win98; I) 45 User-Agent: Mozilla/4.7 [en] (Win98; I)
38 Pragma: no-cache 46 Pragma: no-cache
39 47
40 na co powinniśmy dostać odpowiedź w stylu: 48 oryginalny klient może wysłać jeden z podanych identyfikatorów przeglądarki:
49
50 Mozilla/4.04 [en] (Win95; I ;Nav)
51 Mozilla/4.7 [en] (Win98; I)
52 Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
53 Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
54 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
55 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98)
56
57 nowsze wersje klienta do zapytania dodają również `version=...' opisujące,
58 z jakim klientem serwer ma do czynienia. jednak ze względu na możliwe
59 różnice w protokole, lepiej pomijać ten parametr i uwagać GG 4.0. w każdym
60 razie na to zapytanie serwer powinien odpowiedzieć:
41 61
42 HTTP/1.0 200 OK 62 HTTP/1.0 200 OK
43 63
44 0 1 0 217.17.33.21:8074 217.17.33.21 217.17.33.21 64 0 1 0 217.17.33.21:8074 217.17.33.21 217.17.33.21
45 65
46 co to oznacza? nie mam pojęcia ;) wygląda na to, że cały g*du-g*du jest 66 co to oznacza? nie mam pojęcia ;) wygląda na to, że cały g*du-g*du jest
47 przemyślany i w przyszłości będzie można używać różnych serwerów do różnych 67 przemyślany i w przyszłości będzie można używać różnych serwerów do różnych
48 rzeczy, typu szukanie, obsługa klientów itd. póki co, łączyć się trzeba na 68 rzeczy, typu szukanie, obsługa klientów itd. póki co, łączyć się trzeba na
49 pierwszy adres (tak, ten z portem). 69 pierwszy adres (tak, ten z portem).
70 Jeżeli połączenie z portem 8074 nie wyjdzie z jakiś specyficznych powodów -
71 można się łączyć na port 443.
50 72
51 --- 3) logowanie się ------------------------------------------------------- 73 --- 3) logowanie się -------------------------------------------------------
52 74
53 po połączeniu się portem 8074 serwera g*du-g*du, dostajemy pakiet typu 0x0001, 75 po połączeniu się portem serwera g*du-g*du, dostajemy pakiet typu 0x0001,
54 który na potrzeby tego dokumentu nazwiemy: 76 który na potrzeby tego dokumentu nazwiemy:
55 77
56 #define GG_WELCOME 0x0001 78 #define GG_WELCOME 0x0001
57 79
58 reszta pakietu zawiera liczbę, na podstawie której liczony jest hash z hasła 80 reszta pakietu zawiera liczbę, na podstawie której liczony jest hash z hasła
70 92
71 struct gg_login { 93 struct gg_login {
72 int uin; /* twój numerek */ 94 int uin; /* twój numerek */
73 int hash; /* hash hasła */ 95 int hash; /* hash hasła */
74 int status; /* status na dzień dobry */ 96 int status; /* status na dzień dobry */
75 int dunno1; /* == 0x0b */ 97 int version; /* wersja klienta */
76 int local_ip; /* mój adres ip */ 98 int local_ip; /* mój adres ip */
77 short local_port; /* port, na którym słucham */ 99 short local_port; /* port, na którym słucham */
78 }; 100 };
79 101
80 jak obliczyć hash hasła? hmm... nic prostszego. do każdej literki hasła 102 jak obliczyć hash hasła? hmm... nic prostszego. do każdej literki hasła
82 serwer. 104 serwer.
83 105
84 for (hash = 1; *passwd; passwd++) 106 for (hash = 1; *passwd; passwd++)
85 hash *= (*passwd) + 1; 107 hash *= (*passwd) + 1;
86 108
87 zrozumiałe, racja? jeśli wszystko się powiedzie, dostaniemy w odpowiedzi 109 zrozumiałe, racja? liczba oznaczająca wersję może być jedną z poniższych:
88 pakiet typu 110
111 0x11 - 4.6.1
112 0x10 - 4.5.22, 4.5.21, 4.5.19, 4.5.17, 4.5.15
113 0x0f - 4.5.12
114 0x0b - 4.0.30, 4.0.29, 4.0.28, 4.0.25
115
116 oczywiście nie są to wszystkie możliwe wersje klientów, lecz te, które
117 udało się sprawdzić. najbezpieczniej będzie przedstawiać się jako ta
118 wersja, której ficzerów używamy. wiadomo, że 4.0.x nie obsługiwały trybu
119 ukrytego, ani tylko dla znajomych itd.
120
121 jeśli wszystko się powiedzie, dostaniemy w odpowiedzi pakiet typu
89 122
90 #define GG_LOGIN_OK 0x0003 123 #define GG_LOGIN_OK 0x0003
91 124
92 z polem header->length = 0, lub pakiet 125 z polem header->length = 0, lub pakiet
93 126
135 struct gg_notify_reply { 168 struct gg_notify_reply {
136 int uin; /* numerek */ 169 int uin; /* numerek */
137 int status; /* status danej osoby */ 170 int status; /* status danej osoby */
138 int remote_ip; /* adres ip delikwenta */ 171 int remote_ip; /* adres ip delikwenta */
139 short remote_port; /* port, na którym słucha klient */ 172 short remote_port; /* port, na którym słucha klient */
140 int dunno1; /* == 0x0b */ 173 int version; /* wersja klienta */
141 short dunno2; /* znowu port? */ 174 short dunno1; /* znowu port? */
142 }; 175 };
143 176
144 jeśli klient nie obsługuje połączeń między klientami (np. g*du-g*du 3.x) 177 jeśli klient nie obsługuje połączeń między klientami (np. g*du-g*du 3.x)
145 zamiast adresu ip jest 0, zamiast portu jest 2. nieważne ;) w każdym razie, 178 zamiast adresu ip jest 0, zamiast portu może być 0, 1, 2... nieważne ;)
146 jeśli ktoś się pojawi w trakcie pracy, również zostanie przysłany ten 179 port może przyjmować wartość 1, jeśli klient znajduje się za jakimś
147 pakiet. proste? proste :) 180 firewallem lub innym urządzeniem robiącym NAT. w każdym razie, jeśli ktoś
181 się pojawi w trakcie pracy, również zostanie przysłany ten pakiet.
182 proste? proste :)
148 183
149 żeby dodać kogoś do listy w trakcie pracy, trzeba wysłać niżej opisany 184 żeby dodać kogoś do listy w trakcie pracy, trzeba wysłać niżej opisany
150 pakiet. jego format jest identyczny jak przy GG_NOTIFY. 185 pakiet. jego format jest identyczny jak przy GG_NOTIFY.
151 186
152 #define GG_ADD 0x000d 187 #define GG_ADD 0x000d
169 204
170 przejdźmy do sedna sprawy ;) 205 przejdźmy do sedna sprawy ;)
171 206
172 #define GG_SEND_MSG 0x000b 207 #define GG_SEND_MSG 0x000b
173 208
209 #define GG_CLASS_QUEUED 0x0001 /* tylko przy odbieraniu */
174 #define GG_CLASS_MSG 0x0004 210 #define GG_CLASS_MSG 0x0004
175 #define GG_CLASS_CHAT 0x0008 211 #define GG_CLASS_CHAT 0x0008
212 #define GG_CLASS_UNKNOWN_1 0x0020
176 213
177 struct gg_send_msg { 214 struct gg_send_msg {
178 int recipient; 215 int recipient;
179 int seq; 216 int seq;
180 int class; 217 int class;
184 wiadomo, odbiorca. numer sekwencyjny, który wykorzystujemy potem do 221 wiadomo, odbiorca. numer sekwencyjny, który wykorzystujemy potem do
185 potwierdzenia. nie wykluczone, że w jakis sposób odróżnia się różne 222 potwierdzenia. nie wykluczone, że w jakis sposób odróżnia się różne
186 rozmowy za pomocą części bajtów, ale raczej nie ma znaczenia. klasa 223 rozmowy za pomocą części bajtów, ale raczej nie ma znaczenia. klasa
187 wiadomości pozwala odróżnić, czy wiadomość ma się pokazać w osobym 224 wiadomości pozwala odróżnić, czy wiadomość ma się pokazać w osobym
188 okienku czy jako kolejna linijka w okienku rozmowy. wygląda na to, 225 okienku czy jako kolejna linijka w okienku rozmowy. wygląda na to,
189 że to jakaś bitmapa, więc najlepiej olać inne bity niż 0x0f. (czasem 226 że to jakaś bitmapa, więc najlepiej olać inne bity niż 0x0e. (czasem
190 klienty wysyłają 0x04, czasem 0x24) 227 klienty wysyłają 0x04, czasem 0x24 -- widocznie 0x20 to też jakaś
228 flaga). jeśli odbiorca był niedostępny podczas wysyłania wiadomości,
229 zostanie zaznaczony bit 0x01.
230
231 oryginalny klient wysyłając wiadomość do kilku użytkowników, wysyła po
232 prostu kilka takich samych pakietów z różnymi numerkami odbiorców. nie
233 ma osobnego pakietu do tego. natomiast jeśli chodzi o ,,konferencyjnę''
234 do pakietu doklejana jest za ,,char message[];'' następująca struktura:
235
236 struct gg_send_recipients {
237 char flag; /* == 1 */
238 int count; /* ilość odbiorców */
239 int recipients[]; /* tablica odbiorców */
240 };
241
242 na przykład, by wysłać do trzech ludzi, należy wysłać pakiet:
243
244 - -- --- --+--+--+--+--+--+--+-----------+-----------+
245 treść |\0|\1| 0x02 | uin1 | uin2 |
246 - -- -- ---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
191 247
192 serwer po otrzymaniu wiadomości odsyła informację o tym. przy okazji 248 serwer po otrzymaniu wiadomości odsyła informację o tym. przy okazji
193 mówi, czy wiadomość dotarła do odbiorcy (status == GG_ACK_DELIVERED), 249 mówi, czy wiadomość dotarła do odbiorcy (status == GG_ACK_DELIVERED),
194 czy może jest offline i została zakolejkowana (GG_ACK_QUEUED): 250 czy może jest offline i została zakolejkowana (GG_ACK_QUEUED):
195 251
206 262
207 numer sekwencyjny i adresat ten sam, co przy wysyłaniu. 263 numer sekwencyjny i adresat ten sam, co przy wysyłaniu.
208 264
209 --- 7) otrzymywanie wiadomości --------------------------------------------- 265 --- 7) otrzymywanie wiadomości ---------------------------------------------
210 266
211 zbyt wiele wyjaśnień chyba nie trzeba. wiadomo od kogo. nieznane pola to 267 zbyt wiele wyjaśnień chyba nie trzeba. wiadomo od kogo. drugie pole to
212 coś a'la numer sekwencyjny albo identyfikator okienka z rozmową albo nowe 268 najprawdopodobniej jakiś numerek sekwencyjny. trzecie oznacza czas nadania
213 dane dla setiathome. klasa wiadomości taka sama jak przy wysyłaniu: 269 wiadomości. klasa wiadomości taka sama jak przy wysyłaniu:
214 270
215 #define GG_RECV_MSG 0x000a 271 #define GG_RECV_MSG 0x000a
216 272
217 struct gg_recv_msg { 273 struct gg_recv_msg {
218 int sender; 274 int sender;
219 int dunno1; 275 int seq;
220 int dunno2; 276 int time;
221 int class; 277 int class;
222 char message[]; 278 char message[];
223 }; 279 };
224 280
225 --- 8) otrzymywanie wiadomości --------------------------------------------- 281 w przypadku pakietów ,,konferencyjnych'' na koncu pakietu doklejona jest
282 struktura identyczna ze struct gg_send_recipients zawierająca pozostałych
283 rozmówców.
284
285 --- 8) ping/pong -----------------------------------------------------------
226 286
227 od czasu do czasu klient wysyła pakiet a'la ping do serwera i dostaje pustą 287 od czasu do czasu klient wysyła pakiet a'la ping do serwera i dostaje pustą
228 odpowiedź. ciężko stwierdzić, czy serwer wywala, jeśli nie dostanie pinga 288 odpowiedź. o ile dobrze pamiętam, serwer rozłącza się po upływie 5 minut od
229 przez jakiś czas, czy klient się rozłącza, jeśli serwer mu nie odpowie. 289 otrzymania ostatniej informacji.
230 jakoś nie chce mi się sprawdzać ;)
231 290
232 #define GG_PING 0x0008 291 #define GG_PING 0x0008
233 292
234 /* nie ma niczego */ 293 /* nie ma niczego */
235 294
237 296
238 /* nie ma niczego */ 297 /* nie ma niczego */
239 298
240 --- 9) podziękowania ------------------------------------------------------- 299 --- 9) podziękowania -------------------------------------------------------
241 300
242 swój wkład w poznanie protokołu miał Robert Woźny, który opisał nowości 301 swój wkład w poznanie protokołu mieli:
243 w GG 4.6. 302 - Robert J. Woźny <speedy@atman.pl>:
303 opis nowości w protokole GG 4.6,
304 - Tomasz Jarzynka <tomee@cpi.pl>:
305 badanie timeoutów,
306 - Adam Ludwikowski <adam.ludwikowski@wp.pl>:
307 wiele różnych poprawek do tekstu, badanie wersji,
308 - Marek Kozina <klith@hybrid.art.pl>:
309 czas otrzymania wiadomości,
310 - Rafał Florek <raf@regionet.regionet.pl>:
311 konferencje,
312 - Igor Popik <igipop@wsfiz.edu.pl>:
313 klasy wiadomości przy odbieraniu zakolejkowanej.
244 314
245 ---------------------------------------------------------------------------- 315 ----------------------------------------------------------------------------
246 316
247 $Id: protocol.txt 2406 2001-09-29 23:06:30Z warmenhoven $ 317 $Id: protocol.txt 2819 2001-11-27 22:54:32Z warmenhoven $
248 318