Răsfoiți Sursa

Catch extension exceptions in override (#7475)

* Catch extension exceptions in override
https://github.com/FreshRSS/Extensions/pull/300#issuecomment-2768578464

* Fix error message
Alexandre Alapetite 1 an în urmă
părinte
comite
3336631a84

+ 6 - 1
app/Controllers/extensionController.php

@@ -131,7 +131,12 @@ class FreshRSS_extension_Controller extends FreshRSS_ActionController {
 
 		FreshRSS_View::prependTitle($ext->getName() . ' · ' . _t('admin.extensions.title') . ' · ');
 		$this->view->extension = $ext;
-		$this->view->extension->handleConfigureAction();
+		try {
+			$this->view->extension->handleConfigureAction();
+		} catch (Minz_Exception $e) {	// @phpstan-ignore catch.neverThrown (Thrown by extensions)
+			Minz_Log::error('Error while configuring extension ' . $ext->getName() . ': ' . $e->getMessage());
+			Minz_Request::bad(_t('feedback.extensions.enable.ko', $ext_name, _url('index', 'logs')), ['c' => 'extension', 'a' => 'index']);
+		}
 	}
 
 	/**

+ 6 - 0
lib/Minz/Extension.php

@@ -91,6 +91,10 @@ abstract class Minz_Extension {
 		$this->is_enabled = true;
 	}
 
+	final public function disable(): void {
+		$this->is_enabled = false;
+	}
+
 	/**
 	 * Return if the extension is currently enabled.
 	 *
@@ -253,6 +257,8 @@ abstract class Minz_Extension {
 		switch ($type) {
 			case 'system': return FreshRSS_Context::hasSystemConf();
 			case 'user': return FreshRSS_Context::hasUserConf();
+			default:
+				return false;
 		}
 	}
 

+ 7 - 1
lib/Minz/ExtensionManager.php

@@ -268,7 +268,13 @@ final class Minz_ExtensionManager {
 				spl_autoload_register([$ext, 'autoload']);
 			}
 			$ext->enable();
-			$ext->init();
+			try {
+				$ext->init();
+			} catch (Minz_Exception $e) {	// @phpstan-ignore catch.neverThrown (Thrown by extensions)
+				Minz_Log::warning('Error while enabling extension ' . $ext->getName() . ': ' . $e->getMessage());
+				$ext->disable();
+				unset(self::$ext_list_enabled[$ext_name]);
+			}
 		}
 	}