Comment obtenir la version joomla par http?

11

J'ai vu des captures d'écran d'une solution, la version Joomla est 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 et ainsi de suite 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. Comme je n'ai pas toujours un accès complet au stockage FTP, je voudrais savoir comment extraire la version Joomla d'un simple HTTP GET.

hkais
la source
Faites-vous référence à votre propre site Web ou à un site Web externe. Si externe, cela ne peut pas être fait
Lodder
@Farahmand - Les liens fournis ne seront d'aucune aide pour la version exacte, telle que 2.5.28 . Seuls les numéros de version principaux tels que 1.5 et 2.5
Lodder
@Lodder - Veuillez vérifier ce lien: whitefirdesign.com/tools/joomla-version-check.html qui montre la version exacte.
Farahmand
@Lodder - J'ai vérifié le lien et cela fonctionne pour les versions de Joomla 2.5 mais ne fonctionne pas pour certaines versions de Joomla 3.
Farahmand

Réponses:

15

Ok, c'est ce que j'écrivais hier.

Pour Joomla 2.5 et 3.x uniquement

  1. Vérifiez si le http://préfixe manque dans l'URL. Si c'est le cas, il l'ajoute. Notez que dans ce cas je n'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 de la <version>balise.
  4. Si le fichier XML n'est pas lisible, j'ai écrit une solution de rechange pour obtenir la version TinyMCE. Encore une fois, il essaiera de lire la valeur de la <version>balise.
  5. À partir de là, j'ai passé assez de temps à parcourir les notes de publication de chaque version de Joomla pour voir quelles versions ont une mise à jour TinyMCE. Ceux qui l'ont fait, j'ai ajouté au switchbloc plus propre dans le code. Cette approche ne donnera pas la version exacte en dehors de 2 d'entre eux, mais elle donnera une moyenne. Je pensais à détecter la version jQuery, mais j'ai réalisé que beaucoup de gens mettaient à jour la version principale vers la dernière, ce qui rendrait les résultats inexacts.
  6. Si la version de TinyMCE est introuvable (donc en gros un site non Joomla), alors la fonction reviendra Unknown.

Remarque: Ce script utilise CURLalors 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 fork ou soumettre des requêtes pull:

Joomla Version Detect Github Repo

Quoi qu'il en soit, comme certains d'entre vous le savent, je ne suis pas un développeur principal, donc il y a probablement beaucoup d'améliorations qui peuvent ê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 en tant que nouvelle réponse.

Lodder
la source
bonne solution! Quoi qu'il en soit, cela implique que vous avez accès au fichier /administrator/manifests/files/joomla.xml. Ce n'est donc pas toujours le cas. L'autre page mentionnée a une solution, qui détecte la version uniquement sur le GET de la page /. On ne sait donc pas très bien comment procéder. Les journaux apache ne disent qu'un simple accès au / du domaine, rien de plus.
hkais
1
J'ai ajouté un lien vers le référentiel Github à la réponse.
Lodder
Excellente réponse qui aide également à répondre à la question que j'ai posée sur joomla.stackexchange.com/q/182/120
Neil Robertson
@Joomjunk J'ai essayé le script sur votre site pour vérifier plusieurs sites Joomla. Ca ne fonctionne pas. La réponse est vide.
@Marc - Certains sites fonctionnent, d'autres non car l'hôte n'autorise pas les autorisations de lecture pour certains fichiers XML, c'est ainsi que ma détection de version fonctionne. Il existe un autre site qui utilise différentes méthodes pour détecter la version, mais je ne sais pas comment ils procèdent. Si je peux trouver un moyen plus approprié de le faire, je le mettrai en œuvre.
Lodder
3

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

  • Je n'en avais pas encore besoin donc je n'ai pas le code. Mais d'après la réponse de Lodder , vous pouvez voir comment lire Joomla! fichier mainfest /administrator/manifests/files/joomla.xmlafin de renvoyer le numéro de version.

Remarque surtout pour les débutants: configuredSecretest l'une des approches classiques pour partager le canal visible publiquement uniquement aux demandes autorisées. Il est couramment utilisé pour connecter deux systèmes s'il n'y a pas de meilleur moyen de protéger la connexion d'intégration.

miroxlav
la source
administrateur / manifestes / fichiers / joomla.xml est la réponse, pour joomla 2.5 au moins
Lynob
@Lynob - bien sûr. Dans ce cas, l'OP souhaite avoir une application légère qui ne reçoit qu'un seul numéro, pas un fichier XML entier. Votre solution convient donc aux gros clients, ma solution aux clients légers.
miroxlav
0

Je vais ajouter cela comme une réponse distincte, 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 joomla.xmlfichier 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

Lodder
la source