Jak uzyskać wersję Joomla przez http?

11

Widziałem zrzuty ekranu rozwiązania, tam wersja Joomla jest wykrywana przez dostęp do strony tylko przez http.

Np. Rozwiązanie wyświetlało wszystkie 3 cyfry wersji Joomla. np. 2.5.28 lub 1.0.x itd., uzyskując dostęp do strony internetowej tylko przez http.

Chcę utworzyć małą aplikację, aby otrzymywać informacje o wersji zainstalowanej na serwerze. Ponieważ nie zawsze mam pełny dostęp do pamięci FTP, chciałbym wiedzieć, jak mogę wyodrębnić wersję Joomla z prostego HTTP GET.

hkais
źródło
Czy masz na myśli własną stronę internetową lub zewnętrzną stronę internetową? Jeśli jest to zewnętrzne, nie można tego zrobić
Lodder
@Farahmand - Podane linki nie będą pomocne dla dokładnej wersji, takiej jak 2.5.28 . Tylko główne numery wersji, takie jak 1.5 i 2.5
Lodder
@Lodder - Sprawdź ten link: whitefirdesign.com/tools/joomla-version-check.html, który pokazuje dokładną wersję.
Farahmand
@Lodder - Sprawdziłem link i działa dla wersji Joomla 2.5, ale nie działa dla niektórych wersji Joomla 3.
Farahmand

Odpowiedzi:

15

Ok, więc to właśnie pisałem wczoraj.

Tylko dla Joomla 2.5 i 3.x.

  1. Sprawdź, czy http://w adresie URL nie ma prefiksu. Jeśli tak, to dodaje. Uwaga: w tym przypadku nie wziąłem https://pod uwagę.
  2. Następnie próbuje pobrać plik manifestu Joomla i sprawdza, czy istnieje / jest czytelny.
  3. Jeśli istnieje, pobiera wartość z <version>tagu.
  4. Jeśli pliku XML nie można odczytać, to napisałem awarię, aby uzyskać wersję TinyMCE. Ponownie spróbuje odczytać wartość ze <version>znacznika.
  5. Odtąd spędziłem dość dużo czasu, przeglądając informacje o wydaniu dla każdej wersji Joomla, aby zobaczyć, które wersje mają aktualizację TinyMCE. Te, które zrobiły, dodałem do switchbloku dalej posiadanego w kodzie. To podejście nie da dokładnej wersji oprócz 2 z nich, ale da średnią. Myślałem o wykryciu wersji jQuery, ale potem zdałem sobie sprawę, że wiele osób aktualizuje wersję podstawową do najnowszej, co spowodowałoby, że wyniki byłyby niedokładne.
  6. Jeśli nie można znaleźć wersji TinyMCE (czyli zasadniczo strony innej niż Joomla), funkcja wróci Unknown.

Uwaga: ten skrypt używa, CURLwięc upewnij się, że jest włączony na twoim serwerze.


class JoomlaVersions
{
    public function getJoomlaVersion($site)
    {
        // Add http prefix if missing
        if (strpos($site,'http://') === false)
        {
            $site = 'http://'.$site;
        }

        // Get the number value from the <version> tag in the XML file
        $dom = new DOMDocument;
        $url = $site . '/administrator/manifests/files/joomla.xml';
        libxml_use_internal_errors(true);

        $exists = $this->XMLexists($url);

        if( $exists )
        {
            $dom->load($url);
            $versions = $dom->getElementsByTagName('version');

            foreach ($versions as $version) 
            {
                return $version->nodeValue;
            }
        }
        else 
        {
            $mce = $this->getTinyMCEversion($site);

            if($mce)
            {
                // Base Joomla version on the TinyMCE version
                switch ($mce)
                {
                    case '3.5.6':
                        $joomla = '3.0.0 - 3.1.6';
                        break;
                    case '4.0.10':
                        $joomla = '3.2.0 - 3.2.1';
                        break;
                    case '4.0.12':
                        $joomla = '3.2.2';
                        break;
                    case '4.0.18':
                        $joomla = '3.2.3 - 3.2.4';
                        break;
                    case '4.0.22':
                        $joomla = '3.3.0';
                        break;
                    case '4.0.28':
                        $joomla = '3.3.1 - 3.3.6';
                        break; 
                    case '4.1.7':
                        $joomla = '3.4.0';
                        break; 
                    default:
                        $joomla = '3.x';
                }

                return $joomla;
            }
            else 
            {
                return 'Unknown';
            }
        }   
    }

