Wie bekomme ich eine Joomla-Version von http?

11

Ich habe Screenshots einer Lösung gesehen, dort wird die Joomla-Version erkannt, indem nur über http auf die Seite zugegriffen wird.

ZB zeigte die Lösung alle 3 Ziffern einer Version von Joomla an. zB 2.5.28 oder 1.0.x usw., indem Sie nur über http auf die Webseite zugreifen.

Ich möchte eine kleine Anwendung erstellen, um über die auf dem Server installierte Version informiert zu werden. Da ich nicht immer vollen Zugriff auf den FTP-Speicher habe, möchte ich wissen, wie ich die Joomla-Version aus einem einfachen HTTP-GET extrahieren kann.

hkais
quelle
Verweisen Sie auf Ihre eigene Website oder eine externe Website? Wenn extern, dann kann dies nicht getan werden
Lodder
@Farahmand - Die bereitgestellten Links sind keine Hilfe für die genaue Version, wie z. B. 2.5.28 . Nur Hauptversionsnummern wie 1.5 und 2.5
Lodder
@Lodder - Bitte überprüfen Sie diesen Link: whitefirdesign.com/tools/joomla-version-check.html , der die genaue Version anzeigt .
Farahmand
@Lodder - Ich habe den Link überprüft und er funktioniert für Joomla 2.5-Versionen, aber für einige Joomla 3-Versionen nicht.
Farahmand

Antworten:

15

Ok, das habe ich gestern geschrieben.

Nur für Joomla 2.5 und 3.x.

  1. Überprüfen Sie, ob das http://Präfix in der URL fehlt. Wenn dies der Fall ist, wird es hinzugefügt. Beachten Sie, dass in diesem Fall habe ich nicht genommen https://in Betracht.
  2. Anschließend wird versucht, die Joomla-Manifestdatei abzurufen, und es wird geprüft, ob sie vorhanden / lesbar ist.
  3. Wenn es existiert, erhält es den Wert vom <version>Tag.
  4. Wenn die XML-Datei nicht lesbar ist, habe ich einen Fallback geschrieben, um die TinyMCE-Version zu erhalten. Wieder wird versucht, den Wert aus dem <version>Tag zu lesen .
  5. Von hier an habe ich ziemlich lange die Versionshinweise für jede Joomla-Version durchgesehen, um festzustellen, welche Versionen ein TinyMCE-Update enthalten. Diejenigen, die das taten, fügte ich dem switchBlock hinzu, der im Code weiter eigen ist. Dieser Ansatz gibt nicht die genaue Version außer 2 von ihnen, aber es gibt einen Durchschnitt. Ich habe darüber nachgedacht, die jQuery-Version zu erkennen, aber dann festgestellt, dass viele Leute die Kernversion auf die neueste Version aktualisieren, wodurch die Ergebnisse ungenau werden.
  6. Wenn die TinyMCE-Version nicht gefunden werden kann (also im Grunde eine Nicht-Joomla-Site), wird die Funktion zurückgegeben Unknown.

Hinweis: Dieses Skript verwendet CURL, stellen Sie also sicher, dass es auf Ihrem Server aktiviert ist.


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;
    }

}

Rufen Sie dann die Funktion folgendermaßen auf:

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

Ich habe auf meiner Website ein Modul als Tool für andere Benutzer erstellt:

Joomla Version Detection Tool

Ich habe auch ein Github-Repository erstellt, wenn Sie es teilen oder Pull-Anforderungen senden möchten:

Joomla Version Detect Github Repo

Wie einige von Ihnen wissen, bin ich kein Backend-Entwickler, daher gibt es wahrscheinlich viele Verbesserungen, die am Code vorgenommen werden können. Wenn Sie eine andere Lösung haben oder aktualisieren können, was ich derzeit habe, stellen Sie sicher, dass Sie diese als neue Antwort veröffentlichen.

Lodder
quelle
tolle Lösung! Auf jeden Fall bedeutet dies, dass Sie Zugriff auf die Datei /administrator/manifests/files/joomla.xml haben. Das ist also nicht immer der Fall. Die andere erwähnte Seite hat eine Lösung, die die Version nur auf dem GET der / Seite erkennt. Es ist also völlig unklar, wie dies gemacht wird. Die Apache-Protokolle geben nur einen einfachen Zugang zur / der Domain an, nichts weiter.
Hkais
1
Ich habe der Antwort einen Github-Repository-Link hinzugefügt.
Lodder
Ausgezeichnete Antwort, die auch bei der Beantwortung der Frage hilft, die ich unter joomla.stackexchange.com/q/182/120 gestellt habe
Neil Robertson
@Joomjunk Ich habe versucht, mit dem Skript auf Ihrer Site mehrere Joomla-Sites zu überprüfen. Funktioniert nicht. Die Antwort ist leer.
@Marc - Einige Websites funktionieren, andere nicht, da der Host keine Leseberechtigungen für bestimmte XML-Dateien zulässt. So funktioniert die Versionserkennung. Es gibt eine andere Site, die unterschiedliche Methoden zum Erkennen der Version verwendet. Ich bin mir jedoch nicht sicher, wie sie dies tun. Wenn ich einen angemesseneren Weg finden kann, werde ich ihn implementieren.
Lodder
3

Wenn Sie nur an Versionen von Websites interessiert sind, die Sie verwalten , können Sie ein kleines Plugin erstellen und installieren, das die Joomla-Version gemeinsam nutzt, indem Sie beispielsweise die Plugin-URL öffnen
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • Ich brauchte es noch nicht, also habe ich den Code nicht. Aber basierend auf Lodders Antwort können Sie sehen, wie man Joomla liest ! Hauptfestdatei /administrator/manifests/files/joomla.xml, um die Versionsnummer zurückzugeben.

Hinweis vor allem für Neulinge: Dies configuredSecretist einer der klassischen Ansätze, um öffentlich sichtbare Kanäle nur für autorisierte Anfragen freizugeben. Es wird üblicherweise zum Verbinden zweier Systeme verwendet, wenn es keinen besseren Weg gibt, die integrierende Verbindung zu schützen.

miroxlav
quelle
Administrator / Manifeste / Dateien / joomla.xml ist die Antwort, für Joomla 2.5 mindestens
Lynob
@Lynob - sicher. In diesem Fall möchte das OP eine einfache Anwendung, die nur eine einzige Nummer und nicht die gesamte XML-Datei empfängt. Ihre Lösung ist also für Fat Client geeignet, meine Lösung für Thin Client.
Miroxlav
0

Ich werde dies als separate Antwort hinzufügen, da es sich nicht gerade um eine Codelösung handelt.

Ich habe eine Firefox-Erweiterung entwickelt, die 2 XHR-Anforderungen ausführt. Der erste auf der Joomla API-Site, um die neueste Version zu erhalten, der andere auf die joomla.xmlDatei der aktuellen Website, die Sie gerade anzeigen. Anschließend werden die beiden Versionen und console.log()das Ergebnis verglichen .

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

Lodder
quelle