be more verbose on errors and return full Sieve script text (for user/password, not for admin connection)

This commit is contained in:
ralf 2023-08-03 13:58:51 +02:00
parent da49ce2924
commit 2022adfbfb
3 changed files with 37 additions and 7 deletions

View File

@ -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);

View File

@ -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

View File

@ -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)
{