diff --git a/GameEngine/Admin/Mods/config_template.php b/GameEngine/Admin/Mods/config_template.php index 47972890..b904100a 100644 --- a/GameEngine/Admin/Mods/config_template.php +++ b/GameEngine/Admin/Mods/config_template.php @@ -340,89 +340,82 @@ if (!function_exists('admin_config_template_path')) { $text = str_replace($placeholder, (string) $value, $text); } - /** - * PLASA DE SIGURANTA: orice placeholder ramas se rezolva din constanta - * pe care o defineste chiar linia lui. - * - * De ce e nevoie: fiecare pagina din panou regenereaza INTREG config.php - * din acelasi sablon, dar rezolva doar setarile ei. O setare noua, - * tratata de un singur modul, ramanea literala cand salvai din alta - * pagina: - * define("NEW_FUNCTIONS_ALLIANCE_BONUSES", %ALLIANCEBONUSES%); - * adica eroare de parsare si 500 pe tot serverul, pana la reparare - * manuala a fisierului. Ni s-a intamplat de trei ori: %GP%, - * %ALLIANCEBONUSES% si %NATARS_WW_START_DELAY%. - * - * Listele de mai sus raman - sunt explicite si mai lizibile. Blocul asta - * prinde ce scapa, ca urmatoarea setare adaugata sa nu mai poata sparge - * serverul. Ruleaza ULTIMUL, deci nu suprascrie nimic rezolvat inainte. - */ - if (preg_match_all('/^\s*define\(\s*["\']([A-Z0-9_]+)["\']\s*,\s*(.*?%[A-Z0-9_]+%.*?)\s*\)\s*;/m', + + return $text; + } +} + +if (!function_exists('tz_config_finalize')) { + + /** + * Ultima verificare inainte de a scrie config.php. + * + * TREBUIE apelata DUPA toate apelurile de tz_config_set() si INAINTE de + * fwrite(). Rezolva orice placeholder ramas, din constanta pe care o + * defineste chiar linia lui. + * + * DE CE AICI si nu in admin_config_template_contents(): + * acea functie ruleaza la INCEPUT, inainte ca modulul sa-si scrie valorile. + * Daca plasa ar rula acolo, ar consuma placeholderele din valorile CURENTE, + * iar tz_config_set() n-ar mai avea ce inlocui - adica orice modificare + * facuta de admin ar fi ignorata in tacere. Exact asta s-a intamplat. + * + * De ce e nevoie de ea: fiecare pagina din panou regenereaza INTREG + * config.php din acelasi sablon, dar rezolva doar setarile ei. O setare + * tratata de un singur modul ramanea literala cand salvai din alta pagina: + * define("NEW_FUNCTIONS_ALLIANCE_BONUSES", %ALLIANCEBONUSES%); + * adica eroare de parsare si 500 pe tot serverul. + */ + function tz_config_finalize($text) + { + if (!preg_match_all('/^\s*define\(\s*["\']([A-Z0-9_]+)["\']\s*,\s*(.*?%[A-Z0-9_]+%.*?)\s*\)\s*;/m', $text, $leftovers, PREG_SET_ORDER)) { + return $text; + } - foreach ($leftovers as $row) { - $constant = $row[1]; + $defaults = array( + 'NATARS_WW_START_DELAY' => 10, + 'USRNM_MIN_LENGTH' => 3, + 'USRNM_MAX_LENGTH' => 15, + 'PW_MIN_LENGTH' => 4, + 'USRNM_SPECIAL' => true, + 'PLUS_STATS_INTERVAL_HOURS' => 6, + 'PLUS_STATS_KEEP_DAYS' => 0, + ); - if (!preg_match('/%[A-Z0-9_]+%/', $row[2], $ph)) { - continue; - } + foreach ($leftovers as $row) { + $constant = $row[1]; - if (!defined($constant)) { - /** - * Constanta nu exista inca: config.php a fost generat - * inaintea acestei setari. - * - * ATENTIE: aici NU se poate pune "false" la nimereala. - * Fisierul ar ramane PHP valid, dar setarea ar deveni - * inutilizabila fara niciun semn - Natarii n-ar mai - * construi, lungimea minima a numelui ar deveni 0 si asa - * mai departe. Folosim valoarea implicita reala a fiecarei - * setari, aceeasi ca la instalare. - */ - $defaults = array( - 'NATARS_WW_START_DELAY' => 10, - 'USRNM_MIN_LENGTH' => 3, - 'USRNM_MAX_LENGTH' => 15, - 'PW_MIN_LENGTH' => 4, - 'USRNM_SPECIAL' => true, - 'PLUS_STATS_INTERVAL_HOURS' => 6, - 'PLUS_STATS_KEEP_DAYS' => 0, - ); - - if (isset($defaults[$constant])) { - $d = $defaults[$constant]; - $value = is_bool($d) ? ($d ? 'true' : 'false') : (string) $d; - } else { - // Setare necunoscuta: alegem dupa context, ca fisierul - // sa ramana valid. Ghilimele in sablon => sir gol, - // altfel 0 (acceptabil si ca numar, si ca boolean). - $quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false) - || (strpos($row[2], "'" . $ph[0] . "'") !== false); - $value = $quoted ? '' : '0'; - } - } else { - $current = constant($constant); - - if (is_bool($current)) { - $value = $current ? 'true' : 'false'; - } elseif (is_int($current) || is_float($current)) { - $value = (string) $current; - } else { - // Sir: pastram ghilimelele din sablon daca exista deja, - // altfel le adaugam noi. - $quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false) - || (strpos($row[2], "'" . $ph[0] . "'") !== false); - - $safe = addcslashes((string) $current, "\"\\\$"); - $value = $quoted ? $safe : '"' . $safe . '"'; - } - } - - $text = str_replace($ph[0], $value, $text); - - error_log('[TravianZ] config: placeholder ' . $ph[0] - . ' nerezolvat de niciun modul, completat din ' . $constant); + if (!preg_match('/%[A-Z0-9_]+%/', $row[2], $ph)) { + continue; } + + $quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false) + || (strpos($row[2], "'" . $ph[0] . "'") !== false); + + if (defined($constant)) { + $current = constant($constant); + + if (is_bool($current)) { + $value = $current ? 'true' : 'false'; + } elseif (is_int($current) || is_float($current)) { + $value = (string) $current; + } else { + $safe = addcslashes((string) $current, "\"\\\$"); + $value = $quoted ? $safe : '"' . $safe . '"'; + } + } elseif (isset($defaults[$constant])) { + $d = $defaults[$constant]; + $value = is_bool($d) ? ($d ? 'true' : 'false') : (string) $d; + } else { + // setare necunoscuta: alegem dupa context, ca fisierul sa ramana valid + $value = $quoted ? '' : '0'; + } + + $text = str_replace($ph[0], $value, $text); + + error_log('[TravianZ] config: placeholder ' . $ph[0] + . ' nerezolvat de niciun modul, completat din ' . $constant); } return $text; diff --git a/GameEngine/Admin/Mods/editAdminInfo.php b/GameEngine/Admin/Mods/editAdminInfo.php index aaf47f26..b50bd521 100755 --- a/GameEngine/Admin/Mods/editAdminInfo.php +++ b/GameEngine/Admin/Mods/editAdminInfo.php @@ -195,6 +195,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editExtraSet.php b/GameEngine/Admin/Mods/editExtraSet.php index 290e079d..16c61c72 100755 --- a/GameEngine/Admin/Mods/editExtraSet.php +++ b/GameEngine/Admin/Mods/editExtraSet.php @@ -190,6 +190,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editLogSet.php b/GameEngine/Admin/Mods/editLogSet.php index 03040f27..96a1c88e 100755 --- a/GameEngine/Admin/Mods/editLogSet.php +++ b/GameEngine/Admin/Mods/editLogSet.php @@ -191,6 +191,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editNewFunctions.php b/GameEngine/Admin/Mods/editNewFunctions.php index ee2b236b..28202b49 100644 --- a/GameEngine/Admin/Mods/editNewFunctions.php +++ b/GameEngine/Admin/Mods/editNewFunctions.php @@ -178,6 +178,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editNewsboxSet.php b/GameEngine/Admin/Mods/editNewsboxSet.php index b7bf3b96..ab3ab847 100755 --- a/GameEngine/Admin/Mods/editNewsboxSet.php +++ b/GameEngine/Admin/Mods/editNewsboxSet.php @@ -197,6 +197,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editPlusSet.php b/GameEngine/Admin/Mods/editPlusSet.php index 07a57a19..8433dd1e 100644 --- a/GameEngine/Admin/Mods/editPlusSet.php +++ b/GameEngine/Admin/Mods/editPlusSet.php @@ -175,6 +175,11 @@ $fh = fopen($myFile, 'w') or die("


Can't open file: GameEngine\con tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', $_POST['plus-e-gold'] ?? ''); tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', $_POST['plus-e-price'] ?? ''); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/GameEngine/Admin/Mods/editServerSet.php b/GameEngine/Admin/Mods/editServerSet.php index 471dade3..3a3b8054 100755 --- a/GameEngine/Admin/Mods/editServerSet.php +++ b/GameEngine/Admin/Mods/editServerSet.php @@ -287,6 +287,11 @@ $text = admin_config_template_contents(array( tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99')); tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000')); + // Ultima verificare: rezolva orice placeholder pe care acest modul + // nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si + // inainte de scriere - altfel setarile modulului ar fi ignorate. + $text = tz_config_finalize($text); + fwrite($fh, $text); fclose($fh); diff --git a/install/templates/config.tpl b/install/templates/config.tpl index e1a2363f..d2c3b353 100644 --- a/install/templates/config.tpl +++ b/install/templates/config.tpl @@ -141,7 +141,7 @@ $dbPrefix = $_SESSION['install_random_prefix'];
-
+