To jest tylko wersja do druku, aby zobaczyć pełną wersję tematu, kliknij TUTAJ
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

F.A.Q. - Najczęściej Zadawane Pytania - [Problem] Gadu-Gadu na forum - POPRAWKA DO WERSJI 1.12.6p2

joli - 05-12-2008, 22:33
Temat postu: [Problem] Gadu-Gadu na forum - POPRAWKA DO WERSJI 1.12.6p2
Jesli mamy problemy z GG, warto skorzystać z poprawki

http://www.przemo.org/php...p=405999#405999

Kubos - 19-12-2008, 16:22
Temat postu: [Problem] Gadu-Gadu na forum
Witam. Kiedy chcę wysłać przez forum wiadomość gg, to wyskakuje mi taki błąd po kliknięciu "Wyślij":
Kod:
PROBLEM Z POLACZENIEM: 110 - Przekroczony czas oczekiwania na połączenie

Wie ktoś co trzeba pozmieniać, żeby to działało?

MagicalFire - 19-12-2008, 16:27

to ze twój serwer nie ma takiej opcji
zmienić hosting
a poza tym masz ustawione dane w panelu ??

Kubos - 19-12-2008, 17:47

MagicalFire napisał/a:
zmienić hosting

Hehe, to się obejdzie bez gg ;]
MagicalFire napisał/a:
a poza tym masz ustawione dane w panelu ??

No podałem mój nr. gg i hasło.

MagicalFire - 19-12-2008, 17:48

Kubos, no to hosting nie obsługuje
Petermechanic - 19-12-2008, 18:09

Nigdy się nie wyśle, GG zmieniło IP serwerów. Aby naprawić:
Cytat:

->Otwórz includes/functions_gg,php
->Znajdź:
Kod:

        $ip = array(85, 86, 88, 89);
        $host = '217.17.41.'.$ip[rand(0,sizeof($ip)-1)];

->Zamień na:
Kod:

        $ip = array(24, 33, 6, 7, 4, 5);
        $host = '91.197.13.'.$ip[rand(0,sizeof($ip)-1)];

->Otwórz includes/functions_gg_notice,php
->Znajdź:
Kod:

        $ip = array(85, 86, 88, 89);
        $host = '217.17.41.'.$ip[rand(0,sizeof($ip)-1)];

->Zamień na:
Kod:

        $ip = array(24, 33, 6, 7, 4, 5);
        $host = '91.197.13.'.$ip[rand(0,sizeof($ip)-1)];

->Zapisz i zamknij wszystkie pliki

Pozdrawiam

Kaito - 01-01-2009, 23:24

@up Witam. Po zmianie adresów ip wyskakuje mi taki błąd
Kod:
Warning:unpack() [function.unpack]: Type V: not enough input, need 4, have 1 in /.../..../ftp/includes/functions_gg.php on line 177


Oczywiście wiąże się to z komunikatem iż wiadomość nie została wysłana proszę spróbować puźniej ;]

redox - 02-01-2009, 13:42

A mi nadal pisze to co na początku ;/ co zrobiC?
bomber - 12-01-2009, 13:50

mam ten sam komunikat

Kod:

[<a href='function.unpack'>function.unpack</a>]: Type V: not enough input, need 4, have 1 in ../public_html/forum/includes/functions_gg.php on line 179

MagicalFire - 12-01-2009, 13:52

bomber, daj tu plik functions_gg.php
bomber - 12-01-2009, 14:08

1.12.5
1.12.5 functions_gg.php

myslalem ze stara wersja i to tego wina wiec zamienilem na plik z 1.12.6

1.12.6
1.12.6 functions_gg.php

serwery podmienione, wiem ze do firewalla sa dopisane ipki gg
poniewaz zwykla bramka http://bikeforum.opole.pl/forum/gg/ dziala
jej gg to 11068948 jakby co ;) [pisze ze nie wysyla ale wiadomosci dochodza]

MagicalFire - 12-01-2009, 14:30

bomber napisał/a:
myslalem ze stara wersja i to tego wina wiec zamienilem na plik z 1.12.6

te pliki sa takie same w tych wersjach

bomber - 12-01-2009, 14:45

co nie zmienia faktu ze nie tylko mi to nie dziala :)

[ Dodano: 13-01-2009, 12:13 ]
Hm. Przyszlo mi cos jeszcze do glowy. phpbb2 korzysta z www2gg 2.2 a ta bramka ktora wkleilem wczesniej to www2gg 2.2.1. I to i to stoi na tym samym serwerze. Wersja php na dmkproject to 5.2.3.
Podejrzewam wiec ze www2gg 2.2 ma na niektorych serwerach problem? A 2.2.1 go nie ma?
Czy ktos jeszcze ma tutaj podobny problem na dmk?

[ Dodano: 20-01-2009, 10:55 ]
częsciowa poprawka

functions_gg.php

