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

11

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

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

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

hkais
источник
Вы имеете в виду свой собственный сайт или внешний сайт? Если внешний, то это не может быть сделано
Lodder
1
Посетите joomla.stackexchange.com/questions/182/how-can-i-programatics-determine-the-joomla-version-of-a-website-on-which-ih и посмотрите ответ @BrianPeat.
Фараманд
@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это один из классических подходов, чтобы разделить публично видимый канал только для авторизованных запросов. Обычно он используется для соединения двух систем, если нет лучшего способа защиты интегрированного соединения.

miroxlav
источник
Администратор / 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

Лоддер
источник