วิธีการรับรุ่น 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ที่แสดงรุ่นที่แน่นอน
Farahmand

@Lodder - ฉันตรวจสอบลิงก์และใช้งานได้กับรุ่น Joomla 2.5 แต่ไม่สามารถใช้กับ Joomla 3 รุ่นบางรุ่นได้
Farahmand

คำตอบ:


15

ตกลงนี่คือสิ่งที่ฉันเขียนเมื่อวานนี้

สำหรับ Joomla 2.5 และ 3.x เท่านั้น

  1. ตรวจสอบว่าhttp://คำนำหน้าหายไปจาก URL ถ้าเป็นเช่นนั้นมันจะเพิ่ม โปรดทราบว่าในกรณีนี้ฉันยังไม่ได้https://พิจารณา
  2. จากนั้นจะพยายามรับไฟล์รายการ Joomla และตรวจสอบว่ามีอยู่ / อ่านได้หรือไม่
  3. หากมีอยู่แล้วจะได้รับค่าจาก<version>แท็ก
  4. หากไฟล์ XML ไม่สามารถอ่านได้ฉันได้เขียนทางเลือกเพื่อรับเวอร์ชั่น TinyMCE อีกครั้งมันจะพยายามอ่านค่าจาก<version>แท็ก
  5. จากนี้ไปฉันใช้เวลาค่อนข้างนานในการอ่านบันทึกย่อของรุ่น Joomla แต่ละรุ่นเพื่อดูว่ารุ่นใดมีการอัพเดต TinyMCE ที่ฉันทำฉันเพิ่มลงในswitchบล็อกของตัวเองต่อไปในรหัส วิธีการนี้จะไม่ให้รุ่นที่แน่นอนนอกเหนือจาก 2 วิธี แต่จะให้ค่าเฉลี่ย ฉันกำลังคิดที่จะตรวจจับเวอร์ชัน 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

ฉันได้สร้างที่เก็บ Github ด้วยหากคุณต้องการแยกหรือส่งคำขอดึง:

Joomla Version ตรวจจับ Github Repo

อย่างไรก็ตามอย่างที่บางคนรู้ว่าฉันไม่ใช่นักพัฒนาแบ็กเอนด์ดังนั้นอาจมีการปรับปรุงมากมายที่สามารถทำกับรหัสได้ หากคุณมีวิธีแก้ไขปัญหาอื่นหรือสามารถอัปเดตสิ่งที่ฉันมีอยู่ในปัจจุบันโปรดโพสต์เป็นคำตอบใหม่


ทางออกที่ดี! อย่างไรก็ตามก็หมายความว่าคุณสามารถเข้าถึงไฟล์ /administrator/manifests/files/joomla.xml ดังนั้นนี่ไม่ใช่กรณีเสมอไป หน้าอื่น ๆ ที่กล่าวถึงมีวิธีแก้ปัญหาซึ่งตรวจพบรุ่นเฉพาะใน GET ของ / หน้า ดังนั้นจึงไม่ชัดเจนว่าจะทำอย่างไร บันทึก apache บอกเพียงแค่การเข้าถึงโดเมน / อย่างง่ายไม่มีอะไรเพิ่มเติม
hkais

1
ฉันได้เพิ่มลิงก์ที่เก็บ Github ไปยังคำตอบแล้ว
บ้านพัก

คำตอบที่ยอดเยี่ยมซึ่งช่วยตอบคำถามที่ฉันถามที่joomla.stackexchange.com/q/182/120
Neil Robertson

@Joomjunkฉันลองใช้สคริปต์ในเว็บไซต์ของคุณเพื่อตรวจสอบเว็บไซต์ Joomla หลายรายการ ไม่ทำงาน. การตอบสนองว่างเปล่า

@Marc - บางไซต์ทำงานได้ แต่บางไซต์จะไม่เนื่องจากโฮสต์ไม่อนุญาตให้อ่านไฟล์ XML บางไฟล์ซึ่งเป็นวิธีการตรวจสอบเวอร์ชันของฉัน มีไซต์อื่นที่ใช้วิธีการต่าง ๆ ในการตรวจสอบเวอร์ชัน แต่ฉันไม่แน่ใจว่าจะทำอย่างไร หากฉันสามารถหาวิธีที่เหมาะสมกว่าในการทำสิ่งนี้ฉันจะใช้มัน
Lodder

3

หากคุณสนใจเฉพาะเว็บไซต์ที่คุณจัดการเท่านั้นคุณสามารถสร้างและติดตั้งปลั๊กอินขนาดเล็กที่ใช้รุ่น Joomla ได้ด้วยการเปิด URL ปลั๊กอินเช่น
http://example.com/plugins/getversion/getversion.php?configuredSecret

  • ฉันยังไม่ต้องการมันเลยยังไม่มีรหัส แต่จากคำตอบของ Lodderคุณสามารถดูวิธีการอ่านJoomla! ไฟล์ mainfest /administrator/manifests/files/joomla.xmlเพื่อส่งคืนหมายเลขเวอร์ชัน

หมายเหตุส่วนใหญ่สำหรับมือใหม่: configuredSecretเป็นหนึ่งในวิธีการแบบคลาสสิกในการแบ่งปันช่องทางสาธารณะที่มองเห็นได้เฉพาะกับคำขอที่ได้รับอนุญาต โดยทั่วไปจะใช้สำหรับเชื่อมต่อสองระบบหากไม่มีวิธีที่ดีกว่าในการป้องกันการเชื่อมต่อแบบรวม


ผู้ดูแลระบบ / รายชื่อ / ไฟล์ / joomla.xml เป็นคำตอบสำหรับ joomla 2.5 อย่างน้อย
Lynob

@Lynob - แน่นอน ในกรณีนี้ OP ต้องการแอปพลิเคชั่นที่มีน้ำหนักเบาซึ่งได้รับหมายเลขเดียวเท่านั้นไม่ใช่ไฟล์ XML ทั้งหมด ดังนั้นโซลูชันของคุณเหมาะสำหรับลูกค้าที่อ้วนวิธีแก้ปัญหาสำหรับลูกค้าที่ผอม
miroxlav

0

ฉันจะเพิ่มคำตอบนี้เป็นคำตอบแยกต่างหากเนื่องจากมันไม่ใช่โซลูชันรหัส

ฉันได้พัฒนาส่วนขยายของ Firefox ที่ดำเนินการตามคำขอ XHR 2 รายการ คนแรกที่เข้าสู่เว็บไซต์ Joomla API เพื่อรับรุ่นล่าสุดส่วนที่เหลือjoomla.xmlในเว็บไซต์ปัจจุบันที่คุณกำลังดู จากนั้นจะเปรียบเทียบทั้งสองเวอร์ชันและconsole.log()ผลลัพธ์

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.