Kod:

        function odbierz_dane()
        {
                if ( !$data = fread($this->fp, 8) ) return FALSE;
                $tab = unpack("Vtyp/Vrozmiar", $data);

                while ($tab['typ'] == 0x0011 || $tab['typ'] == 0x0002)
                {
                        $data = @fread($this->fp, $tab['rozmiar']);

                        switch($tab['typ'])
                        {
                                case 0x0002:
                                case 0x0011:
                                        $tab = unpack("Vuin/Vstatus", $data);
                                break;
                        }

                        $data = @fread($this->fp, 8);
                        $tab = unpack("Vtyp/Vrozmiar", $data);
                }

                if ( !$data = @fread($this->fp, $tab['rozmiar']) ) return FALSE;

                if ( $tab['typ'] == 0x0005 )
                {
                        $tab = unpack("Vstatus/Vadresat/Vseq", $data);
                        $this->status_dostarczenia[$tab['seq']] = $tab['status'];
                }
                else if ( $tab['typ'] == 0x000e )
                {
                        $tab = unpack("Cunknown/Vczas/A*results", $data);
                        $this->wyniki_szukania = $tab['results'];
                }

                return TRUE;
        }


zamienic na:
Kod:

        function odbierz_dane($auto_odpowiedz = "")
        {
                if ( !$data = fread($this->fp, 8) ) return FALSE;
                $tab = unpack("Vtyp/Vrozmiar", $data);

                while ($tab['typ'] == 0x0011 || $tab['typ'] == 0x0002)
                {
                        $data = @fread($this->fp, $tab['rozmiar']);

                        switch($tab['typ'])
                        {
                                case 0x0002:
                                case 0x0011:
                                $tab = unpack("Vuin/Vstatus", $data);

                                    $this->Debug("Otrzymano wiadomosc ", $tab);
                                    if ($auto_odpowiedz)
                                    $this->wyslij_wiadomosc($tab['nadawca'], $auto_odpowiedz, FALSE); //bez potwierdzen
                                    array_push($this->wiadomosci, $tab);

                                break;
                        }

                        $data = @fread($this->fp, 8);
                        $tab = unpack("Vtyp/Vrozmiar", $data);
                }

                if ( !$data = @fread($this->fp, $tab['rozmiar']) ) return FALSE;

                if ( $tab['typ'] == 0x0005 )
                {
                        $tab = unpack("Vstatus/Vadresat/Vseq", $data);
                        $this->status_dostarczenia[$tab['seq']] = $tab['status'];
                }
                else if ( $tab['typ'] == 0x000e )
                {
                        $tab = unpack("Cunknown/Vczas/A*results", $data);
                        $this->wyniki_szukania = $tab['results'];
                }

                return TRUE;
        }


oraz

Kod:

                        case 0x0003:
                                if ( $seq = $this->wyslij_wiadomosc($adresat, $tresc) )
                                {
                                        if ( $this->odbierz_dane() ) $this->logoff("");
                                        return $seq;
                                }
                                else
                                {
                                        $this->debug("Polaczenie zerwane po zalogowaniu");
                                        break;
                                }


zamienic na:
Kod:

                        case 0x0003:
                            if ($this->wyslij_liste_kontaktow ($adresat)) {
                                if ( $seq = $this->wyslij_wiadomosc($adresat, $tresc) )
                                        if ($this->odbierz_dane($this->auto_odpowiedz))  // czy wysylac odp. ze bramka
                                $this->logoff($this->OPIS_W_STATUSIE_PO_WYLOGOWANIU);
                                        return $seq;
                                }
                                else
                                {
                                        $this->debug("Polaczenie zerwane po zalogowaniu");
//                                      break;
                                }


Umozliwy to wysylanie wiadomosci do innych uzytkownikow. [Dziala prawie zawsze ;P mimo blednego komunikatu]
Powiadomienia uzytkownikow/adminow wciaz nie dzialaja. [functions_gg_notice.php nie poprawione]

Krzyś Kaspruk - 23-01-2009, 11:27

bomber napisał/a:
(...) częsciowa poprawka (...)
poprawka wygląda na robioną na zasadzie "wstawię w losowym miejscu wywołanie losowej metody i zobaczę czy działa".

Gadu-Gadu nieznacznie zmodyfikowało protokół, a w zasadzie wykorzystało niedokładną implementację tegoż w bramce gg. Od teraz klient po zalogowaniu dostaje pakiet GG_LOGIN_OK o długości 1 z polem o wartości 0x1F o nieznanym przeznaczeniu (nawet dla wersji GG starszych od 6.0 Build 140). Niestety nasza bramka była na tyle niechlujnie napisana, że nie fatygowała się sprawdzać jakichkolwiek długości pakietów, co skwapliwie wykorzystała firma Gadu-Gadu, i dlatego dopiero w późniejszej części kodu ta wartość była odczytywana ze strumienia (i stąd ten błąd z funkcją unpack). Poprawka tego niedociągnięcia wygląda następująco:
w pliku functions_gg.php w funkcji login fragment
Kod:
                if ( !$data1 = fread($this->fp, 8) ) return 0x000B;
                $tab = unpack("Vlogin_status/Vrozmiar", $data1);

                return $tab['login_status'];