    // Get TinyMCE Version 
    private function getTinyMCEversion($site)
    {
        $tinymce = $site . '/plugins/editors/tinymce/tinymce.xml';      
        libxml_use_internal_errors(true);

        $exists = $this->XMLexists($tinymce);

        if( $exists )
        {
            $dom->load($tinymce);
            $vTag = $dom->getElementsByTagName('version');

            foreach ($vTag as $tag) 
            {
                return $tag->nodeValue;
            }
        }
    }

    // Check file exists using CURL
    private function XMLexists($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_exec($ch);
        $getinfo = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return $getinfo;
    }

}

Następnie wywołaj funkcję tak:

$version = new JoomlaVersions;
echo $version->getJoomlaVersion('http://joomla.org');

W swojej witrynie utworzyłem moduł jako narzędzie dla innych użytkowników:

Narzędzie do wykrywania wersji Joomla

Utworzyłem również repozytorium Github, jeśli chcesz je rozwidlić lub przesłać żądania ściągnięcia:

Wersja Joomla Detect Github Repo

W każdym razie, jak niektórzy z was wiedzą, nie jestem programistą zaplecza, więc w kodzie jest prawdopodobnie wiele ulepszeń. Jeśli masz inne rozwiązanie lub możesz zaktualizować to, co obecnie posiadam, opublikuj je jako nową odpowiedź.

Lodder
źródło
świetne rozwiązanie! W każdym razie oznacza to, że masz dostęp do pliku /administrator/manifests/files/joomla.xml. Nie zawsze tak jest. Druga wspomniana strona ma rozwiązanie, które wykrywa wersję tylko w GET strony /. Nie jest więc całkowicie jasne, jak to się robi. Dzienniki apache informują tylko o prostym przejściu do / domeny, nic więcej.
hkais
1
Do odpowiedzi dodałem link do repozytorium Github.
Lodder
Doskonała odpowiedź, która pomaga również odpowiedzieć na pytanie, które zadałem na joomla.stackexchange.com/q/182/120
Neil Robertson
@Joomjunk Wypróbowałem skrypt na twojej stronie, aby sprawdzić kilka stron Joomla. Nie działa. Odpowiedź jest pusta.
@Marc - Niektóre strony działają, inne nie ze względu na to, że host nie zezwala na uprawnienia do odczytu dla niektórych plików XML, tak działa moje wykrywanie wersji. Istnieje inna strona, która używa różnych metod wykrywania wersji, jednak nie jestem pewien, jak to robią. Jeśli uda mi się znaleźć bardziej odpowiedni sposób na zrobienie tego, zaimplementuję to.
Lodder
3

Jeśli interesują Cię tylko wersje stron, którymi zarządzasz , możesz utworzyć i zainstalować małą wtyczkę, która udostępnia wersję Joomla, otwierając na przykład adres URL wtyczki
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • Nie potrzebowałem go jeszcze, więc nie mam kodu. Ale na podstawie odpowiedzi Loddera możesz zobaczyć, jak czytać Joomla! plik mainfest /administrator/manifests/files/joomla.xmlw celu zwrócenia numeru wersji.

Uwaga głównie dla początkujących: configuredSecretjest jednym z klasycznych sposobów udostępniania publicznie widocznego kanału tylko autoryzowanym żądaniom. Jest powszechnie używany do łączenia dwóch systemów, jeśli nie ma lepszego sposobu ochrony połączenia integrującego.

miroxlav
źródło
administrator / manifests / files / joomla.xml jest odpowiedzią, przynajmniej dla joomla 2.5
Lynob
@Lynob - jasne. W tym przypadku OP chciałby mieć lekką aplikację, która otrzymuje tylko jeden numer, a nie cały plik XML. Twoje rozwiązanie jest odpowiednie dla grubego klienta, moje rozwiązanie dla cienkiego klienta.
miroxlav
0

Dodam to jako osobną odpowiedź, ponieważ nie jest to dokładnie rozwiązanie kodu.

Opracowałem rozszerzenie Firefox, które wykonuje 2 żądania XHR. Pierwszy do strony Joomla API, aby uzyskać najnowszą wersję, drugi do joomla.xmlpliku aktualnie oglądanej strony. Następnie porówna dwie wersje i console.log()wynik.

URL: https://github.com/C-Lodder/joomla-update-checker

Lodder
źródło