Mercurial > pidgin
changeset 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 | 9b3c7d2a6e9a |
children | f01e6a425136 |
files | src/protocols/gg/gg.c src/protocols/gg/protocol.txt |
diffstat | 2 files changed, 151 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/src/protocols/gg/gg.c Tue Nov 27 22:46:03 2001 +0000 +++ b/src/protocols/gg/gg.c Tue Nov 27 22:54:32 2001 +0000 @@ -1,6 +1,6 @@ /* * gaim - Gadu-Gadu Protocol Plugin - * $Id: gg.c 2805 2001-11-26 21:22:56Z warmenhoven $ + * $Id: gg.c 2819 2001-11-27 22:54:32Z warmenhoven $ * * Copyright (C) 2001 Arkadiusz Mi�kiewicz <misiek@pld.ORG.PL> * @@ -79,6 +79,7 @@ #define AGG_HTTP_SEARCH 1 #define AGG_HTTP_USERLIST_IMPORT 2 #define AGG_HTTP_USERLIST_EXPORT 3 +#define AGG_HTTP_USERLIST_DELETE 4 #define UC_NORMAL 2 @@ -578,7 +579,6 @@ gd->sess->state = GG_STATE_CONNECTING_HTTP; gd->sess->check = GG_CHECK_WRITE; gd->sess->async = 1; - gd->sess->recv_left = 0; gd->sess->fd = proxy_connect(GG_APPMSG_HOST, GG_APPMSG_PORT, login_callback, gc); if (gd->sess->fd < 0) { @@ -667,7 +667,6 @@ if ((ptr = strstr(webdata, "query_results:")) == NULL || (ptr = strchr(ptr, '\n')) == NULL) { debug_printf("search_callback: pubdir result [%s]\n", webdata); - g_free(webdata); do_error_dialog(_("Couldn't get search results"), _("Gadu-Gadu Error")); return; } @@ -677,8 +676,6 @@ webdata_tbl = g_strsplit(ptr, "\n", AGG_PUBDIR_MAX_ENTRIES); - g_free(webdata); - j = 0; /* Parse array */ @@ -768,28 +765,25 @@ g_free(buf); } -static void agg_import_buddies_results(struct gaim_connection *gc, gchar *webdata) +static void import_buddies_server_results(struct gaim_connection *gc, gchar *webdata) { gchar *ptr; gchar **users_tbl; int i; if (strstr(webdata, "no_data:")) { - g_free(webdata); do_error_dialog(_("There is no Buddy List stored on server. Sorry!"), _("Gadu-Gadu Error")); return; } if ((ptr = strstr(webdata, "get_results:")) == NULL || (ptr = strchr(ptr, ':')) == NULL) { - debug_printf("agg_import_buddies_list: import buddies result [%s]\n", webdata); - g_free(webdata); + debug_printf("import_buddies_server_results: import buddies result [%s]\n", webdata); do_error_dialog(_("Couldn't Import Buddies List from Server"), _("Gadu-Gadu Error")); return; } ptr++; users_tbl = g_strsplit(ptr, "\n", AGG_PUBDIR_MAX_ENTRIES); - g_free(webdata); /* Parse array of Buddies List */ for (i = 0; users_tbl[i] != NULL; i++) { @@ -806,7 +800,7 @@ continue; } - debug_printf("uin: %s\n", name); + debug_printf("import_buddies_server_results: uin: %s\n", name); if (!find_buddy(gc, name)) { /* Default group if none specified on server */ gchar *group = g_strdup("Gadu-Gadu"); @@ -828,20 +822,30 @@ g_strfreev(users_tbl); } -static void agg_export_buddies_results(struct gaim_connection *gc, gchar *webdata) +static void export_buddies_server_results(struct gaim_connection *gc, gchar *webdata) { if (strstr(webdata, "put_success:")) { - g_free(webdata); do_error_dialog(_("Buddies List sucessfully transfered into Server"), _("Gadu-Gadu Information")); return; } - debug_printf("agg_export_buddies_results: webdata [%s]\n", webdata); - g_free(webdata); + debug_printf("export_buddies_server_results: webdata [%s]\n", webdata); do_error_dialog(_("Couldn't transfer Buddies List into Server"), _("Gadu-Gadu Error")); } +static void delete_buddies_server_results(struct gaim_connection *gc, gchar *webdata) +{ + if (strstr(webdata, "put_success:")) { + do_error_dialog(_("Buddies List sucessfully deleted from Server"), + _("Gadu-Gadu Information")); + return; + } + + debug_printf("delete_buddies_server_results: webdata [%s]\n", webdata); + do_error_dialog(_("Couldn't delete Buddies List from Server"), _("Gadu-Gadu Error")); +} + static void http_results(gpointer data, gint source, GaimInputCondition cond) { struct agg_http *hdata = data; @@ -890,10 +894,13 @@ search_results(gc, webdata); break; case AGG_HTTP_USERLIST_IMPORT: - agg_import_buddies_results(gc, webdata); + import_buddies_server_results(gc, webdata); break; case AGG_HTTP_USERLIST_EXPORT: - agg_export_buddies_results(gc, webdata); + export_buddies_server_results(gc, webdata); + break; + case AGG_HTTP_USERLIST_DELETE: + delete_buddies_server_results(gc, webdata); break; case AGG_HTTP_NONE: default: @@ -901,6 +908,7 @@ break; } + g_free(webdata); g_free(hdata); } @@ -956,7 +964,7 @@ hdata->inpa = gaim_input_add(source, GAIM_INPUT_READ, http_results, hdata); } -static void agg_import_buddies(struct gaim_connection *gc) +static void import_buddies_server(struct gaim_connection *gc) { struct agg_http *hi = g_new0(struct agg_http, 1); static char msg[AGG_BUF_LEN]; @@ -977,7 +985,7 @@ } } -static void agg_export_buddies(struct gaim_connection *gc) +static void export_buddies_server(struct gaim_connection *gc) { struct agg_http *he = g_new0(struct agg_http, 1); static char msg[AGG_BUF_LEN]; @@ -1023,6 +1031,27 @@ } } +static void delete_buddies_server(struct gaim_connection *gc) +{ + struct agg_http *he = g_new0(struct agg_http, 1); + static char msg[AGG_BUF_LEN]; + + he->gc = gc; + he->type = AGG_HTTP_USERLIST_DELETE; + he->form = AGG_PUBDIR_USERLIST_EXPORT_FORM; + he->host = GG_PUBDIR_HOST; + he->request = g_strdup_printf("FmNum=%s&Pass=%s&Delete=1", gc->username, gc->password); + + if (proxy_connect(GG_PUBDIR_HOST, GG_PUBDIR_PORT, http_req_callback, he) < 0) { + g_snprintf(msg, sizeof(msg), _("Deletion of Buddies List from Server failed (%s)"), + GG_PUBDIR_HOST); + do_error_dialog(msg, _("Gadu-Gadu Error")); + g_free(he->request); + g_free(he); + return; + } +} + static void agg_dir_search(struct gaim_connection *gc, char *first, char *middle, char *last, char *maiden, char *city, char *state, char *country, char *email) { @@ -1066,9 +1095,11 @@ if (!strcmp(action, _("Directory Search"))) { show_find_info(gc); } else if (!strcmp(action, _("Import Buddies List from Server"))) { - agg_import_buddies(gc); + import_buddies_server(gc); } else if (!strcmp(action, _("Export Buddies List to Server"))) { - agg_export_buddies(gc); + export_buddies_server(gc); + } else if (!strcmp(action, _("Delete Buddies List from Server"))) { + delete_buddies_server(gc); } } @@ -1079,6 +1110,7 @@ m = g_list_append(m, _("Directory Search")); m = g_list_append(m, _("Import Buddies List from Server")); m = g_list_append(m, _("Export Buddies List to Server")); + m = g_list_append(m, _("Delete Buddies List from Server")); return m; }
--- 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 $