zamieniamy na:
Kod:
                if ( !$data1 = fread($this->fp, 8) ) return 0x000B;

                $tab = unpack("Vlogin_status/Vrozmiar", $data1);
                if ($tab['rozmiar']>0)
                        $dummy = fread($this->fp, $tab['rozmiar']);

                return $tab['login_status'];
Następnym problemem - zauważonym przez mojego przedmówcę - jest fakt, że serwery GG oczekują albo na listę kontaktów (pakiety typu GG_NOTIFY_FIRST bądź GG_NOTIFY_LAST), albo na informację o pustej liście (pakiet GG_LIST_EMPTY). Przedmówca zaproponował wysłać listę kontaktów z jednym kontaktem - adresatem wiadomości, ja proponuję zamiast tego wysłać pustą listę. W tym celu w pliku functions_gg.php, w klasie GaduGadu, np. pod funkcją function wyslij_liste_kontaktow ($uin), należy zdefiniować funkcję pusta_lista_kontaktow w następujący sposób:
Kod:
        function pusta_lista_kontaktow ()
        {
                $data = pack ("VV",0x0012, 0);
                return @fwrite($this->fp,$data);
        }
Następnie, by informacja o pustej liście kontaktów została wysłana tuż po zalogowaniu, należy w funkcji wiadomosc (znajdującej się w klasie www2gg zamienić następujący fragment:
Kod:
                list ($host, $port) = $this->znajdz_serwer($this->numer);

                switch ($this->login($this->numer, $this->haslo, $host, $port, ""))
                {
                        case 0x0003:
                                if ( $seq = $this->wyslij_wiadomosc($adresat, $tresc) )
na:
Kod:
                list ($host, $port) = $this->znajdz_serwer($this->numer);

                switch ($this->login($this->numer, $this->haslo, $host, $port, ""))
                {
                        case 0x0003:
                                $this->pusta_lista_kontaktow();
                                if ( $seq = $this->wyslij_wiadomosc($adresat, $tresc) )
Ponowna próba wysłania wiadomości wewnątrz metody odbierz_dane i w dodatku w rozgałęzieniu dotyczącym powiadomienia o statusie osób z naszej listy kontaktów (tak jak to zrobił mój przedmówca) wydaje mi się nieporozumieniem.

Po tych zmianach należy jeszcze ustawić starszą wersję protokołu wykorzystywanego przez skrypt - w sygnaturze funkcji login w klasie GaduGadu trzeba zmniejszyć nr wersji o 1 - czyli było:
Kod:
function login($numer, $haslo, $host, $port, $opis = "", $wersja = 0x22)
a powinno być:
Kod:
function login($numer, $haslo, $host, $port, $opis = "", $wersja = 0x21)
Czemu przy nowszej wersji protokołu nie chce działać, nie chciało mi się sprawdzać.


Teraz kolej na functions_gg_notice.php. W ciele funkcji wiadomosc_gg zmieniamy początkową wartość zmiennej $wersja na 0x21 (analogicznie jak poprzednio), czyli: to:
Kod:
        $wersja = 0x22;
zmieniamy na:
Kod:
        $wersja = 0x21;
Analogicznie jak poprzednio należy również przed wysłaniem wiadomości wysłać na serwer listę kontaktów bądź pakiet informujący o jej braku - fragment
Kod:
        @fwrite($fp, @pack("VVVVVVvVvVvCCa".strlen($opis), 0x0015, 0x20 + strlen($opis), $numer, $hash, ($opis)?0x0004:0x0014, $wersja, 0, 0, 0, 0, 0, 0x14, 0xbe , $opis ));

        if ( is_array($list_addressats) )
        {
                for($i = 0; $i < count($list_addressats); $i++)
zamieniamy na:
Kod:
        @fwrite($fp, @pack("VVVVVVvVvVvCCa".strlen($opis), 0x0015, 0x20 + strlen($opis), $numer, $hash, ($opis)?0x0004:0x0014, $wersja, 0, 0, 0, 0, 0, 0x14, 0xbe , $opis ));

        @fwrite($fp, @pack("VV", 0x0012, 0));
        if ( is_array($list_addressats) )
        {
                for($i = 0; $i < count($list_addressats); $i++)
Po takich poprawkach - o ile o niczym nie zapomniałem - (+ oczywiście poprawki dotyczące adresów IP - bramka powinna chyba nie mieć adresów na sztywno, tylko je odczytywać z odpowiedzi serwera?) powiadamianie oraz bramka wydają się działać.

Przemo - 01-02-2009, 18:12

Krzyś Kaspruk, wielkie dzięki za poprawke, działa !!


Powered by phpBB modified by Przemo © 2003 phpBB Group