¿Cómo obtener la versión de Joomla por http?

11

He visto capturas de pantalla de una solución, allí la versión de Joomla se detecta solo accediendo a la página a través de http.

Por ejemplo, la solución muestra los 3 dígitos de una versión de Joomla. por ejemplo, 2.5.28, o 1.0.xy así sucesivamente solo accediendo a la página web a través de http.

Quiero crear una pequeña aplicación para estar informado sobre la versión instalada en el servidor. Como no siempre tengo acceso completo al almacenamiento FTP, me gustaría saber cómo puedo extraer la versión de Joomla de un simple HTTP GET.

hkais
fuente
¿Se refiere a su propio sitio web o a un sitio web externo? Si es externo, entonces esto no se puede hacer
Lodder
@Farahmand: los enlaces proporcionados no serán de ayuda para la versión exacta, como 2.5.28 . Solo números de versión principal como 1.5 y 2.5
Lodder
@Lodder: compruebe este enlace: whitefirdesign.com/tools/joomla-version-check.html que muestra la versión exacta.
Farahmand
@Lodder: revisé el enlace y funciona para las versiones de Joomla 2.5, pero no funciona para algunas versiones de Joomla 3.
Farahmand

Respuestas:

15

Ok, esto es lo que estaba escribiendo ayer.

Solo para Joomla 2.5 y 3.x

  1. Compruebe si http://falta el prefijo de la URL. Si es así, entonces lo agrega. Nótese que en este caso he no tenido https://en cuenta.
  2. Luego intenta obtener el archivo de manifiesto de Joomla y comprueba si existe / es legible.
  3. Si existe, obtiene el valor de la <version>etiqueta.
  4. Si el archivo XML no es legible, he escrito una copia de respaldo para obtener la versión TinyMCE. Nuevamente, intentará leer el valor de la <version>etiqueta.
  5. De aquí en adelante, pasé bastante tiempo revisando las notas de lanzamiento de cada versión de Joomla para ver qué versiones tienen una actualización de TinyMCE. Los que lo hicieron, agregué al switchbloque más propio en el código. Este enfoque no dará la versión exacta aparte de 2 de ellos, pero dará un promedio. Estaba pensando en detectar la versión jQuery, pero luego me di cuenta de que muchas personas actualizan la versión principal a la última, lo que haría que los resultados fueran inexactos.
  6. Si no se puede encontrar la versión de TinyMCE (básicamente un sitio que no es de Joomla), la función volverá Unknown.

Nota: Esta secuencia de comandos utiliza, CURLasí que asegúrese de que esté habilitada en su servidor.


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

}

Luego llame a la función así:

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

He creado un módulo en mi sitio web como herramienta para otros usuarios:

Herramienta de detección de versiones de Joomla

También he creado un repositorio de Github si desea bifurcarlo o enviar solicitudes de extracción:

Versión Joomla Detect Github Repo

De todos modos, como algunos de ustedes saben, no soy un desarrollador de back-end, por lo que probablemente hay muchas mejoras que se pueden hacer en el código. Si tiene otra solución o puede actualizar lo que tengo actualmente, asegúrese de publicarlo como una nueva respuesta.

Lodder
fuente
gran solución! De todos modos, implica que tiene acceso al archivo /administrator/manifests/files/joomla.xml. Entonces este no es siempre el caso. La otra página mencionada tiene una solución, que detecta la versión solo en el GET de la página /. Por lo tanto, no está completamente claro cómo se hace esto. Los registros de apache indican solo un simple acceso al dominio, nada más.
hkais
1
He agregado un enlace de repositorio de Github a la respuesta.
Lodder
Excelente respuesta que también ayuda a responder la pregunta que hice en joomla.stackexchange.com/q/182/120
Neil Robertson
@Joomjunk Probé el script en su sitio para verificar varios sitios de Joomla. No funciona. La respuesta está vacía.
@Marc: algunos sitios funcionan, otros no debido a que el host no permite permisos de lectura para ciertos archivos XML, así es como funciona la detección de la versión. Hay otro sitio que utiliza diferentes métodos para detectar la versión, sin embargo, no estoy seguro de cómo lo hacen. Si puedo encontrar una forma más apropiada de hacerlo, lo implementaré.
Lodder
3

Si solo le interesan las versiones de los sitios que administra , puede crear e instalar un pequeño complemento que comparta la versión de Joomla abriendo la URL del complemento, por ejemplo
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • Todavía no lo necesitaba, así que no tengo el código. Pero según la respuesta de Lodder , ¡puedes ver cómo leer Joomla! archivo mainfest /administrator/manifests/files/joomla.xmlpara devolver el número de versión.

Tenga en cuenta principalmente para los novatos: configuredSecretes uno de los enfoques clásicos para compartir canales visibles públicamente solo para solicitudes autorizadas. Se usa comúnmente para conectar dos sistemas si no hay una mejor manera de proteger la conexión de integración.

miroxlav
fuente
administrador / manifiestos / archivos / joomla.xml es la respuesta, para joomla 2.5 al menos
Lynob
@Lynob: claro. En este caso, al OP le gustaría tener una aplicación liviana que reciba solo un número, no un archivo XML completo. Entonces, su solución es adecuada para clientes gordos, mi solución para clientes ligeros.
miroxlav
0

Agregaré esto como una respuesta separada, ya que no es exactamente una solución de código.

Desarrollé una extensión de Firefox que realiza 2 solicitudes XHR. El primero en el sitio API de Joomla para obtener la última versión, el otro en el joomla.xmlarchivo del sitio web actual que está viendo. Luego comparará las dos versiones y console.log()el resultado.

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

Lodder
fuente