Mercurial > pidgin
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 |