diff --git a/plugins/README.md b/plugins/README.md index bccac3c13..850f18234 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -240,6 +240,25 @@ $Plugin->addHook('hook.name', 'functionName'); \RainLoop\Model\Account $oAccount array &$aCache +## Json service actions +Called by RainLoop\ServiceActions::ServiceJson() + +### json.before-{actionname} + params: none + +### json.after-{actionname} + params: + array &$aResponse + +### json.action-post-call + Obsolete, use json.after-{actionname} + +### json.action-pre-call + Obsolete, use json.before-{actionname} + +### filter.json-response + Obsolete, use json.after-{actionname} + ## Others ### filter.account @@ -285,11 +304,6 @@ $Plugin->addHook('hook.name', 'functionName'); params: array &$aPaths -### filter.json-response - params: - string $sAction - array &$aResponseItem - ### filter.message-html params: \RainLoop\Model\Account $oAccount @@ -368,16 +382,7 @@ $Plugin->addHook('hook.name', 'functionName'); ### filter.upload-response params: - array &$aResponseItem - -### json.action-post-call - params: - string $sAction - array &$aResponseItem - -### json.action-pre-call - params: - string $sAction + array &$aResponse ### json.attachments params: @@ -413,7 +418,7 @@ $Plugin->addHook('hook.name', 'functionName'); ### main.default-response params: string $sActionName - array &$aResponseItem + array &$aResponse ### main.default-response-data params: diff --git a/plugins/avatars/index.php b/plugins/avatars/index.php index f678000e6..c63388d76 100644 --- a/plugins/avatars/index.php +++ b/plugins/avatars/index.php @@ -7,8 +7,8 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin AUTHOR = 'SnappyMail', URL = 'https://snappymail.eu/', VERSION = '1.4', - RELEASE = '2022-12-07', - REQUIRED = '2.22.4', + RELEASE = '2022-12-08', + REQUIRED = '2.23', CATEGORY = 'Contacts', LICENSE = 'MIT', DESCRIPTION = 'Show photo of sender in message and messages list (supports BIMI, Gravatar and identicon, Contacts is still TODO)'; @@ -25,20 +25,26 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin } // https://github.com/the-djmaze/snappymail/issues/714 if ($this->Config()->Get('plugin', 'service', true) || !$this->Config()->Get('plugin', 'delay', true)) { - $this->addHook('filter.json-response', 'FilterJsonResponse'); + $this->addHook('json.after-message', 'JsonMessage'); + $this->addHook('json.after-messagelist', 'JsonMessageList'); } } - public function FilterJsonResponse(string $sAction, array &$aResponseItem) + public function JsonMessage(array &$aResponse) { - if ('MessageList' === $sAction && !empty($aResponseItem['Result']['@Collection'])) { - foreach ($aResponseItem['Result']['@Collection'] as $id => $message) { + if (!empty($aResponse['Result']['From'])) { + $aResponse['Result']['Avatar'] = $this->encryptFrom($aResponse['Result']['From'][0]); + } + } + + public function JsonMessageList(array &$aResponse) + { + if (!empty($aResponse['Result']['@Collection'])) { + foreach ($aResponse['Result']['@Collection'] as $id => $message) { if (!empty($message['From'])) { - $aResponseItem['Result']['@Collection'][$id]['Avatar'] = $this->encryptFrom($message['From'][0]); + $aResponse['Result']['@Collection'][$id]['Avatar'] = $this->encryptFrom($message['From'][0]); } } - } else if ('Message' === $sAction && !empty($aResponseItem['Result']['From'])) { - $aResponseItem['Result']['Avatar'] = $this->encryptFrom($aResponseItem['Result']['From'][0]); } } diff --git a/plugins/demo-account/index.php b/plugins/demo-account/index.php index 1645fdc6b..ba4d788ce 100644 --- a/plugins/demo-account/index.php +++ b/plugins/demo-account/index.php @@ -5,7 +5,7 @@ class DemoAccountPlugin extends \RainLoop\Plugins\AbstractPlugin const NAME = 'Demo Account Extension', CATEGORY = 'Login', - REQUIRED = '2.14.0', + REQUIRED = '2.23', DESCRIPTION = 'Extension to enable a demo account'; /** @@ -15,7 +15,7 @@ class DemoAccountPlugin extends \RainLoop\Plugins\AbstractPlugin { $this->addHook('filter.app-data', 'FilterAppData'); $this->addHook('filter.action-params', 'FilterActionParams'); - $this->addHook('json.action-pre-call', 'JsonActionPreCall'); + $this->addHook('json.before-accountsetup', 'BeforeAccountSetup'); $this->addHook('filter.send-message', 'FilterSendMessage'); $this->addHook('main.fabrica', 'MainFabrica'); } @@ -78,11 +78,9 @@ class DemoAccountPlugin extends \RainLoop\Plugins\AbstractPlugin return ($oAccount && $oAccount->Email() === $this->Config()->Get('plugin', 'email')); } - public function JsonActionPreCall($sAction) + public function BeforeAccountSetup() { - if ('AccountSetup' === $sAction && $this->isDemoAccount()) { - throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DemoAccountError); - } + throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::DemoAccountError); } public function FilterSendMessage($oMessage) diff --git a/plugins/recaptcha/index.php b/plugins/recaptcha/index.php index a0fd55ffe..2aa978a17 100644 --- a/plugins/recaptcha/index.php +++ b/plugins/recaptcha/index.php @@ -6,9 +6,9 @@ class RecaptchaPlugin extends \RainLoop\Plugins\AbstractPlugin NAME = 'reCaptcha', AUTHOR = 'SnappyMail', URL = 'https://snappymail.eu/', - VERSION = '2.12.1', - RELEASE = '2022-02-14', - REQUIRED = '2.12.1', + VERSION = '2.13', + RELEASE = '2022-12-08', + REQUIRED = '2.23', CATEGORY = 'General', LICENSE = 'MIT', DESCRIPTION = 'A CAPTCHA (v2) is a program that can generate and grade tests that humans can pass but current computer programs cannot. For example, humans can read distorted text as the one shown below, but current computer programs can\'t. More info at https://developers.google.com/recaptcha'; @@ -22,8 +22,8 @@ class RecaptchaPlugin extends \RainLoop\Plugins\AbstractPlugin $this->addJs('js/recaptcha.js'); - $this->addHook('json.action-pre-call', 'AjaxActionPreCall'); - $this->addHook('filter.json-response', 'FilterAjaxResponse'); + $this->addHook('json.before-login', 'BeforeLogin'); + $this->addHook('json.after-login', 'AfterLogin'); $this->addHook('main.content-security-policy', 'ContentSecurityPolicy'); } @@ -82,12 +82,9 @@ class RecaptchaPlugin extends \RainLoop\Plugins\AbstractPlugin } } - /** - * @param string $sAction - */ - public function AjaxActionPreCall(string $sAction) + public function BeforeLogin() { - if ('Login' === $sAction && 0 >= $this->getLimit()) { + if (0 >= $this->getLimit()) { $bResult = false; $HTTP = \SnappyMail\HTTP\Request::factory(); @@ -112,18 +109,18 @@ class RecaptchaPlugin extends \RainLoop\Plugins\AbstractPlugin /** * @param string $sAction - * @param array $aResponseItem + * @param array $aResponse */ - public function FilterAjaxResponse(string $sAction, array &$aResponseItem) + public function AfterLogin(array &$aResponse) { - if ('Login' === $sAction && $aResponseItem && isset($aResponseItem['Result'])) { + if (isset($aResponse['Result'])) { $oCacher = $this->Manager()->Actions()->Cacher(); $iConfigLimit = (int) $this->Config()->Get('plugin', 'error_limit', 0); $sKey = $this->getCaptchaCacherKey(); if (0 < $iConfigLimit && $oCacher && $oCacher->IsInited()) { - if (false === $aResponseItem['Result']) { + if (false === $aResponse['Result']) { $iLimit = 0; $sLimut = $oCacher->Get($sKey); if (\strlen($sLimut) && \is_numeric($sLimut)) { @@ -133,7 +130,7 @@ class RecaptchaPlugin extends \RainLoop\Plugins\AbstractPlugin $oCacher->Set($sKey, ++$iLimit); if ($iConfigLimit <= $iLimit) { - $aResponseItem['Captcha'] = true; + $aResponse['Captcha'] = true; } } else { $oCacher->Delete($sKey); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/Manager.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/Manager.php index 7ee9c6ca9..e490e78c7 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/Manager.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Plugins/Manager.php @@ -9,7 +9,7 @@ class Manager */ private $oActions; - private + private array $aHooks = array(), $aCss = array([], []), $aJs = array([], []), @@ -19,10 +19,7 @@ class Manager $aAdditionalJson = array(), $aPlugins = array(); - /** - * @var bool - */ - private $bIsEnabled; + private bool $bIsEnabled; /** * @var \MailSo\Log\Logger @@ -284,16 +281,13 @@ class Manager */ public function AddHook(string $sHookName, $mCallbak) : self { - if ($this->bIsEnabled && \is_callable($mCallbak)) - { - if (!isset($this->aHooks[$sHookName])) - { + if ($this->bIsEnabled && \is_callable($mCallbak)) { + $sHookName = \strtolower($sHookName); + if (!isset($this->aHooks[$sHookName])) { $this->aHooks[$sHookName] = array(); } - $this->aHooks[$sHookName][] = $mCallbak; } - return $this; } @@ -333,22 +327,17 @@ class Manager public function RunHook(string $sHookName, array $aArg = array(), bool $bLogHook = true) : self { - if ($this->bIsEnabled) - { - if (isset($this->aHooks[$sHookName])) - { - if ($bLogHook) - { + if ($this->bIsEnabled) { + $sHookName = \strtolower($sHookName); + if (isset($this->aHooks[$sHookName])) { + if ($bLogHook) { $this->WriteLog('Hook: '.$sHookName, \LOG_INFO); } - - foreach ($this->aHooks[$sHookName] as $mCallback) - { + foreach ($this->aHooks[$sHookName] as $mCallback) { $mCallback(...$aArg); } } } - return $this; } diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index 18a6e13f6..82a3e12bb 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -88,7 +88,7 @@ class ServiceActions { \ob_start(); - $aResponseItem = null; + $aResponse = null; $oException = null; $_POST = \json_decode(\file_get_contents('php://input'), true); @@ -151,20 +151,20 @@ class ServiceActions if (\method_exists($this->oActions, $sMethodName) && \is_callable(array($this->oActions, $sMethodName))) { - $sAction && $this->Plugins()->RunHook('json.action-pre-call', array($sAction)); - $aResponseItem = $this->oActions->{$sMethodName}(); - $sAction && $this->Plugins()->RunHook('json.action-post-call', array($sAction, &$aResponseItem)); + $sAction && $this->Plugins()->RunHook("json.before-{$sAction}"); + $aResponse = $this->oActions->{$sMethodName}(); } else if ($this->Plugins()->HasAdditionalJson($sMethodName)) { - $sAction && $this->Plugins()->RunHook('json.action-pre-call', array($sAction)); - $aResponseItem = $this->Plugins()->RunAdditionalJson($sMethodName); - $sAction && $this->Plugins()->RunHook('json.action-post-call', array($sAction, &$aResponseItem)); + $sAction && $this->Plugins()->RunHook("json.before-{$sAction}"); + $aResponse = $this->Plugins()->RunAdditionalJson($sMethodName); + } + if ($sAction && \is_array($aResponse)) { + $this->Plugins()->RunHook("json.after-{$sAction}", array(&$aResponse)); } } - if (!\is_array($aResponseItem)) - { + if (!\is_array($aResponse)) { throw new Exceptions\ClientException(Notifications::UnknownError); } } @@ -175,22 +175,19 @@ class ServiceActions \SnappyMail\Log::warning('SERVICE', "- {$e->getMessage()} @ {$e->getFile()}#{$e->getLine()}"); } - $aResponseItem = $this->oActions->ExceptionResponse( + $aResponse = $this->oActions->ExceptionResponse( empty($sAction) ? 'Unknown' : $sAction, $oException); } - if (\is_array($aResponseItem)) - { - $aResponseItem['Time'] = (int) ((\microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000); + if (\is_array($aResponse)) { + $aResponse['Time'] = (int) ((\microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000); } - $sAction && $this->Plugins()->RunHook('filter.json-response', array($sAction, &$aResponseItem)); - if (!\headers_sent()) { \header('Content-Type: application/json; charset=utf-8'); } - $sResult = Utils::jsonEncode($aResponseItem); + $sResult = Utils::jsonEncode($aResponse); $sObResult = \ob_get_clean(); @@ -257,7 +254,7 @@ class ServiceActions $oConfig = $this->Config(); \ob_start(); - $aResponseItem = null; + $aResponse = null; try { $aFile = null; @@ -301,27 +298,26 @@ class ServiceActions $this->oActions->SetActionParams($aActionParams, $sAction); - $aResponseItem = $this->oActions->{$sAction}(); + $aResponse = $this->oActions->{$sAction}(); } - if (!is_array($aResponseItem)) - { + if (!is_array($aResponse)) { throw new Exceptions\ClientException(Notifications::UnknownError); } + + $this->Plugins()->RunHook('filter.upload-response', array(&$aResponse)); } catch (\Throwable $oException) { - $aResponseItem = $this->oActions->ExceptionResponse($sAction, $oException); + $aResponse = $this->oActions->ExceptionResponse($sAction, $oException); } \header('Content-Type: application/json; charset=utf-8'); - $this->Plugins()->RunHook('filter.upload-response', array(&$aResponseItem)); - $sResult = Utils::jsonEncode($aResponseItem); + $sResult = Utils::jsonEncode($aResponse); $sObResult = \ob_get_clean(); - if (\strlen($sObResult)) - { + if (\strlen($sObResult)) { $this->Logger()->Write($sObResult, \LOG_ERR, 'OB-DATA'); }