web-dev-qa-db-fra.com

Comment obtenir la version de joomla par http?

J'ai vu des captures d'écran d'une solution, la version de Joomla étant détectée en accédant uniquement à la page via http.

Par exemple. la solution affiche les 3 chiffres d’une version de Joomla. par exemple. 2.5.28, ou 1.0.x, etc. en accédant uniquement à la page Web via http.

Je souhaite créer une petite application pour être informé de la version installée sur le serveur. Étant donné que je n'ai pas toujours un accès complet au stockage FTP, j'aimerais savoir comment extraire la version de Joomla à partir d'un simple HTTP GET.

11
hkais

Ok, voici ce que j’écrivais hier.

Pour Joomla 2.5 et 3.x uniquement

  1. Vérifiez si le http:// Le préfixe _ est manquant dans l'URL. Si c'est le cas, alors il l'ajoute. Notez que dans ce cas j'ai pas pris https:// en considération.
  2. Il essaie ensuite d’obtenir le fichier manifeste Joomla et vérifie s’il existe/est lisible.
  3. S'il existe, il obtient la valeur du <version> tag.
  4. Si le fichier XML n'est pas lisible, j'ai écrit une solution de repli pour obtenir la version de TinyMCE. Encore une fois, il va essayer de lire la valeur de la <version> tag.
  5. À partir de là, j'ai passé pas mal de temps à parcourir les notes de publication de chaque version de Joomla pour voir quelles versions comportaient une mise à jour de TinyMCE. Ceux qui l'ont fait, j'ai ajouté au bloc switch plus en plus propre dans le code. Cette approche ne donnera pas la version exacte à part 2, mais elle donnera une moyenne. Je pensais à la détection de la version de jQuery, mais je me suis rendu compte que beaucoup de personnes mettaient à jour la version principale à la dernière, ce qui rendrait les résultats inexacts.
  6. Si la version de TinyMCE ne peut pas être trouvée (donc, fondamentalement, un site non Joomla), alors la fonction retournera Unknown.

Remarque: Ce script utilise CURL, assurez-vous qu'il est activé sur votre serveur.


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

}

Appelez ensuite la fonction comme suit:

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

J'ai créé un module sur mon site Web en tant qu'outil pour les autres utilisateurs:

Outil de détection de version de Joomla

J'ai également créé un référentiel Github si vous souhaitez le bifurquer ou soumettre des demandes d'extraction:

Joomla Version Detect Github Repo

Quoi qu'il en soit, comme certains d'entre vous le savent, je ne suis pas un développeur back-end, de nombreuses améliorations peuvent donc être apportées au code. Si vous avez une autre solution ou pouvez mettre à jour ce que j'ai actuellement, assurez-vous de la poster comme nouvelle réponse.

15
Lodder

Si vous êtes intéressé uniquement par les versions de sites vous gérez, vous pouvez créer et installer un petit plugin qui partage Version Joomla en ouvrant l'URL du plugin, par exemple
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • Je n'en avais pas encore besoin alors je n'ai pas le code. Mais sur la base de réponse de Lodder , vous pouvez voir comment lire Joomla ! fichier mainfest /administrator/manifests/files/joomla.xml afin de renvoyer le numéro de version.

Note principalement pour les débutants: configuredSecret est l’une des approches classiques pour partager le canal visible publiquement uniquement avec les requêtes autorisées. Il est couramment utilisé pour connecter deux systèmes s'il n'existe pas de meilleur moyen de protéger la connexion d'intégration.

3
miroxlav

J'ajouterai ceci en tant que réponse séparée, car ce n'est pas exactement une solution de code.

J'ai développé une extension Firefox qui effectue 2 requêtes XHR. Le premier sur le site de l'API Joomla pour obtenir la dernière version, l'autre sur le fichier joomla.xml Du site Web actuel que vous consultez. Il comparera ensuite les deux versions et console.log() le résultat.

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

0
Lodder