diff --git a/include/errors/class_SimplePluginHookError.inc b/include/errors/class_SimplePluginHookError.inc new file mode 100644 index 0000000000000000000000000000000000000000..5941024c0736f9cdd8e2acccc9ed360ddb4b1056 --- /dev/null +++ b/include/errors/class_SimplePluginHookError.inc @@ -0,0 +1,88 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2019-2020 FusionDirectory + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/*! \class SimplePluginHookError + \brief Error returned by a hook called from SimplePlugin +*/ +class SimplePluginHookError extends SimplePluginError +{ + protected $hookType; + + public function __construct ($origin, string $type, string $output = '', int $code = 0, Throwable $previous = NULL) + { + $this->hookType = $type; + + parent::__construct($origin, htmlescape($output), $code, $previous); + } + + public function toArray (): array + { + $array = parent::toArray(); + + $array['hookType'] = $this->hookType; + $array['hookCode'] = $this->getCode(); + + return $array; + } + + public function computeMsgDialogParameters (): array + { + $html = ''; + + if (isset($this->object)) { + $html .= htmlescape($this->object->getBaseObject()->dn.' > '); + } + + if (isset($this->tab)) { + $html .= htmlescape($this->tab->parent->by_name[get_class($this->tab)].' > '); + } + + if (isset($this->attribute)) { + $label = $this->attribute->getLabel(); + if (empty($label)) { + $html .= '<i>'.htmlescape($this->attribute->getLdapName()).'</i>'; + } else { + $html .= htmlescape($label); + } + } + + $html .= '<br/><br/>'; + + $html .= htmlescape(sprintf(_('Trigger "%s" returned an error!'), $this->hookType)); + + $html .= '<br/><br/>'."\n"; + $html .= htmlescape(sprintf(_('Exit code: %d'), $this->getCode())).'<br/>'."\n"; + if (!empty($this->htmlMessage)) { + $html .= 'Result: '.$this->htmlMessage."\n"; + } + + $trace = $this->getTrace(); + + array_unshift( + $trace, + [ + 'file' => $this->getFile(), + 'line' => $this->getLine(), + ] + ); + + return [_('Error'), $html, ERROR_DIALOG, $trace]; + } +} diff --git a/include/errors/class_SimplePluginLdapError.inc b/include/errors/class_SimplePluginLdapError.inc index 001bd49ef2f63f04a0f21d4313c6843fb91f2a56..f66b040d43d13b0900c1f137284a0381448046bf 100644 --- a/include/errors/class_SimplePluginLdapError.inc +++ b/include/errors/class_SimplePluginLdapError.inc @@ -83,10 +83,10 @@ class SimplePluginLdapError extends SimplePluginError } if (!empty($this->dn)) { - $html .= '<br/><br/><i>'.htmlescape(_('Object')).':</i> '.htmlescape($this->dn); + $html .= '<br/><br/><i>'.htmlescape(_('Object:')).'</i> '.htmlescape($this->dn); } - $html .= '<br/><br/><i>'.htmlescape(_('Error')).':</i> '.$this->htmlMessage; + $html .= '<br/><br/><i>'.htmlescape(_('Error:')).'</i> '.$this->htmlMessage; $trace = $this->getTrace(); diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc index d89ac97d5df35e86512c3a7efffbb13de32cff7c..b05acf8e0e42c2a54e7e46cebe8208cab22074f8 100644 --- a/include/simpleplugin/class_simplePlugin.inc +++ b/include/simpleplugin/class_simplePlugin.inc @@ -1366,7 +1366,7 @@ class simplePlugin implements SimpleTab return []; } - protected function pre_save () + protected function pre_save (): array { if ($this->initially_was_account) { return $this->handle_pre_events('modify', ['modifiedLdapAttrs' => array_keys($this->attrs)]); @@ -1453,7 +1453,7 @@ class simplePlugin implements SimpleTab * * \param array $addAttrs */ - protected function handle_hooks (string $when, string $mode, array $addAttrs = []) + protected function handle_hooks (string $when, string $mode, array $addAttrs = []): array { switch ($mode) { case 'add': @@ -1467,6 +1467,7 @@ class simplePlugin implements SimpleTab default: trigger_error(sprintf('Invalid %s event type given: "%s"! Valid types are: add, modify, remove.', strtolower($when), $mode)); + return []; break; } } @@ -1489,7 +1490,7 @@ class simplePlugin implements SimpleTab * \brief Forward command execution requests * to the pre hook execution method. */ - function handle_pre_events (string $mode, array $addAttrs = []) + function handle_pre_events (string $mode, array $addAttrs = []): array { global $config; @@ -1565,13 +1566,12 @@ class simplePlugin implements SimpleTab $str = implode("\n", $arr); logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Execution failed code: '.$returnCode); logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Output: '.$str); - $message = msgPool::cmdexecfailed($cmd, '', get_class($this)); - $message .= '<br/><br/>'."\n"; - $message .= 'Exit code: '.$returnCode.'<br/>'."\n"; - if (!empty($str)) { - $message .= 'Result: '.$str."\n"; - } - $messages[] = $message; + $messages[] = new SimplePluginHookError( + $this, + $cmd, + $str, + $returnCode + ); } elseif (is_array($arr)) { $str = implode("\n", $arr); logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Output: '.$str);