diff --git a/.github/docker/WORKER.md b/.github/docker/WORKER.md index 63122a474d..94eacd202f 100644 --- a/.github/docker/WORKER.md +++ b/.github/docker/WORKER.md @@ -7,7 +7,7 @@ image, opt in with: docker.exe run -d --name evo-worker -p 8080:80 \ -e EVO_WORKER_MODE=1 \ -e EVO_WORKER_ORIGIN=http://localhost:8080 \ - ghcr.io/evolution-cms/evolution:3.5.x-php8.4-frankenphp + ghcr.io/evolution-cms/evolution:3.6.x-php8.4-frankenphp ``` This command requires an image built with the worker implementation. The site diff --git a/core/lang/az/global.php b/core/lang/az/global.php index 93f174219a..b578033e64 100644 --- a/core/lang/az/global.php +++ b/core/lang/az/global.php @@ -621,6 +621,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Bu o deməkdir ki, İcazəsiz səhifəniz adi istifadəçilər üçün əlçatan deyil və ya mövcud deyil. Bu, sonsuz dövriyyə probleminə və sayt jurnalında çoxlu xətalara səbəb ola bilər. Səhifəyə heç bir Vebistifadəçi Qrupu təyin edilmədiyinə əmin olun.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Sayt konfiqurasiya ayarlarında təyin olunmuş İcazəsiz səhifə dərc olunmayıb.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Bu o deməkdir ki, İcazəsiz səhifəniz ümumi istifadəçilər üçün əlçatan deyil. Səhifəni dərc edin və ya Alətlər > Konfiqurasiya menyusunda mövcud bir resursa təyin olunduğuna əmin olun.'; +$_lang["configcheck_htaccess_rules"] = 'Təhlükəsizlik xəbərdarlığı: .htaccess köhnəlib'; +$_lang["configcheck_htaccess_rules_msg"] = 'Bu saytın .htaccess faylında cari buraxılışın təhlükəsizlik qaydaları çatışmır və yeniləmələr bu faylı heç vaxt dəyişmir. Şəxsi fayllar, ehtiyat nüsxələr və ya assets altındakı PHP faylları əlçatan ola bilər. Onu bu buraxılışın ht.access faylı ilə müqayisə edin və çatışmayan qaydaları əlavə edin.'; $_lang["configcheck_validate_referer"] = 'Təhlükəsizlik xəbərdarlığı: HTTP Başlıq Doğrulaması'; $_lang["configcheck_validate_referer_msg"] = 'Konfiqurasiya ayarı HTTP_REFERER başlıqlarını yoxlayın? Söndürülüb. Onu aktiv etməyi tövsiyə edirik. Konfiqurasiya seçimlərinə keçin'; $_lang["configcheck_warning"] = 'Konfiqurasiya xəbərdarlığı:'; diff --git a/core/lang/be/global.php b/core/lang/be/global.php index 8c7479d8c4..c6860b1884 100644 --- a/core/lang/be/global.php +++ b/core/lang/be/global.php @@ -610,6 +610,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Гэта азначае, што ваша несанкцыянаваная старонка недаступная звычайным вэб-серферам або не існуе. Гэта можа прывесці да стану рэкурсіўнага цыклу і шматлікіх памылак у часопісах вашага сайта. Пераканайцеся, што да старонкі не прызначаныя групы вэб-карыстальнікаў.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Старонка «Несанкцыянаваная», вызначаная ў параметрах канфігурацыі сайта, не публікуецца.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Гэта азначае, што ваша несанкцыянаваная старонка недаступная для шырокай грамадскасці. Апублікуйце старонку або пераканайцеся, што яна прызначана існуючаму рэсурсу ў вашым дрэве сайта ў меню Інструменты > Канфігурацыя.'; +$_lang["configcheck_htaccess_rules"] = 'Папярэджанне бяспекі: файл .htaccess састарэў'; +$_lang["configcheck_htaccess_rules_msg"] = 'У файле .htaccess гэтага сайта няма правіл бяспекі бягучага выпуску, а абнаўленні ніколі не змяняюць гэты файл. Прыватныя файлы, рэзервовыя копіі або PHP-файлы ў assets могуць быць даступныя. Параўнайце яго з ht.access гэтага выпуску і дадайце правілы, якіх не хапае.'; $_lang["configcheck_validate_referer"] = 'Папярэджанне бяспекі: праверка загалоўка HTTP'; $_lang["configcheck_validate_referer_msg"] = 'Параметр канфігурацыі Праверыць загалоўкі HTTP_REFERER выключана? Мы рэкамендуем уключыць яго. Перайдзіце да параметраў канфігурацыі'; $_lang["configcheck_warning"] = 'Папярэджанне канфігурацыі:'; diff --git a/core/lang/bg/global.php b/core/lang/bg/global.php index 4572913b1f..318597ae69 100644 --- a/core/lang/bg/global.php +++ b/core/lang/bg/global.php @@ -158,6 +158,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Това означава, че страницата с Неоторизиран достъп не е достъпна за нормалните уеб потребители или не съществува. Това може да доведе до състояние на зацикляне и много грешки в логовете на сайта. Уверете се, че няма никакви Групи на уеб потребители, прикачени към страницата.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Страницата с Неоторизиран достъп, указана в конфигурацията на Вашия сайт не е публикувана или не съществува.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Това означава, че страницата с грешката не е публично достъпна. Публикувайте страницата и се уверете, че тя е прикачена към съществуващ документ в дървото на сайта като отидете на Инструменти Tools > в менюто Конфигурация.'; +$_lang["configcheck_htaccess_rules"] = 'Предупреждение за сигурността: .htaccess е остарял'; +$_lang["configcheck_htaccess_rules_msg"] = 'Във файла .htaccess на този сайт липсват правила за сигурност от текущата версия, а актуализациите никога не променят този файл. Лични файлове, архиви или PHP файлове в assets може да са достъпни. Сравнете го с ht.access от тази версия и добавете липсващите правила.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Грешки в конфигурацията:'; diff --git a/core/lang/cs/global.php b/core/lang/cs/global.php index 0e6902d2da..6b0eda2a89 100644 --- a/core/lang/cs/global.php +++ b/core/lang/cs/global.php @@ -158,6 +158,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'To znamená, že Stránka o neautorizovaném přístupu není dostupná normálním internetovým uživatelům nebo neexistuje. To může vést k mnoha chybovým zápisům do logů. Ujistěte se zda žádná ze skupin návštěvníků nemá přístup k této stránce.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Stránka o neautorizovaném přístupu definovaná v nastavení webu není publikována.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'To znamená, že vaše Stránka o neautorizovaném přístupu je nedostupná širolé veřejnosti. Publikujte stránku nebo se přesvědčte, že stránka existuje a je umístěna ve stromu dokumentů v Nástrojích > Konfigurační menu.'; +$_lang["configcheck_htaccess_rules"] = 'Bezpečnostní upozornění: .htaccess je zastaralý'; +$_lang["configcheck_htaccess_rules_msg"] = 'V souboru .htaccess tohoto webu chybí bezpečnostní pravidla aktuálního vydání a aktualizace tento soubor nikdy nemění. Soukromé soubory, zálohy nebo soubory PHP ve složce assets mohou být dostupné. Porovnejte jej se souborem ht.access tohoto vydání a doplňte chybějící pravidla.'; $_lang["configcheck_validate_referer"] = 'Bezpečnostní upozornění: Validace HTTP hlaviček'; $_lang["configcheck_validate_referer_msg"] = 'Nastavení Ověřit hlavičky HTTP_REFERER v konfiguraci systému je vypnuté. Doporučujeme jej zapnout. Přejít na konfiguraci systému
Nezobrazovat to znovu.'; $_lang["configcheck_warning"] = 'Výstraha konfigurace:'; diff --git a/core/lang/da/global.php b/core/lang/da/global.php index 3880b2d142..6856677327 100644 --- a/core/lang/da/global.php +++ b/core/lang/da/global.php @@ -159,6 +159,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Det betyder, at den "ikke autoriseret" side ikke kan tilgås af almindelige besøgende eller ikke eksisterer. Det kan medføre, at systemet omstiller uden at stoppe, og vil samtidigt resultere i, at websitets logfiler til sidst vil fylde for meget. Kontroller også at der ikke er tildelt nogle web bruger grupper til siden.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Den "ikke autoriseret" side, som er defineret i konfigurationsindstillingerne er ikke publiceret.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Det betyder at den "ikke autoriseret" side ikke kan tilgås af normale besøgende. Publicer siden eller tildel den til en eksisterende ressource under Værktøjer > Konfiguration.'; +$_lang["configcheck_htaccess_rules"] = 'Sikkerhedsadvarsel: .htaccess er forældet'; +$_lang["configcheck_htaccess_rules_msg"] = 'Filen .htaccess på dette websted mangler sikkerhedsregler fra den aktuelle version, og opdateringer ændrer aldrig denne fil. Private filer, backups eller PHP-filer under assets kan være tilgængelige. Sammenlign den med ht.access fra denne version, og tilføj de manglende regler.'; $_lang["configcheck_validate_referer"] = 'Sikkerhedsadvarsel: HTTP Header validering'; $_lang["configcheck_validate_referer_msg"] = 'Konfigurationsindstillingen for Valider HTTP_REFERER headers? er slået fra. Det anbefales at slå den til. Gå til konfigurationsindstillingerne'; $_lang["configcheck_warning"] = 'Konfigurationsadvarsel:'; diff --git a/core/lang/de/global.php b/core/lang/de/global.php index 1679972ccd..16352f0921 100644 --- a/core/lang/de/global.php +++ b/core/lang/de/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Die Seite für unautorisierte Zugriffe ist für normale Besucher nicht abrufbar oder existiert nicht. Dies kann zu einer Endlosschleife und vielen Fehlermeldungen in Ihren Webserver-Statistiken führen. Stellen Sie sicher, dass der Seite keine Benutzergruppen zugeordnet sind.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Die Seite für unautorisierte Zugriffe aus den Einstellungen Ihrer Konfiguration ist nicht veröffentlicht.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Die Seite unautorisierte Zugriffe ist der Allgemeinheit nicht zugänglich. Veröffentlichen Sie die Seite oder stellen Sie sicher, dass in der Konfiguration eine vorhandene Seite aus dem Ressourcen-Baum ausgewählt ist.'; +$_lang["configcheck_htaccess_rules"] = 'Sicherheitshinweis: .htaccess ist veraltet'; +$_lang["configcheck_htaccess_rules_msg"] = 'In der Datei .htaccess dieser Website fehlen Sicherheitsregeln der aktuellen Version, und Updates ändern diese Datei nie. Private Dateien, Backups oder PHP-Dateien unter assets könnten erreichbar sein. Vergleichen Sie sie mit ht.access dieser Version und ergänzen Sie die fehlenden Regeln.'; $_lang["configcheck_validate_referer"] = 'Sicherheitshinweis: HTTP Header Validierung'; $_lang["configcheck_validate_referer_msg"] = 'Die Konfigurationseinstellung HTTP_REFERER Header validieren? ist AUSGESCHALTET. Wir empfehlen, diese anzuschalten. Zu den Einstellungen'; $_lang["configcheck_warning"] = 'Konfigurationswarnung:'; diff --git a/core/lang/en/global.php b/core/lang/en/global.php index 8edd5933d5..934844e250 100644 --- a/core/lang/en/global.php +++ b/core/lang/en/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'This means that your Unauthorized page is not accessible to normal web surfers or does not exist. This can lead to a recursive looping condition and many errors in your site logs. Make sure there are no Webuser Groups assigned to the page.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'The Unauthorized page defined in the site configuration settings is not published.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'This means that your Unauthorized page is inaccessible to the general public. Publish the page or make sure it is assigned to an existing Resource in your Site Tree in the Tools > Configuration menu.'; +$_lang["configcheck_htaccess_rules"] = 'Security Warning: .htaccess is out of date'; +$_lang["configcheck_htaccess_rules_msg"] = 'The .htaccess file of this site lacks security rules of the current release, and updates never change this file. Private files, backups or PHP files under assets may be reachable. Compare it with ht.access of this release and add the missing rules.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Configuration warning: '; diff --git a/core/lang/es/global.php b/core/lang/es/global.php index 0149eea5a6..986cb7d1a5 100644 --- a/core/lang/es/global.php +++ b/core/lang/es/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Esto significa que tu página de acceso no autorizado no es accesible para navegantes normales de internet o que no existe. Esto puede provocar un estado de círculo cerrado y varios errores en la bitácora de tu sitio. Asegúrate de que no haya grupos de usuarios web asignados a la página.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'La página de acceso no autorizado definida en la configuración del sitio no está publicada.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Esto significa que tu página de acceso no autorizado no es accesible para el público en general. Publica la página o asegúrate de que esté asignada a un documento existente en el árbol de tu sitio en en menu Herramientas > Configuración.'; +$_lang["configcheck_htaccess_rules"] = 'Advertencia de seguridad: .htaccess está desactualizado'; +$_lang["configcheck_htaccess_rules_msg"] = 'Al archivo .htaccess de este sitio le faltan reglas de seguridad de la versión actual, y las actualizaciones nunca modifican este archivo. Los archivos privados, los respaldos o los archivos PHP dentro de assets podrían ser accesibles. Compáralo con ht.access de esta versión y añade las reglas que faltan.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Advertencia de configuración:'; diff --git a/core/lang/et/global.php b/core/lang/et/global.php index 53aeaf0953..f94425e2a2 100644 --- a/core/lang/et/global.php +++ b/core/lang/et/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'See tähendab, et juurdepääsu keelamise leht ei ole tavalistele veebikülastajatele kättesaadav või seda pole olemas. See võib põhjustada lõputu tsükli ja palju vigu saidi logides. Veendu, et lehele pole määratud veebikasutajate rühmi.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Saidi seadistuses määratud juurdepääsu keelamise leht ei ole avaldatud.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'See tähendab, et juurdepääsu keelamise leht ei ole avalikkusele kättesaadav. Avalda leht või veendu menüüs Tööriistad > Seadistus, et sellele on määratud saidipuus olemasolev ressurss.'; +$_lang["configcheck_htaccess_rules"] = 'Turvahoiatus: .htaccess on aegunud'; +$_lang["configcheck_htaccess_rules_msg"] = 'Selle saidi failist .htaccess puuduvad praeguse väljalaske turvareeglid ja uuendused seda faili kunagi ei muuda. Privaatsed failid, varukoopiad või PHP-failid kaustas assets võivad olla ligipääsetavad. Võrrelge seda selle väljalaske failiga ht.access ja lisage puuduvad reeglid.'; $_lang["configcheck_validate_referer"] = 'Turvahoiatus: HTTP-päise kontroll'; $_lang["configcheck_validate_referer_msg"] = 'Seadistus Kas kontrollida HTTP_REFERER päiseid? on välja lülitatud. Soovitame selle sisse lülitada. Ava seadistusvalikud'; $_lang["configcheck_warning"] = 'Seadistuse hoiatus: '; diff --git a/core/lang/fa/global.php b/core/lang/fa/global.php index 332144dcbf..ee203983a9 100644 --- a/core/lang/fa/global.php +++ b/core/lang/fa/global.php @@ -159,6 +159,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'ایند به این معناست که صفحه ی خارج از دسترس شما قابل دسترسی برای بازدیدکنندگان عادی نمی باشد و یا و جود ندارد. این امکان دارد باعث ایجاد خطالهای پی در پی در وبگاه شود. از این موضوع اطمینان حاصل کنید که هیچ گروه از کاربر وب برای این صفحه تعیین نشده باشد.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'صفحه ی خارج از دسترس تعیین شده در تنظیمات مربوط به وبگاه همچنان منتشر نشده است.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'این بدان معناست که صفحه ی خارج از دسترسی قابل دسترس عمومی نمی باشد. صفحه را منتشر کنید و یا مطمئن شوید که چنین صفحه منتهی به پرونده ای می شود که در درختی وبگاه در قسمت فهرست یا منوی ابزار و تنظیمات وجود دارد.'; +$_lang["configcheck_htaccess_rules"] = 'هشدار امنیتی: .htaccess قدیمی است'; +$_lang["configcheck_htaccess_rules_msg"] = 'فایل .htaccess این وبگاه قوانین امنیتی نسخه فعلی را ندارد و به‌روزرسانی‌ها هرگز این فایل را تغییر نمی‌دهند. فایل‌های خصوصی، نسخه‌های پشتیبان یا فایل‌های PHP در assets ممکن است در دسترس باشند. آن را با ht.access این نسخه مقایسه کنید و قوانین جاافتاده را اضافه کنید.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'خطای تنظیمات:'; diff --git a/core/lang/fi/global.php b/core/lang/fi/global.php index 53155a561c..3eb88300a9 100644 --- a/core/lang/fi/global.php +++ b/core/lang/fi/global.php @@ -158,6 +158,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = '"Pääsy kielletty" -sivulle ei joko päästä tai sitä ei ole olemassa. Tämä voi johtaa ongelmiin sivustollasi. Varmista, ettei sivulle ole määritetty web-käyttäjäryhmää.'; $_lang["configcheck_unauthorizedpage_unpublished"] = '"Pääsy kielletty" -sivua ei ole julkaistu.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = '"Pääsy kielletty" -sivu ei ole julkinen. Varmista, että sivu on julkaistu ja sivun ID-tunnus on oikein.'; +$_lang["configcheck_htaccess_rules"] = 'Tietoturvavaroitus: .htaccess on vanhentunut'; +$_lang["configcheck_htaccess_rules_msg"] = 'Tämän sivuston .htaccess-tiedostosta puuttuu nykyisen julkaisun tietoturvasääntöjä, eivätkä päivitykset koskaan muuta tätä tiedostoa. Yksityiset tiedostot, varmuuskopiot tai assets-kansion PHP-tiedostot voivat olla saavutettavissa. Vertaa sitä tämän julkaisun ht.access-tiedostoon ja lisää puuttuvat säännöt.'; $_lang["configcheck_validate_referer"] = 'Tietoturvavaroitus: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'Järjestelmän asetus Tarkasta HTTP_REFERER tunnisteet? on poissa päältä. On suositeltavaa ottaa asetus käyttöön. Järjestelmän asetukset
Älä näytä tätä ilmoitusta uudelleen.'; $_lang["configcheck_warning"] = 'Varoitus:'; diff --git a/core/lang/fr/global.php b/core/lang/fr/global.php index 44c31fa32f..cf8ac7ba23 100644 --- a/core/lang/fr/global.php +++ b/core/lang/fr/global.php @@ -161,6 +161,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Cela signifie que la page "Accès non autorisé" n\'est pas accessible à vos visiteurs ou n\'existe pas. Cela peut provoquer une boucle infinie, générer des erreurs dans vos logs. Assurez-vous qu\'aucun Groupe d\'Utilisateurs Web n\'est associé à cette page.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'La page "Accès non autorisé" définie dans la configuration du site n\'est pas publiée.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Cela signifie que la page "Accès non autorisé" n\'est pas accessible au public. Publiez cette page ou assurez-vous qu\'elle est associée à une Ressource existante dans votre Arbre de Site dans le menu Outils > Configuration.'; +$_lang["configcheck_htaccess_rules"] = 'Avertissement de sécurité: .htaccess est obsolète'; +$_lang["configcheck_htaccess_rules_msg"] = 'Le fichier .htaccess de ce site ne contient pas certaines règles de sécurité de la version actuelle, et les mises à jour ne modifient jamais ce fichier. Des fichiers privés, des sauvegardes ou des fichiers PHP situés dans assets peuvent être accessibles. Comparez-le avec le fichier ht.access de cette version et ajoutez les règles manquantes.'; $_lang["configcheck_validate_referer"] = 'Avertissement de sécurité: validation des en-têtes HTTP'; $_lang["configcheck_validate_referer_msg"] = 'Le paramètre de configuration Valider les en-têtes HTTP_REFERER? est désactivé. Nous vous recommandons de l\'activer. Aller aux options de configuration
Ne plus afficher ce message.'; $_lang["configcheck_warning"] = 'Avertissement de configuration:'; diff --git a/core/lang/he/global.php b/core/lang/he/global.php index b5a23d75c9..ef4d010f12 100644 --- a/core/lang/he/global.php +++ b/core/lang/he/global.php @@ -159,6 +159,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'This means that your Unauthorized page is not accessible to normal web surfers or does not exist. This can lead to a recursive looping condition and many errors in your site logs. Make sure there are no webuser groups assigned to the page.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'The Unauthorized page defined in the site configuration settings is not published.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'This means that your Unauthorized page is inaccessible to the general public. Publish the page or make sure it is assigned to an existing document in your site tree in the Tools > Configuration menu.'; +$_lang["configcheck_htaccess_rules"] = 'אזהרת אבטחה: .htaccess אינו מעודכן'; +$_lang["configcheck_htaccess_rules_msg"] = 'בקובץ .htaccess של אתר זה חסרים כללי אבטחה של הגרסה הנוכחית, ועדכונים לעולם אינם משנים קובץ זה. קבצים פרטיים, גיבויים או קובצי PHP תחת assets עלולים להיות נגישים. יש להשוות אותו אל ht.access של גרסה זו ולהוסיף את הכללים החסרים.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Configuration warning:'; diff --git a/core/lang/hy/global.php b/core/lang/hy/global.php index 8f1fb9f7f8..5bb4a3ae97 100644 --- a/core/lang/hy/global.php +++ b/core/lang/hy/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Սա նշանակում է, որ չարտոնված մուտքի էջը հասանելի չէ սովորական այցելուներին կամ գոյություն չունի։ Դա կարող է առաջացնել անվերջ կրկնվող ցիկլ և բազմաթիվ սխալներ կայքի մատյաններում։ Համոզվեք, որ էջին վեբ օգտատերերի խմբեր կցված չեն։'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Կայքի կազմաձևման կարգավորումներում սահմանված չարտոնված մուտքի էջը հրապարակված չէ։'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Սա նշանակում է, որ չարտոնված մուտքի էջը հանրությանը հասանելի չէ։ Հրապարակեք էջը կամ Գործիքներ > Կազմաձևում ընտրացանկում համոզվեք, որ այն նշանակված է կայքի ծառում գոյություն ունեցող ռեսուրսի։'; +$_lang["configcheck_htaccess_rules"] = 'Անվտանգության նախազգուշացում․ .htaccess-ը հնացած է'; +$_lang["configcheck_htaccess_rules_msg"] = 'Այս կայքի .htaccess ֆայլում բացակայում են ընթացիկ թողարկման անվտանգության կանոնները, իսկ թարմացումները երբեք չեն փոխում այս ֆայլը։ Անձնական ֆայլերը, պահուստային պատճենները կամ assets-ի PHP ֆայլերը կարող են հասանելի լինել։ Համեմատեք այն այս թողարկման ht.access ֆայլի հետ և ավելացրեք բացակայող կանոնները։'; $_lang["configcheck_validate_referer"] = 'Անվտանգության նախազգուշացում․ HTTP վերնագրի վավերացում'; $_lang["configcheck_validate_referer_msg"] = 'Վավերացնե՞լ HTTP_REFERER վերնագրերը կարգավորումն անջատված է։ Խորհուրդ ենք տալիս միացնել այն։ Անցնել կազմաձևման կարգավորումներին'; $_lang["configcheck_warning"] = 'Կազմաձևման նախազգուշացում․ '; diff --git a/core/lang/it/global.php b/core/lang/it/global.php index c12a8cf392..a01fdf454e 100644 --- a/core/lang/it/global.php +++ b/core/lang/it/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Ciò significa che la pagina di Non Autorizzato non esiste o non è accessibile da parte dei normali visitatori web. Questo fatto generare un loop ricorsivo e scrivere numerosi errori nel log del vostro sito. Verificate che non ci siano Gruppi di Utenti Web assegnati a questa pagina.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'La pagina Non Autorizzato del vostro sito non è stata pubblicata.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Ciò significa che la pagina di Non Autorizzato non è accessibile ai visitatori. Pubblicate la pagina o selezionate una Risorsa esistente nella struttura ad albero del vostro sito dal menu Strumenti -> Configurazione.'; +$_lang["configcheck_htaccess_rules"] = 'Avviso di Sicurezza: .htaccess non è aggiornato'; +$_lang["configcheck_htaccess_rules_msg"] = 'Nel file .htaccess di questo sito mancano regole di sicurezza della versione corrente e gli aggiornamenti non modificano mai questo file. File privati, backup o file PHP in assets potrebbero essere raggiungibili. Confrontalo con ht.access di questa versione e aggiungi le regole mancanti.'; $_lang["configcheck_validate_referer"] = 'Avviso di Sicurezza: Validazione headers HTTP'; $_lang["configcheck_validate_referer_msg"] = 'L\'opzione di Validazione degli headers HTTP_REFERER? non è attivata. Raccomandiamo di attivarla. Vai alle Opzioni di Configurazione'; $_lang["configcheck_warning"] = 'Avviso di configurazione:'; diff --git a/core/lang/ja/global.php b/core/lang/ja/global.php index 8d4633ab14..4e07801ae1 100644 --- a/core/lang/ja/global.php +++ b/core/lang/ja/global.php @@ -170,6 +170,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = '設定した「権限外告知のページ」が一般的なエンドユーザーからアクセスできないページ(private)かあるいは存在しないことを意味しています。システムがループ状態に陥り、多数のエラーをエラーログに蓄積します。権限フリーの公開ページを「権限外告知のページ」に指定してください。'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'グローバル設定で設定された権限外告知のページは公開されていません。'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = '設定した権限外告知のページが誰でも見られるようにはなっていないことを意味します。権限外告知ページは全ての人「Public」に公開するようにしてください。'; +$_lang["configcheck_htaccess_rules"] = 'セキュリティ警告: .htaccess が古くなっています'; +$_lang["configcheck_htaccess_rules_msg"] = 'このサイトの .htaccess には現在のリリースのセキュリティルールが不足しており、アップデートではこのファイルは変更されません。非公開ファイル、バックアップ、または assets 配下の PHP ファイルにアクセスできる可能性があります。このリリースの ht.access と比較し、不足しているルールを追加してください。'; $_lang["configcheck_validate_referer"] = 'セキュリティ警告: 参照元チェックの設定'; $_lang["configcheck_validate_referer_msg"] = 'グローバル設定の「管理画面のリファラチェック」がオフになっています。セキュリティ強化のためオンにすることをおすすめします。
今後この警告を表示しない'; $_lang["configcheck_warning"] = '警告'; diff --git a/core/lang/ka/global.php b/core/lang/ka/global.php index bcaa432175..f3fab9c0fa 100644 --- a/core/lang/ka/global.php +++ b/core/lang/ka/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'ეს ნიშნავს, რომ წვდომის აკრძალვის გვერდი ჩვეულებრივი ვიზიტორებისთვის მიუწვდომელია ან არ არსებობს. ამან შეიძლება გამოიწვიოს განმეორებადი ციკლი და მრავალი შეცდომა საიტის ჟურნალებში. დარწმუნდით, რომ გვერდს ვებმომხმარებელთა ჯგუფები არ აქვს მინიჭებული.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'საიტის კონფიგურაციაში მითითებული წვდომის აკრძალვის გვერდი გამოუქვეყნებელია.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'ეს ნიშნავს, რომ წვდომის აკრძალვის გვერდი ყველასთვის მიუწვდომელია. გამოაქვეყნეთ გვერდი ან მენიუში ხელსაწყოები > კონფიგურაცია დარწმუნდით, რომ მას საიტის ხეში არსებული რესურსი აქვს მინიჭებული.'; +$_lang["configcheck_htaccess_rules"] = 'უსაფრთხოების გაფრთხილება: .htaccess მოძველებულია'; +$_lang["configcheck_htaccess_rules_msg"] = 'ამ საიტის .htaccess ფაილს აკლია მიმდინარე გამოშვების უსაფრთხოების წესები, განახლებები კი ამ ფაილს არასდროს ცვლის. პირადი ფაილები, სარეზერვო ასლები ან assets-ში არსებული PHP ფაილები შესაძლოა ხელმისაწვდომი იყოს. შეადარეთ იგი ამ გამოშვების ht.access ფაილს და დაამატეთ გამოტოვებული წესები.'; $_lang["configcheck_validate_referer"] = 'უსაფრთხოების გაფრთხილება: HTTP სათაურების შემოწმება'; $_lang["configcheck_validate_referer_msg"] = 'კონფიგურაციის პარამეტრი შემოწმდეს HTTP_REFERER სათაურები? გამორთულია. გირჩევთ, ჩართოთ. კონფიგურაციის პარამეტრებზე გადასვლა'; $_lang["configcheck_warning"] = 'კონფიგურაციის გაფრთხილება: '; diff --git a/core/lang/kk/global.php b/core/lang/kk/global.php index f49e93b680..0682db8411 100644 --- a/core/lang/kk/global.php +++ b/core/lang/kk/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Рұқсатсыз қатынау беті қарапайым келушілерге қолжетімсіз немесе жоқ. Бұл қайталанатын циклге және журналда көптеген қателерге әкелуі мүмкін. Бетке веб-пайдаланушы топтары тағайындалмағанын тексеріңіз.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Сайт баптауларындағы рұқсатсыз қатынау беті жарияланбаған.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Рұқсатсыз қатынау беті жалпыға қолжетімсіз. Бетті жариялаңыз немесе Құралдар > Баптаулар мәзірінде оның сайт ағашындағы бар ресурсқа тағайындалғанын тексеріңіз.'; +$_lang["configcheck_htaccess_rules"] = 'Қауіпсіздік ескертуі: .htaccess ескірген'; +$_lang["configcheck_htaccess_rules_msg"] = 'Осы сайттың .htaccess файлында ағымдағы шығарылымның қауіпсіздік ережелері жетіспейді, ал жаңартулар бұл файлды ешқашан өзгертпейді. Жеке файлдар, сақтық көшірмелер немесе assets ішіндегі PHP файлдары қолжетімді болуы мүмкін. Оны осы шығарылымның ht.access файлымен салыстырып, жетіспейтін ережелерді қосыңыз.'; $_lang["configcheck_validate_referer"] = 'Қауіпсіздік ескертуі: HTTP тақырыптарын тексеру'; $_lang["configcheck_validate_referer_msg"] = 'HTTP_REFERER тақырыптарын тексеру керек пе? баптауы өшірілген. Оны қосуды ұсынамыз. Баптауларға өту'; $_lang["configcheck_warning"] = 'Баптау ескертуі: '; diff --git a/core/lang/ky/global.php b/core/lang/ky/global.php index e9df6d7080..0e464b791a 100644 --- a/core/lang/ky/global.php +++ b/core/lang/ky/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Кирүүгө тыюу салуу барагы кадимки конокторго жеткиликсиз же жок. Бул чексиз багыттоого жана журналда көптөгөн каталарга алып келиши мүмкүн. Баракка веб-колдонуучу топтору дайындалбаганын текшериңиз.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Сайттын жөндөөлөрүндөгү кирүүгө тыюу салуу барагы жарыяланган эмес.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Бул барак жалпыга жеткиликсиз. Аны жарыялаңыз же Куралдар > Жөндөөлөр менюсунда сайт дарагындагы ресурс туура дайындалганын текшериңиз.'; +$_lang["configcheck_htaccess_rules"] = 'Коопсуздук эскертүүсү: .htaccess эскирген'; +$_lang["configcheck_htaccess_rules_msg"] = 'Бул сайттын .htaccess файлында учурдагы чыгарылыштын коопсуздук эрежелери жетишпейт, ал эми жаңыртуулар бул файлды эч качан өзгөртпөйт. Жеке файлдар, камдык көчүрмөлөр же assets ичиндеги PHP файлдары жеткиликтүү болушу мүмкүн. Аны ушул чыгарылыштын ht.access файлы менен салыштырып, жетишпеген эрежелерди кошуңуз.'; $_lang["configcheck_validate_referer"] = 'Коопсуздук эскертүүсү: HTTP баштарын текшерүү'; $_lang["configcheck_validate_referer_msg"] = 'HTTP_REFERER баштарын текшерүүбү? жөндөөсү өчүрүлгөн. Аны иштетүүнү сунуштайбыз. Жөндөөлөргө өтүү'; $_lang["configcheck_warning"] = 'Жөндөөлөр боюнча эскертүү: '; diff --git a/core/lang/lt/global.php b/core/lang/lt/global.php index e130719a5a..0b43124765 100644 --- a/core/lang/lt/global.php +++ b/core/lang/lt/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Tai reiškia, kad neleistinos prieigos puslapis nepasiekiamas įprastiems lankytojams arba jo nėra. Dėl to gali susidaryti rekursinė kilpa ir svetainės žurnaluose atsirasti daug klaidų. Įsitikinkite, kad puslapiui nepriskirta jokių žiniatinklio naudotojų grupių.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Svetainės konfigūracijoje nustatytas neleistinos prieigos puslapis nepaskelbtas.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Tai reiškia, kad neleistinos prieigos puslapis nepasiekiamas visiems lankytojams. Paskelbkite puslapį arba meniu Įrankiai > Konfigūracija įsitikinkite, kad jam priskirtas esamas išteklius svetainės medyje.'; +$_lang["configcheck_htaccess_rules"] = 'Saugumo įspėjimas: .htaccess yra pasenęs'; +$_lang["configcheck_htaccess_rules_msg"] = 'Šios svetainės .htaccess faile trūksta dabartinės laidos saugumo taisyklių, o atnaujinimai šio failo niekada nekeičia. Privatūs failai, atsarginės kopijos arba PHP failai kataloge assets gali būti pasiekiami. Palyginkite jį su šios laidos failu ht.access ir pridėkite trūkstamas taisykles.'; $_lang["configcheck_validate_referer"] = 'Saugumo įspėjimas: HTTP antraščių tikrinimas'; $_lang["configcheck_validate_referer_msg"] = 'Konfigūracijos nuostata Tikrinti HTTP_REFERER antraštes? išjungta. Rekomenduojame ją įjungti. Atverti konfigūracijos parinktis'; $_lang["configcheck_warning"] = 'Konfigūracijos įspėjimas: '; diff --git a/core/lang/lv/global.php b/core/lang/lv/global.php index 6c302c6392..2e3657c64f 100644 --- a/core/lang/lv/global.php +++ b/core/lang/lv/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Tas nozīmē, ka nesankcionētas piekļuves lapa nav pieejama parastajiem apmeklētājiem vai nepastāv. Tas var izraisīt rekursīvu ciklu un daudz kļūdu vietnes žurnālos. Pārliecinieties, ka lapai nav piešķirtas tīmekļa lietotāju grupas.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Vietnes konfigurācijā norādītā nesankcionētas piekļuves lapa nav publicēta.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Tas nozīmē, ka nesankcionētas piekļuves lapa nav publiski pieejama. Publicējiet lapu vai izvēlnē Rīki > Konfigurācija pārliecinieties, ka tai ir piešķirts esošs resurss vietnes kokā.'; +$_lang["configcheck_htaccess_rules"] = 'Drošības brīdinājums: .htaccess ir novecojis'; +$_lang["configcheck_htaccess_rules_msg"] = 'Šīs vietnes failā .htaccess trūkst pašreizējā laidiena drošības noteikumu, un atjauninājumi šo failu nekad nemaina. Privāti faili, rezerves kopijas vai PHP faili mapē assets var būt pieejami. Salīdziniet to ar šī laidiena failu ht.access un pievienojiet trūkstošos noteikumus.'; $_lang["configcheck_validate_referer"] = 'Drošības brīdinājums: HTTP galveņu pārbaude'; $_lang["configcheck_validate_referer_msg"] = 'Konfigurācijas iestatījums Pārbaudīt HTTP_REFERER galvenes? ir izslēgts. Iesakām to ieslēgt. Atvērt konfigurācijas opcijas'; $_lang["configcheck_warning"] = 'Konfigurācijas brīdinājums: '; diff --git a/core/lang/nl/global.php b/core/lang/nl/global.php index 2d1bb30bfb..df39b9c683 100644 --- a/core/lang/nl/global.php +++ b/core/lang/nl/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Dit houdt in dat uw \'Niet Gemachtigd\'-pagina niet toegankelijk is voor normale Webgebruikers of niet bestaat. Dit kan leiden tot een oneindige lus en veel foutmeldingen in uw logbestand. Zorg ervoor dat de Pagina niet aan een Webgebruikersgroep is toegewezen.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'De \'Niet Gemachtigd\'-pagina die in de configuratie instellingen is aangegeven is niet gepubliceerd.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Dit houdt in dat uw \'Niet Gemachtigd\'-pagina niet toegankelijk is voor bezoekers. Publiceer de Pagina of zorg ervoor dat het is toegewezen aan een bestaande Pagina in de inhoudsopgave van uw website met het Beheer > Configuratie menu.'; +$_lang["configcheck_htaccess_rules"] = 'Beveiliging Waarschuwing: .htaccess is verouderd'; +$_lang["configcheck_htaccess_rules_msg"] = 'Het bestand .htaccess van deze site mist beveiligingsregels van de huidige release, en updates wijzigen dit bestand nooit. Privébestanden, backups of PHP-bestanden onder assets kunnen bereikbaar zijn. Vergelijk het met ht.access van deze release en voeg de ontbrekende regels toe.'; $_lang["configcheck_validate_referer"] = 'Beveiliging Waarschuwing: HTTP Header Validatie'; $_lang["configcheck_validate_referer_msg"] = 'De configuratie instelling Validate HTTP_REFERER headers? staat UIT. We raden aan deze AAN te zetten. Ga naar de Configuratie opties'; $_lang["configcheck_warning"] = 'Configuratie waarschuwing:'; diff --git a/core/lang/nn/global.php b/core/lang/nn/global.php index 9c90df848f..e88ca83cf5 100644 --- a/core/lang/nn/global.php +++ b/core/lang/nn/global.php @@ -158,6 +158,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'This means that your Unauthorized page is not accessible to normal web surfers or does not exist. This can lead to a recursive looping condition and many errors in your site logs. Make sure there are no Webuser Groups assigned to the page.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'The Unauthorized page defined in the site configuration settings is not published.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'This means that your Unauthorized page is inaccessible to the general public. Publish the page or make sure it is assigned to an existing Resource in your Site Tree in the Tools > Configuration menu.'; +$_lang["configcheck_htaccess_rules"] = 'Sikkerhetsadvarsel: .htaccess er utdatert'; +$_lang["configcheck_htaccess_rules_msg"] = 'Filen .htaccess på denne webplassen mangler sikkerhetsregler fra gjeldende versjon, og oppdateringer endrer aldri denne filen. Private filer, sikkerhetskopier eller PHP-filer under assets kan være tilgjengelige. Sammenlign den med ht.access fra denne versjonen og legg til reglene som mangler.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Konfigurasjonsadvarsel:'; diff --git a/core/lang/pl/global.php b/core/lang/pl/global.php index 68dea2b54e..66b36f8c69 100644 --- a/core/lang/pl/global.php +++ b/core/lang/pl/global.php @@ -167,6 +167,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Oznacza to, że Strona Braku Autoryzacji jest niedostępna dla odwiedzających. Może to powodować niestabilność i wiele błędnych wpisów w logach serwisu. Upewnij się, że żadna grupa użytkowników nie jest przypisana do strony.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Strona Braku Konfiguracji zdefiniowana w ustawieniach jest nieopublikowana.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Oznacza to, że Strona Braku Autoryzacji serwisu jest niedostępna dla odwiedzających. Opublikuj tą stronę albo upewnij się, że jest ona przypisana do istniejącego dokumentu w drzewie zawartości Twojej strony.'; +$_lang["configcheck_htaccess_rules"] = 'Ostrzeżenie odnośnie bezpieczeństwa: plik .htaccess jest nieaktualny'; +$_lang["configcheck_htaccess_rules_msg"] = 'W pliku .htaccess tej strony brakuje reguł bezpieczeństwa bieżącego wydania, a aktualizacje nigdy nie zmieniają tego pliku. Prywatne pliki, kopie zapasowe lub pliki PHP w assets mogą być dostępne. Porównaj go z plikiem ht.access z tego wydania i dodaj brakujące reguły.'; $_lang["configcheck_validate_referer"] = 'Ostrzeżenie odnośnie bezpieczeństwa: Weryfikacja nagłówków HTTP_REFERER'; $_lang["configcheck_validate_referer_msg"] = 'Ustawienie konfiguracyjne Weryfikuj nagłówki HTTP_REFERER jest wyłączone. Zalecamy aby było ono włączone. Przejdź do konfiguracji systemu
Nie pokazuj tego komunikatu ponownie./em>'; $_lang["configcheck_warning"] = 'Ostrzeżenia konfiguracji:'; diff --git a/core/lang/pt/global.php b/core/lang/pt/global.php index e35d96cef2..05103053bd 100644 --- a/core/lang/pt/global.php +++ b/core/lang/pt/global.php @@ -158,6 +158,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Isto significa que a Página de \'acesso não autorizado\' não está disponível a utilizadores normais da web ou não existe. Isto pode conduzir a um ciclo recursivo e a muitos erros nos registos do site. Certifique-se de que não existem grupos de webusers alocados a essa página.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'A página de \'acesso não autorizado\' do seu site não está publicada.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Isto significa que a sua página de \'acesso não autorizado\' não está acessível para o público geral. Publique a página ou certifique-se de que esta está afectada a um documento existente na árvore de documentos no menu Ferramentas > Configuração.'; +$_lang["configcheck_htaccess_rules"] = 'Aviso de segurança: .htaccess está desactualizado'; +$_lang["configcheck_htaccess_rules_msg"] = 'O ficheiro .htaccess deste site não tem regras de segurança da versão actual, e as actualizações nunca alteram este ficheiro. Ficheiros privados, cópias de segurança ou ficheiros PHP em assets podem estar acessíveis. Compare-o com ht.access desta versão e adicione as regras em falta.'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = 'Avisos de configuração:'; diff --git a/core/lang/ro/global.php b/core/lang/ro/global.php index 17236c77a8..56d3e7c113 100644 --- a/core/lang/ro/global.php +++ b/core/lang/ro/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Aceasta înseamnă că pagina de acces neautorizat nu este accesibilă vizitatorilor obișnuiți sau nu există. Acest lucru poate provoca o buclă recursivă și multe erori în jurnalele site-ului. Asigură-te că paginii nu îi sunt atribuite grupuri de utilizatori web.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Pagina de acces neautorizat definită în configurația site-ului nu este publicată.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Aceasta înseamnă că pagina de acces neautorizat nu este accesibilă publicului. Publică pagina sau asigură-te că este atribuită unei resurse existente în arborele site-ului, din meniul Instrumente > Configurare.'; +$_lang["configcheck_htaccess_rules"] = 'Avertisment de securitate: .htaccess este învechit'; +$_lang["configcheck_htaccess_rules_msg"] = 'În fișierul .htaccess al acestui site lipsesc reguli de securitate ale versiunii curente, iar actualizările nu modifică niciodată acest fișier. Fișierele private, copiile de siguranță sau fișierele PHP din assets pot fi accesibile. Comparați-l cu ht.access din această versiune și adăugați regulile lipsă.'; $_lang["configcheck_validate_referer"] = 'Avertisment de securitate: validarea antetelor HTTP'; $_lang["configcheck_validate_referer_msg"] = 'Setarea Validează antetele HTTP_REFERER? este dezactivată. Recomandăm activarea ei. Deschide opțiunile de configurare'; $_lang["configcheck_warning"] = 'Avertisment de configurare: '; diff --git a/core/lang/sk/global.php b/core/lang/sk/global.php index 859aab191b..6c2f8482cb 100644 --- a/core/lang/sk/global.php +++ b/core/lang/sk/global.php @@ -168,6 +168,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'To znamená, že neexistuje alebo nie je dostupná bežným návštevníkom webu. Môže to viesť k rekurzívnemu volaniu funkcie \'chybová stránka\' a veľkému počtu záznamov v protokole webu. Uistite sa, že žiadne skupiny webových používateľov nemajú túto stránku priradenú.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Stránka o obmedzenom prístupe uvedená v konfigurácii webu nie je publikovaná.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'To znamená, že nie je dostupná návštevníkom webu. Aby táto funkcia fungovala správne, je potrebné stránku o obmedzenom prístupe publikovať.'; +$_lang["configcheck_htaccess_rules"] = 'Bezpečnostné upozornenie: .htaccess je zastaraný'; +$_lang["configcheck_htaccess_rules_msg"] = 'V súbore .htaccess tohto webu chýbajú bezpečnostné pravidlá aktuálneho vydania a aktualizácie tento súbor nikdy nemenia. Súkromné súbory, zálohy alebo súbory PHP v priečinku assets môžu byť dostupné. Porovnajte ho so súborom ht.access tohto vydania a doplňte chýbajúce pravidlá.'; $_lang["configcheck_validate_referer"] = 'Bezpečnostné upozornenie: kontrola HTTP hlavičky'; $_lang["configcheck_validate_referer_msg"] = 'V konfigurácii je parameter Overovať serverové hlavičky HTTP_REFERER? vypnutý. Odporúčame ho zapnúť. Prejsť na nastavenie konfigurácie'; $_lang["configcheck_warning"] = 'Chyba konfigurácie:'; diff --git a/core/lang/sv/global.php b/core/lang/sv/global.php index 7dbcd9b6e2..ceb2e81481 100644 --- a/core/lang/sv/global.php +++ b/core/lang/sv/global.php @@ -159,6 +159,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Detta betyder att din webbplats otillåten-sida inte är tillgänglig för vanliga användare eller att den inte existerar. Det här kan leda till att ett tillstånd med upprepande loopar skapas och ger upphov till att många fel rapporteras i webbplatsens loggar. Kontrollera att inga webbanvändargrupper är knutna till sidan.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Den otillåten-sida som angetts i inställningarna är inte publicerad.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Detta betyder att din otillåten-sida är oåtkomlig för allmänheten. Publicera sidan eller kontrollera under Verktyg > Konfiguration att den angivna sidan är en existerande resurs i webbplatsens resursträd.'; +$_lang["configcheck_htaccess_rules"] = 'Säkerhetsvarning: .htaccess är inaktuell'; +$_lang["configcheck_htaccess_rules_msg"] = 'Filen .htaccess på den här webbplatsen saknar säkerhetsregler från den aktuella versionen, och uppdateringar ändrar aldrig den här filen. Privata filer, säkerhetskopior eller PHP-filer under assets kan vara åtkomliga. Jämför den med ht.access i den här versionen och lägg till de regler som saknas.'; $_lang["configcheck_validate_referer"] = 'Säkerhetsvarning: validering av HTTP-header'; $_lang["configcheck_validate_referer_msg"] = 'Konfigurationsinställningen Kontrollera HTTP_REFERER-headers? är inaktiverad. Vi rekommenderar att den aktiveras. Gå till konfigurationssidan.'; $_lang["configcheck_warning"] = 'Konfigurationsvarning: '; diff --git a/core/lang/tg/global.php b/core/lang/tg/global.php index 1a9eeacfd9..8fb742302f 100644 --- a/core/lang/tg/global.php +++ b/core/lang/tg/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Ин саҳифа барои меҳмонон дастнорас аст ё мавҷуд нест. Он метавонад даври беохир ва хатоҳои зиёд дар гузоришҳо эҷод кунад. Боварӣ ҳосил кунед, ки ба саҳифа гурӯҳҳои корбарони веб таъин нашудаанд.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Саҳифаи манъи дастрасии дар танзимот муайяншуда нашр нашудааст.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Ин саҳифа барои умум дастнорас аст. Онро нашр кунед ё дар менюи Абзорҳо > Танзимот захираи мавҷудаи дарахти сомонаро таъин кунед.'; +$_lang["configcheck_htaccess_rules"] = 'Огоҳии амниятӣ: .htaccess кӯҳна шудааст'; +$_lang["configcheck_htaccess_rules_msg"] = 'Дар файли .htaccess-и ин сайт қоидаҳои амниятии нашри ҷорӣ намерасанд ва навсозиҳо ҳеҷ гоҳ ин файлро тағйир намедиҳанд. Файлҳои шахсӣ, нусхаҳои эҳтиётӣ ё файлҳои PHP дар assets метавонанд дастрас бошанд. Онро бо ht.access-и ин нашр муқоиса кунед ва қоидаҳои намерасидаро илова намоед.'; $_lang["configcheck_validate_referer"] = 'Огоҳии амниятӣ: санҷиши сарлавҳаҳои HTTP'; $_lang["configcheck_validate_referer_msg"] = 'Танзимоти Сарлавҳаҳои HTTP_REFERER санҷида шаванд? хомӯш аст. Фаъол кардани он тавсия мешавад. Кушодани танзимот'; $_lang["configcheck_warning"] = 'Огоҳии танзимот: '; diff --git a/core/lang/tk/global.php b/core/lang/tk/global.php index 526a1c7d6c..f8f92a5339 100644 --- a/core/lang/tk/global.php +++ b/core/lang/tk/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Ygtyýarsyz giriş sahypasy adaty ulanyjylara elýeterli däl ýa-da ýok. Bu aýlawlara we žurnalda köp ýalňyşlyga sebäp bolup biler. Sahypa web ulanyjy toparlarynyň bellenmändigini barlaň.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Sazlamalarda bellenen ygtyýarsyz giriş sahypasy çap edilmedik.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Sahypa köpçülige elýeterli däl. Ony çap ediň ýa-da Gurallar > Sazlamalar menýusynda bar bolan resursyň bellenendigini barlaň.'; +$_lang["configcheck_htaccess_rules"] = 'Howpsuzlyk duýduryşy: .htaccess köneldi'; +$_lang["configcheck_htaccess_rules_msg"] = 'Bu saýtyň .htaccess faýlynda häzirki neşiriň howpsuzlyk düzgünleri ýetmeýär, täzelenmeler bolsa bu faýly hiç haçan üýtgetmeýär. Hususy faýllar, ätiýaçlyk nusgalar ýa-da assets içindäki PHP faýllary elýeterli bolup biler. Ony şu neşiriň ht.access faýly bilen deňeşdiriň we ýetmeýän düzgünleri goşuň.'; $_lang["configcheck_validate_referer"] = 'Howpsuzlyk duýduryşy: HTTP sözbaşylaryny barlamak'; $_lang["configcheck_validate_referer_msg"] = 'HTTP_REFERER sözbaşylaryny barlamalymy? sazlamasy öçürilen. Ony açmagy maslahat berýäris. Sazlamalara geç'; $_lang["configcheck_warning"] = 'Sazlama duýduryşy: '; diff --git a/core/lang/uk/global.php b/core/lang/uk/global.php index 3063c3f087..fdd06293d6 100644 --- a/core/lang/uk/global.php +++ b/core/lang/uk/global.php @@ -173,6 +173,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Це означає, що вона не існує або недоступна звичайним відвідувачам сайту. Це може призвести до рекурсивного виклику функції \'повідомлення про помилку\' і великої кількості записів у журналі сайту. Переконайтеся, що немає груп веб-користувачів, яким призначена ця сторінка.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Сторінка повідомлення про обмежений доступ, зазначена в конфігурації сайту, не опублікована.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Це означає, що вона недоступна відвідувачам сайту. Необхідно опублікувати сторінку повідомлення про обмеження доступу, щоб ця функція працювала правильно.'; +$_lang["configcheck_htaccess_rules"] = 'Попередження безпеки: .htaccess застарів'; +$_lang["configcheck_htaccess_rules_msg"] = 'У файлі .htaccess цього сайту бракує правил безпеки поточного випуску, а оновлення ніколи не змінюють цей файл. Приватні файли, резервні копії або PHP-файли в assets можуть бути доступні. Порівняйте його з ht.access цього випуску та додайте відсутні правила.'; $_lang["configcheck_validate_referer"] = 'Попередження безпеки: перевірка заголовка HTTP'; $_lang["configcheck_validate_referer_msg"] = 'У конфігурації параметрПеревіряти серверні заголовки HTTP_REFERER? відключений. Ми рекомендуємо його ввімкнути. Перейти до налаштування конфігурації'; $_lang["configcheck_warning"] = 'Помилка конфігурації:'; diff --git a/core/lang/uz/global.php b/core/lang/uz/global.php index 6e36a53359..eff75e6648 100644 --- a/core/lang/uz/global.php +++ b/core/lang/uz/global.php @@ -166,6 +166,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'Bu ruxsatsiz kirish sahifasi oddiy tashrif buyuruvchilar uchun ochiq emasligini yoki mavjud emasligini bildiradi. Bu rekursiv takrorlanishga va sayt jurnallarida ko‘plab xatolarga olib kelishi mumkin. Sahifaga veb-foydalanuvchi guruhlari biriktirilmaganini tekshiring.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'Sayt konfiguratsiyasida belgilangan ruxsatsiz kirish sahifasi chop etilmagan.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'Bu ruxsatsiz kirish sahifasi barcha tashrif buyuruvchilar uchun yopiq ekanini bildiradi. Sahifani chop eting yoki Asboblar > Konfiguratsiya menyusida unga sayt daraxtidagi mavjud resurs tayinlanganini tekshiring.'; +$_lang["configcheck_htaccess_rules"] = 'Xavfsizlik ogohlantirishi: .htaccess eskirgan'; +$_lang["configcheck_htaccess_rules_msg"] = 'Ushbu saytning .htaccess faylida joriy relizning xavfsizlik qoidalari yetishmaydi, yangilanishlar esa bu faylni hech qachon o‘zgartirmaydi. Shaxsiy fayllar, zaxira nusxalar yoki assets ichidagi PHP fayllari ochiq bo‘lishi mumkin. Uni ushbu relizning ht.access fayli bilan solishtiring va yetishmayotgan qoidalarni qo‘shing.'; $_lang["configcheck_validate_referer"] = 'Xavfsizlik ogohlantirishi: HTTP sarlavhalarini tekshirish'; $_lang["configcheck_validate_referer_msg"] = 'HTTP_REFERER sarlavhalari tekshirilsinmi? sozlamasi o‘chirilgan. Uni yoqishni tavsiya qilamiz. Konfiguratsiya sozlamalariga o‘tish'; $_lang["configcheck_warning"] = 'Konfiguratsiya ogohlantirishi: '; diff --git a/core/lang/zh/global.php b/core/lang/zh/global.php index 9a81529df2..74611cbbb4 100644 --- a/core/lang/zh/global.php +++ b/core/lang/zh/global.php @@ -159,6 +159,8 @@ $_lang["configcheck_unauthorizedpage_unavailable_msg"] = 'This means that your Unauthorized page is not accessible to normal web surfers or does not exist. This can lead to a recursive looping condition and many errors in your site logs. Make sure there are no Webuser Groups assigned to the page.'; $_lang["configcheck_unauthorizedpage_unpublished"] = 'The Unauthorized page defined in the site configuration settings is not published.'; $_lang["configcheck_unauthorizedpage_unpublished_msg"] = 'This means that your Unauthorized page is inaccessible to the general public. Publish the page or make sure it is assigned to an existing Resource in your Site Tree in the Tools > Configuration menu.'; +$_lang["configcheck_htaccess_rules"] = '安全警告: .htaccess 已过时'; +$_lang["configcheck_htaccess_rules_msg"] = '此站点的 .htaccess 文件缺少当前版本的安全规则,而更新绝不会更改此文件。私有文件、备份或 assets 下的 PHP 文件可能可被访问。请将其与此版本的 ht.access 进行比较,并添加缺失的规则。'; $_lang["configcheck_validate_referer"] = 'Security Warning: HTTP Header Validation'; $_lang["configcheck_validate_referer_msg"] = 'The configuration setting Validate HTTP_REFERER headers? is Off. We recommend turning it On. Go to Configuration options'; $_lang["configcheck_warning"] = '配置警告:'; diff --git a/core/src/Console/SiteUpdateCommand.php b/core/src/Console/SiteUpdateCommand.php index 13efd7402c..be31928f45 100644 --- a/core/src/Console/SiteUpdateCommand.php +++ b/core/src/Console/SiteUpdateCommand.php @@ -7,6 +7,7 @@ use EvolutionCMS\Services\ComposerVersionSynchronizer; use EvolutionCMS\Services\CustomComposerPackages; use EvolutionCMS\Services\Store\RemoteTransportService; +use EvolutionCMS\Support\HtaccessRules; use EvolutionCMS\Traits\RunsComposerShell; use Illuminate\Console\Command; @@ -322,6 +323,7 @@ public function startUpdate() } } $this->cleanupUpdatePlaceholderFiles(); + $this->warnAboutHtaccess(); $this->synchronizeComposerVersion(); $this->installComposerDependencies($customPackageUpdate, $customPackageNames); $this->runCoreMigrations(); @@ -629,6 +631,29 @@ protected function cleanupUpdatePlaceholderFiles(): void } } + /** + * The update keeps the site's .htaccess: say so when that leaves it without the rules of this release. + * + * @since 3.5.10 + * @return void + */ + protected function warnAboutHtaccess(): void + { + $file = EVO_BASE_PATH . '.htaccess'; + if (!is_file($file)) { + return; + } + + $missing = HtaccessRules::missing((string) file_get_contents($file)); + if ($missing !== []) { + $this->warn('.htaccess was kept and lacks ' . count($missing) . ' security rules of this release.' + . ' On Apache, add them from ht.access of this release:'); + foreach ($missing as $rule) { + $this->warn(' ' . $rule); + } + } + } + /** * Placeholder files shipped by the core archive and their local replacements. * diff --git a/core/src/Middleware/Manager.php b/core/src/Middleware/Manager.php index a8dabfc172..d3a97fbd9d 100644 --- a/core/src/Middleware/Manager.php +++ b/core/src/Middleware/Manager.php @@ -82,7 +82,7 @@ protected function grantInstaller(bool $secure): void $held = is_string($held) ? $held : null; $secret = InstallerCompletion::grantToAdministrator( EVO_BASE_PATH . 'install.session.php', - (string) ($_SERVER['REMOTE_ADDR'] ?? ''), + InstallerCompletion::clientAddress($_SERVER), $held, time(), (int) ini_get('session.gc_maxlifetime') diff --git a/core/src/Services/CustomComposerPackages.php b/core/src/Services/CustomComposerPackages.php index 61a3ece40e..9ecf84e1db 100644 --- a/core/src/Services/CustomComposerPackages.php +++ b/core/src/Services/CustomComposerPackages.php @@ -686,7 +686,16 @@ public static function operations(string $output, bool $lockOnly = false): array public static function unexpectedChanges(array $operations, array $pins, array $packages): array { $custom = array_fill_keys(array_map('strtolower', $packages), true); - $sameVersion = static fn (string $a, string $b): bool => strtolower(ltrim($a, 'vV')) === strtolower(ltrim($b, 'vV')); + $sameVersion = static function (string $a, string $b): bool { + // A branch is "dev-main 18f1a03" in one source and "dev-main" in another: a reference + // on one side only says nothing, two different ones mean the branch moved. + [$versionA, $referenceA] = array_pad(explode(' ', strtolower(ltrim(trim($a), 'vV')), 2), 2, ''); + [$versionB, $referenceB] = array_pad(explode(' ', strtolower(ltrim(trim($b), 'vV')), 2), 2, ''); + + return $versionA === $versionB + && ($referenceA === '' || $referenceB === '' + || str_starts_with($referenceA, $referenceB) || str_starts_with($referenceB, $referenceA)); + }; $changes = []; foreach ($operations as $name => $operation) { diff --git a/core/src/Support/HtaccessRules.php b/core/src/Support/HtaccessRules.php new file mode 100644 index 0000000000..03d0f502b0 --- /dev/null +++ b/core/src/Support/HtaccessRules.php @@ -0,0 +1,35 @@ + The required rules a .htaccess does not have, commented out ones included. + */ + public static function missing(string $htaccess): array + { + $lines = array_map( + static fn (string $line): string => (string) preg_replace('/\s+/', ' ', trim($line)), + preg_split('/\R/', $htaccess) ?: [] + ); + + return array_values(array_diff(self::REQUIRED, $lines)); + } +} diff --git a/core/src/Support/InstallerCompletion.php b/core/src/Support/InstallerCompletion.php index 72c719544f..04e5a22686 100644 --- a/core/src/Support/InstallerCompletion.php +++ b/core/src/Support/InstallerCompletion.php @@ -20,6 +20,30 @@ final class InstallerCompletion /** The installer refuses the request. */ public const DENY = 'deny'; + /** + * The address an installer lock is tied to. + * + * Behind a proxy REMOTE_ADDR is the proxy, the same for every visitor, and on the same host it is + * loopback, which may take over a lock. So a forwarded client is kept next to it. The headers can + * be forged, but only to tell a request apart: REMOTE_ADDR stays part of the value, and a request + * that sends one is never loopback. + * + * @param array $server A `$_SERVER`-shaped array. + */ + public static function clientAddress(array $server): string + { + $remote = is_string($server['REMOTE_ADDR'] ?? null) ? $server['REMOTE_ADDR'] : ''; + + foreach (['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP'] as $header) { + $value = is_string($server[$header] ?? null) ? trim(explode(',', $server[$header], 2)[0]) : ''; + if (filter_var($value, FILTER_VALIDATE_IP) !== false) { + return $value . '@' . $remote; + } + } + + return $remote; + } + /** * Record a successful installation: the one-time token that authorizes removing the installer. * An administrator's grant held by the lock is kept. diff --git a/core/tests/Feature/InstallerRemovalFlowTest.php b/core/tests/Feature/InstallerRemovalFlowTest.php new file mode 100644 index 0000000000..242fa98089 --- /dev/null +++ b/core/tests/Feature/InstallerRemovalFlowTest.php @@ -0,0 +1,475 @@ + 'sqlite', 'database' => " . var_export($database, true) . ", 'prefix' => 'evo_'];\n"; + $environment = "DB_TYPE=sqlite\nDB_DATABASE=$database\nDB_PREFIX=evo_\n"; + foreach ([ + '.env' => $environment, + '.env.local' => $environment, + 'core/custom/.env' => $environment, + 'core/custom/define.php' => " $connection, + 'core/config/database/connections/default.php' => $connection, + 'core/config/database/connections/local.php' => $connection, + 'core/storage/cache/env.php' => " " . var_export($database, true) . "];\n", + 'manager/includes/config.inc.php' => " $content) { + is_dir(dirname("$root/$path")) || mkdir(dirname("$root/$path"), 0777, true); + file_put_contents("$root/$path", $content); + } +} + +/** Only what a process needs to run: the settings of the test run stay out of the site. */ +function installerFlowEnvironment(): array +{ + $kept = ['PATH', 'HOME', 'TMP', 'TEMP', 'TMPDIR', 'SYSTEMROOT', 'COMPOSER_HOME']; + $environment = []; + foreach (array_keys($_ENV + getenv()) as $name) { + if (!in_array(strtoupper($name), $kept, true)) { + $environment[$name] = false; + } + } + + return $environment; +} + +/** + * The site of this file: copied and served once, because a tree with its vendor takes seconds. + * + * @return array{root: string, url: string, server: Process, original: string, originalHash: string} + */ +function installerFlowSite(bool $stop = false): ?array +{ + static $site = null; + if ($stop) { + if ($site !== null) { + $site['server']->stop(1); + installerFlowDelete(dirname($site['root'])); + installerFlowDelete(dirname($site['original'])); + } + return $site = null; + } + if ($site !== null) { + return $site; + } + + $unique = str_replace('\\', '/', sys_get_temp_dir()) . '/evo-installer-flow-' . bin2hex(random_bytes(8)); + $root = "$unique/site"; + + $original = "$unique-original/original.sqlite"; + mkdir(dirname($original), 0777, true); + (new PDO("sqlite:$original"))->exec('CREATE TABLE evo_site_content (id INTEGER PRIMARY KEY, pagetitle TEXT)'); + $local = dirname($original) . '/tree'; + installerFlowLocalConfiguration($local, $original); + + installerFlowCopy(dirname(__DIR__, 3), $root); + installerFlowCopy($local, $root); + foreach (['logs', 'cache', 'sessions', 'bootstrap', 'blade'] as $folder) { + is_dir("$root/core/storage/$folder") || mkdir("$root/core/storage/$folder", 0777, true); + } + is_dir("$root/assets/cache") || mkdir("$root/assets/cache", 0777, true); + + file_put_contents("$root/core/custom/.env", "DB_TYPE=sqlite\nDB_DATABASE=$root/core/database/flow.sqlite\nDB_PREFIX=evo_\n"); + file_put_contents("$root/flow-probe.php", <<<'PHP' +getExtension() === 'php') { + $files[] = $entry->getPathname(); + } + } + } +} +header('Content-Type: application/json'); +echo json_encode(['env' => $values, 'files' => $files]); +PHP); + + $socket = stream_socket_server('tcp://127.0.0.1:0'); + $address = stream_socket_get_name($socket, false); + fclose($socket); + + // A conflict in the environment too: it has to go the way of the rest. + $_ENV['DB_DATABASE'] = $original; + $server = new Process( + [PHP_BINARY, '-d', 'opcache.enable=0', '-S', $address, '-t', $root], + $root, + installerFlowEnvironment(), + null, + null + ); + $server->start(); + unset($_ENV['DB_DATABASE']); + + for ($attempt = 0; $attempt < 100; $attempt++) { + $connection = @fsockopen('127.0.0.1', (int) substr(strrchr($address, ':'), 1), $code, $message, 0.1); + if ($connection !== false) { + fclose($connection); + break; + } + usleep(50000); + } + + return $site = [ + 'root' => $root, + 'url' => "http://$address", + 'server' => $server, + 'original' => $original, + 'originalHash' => hash_file('sha256', $original), + ]; +} + +/** + * Stops a test before its first write unless the site sees only the database of the fixture. + * The connection file the installer writes is the one file allowed to appear. + */ +function installerFlowAssertIsolated(array $site): void +{ + $root = $site['root']; + $seen = json_decode((string) file_get_contents($site['url'] . '/flow-probe.php'), true); + $expected = [ + 'DB_CONNECTION' => null, 'DB_TYPE' => 'sqlite', 'DB_HOST' => null, + 'DB_DATABASE' => "$root/core/database/flow.sqlite", 'DB_USERNAME' => null, 'DB_SOCKET' => null, + ]; + if (!is_array($seen) || $seen['env'] !== $expected) { + throw new RuntimeException('The site sees another connection: ' . json_encode($seen)); + } + $written = "$root/core/config/database/connections/default.php"; + $foreign = array_values(array_filter($seen['files'], static fn (string $file) => str_replace('\\', '/', $file) !== $written)); + if ($foreign !== []) { + throw new RuntimeException('Local configuration reached the site: ' . json_encode($foreign)); + } +} + +/** Back to a tree that was never installed, with the installer of the repository. */ +function installerFlowReset(): array +{ + $site = installerFlowSite(); + $root = $site['root']; + foreach ([ + 'core/.install', 'core/config/database/connections/default.php', 'core/database/flow.sqlite', + 'install.session.php', 'install', 'core/storage/bootstrap', 'core/storage/cache/env.php', + 'assets/cache/installProc.inc.php', + ] as $path) { + installerFlowDelete("$root/$path"); + } + mkdir("$root/core/storage/bootstrap", 0777, true); + installerFlowCopy(dirname(__DIR__, 3) . '/install', "$root/install", 'install'); + installerFlowAssertIsolated($site); + + return $site; +} + +function installerFlowBrowser(array $site): Client +{ + return new Client([ + 'base_uri' => $site['url'], + 'cookies' => new CookieJar(), + 'http_errors' => false, + 'timeout' => 300, + 'headers' => ['Accept-Language' => 'en', 'Referer' => $site['url'] . '/install/'], + ]); +} + +/** + * The fields form#install_form submits as it stands, and where it posts them. + * + * @return array{action: string, fields: array} + */ +function installerFlowForm(string $html): array +{ + $document = new DOMDocument(); + @$document->loadHTML($html); + $form = $document->getElementById('install_form'); + expect($form)->toBeInstanceOf(DOMElement::class, 'no installer form in: ' . substr(strip_tags($html), 0, 500)); + + $fields = []; + foreach ((new DOMXPath($document))->query('.//input|.//select|.//textarea', $form) as $field) { + $name = $field->getAttribute('name'); + $type = strtolower($field->getAttribute('type')); + if ($name === '' || $field->hasAttribute('disabled') + || (in_array($type, ['checkbox', 'radio'], true) && !$field->hasAttribute('checked'))) { + continue; + } + if ($field->nodeName === 'select') { + $value = ''; + foreach ($field->getElementsByTagName('option') as $index => $option) { + if ($index === 0 || $option->hasAttribute('selected')) { + $value = $option->getAttribute('value'); + } + } + } else { + $value = $field->nodeName === 'textarea' ? $field->textContent : $field->getAttribute('value'); + } + if (str_ends_with($name, '[]')) { + $fields[substr($name, 0, -2)][] = $value; + } else { + $fields[$name] = $value; + } + } + + return ['action' => $form->getAttribute('action'), 'fields' => $fields]; +} + +function installerFlowPost(Client $browser, string $path, array $fields): string +{ + $response = $browser->post($path, ['form_params' => $fields]); + expect($response->getStatusCode())->toBe(200, "$path answered " . $response->getStatusCode()); + + return (string) $response->getBody(); +} + +/** Submits the forms from $page on, each with $choices, up to the page of results. */ +function installerFlowFinish(Client $browser, string $page, array $choices): string +{ + for ($step = 0; $step < 8 && !str_contains($page, 'remove_installer.processor.php'); $step++) { + $form = installerFlowForm($page); + $page = installerFlowPost( + $browser, + '/install/' . $form['action'], + array_replace($form['fields'], $choices) + ); + } + expect($page)->toContain('remove_installer.processor.php')->not->toContain('class="notok"'); + + return $page; +} + +/** @return string the page of results */ +function installerFlowInstall(Client $browser): string +{ + $page = (string) $browser->get('/install/index.php')->getBody(); + $form = installerFlowForm($page); + $page = installerFlowPost($browser, '/install/' . $form['action'], ['language' => 'en'] + $form['fields']); + $form = installerFlowForm($page); + $page = installerFlowPost($browser, '/install/' . $form['action'], ['installmode' => '0'] + $form['fields']); + + $connection = [ + 'database_type' => 'sqlite', 'method' => 'sqlite', 'host' => '', 'uid' => '', 'pwd' => '', + 'database_name' => 'flow', 'tableprefix' => 'evo_', 'installMode' => '0', + ]; + $collations = installerFlowPost($browser, '/install/index.php?s=1&action=connection/collation', $connection); + preg_match('/