From 2022adfbfbdaeaa690e87de36f6ea7758a4ffa30 Mon Sep 17 00:00:00 2001 From: ralf Date: Thu, 3 Aug 2023 13:58:51 +0200 Subject: [PATCH] be more verbose on errors and return full Sieve script text (for user/password, not for admin connection) --- api/src/Mail/Script.php | 8 ++++++-- api/src/Mail/Sieve.php | 6 ++++++ mail/src/ApiHandler.php | 30 +++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/api/src/Mail/Script.php b/api/src/Mail/Script.php index a3cf885a86..51f136879e 100644 --- a/api/src/Mail/Script.php +++ b/api/src/Mail/Script.php @@ -183,7 +183,7 @@ class Script $this->pcount = $rule['priority']; } break; - case "vacation" : + case "vacation" : // #vacation&&1:days&&2:addresses&&3:text&&4:status/start-end&&5:forwards&&6:modus if (preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits) || preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits) || preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits)) { @@ -671,7 +671,11 @@ class Script $connection->installScript($this->name, $newscript, true); } catch (\Exception $e) { - if ($throw_exceptions) throw $e; + if ($throw_exceptions) + { + $e->script = $newscript; + throw $e; + } $this->errstr = 'updateScript: putscript failed: ' . $e->getMessage().($e->details?': '.$e->details:''); if ($regexused && !$this->extensions['regex']) $this->errstr .= " REGEX is not an supported CAPABILITY"; error_log(__METHOD__.__LINE__.' # Error: ->'.$this->errstr); diff --git a/api/src/Mail/Sieve.php b/api/src/Mail/Sieve.php index 8c2d3deada..0e491febc2 100644 --- a/api/src/Mail/Sieve.php +++ b/api/src/Mail/Sieve.php @@ -41,6 +41,11 @@ class Sieve extends Horde\ManageSieve */ var $scriptName; + /** + * @var string full Sieve script as text + */ + var $script; + /** * @var array $rules containing the rules */ @@ -219,6 +224,7 @@ class Sieve extends Horde\ManageSieve catch (\Exception $e) { unset($e); // ignore not found script exception } + $this->script =& $script->script; $this->rules =& $script->rules; $this->vacation =& $script->vacation; $this->emailNotification =& $script->emailNotification; // Added email notifications diff --git a/mail/src/ApiHandler.php b/mail/src/ApiHandler.php index 4c532cfb77..0c37240576 100644 --- a/mail/src/ApiHandler.php +++ b/mail/src/ApiHandler.php @@ -143,6 +143,23 @@ class ApiHandler extends Api\CalDAV\Handler } } + /** + * Get vacation array from server + * + * @param Api\Mail\Imap $imap + * @param ?int $user + * @return array + */ + protected static function getVacation(Api\Mail\Imap $imap, int $user=null) + { + if ($GLOBALS['egw']->session->token_auth) + { + return $imap->getVacationUser($user ?: $GLOBALS['egw_info']['user']['account_id']); + } + $sieve = new Api\Mail\Sieve($imap); + return $sieve->getVacation()+['script' => $sieve->script]; + } + /** * Update vacation message/handling with JSON data given in $content * @@ -159,7 +176,7 @@ class ApiHandler extends Api\CalDAV\Handler $vacation = $account->imapServer()->getVacationUser($user); if (!($update = json_decode($content, true, 3, JSON_THROW_ON_ERROR))) { - return throw new \Exeception('Invalid request: no content', 400); + throw new \Exeception('Invalid request: no content', 400); } // Sieve class stores them as timestamps foreach(['start', 'end'] as $name) @@ -218,7 +235,7 @@ class ApiHandler extends Api\CalDAV\Handler 'status' => 200, 'message' => 'Vacation handling updated', 'vacation_rule' => $vacation_rule, - 'vacation' => self::returnVacation($account->imapServer()->getVacationUser($user)), + 'vacation' => self::returnVacation(self::getVacation($account->imapServer(), $user)), ]), self::JSON_RESPONSE_OPTIONS); return true; } @@ -450,7 +467,7 @@ class ApiHandler extends Api\CalDAV\Handler case preg_match('#^/mail(/(\d+))?/vacation$#', $path, $matches) === 1: $account = self::getMailAccount($user, $matches[2] ?? null); - echo json_encode(self::returnVacation($account->imapServer()->getVacationUser($user)), self::JSON_RESPONSE_OPTIONS); + echo json_encode(self::returnVacation(self::getVacation($account->imapServer(), $user)), self::JSON_RESPONSE_OPTIONS); return true; } } @@ -463,14 +480,15 @@ class ApiHandler extends Api\CalDAV\Handler protected static function returnVacation(array $vacation) { return array_filter([ - 'status' => $vacation['status'], + 'status' => $vacation['status'] ?? 'off', 'start' => isset($vacation['start_date']) ? Api\DateTime::to($vacation['start_date'], 'Y-m-d') : null, 'end' => $vacation['end_date'] ? Api\DateTime::to($vacation['end_date'], 'Y-m-d') : null, - 'text' => $vacation['text'], + 'text' => $vacation['text'] ?? null, 'modus' => $vacation['modus'] ?? "notice+store", 'days' => (int)($vacation['days'] ?? 0), 'addresses' => $vacation['addresses'] ?? null, 'forwards' => empty($vacation['forwards']) ? [] : preg_split('/, ?/', $vacation['forwards']), + 'script' => $vacation['script'] ?? null, ]); } @@ -505,6 +523,8 @@ class ApiHandler extends Api\CalDAV\Handler echo json_encode([ 'error' => $code = $e->getCode() ?: 500, 'message' => $e->getMessage(), + 'details' => $e->details ?? null, + 'script' => $e->script ?? null, ]+(empty($GLOBALS['egw_info']['server']['exception_show_trace']) ? [] : [ 'trace' => array_map(static function($trace) {