aboutsummaryrefslogtreecommitdiffhomepage
path: root/application
diff options
context:
space:
mode:
authorArthurHoaro <arthur@hoa.ro>2020-08-27 12:04:36 +0200
committerArthurHoaro <arthur@hoa.ro>2020-08-27 12:04:36 +0200
commit7e3dc0ba98bf019c2804e5c74fb6061b16fb712f (patch)
treef0a333e9e009d78d59c1e4823f766625bc2bb255 /application
parentaf41d5ab5d2bd3ba64d052c997bc6afa6966a63c (diff)
downloadShaarli-7e3dc0ba98bf019c2804e5c74fb6061b16fb712f.tar.gz
Shaarli-7e3dc0ba98bf019c2804e5c74fb6061b16fb712f.tar.zst
Shaarli-7e3dc0ba98bf019c2804e5c74fb6061b16fb712f.zip
Better handling of plugin incompatibility
If a PHP is raised while executing plugin hook, Shaarli will display an error instead of rendering the error page (or just ending in fatal error for default hooks). Also added phpErrorHandler which is handled differently that regular errorHandler by Slim.:
Diffstat (limited to 'application')
-rw-r--r--application/container/ContainerBuilder.php3
-rw-r--r--application/container/ShaarliContainer.php4
-rw-r--r--application/front/controller/visitor/ShaarliVisitorController.php3
-rw-r--r--application/plugin/PluginManager.php7
4 files changed, 13 insertions, 4 deletions
diff --git a/application/container/ContainerBuilder.php b/application/container/ContainerBuilder.php
index 4a1a6ea7..58067c99 100644
--- a/application/container/ContainerBuilder.php
+++ b/application/container/ContainerBuilder.php
@@ -152,6 +152,9 @@ class ContainerBuilder
152 $container['errorHandler'] = function (ShaarliContainer $container): ErrorController { 152 $container['errorHandler'] = function (ShaarliContainer $container): ErrorController {
153 return new ErrorController($container); 153 return new ErrorController($container);
154 }; 154 };
155 $container['phpErrorHandler'] = function (ShaarliContainer $container): ErrorController {
156 return new ErrorController($container);
157 };
155 158
156 return $container; 159 return $container;
157 } 160 }
diff --git a/application/container/ShaarliContainer.php b/application/container/ShaarliContainer.php
index c4fe753e..9a9a974a 100644
--- a/application/container/ShaarliContainer.php
+++ b/application/container/ShaarliContainer.php
@@ -4,7 +4,6 @@ declare(strict_types=1);
4 4
5namespace Shaarli\Container; 5namespace Shaarli\Container;
6 6
7use http\Cookie;
8use Shaarli\Bookmark\BookmarkServiceInterface; 7use Shaarli\Bookmark\BookmarkServiceInterface;
9use Shaarli\Config\ConfigManager; 8use Shaarli\Config\ConfigManager;
10use Shaarli\Feed\FeedBuilder; 9use Shaarli\Feed\FeedBuilder;
@@ -30,7 +29,7 @@ use Slim\Container;
30 * @property CookieManager $cookieManager 29 * @property CookieManager $cookieManager
31 * @property ConfigManager $conf 30 * @property ConfigManager $conf
32 * @property mixed[] $environment $_SERVER automatically injected by Slim 31 * @property mixed[] $environment $_SERVER automatically injected by Slim
33 * @property callable $errorHandler Overrides default Slim error display 32 * @property callable $errorHandler Overrides default Slim exception display
34 * @property FeedBuilder $feedBuilder 33 * @property FeedBuilder $feedBuilder
35 * @property FormatterFactory $formatterFactory 34 * @property FormatterFactory $formatterFactory
36 * @property History $history 35 * @property History $history
@@ -39,6 +38,7 @@ use Slim\Container;
39 * @property NetscapeBookmarkUtils $netscapeBookmarkUtils 38 * @property NetscapeBookmarkUtils $netscapeBookmarkUtils
40 * @property PageBuilder $pageBuilder 39 * @property PageBuilder $pageBuilder
41 * @property PageCacheManager $pageCacheManager 40 * @property PageCacheManager $pageCacheManager
41 * @property callable $phpErrorHandler Overrides default Slim PHP error display
42 * @property PluginManager $pluginManager 42 * @property PluginManager $pluginManager
43 * @property SessionManager $sessionManager 43 * @property SessionManager $sessionManager
44 * @property Thumbnailer $thumbnailer 44 * @property Thumbnailer $thumbnailer
diff --git a/application/front/controller/visitor/ShaarliVisitorController.php b/application/front/controller/visitor/ShaarliVisitorController.php
index 47057d97..f17c8ed3 100644
--- a/application/front/controller/visitor/ShaarliVisitorController.php
+++ b/application/front/controller/visitor/ShaarliVisitorController.php
@@ -58,10 +58,11 @@ abstract class ShaarliVisitorController
58 { 58 {
59 $this->assignView('linkcount', $this->container->bookmarkService->count(BookmarkFilter::$ALL)); 59 $this->assignView('linkcount', $this->container->bookmarkService->count(BookmarkFilter::$ALL));
60 $this->assignView('privateLinkcount', $this->container->bookmarkService->count(BookmarkFilter::$PRIVATE)); 60 $this->assignView('privateLinkcount', $this->container->bookmarkService->count(BookmarkFilter::$PRIVATE));
61 $this->assignView('plugin_errors', $this->container->pluginManager->getErrors());
62 61
63 $this->executeDefaultHooks($template); 62 $this->executeDefaultHooks($template);
64 63
64 $this->assignView('plugin_errors', $this->container->pluginManager->getErrors());
65
65 return $this->container->pageBuilder->render($template, $this->container->basePath); 66 return $this->container->pageBuilder->render($template, $this->container->basePath);
66 } 67 }
67 68
diff --git a/application/plugin/PluginManager.php b/application/plugin/PluginManager.php
index b3e8b2f8..2d93cb3a 100644
--- a/application/plugin/PluginManager.php
+++ b/application/plugin/PluginManager.php
@@ -116,7 +116,12 @@ class PluginManager
116 $hookFunction = $this->buildHookName($hook, $plugin); 116 $hookFunction = $this->buildHookName($hook, $plugin);
117 117
118 if (function_exists($hookFunction)) { 118 if (function_exists($hookFunction)) {
119 $data = call_user_func($hookFunction, $data, $this->conf); 119 try {
120 $data = call_user_func($hookFunction, $data, $this->conf);
121 } catch (\Throwable $e) {
122 $error = $plugin . t(' [plugin incompatibility]: ') . $e->getMessage();
123 $this->errors = array_unique(array_merge($this->errors, [$error]));
124 }
120 } 125 }
121 } 126 }
122 } 127 }