Как получить версию Joomla по http?


11

Я видел скриншоты решения, где версия Joomla обнаруживается только при доступе к странице через http.

Например, решение отображало все 3 цифры версии Joomla. например, 2.5.28 или 1.0.x и т. д., открывая веб-страницу только через http.

Я хочу создать небольшое приложение, чтобы получать информацию о версии, установленной на сервере. Поскольку у меня не всегда полный доступ к FTP-хранилищу, я хотел бы знать, как извлечь версию Joomla из простого HTTP GET.


Вы имеете в виду свой собственный сайт или внешний сайт? Если внешний, то это не может быть сделано
Lodder


@Farahmand - Предоставленные ссылки не помогут в точной версии, такой как 2.5.28 . Только основные номера версий, такие как 1.5 и 2.5
Lodder

@Lodder - проверьте эту ссылку: whitefirdesign.com/tools/joomla-version-check.html, которая показывает точную версию.
Фараманд

@Lodder - я проверил ссылку, и она работает для версий Joomla 2.5, но не работает для некоторых версий Joomla 3.
Фараманд

Ответы:


15

Итак, это то, что я писал вчера.

Только для Joomla 2.5 и 3.x

  1. Проверьте, отсутствует ли http://префикс в URL. Если это так, то он добавляет это. Обратите внимание, что в этом случае я не учел https://.
  2. Затем он пытается получить файл манифеста Joomla и проверяет, существует ли / доступен ли для чтения.
  3. Если он существует, он получает значение из <version>тега.
  4. Если файл XML недоступен для чтения, я написал запасной вариант, чтобы получить версию TinyMCE. Опять же, он будет пытаться прочитать значение из <version>тега.
  5. С этого момента я потратил довольно много времени, просматривая заметки о выпуске для каждой версии Joomla, чтобы увидеть, какие версии имеют обновление TinyMCE. Те, которые сделали, я добавил в switchблок далее собственного в коде. Этот подход не даст точную версию, кроме двух из них, но даст среднюю. Я думал об обнаружении версии jQuery, но потом понял, что многие обновляют базовую версию до последней, что делает результаты неточными.
  6. Если версия TinyMCE не может быть найдена (так что, в основном, это сайт не Joomla), функция вернется Unknown.

Примечание: этот скрипт использует, CURLпоэтому убедитесь, что он включен на вашем сервере.


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

}

Затем вызовите функцию так:

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

Я создал модуль на своем веб-сайте в качестве инструмента для других пользователей:

Joomla Version Detection Tool

Я также создал Github-репозиторий, если вы хотите его разветвить или отправить запросы на извлечение:

Версия Joomla Detect Github Repo

В любом случае, как некоторые из вас знают, я не бэкэнд-разработчик, поэтому, вероятно, в код можно внести множество улучшений. Если у вас есть другое решение или вы можете обновить то, что у меня есть, обязательно опубликуйте его как новый ответ.


отличное решение! В любом случае это означает, что у вас есть доступ к файлу /administrator/manifests/files/joomla.xml. Так что это не всегда так. Другая упомянутая страница имеет решение, которое определяет версию только в GET страницы /. Так что совершенно неясно, как это делается. Логи apache сообщают только о простом доступе к домену и ничего более.
hkais

1
Я добавил в ответ ссылку на репозиторий Github.
Лоддер

Отличный ответ, который также помогает ответить на вопрос, который я задал на joomla.stackexchange.com/q/182/120
Нил Робертсон,

@Joomjunk Я попробовал скрипт на вашем сайте, чтобы проверить несколько сайтов Joomla. Не работает. Ответ пуст.

@Marc - некоторые сайты работают, другие - нет, так как хост не разрешает чтение для определенных файлов XML, как работает определение версий. Есть еще один сайт, который использует разные методы для определения версии, однако я не уверен, как они это делают. Если я смогу найти более подходящий способ сделать это, я его реализую.
Лоддер

3

Если вас интересуют только версии сайтов, которыми вы управляете , то вы можете создать и установить небольшой плагин, который использует версию Joomla, открыв, например, URL плагина.
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • Мне это пока не нужно, поэтому у меня нет кода. Но, основываясь на ответе Лоддера , вы можете увидеть, как читать Joomla! файл mainfest /administrator/manifests/files/joomla.xmlдля возврата номера версии.

Обратите внимание, в основном для новичков: configuredSecretэто один из классических подходов, чтобы разделить публично видимый канал только для авторизованных запросов. Обычно он используется для соединения двух систем, если нет лучшего способа защиты интегрированного соединения.


Администратор / manifes / files / joomla.xml - это ответ, по крайней мере, для Joomla 2.5
Lynob

@Lynob - конечно. В этом случае OP хотел бы иметь легковесное приложение, которое получает только одно число, а не весь XML-файл. Таким образом, ваше решение подходит для толстых клиентов, мое решение для тонких клиентов.
Miroxlav

0

Я добавлю это как отдельный ответ, так как это не совсем решение кода.

Я разработал расширение Firefox, которое выполняет 2 XHR-запроса. Первый - на сайт API Joomla, чтобы получить последнюю версию, другой - на joomla.xmlфайл текущего веб-сайта, который вы просматриваете. Затем он сравнит две версии и console.log()результат.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.