Browse Source

Rework saving of configuration files (#8220)

* Attempt to restore user config if `file_put_contents()` fails

* Second approach

* Minor preference: `.tmp.php`

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* Change boolean compare syntax

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>

* fix?
Inverle 4 months ago
parent
commit
cf4d8043d2
1 changed files with 11 additions and 3 deletions
  1. 11 3
      lib/Minz/Configuration.php

+ 11 - 3
lib/Minz/Configuration.php

@@ -210,14 +210,22 @@ class Minz_Configuration {
 	 * Save the current configuration in the configuration file.
 	 */
 	public function save(): bool {
+		$tmp_filename = $this->config_filename . '.tmp.php';
 		$back_filename = $this->config_filename . '.bak.php';
-		@rename($this->config_filename, $back_filename);
 
-		if (file_put_contents($this->config_filename,
-			"<?php\nreturn " . var_export($this->data, true) . ';', LOCK_EX) === false) {
+		if (!file_put_contents($tmp_filename,
+			"<?php\nreturn " . var_export($this->data, true) . ';', LOCK_EX)) {
+			@unlink($tmp_filename);
 			return false;
 		}
 
+		if (!copy($this->config_filename, $back_filename)) {
+			@unlink($tmp_filename);
+			return false;
+		}
+
+		@rename($tmp_filename, $this->config_filename);
+
 		// Clear PHP cache for include
 		if (function_exists('opcache_invalidate')) {
 			opcache_invalidate($this->config_filename);