Convert some abstract enumeration classes to PHP 8.1+ (Backed)Enum

This commit is contained in:
the-djmaze 2026-11-02 02:13:15 +01:00
parent a5592108a5
commit 5d43aeef0b
15 changed files with 66 additions and 76 deletions

View file

@ -2,6 +2,8 @@
namespace OCA\SnappyMail\Util; namespace OCA\SnappyMail\Util;
use RainLoop\Enumerations\SignMeType;
class SnappyMailResponse extends \OCP\AppFramework\Http\Response class SnappyMailResponse extends \OCP\AppFramework\Http\Response
{ {
public function render(): string public function render(): string
@ -184,7 +186,7 @@ class SnappyMailHelper
try { try {
$oAccount = $oActions->LoginProcess($aCredentials[1], $aCredentials[2]); $oAccount = $oActions->LoginProcess($aCredentials[1], $aCredentials[2]);
if (!$isOIDC && $oAccount if (!$isOIDC && $oAccount
&& $oConfig->Get('login', 'sign_me_auto', \RainLoop\Enumerations\SignMeType::DefaultOff) === \RainLoop\Enumerations\SignMeType::DefaultOn && $oConfig->Get('login', 'sign_me_auto', SignMeType::DefaultOff->value) === SignMeType::DefaultOn->value
) { ) {
$oActions->SetSignMeToken($oAccount); $oActions->SetSignMeToken($oAccount);
} }

View file

@ -354,11 +354,10 @@ trait Messages
* @throws \MailSo\RuntimeException * @throws \MailSo\RuntimeException
* @throws \MailSo\Net\Exceptions\* * @throws \MailSo\Net\Exceptions\*
* @throws \MailSo\Imap\Exceptions\* * @throws \MailSo\Imap\Exceptions\*
* $sStoreAction = \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT
*/ */
public function MessageStoreFlag(SequenceSet $oRange, array $aInputStoreItems, string $sStoreAction) : ?ResponseCollection public function MessageStoreFlag(SequenceSet $oRange, array $aInputStoreItems, StoreAction $eStoreAction) : ?ResponseCollection
{ {
if (!\count($oRange) || !\strlen(\trim($sStoreAction)) || !\count($aInputStoreItems)) { if (!\count($oRange) || !\count($aInputStoreItems)) {
return null; return null;
} }
@ -372,7 +371,7 @@ trait Messages
return $this->SendRequestGetResponse( return $this->SendRequestGetResponse(
$oRange->UID ? 'UID STORE' : 'STORE', $oRange->UID ? 'UID STORE' : 'STORE',
array((string) $oRange, $sStoreAction, $aInputStoreItems) array((string) $oRange, $eStoreAction->value, $aInputStoreItems)
); );
} }

View file

@ -16,10 +16,10 @@ namespace MailSo\Imap\Enumerations;
* @package Imap * @package Imap
* @subpackage Enumerations * @subpackage Enumerations
*/ */
abstract class ResponseType enum ResponseType
{ {
const UNKNOWN = 0; case UNKNOWN;
const TAGGED = 1; case TAGGED;
const UNTAGGED = 2; case UNTAGGED;
const CONTINUATION = 3; case CONTINUATION;
} }

View file

@ -16,12 +16,12 @@ namespace MailSo\Imap\Enumerations;
* @package Imap * @package Imap
* @subpackage Enumerations * @subpackage Enumerations
*/ */
abstract class StoreAction enum StoreAction: string
{ {
// const SET_FLAGS = 'FLAGS'; // case SET_FLAGS = 'FLAGS';
// const SET_FLAGS_SILENT = 'FLAGS.SILENT'; // case SET_FLAGS_SILENT = 'FLAGS.SILENT';
const ADD_FLAGS = '+FLAGS'; case ADD_FLAGS = '+FLAGS';
const ADD_FLAGS_SILENT = '+FLAGS.SILENT'; case ADD_FLAGS_SILENT = '+FLAGS.SILENT';
const REMOVE_FLAGS = '-FLAGS'; case REMOVE_FLAGS = '-FLAGS';
const REMOVE_FLAGS_SILENT = '-FLAGS.SILENT'; case REMOVE_FLAGS_SILENT = '-FLAGS.SILENT';
} }

View file

@ -12,6 +12,7 @@
namespace MailSo\Imap; namespace MailSo\Imap;
use MailSo\Net\Enumerations\ConnectionSecurityType; use MailSo\Net\Enumerations\ConnectionSecurityType;
use MailSo\Imap\Enumerations\ResponseType;
/** /**
* @category MailSo * @category MailSo
@ -147,7 +148,7 @@ class ImapClient extends \MailSo\Net\NetClient
if ('CRAM-MD5' === $type) if ('CRAM-MD5' === $type)
{ {
$oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type)); $oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type));
$sChallenge = $this->getResponseValue($oResponse, Enumerations\ResponseType::CONTINUATION); $sChallenge = $this->getResponseValue($oResponse, ResponseType::CONTINUATION);
$sAuth = $SASL->authenticate($sLogin, $sPassword, $sChallenge); $sAuth = $SASL->authenticate($sLogin, $sPassword, $sChallenge);
$this->logMask($sAuth); $this->logMask($sAuth);
$this->sendRaw($sAuth); $this->sendRaw($sAuth);
@ -164,13 +165,13 @@ class ImapClient extends \MailSo\Net\NetClient
$this->sendRaw($sAuth); $this->sendRaw($sAuth);
} }
$oResponse = $this->getResponse(); $oResponse = $this->getResponse();
// if ($oResponse->getLast()->ResponseType === Enumerations\ResponseType::CONTINUATION) // if ($oResponse->getLast()->ResponseType === ResponseType::CONTINUATION)
if ($SASL->hasChallenge()) { if ($SASL->hasChallenge()) {
$sChallenge = $SASL->challenge($this->getResponseValue($oResponse, Enumerations\ResponseType::CONTINUATION)); $sChallenge = $SASL->challenge($this->getResponseValue($oResponse, ResponseType::CONTINUATION));
$this->logMask($sChallenge); $this->logMask($sChallenge);
$this->sendRaw($sChallenge); $this->sendRaw($sChallenge);
$oResponse = $this->getResponse(); $oResponse = $this->getResponse();
$SASL->verify($this->getResponseValue($oResponse, Enumerations\ResponseType::CONTINUATION)); $SASL->verify($this->getResponseValue($oResponse, ResponseType::CONTINUATION));
$this->sendRaw(''); $this->sendRaw('');
$oResponse = $this->getResponse(); $oResponse = $this->getResponse();
} }
@ -181,7 +182,7 @@ class ImapClient extends \MailSo\Net\NetClient
$this->logMask($sAuth); $this->logMask($sAuth);
$oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type, $sAuth)); $oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type, $sAuth));
$oR = $oResponse->getLast(); $oR = $oResponse->getLast();
if ($oR && Enumerations\ResponseType::CONTINUATION === $oR->ResponseType) { if ($oR && ResponseType::CONTINUATION === $oR->ResponseType) {
if (!empty($oR->ResponseList[1]) && \preg_match('/^[a-zA-Z0-9=+\/]+$/', $oR->ResponseList[1])) { if (!empty($oR->ResponseList[1]) && \preg_match('/^[a-zA-Z0-9=+\/]+$/', $oR->ResponseList[1])) {
$this->logWrite(\base64_decode($oR->ResponseList[1]), \LOG_WARNING); $this->logWrite(\base64_decode($oR->ResponseList[1]), \LOG_WARNING);
} }
@ -192,7 +193,7 @@ class ImapClient extends \MailSo\Net\NetClient
else if ($this->hasCapability('LOGINDISABLED')) else if ($this->hasCapability('LOGINDISABLED'))
{ {
$oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type)); $oResponse = $this->SendRequestGetResponse('AUTHENTICATE', array($type));
$sB64 = $this->getResponseValue($oResponse, Enumerations\ResponseType::CONTINUATION); $sB64 = $this->getResponseValue($oResponse, ResponseType::CONTINUATION);
$sAuth = $SASL->authenticate($sLogin, $sPassword, $sB64); $sAuth = $SASL->authenticate($sLogin, $sPassword, $sB64);
$this->logMask($sAuth); $this->logMask($sAuth);
$this->sendRaw($sAuth, true); $this->sendRaw($sAuth, true);
@ -363,7 +364,7 @@ class ImapClient extends \MailSo\Net\NetClient
try { try {
$oResponseCollection = $this->SendRequestGetResponse('NAMESPACE'); $oResponseCollection = $this->SendRequestGetResponse('NAMESPACE');
foreach ($oResponseCollection as $oResponse) { foreach ($oResponseCollection as $oResponse) {
if (Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType if (ResponseType::UNTAGGED === $oResponse->ResponseType
&& 'NAMESPACE' === $oResponse->StatusOrIndex) && 'NAMESPACE' === $oResponse->StatusOrIndex)
{ {
return new NamespaceResult($oResponse); return new NamespaceResult($oResponse);
@ -444,10 +445,10 @@ class ImapClient extends \MailSo\Net\NetClient
return $this->getResponse(); return $this->getResponse();
} }
protected function getResponseValue(ResponseCollection $oResponseCollection, int $type = 0): string protected function getResponseValue(ResponseCollection $oResponseCollection, ResponseType $type): string
{ {
$oResponse = $oResponseCollection->getLast(); $oResponse = $oResponseCollection->getLast();
if ($oResponse && (!$type || $type === $oResponse->ResponseType)) { if ($oResponse && ($type === ResponseType::UNKNOWN || $type === $oResponse->ResponseType)) {
$sResult = $oResponse->ResponseList[1] ?? null; $sResult = $oResponse->ResponseList[1] ?? null;
if ($sResult) { if ($sResult) {
return $sResult; return $sResult;
@ -501,7 +502,7 @@ class ImapClient extends \MailSo\Net\NetClient
$oResult->append($oResponse); $oResult->append($oResponse);
if ($oResponse->IsStatusResponse if ($oResponse->IsStatusResponse
&& Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType && ResponseType::UNTAGGED === $oResponse->ResponseType
&& Enumerations\ResponseStatus::PREAUTH === $oResponse->StatusOrIndex && Enumerations\ResponseStatus::PREAUTH === $oResponse->StatusOrIndex
// && (Enumerations\ResponseStatus::PREAUTH === $oResponse->StatusOrIndex || Enumerations\ResponseStatus::BYE === $oResponse->StatusOrIndex) // && (Enumerations\ResponseStatus::PREAUTH === $oResponse->StatusOrIndex || Enumerations\ResponseStatus::BYE === $oResponse->StatusOrIndex)
) { ) {
@ -514,7 +515,7 @@ class ImapClient extends \MailSo\Net\NetClient
// \SnappyMail\Log::warning('IMAP', "{$oResponse->OptionalResponse[0]}: {$this->lastCommand}"); // \SnappyMail\Log::warning('IMAP', "{$oResponse->OptionalResponse[0]}: {$this->lastCommand}");
} }
if ($sEndTag === $oResponse->Tag || Enumerations\ResponseType::CONTINUATION === $oResponse->ResponseType) { if ($sEndTag === $oResponse->Tag || ResponseType::CONTINUATION === $oResponse->ResponseType) {
if (isset($this->aTagTimeouts[$sEndTag])) { if (isset($this->aTagTimeouts[$sEndTag])) {
$this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', \LOG_DEBUG); $this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', \LOG_DEBUG);
@ -546,7 +547,7 @@ class ImapClient extends \MailSo\Net\NetClient
while (true) { while (true) {
$oResponse = $this->partialParseResponse(); $oResponse = $this->partialParseResponse();
if (Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType) { if (ResponseType::UNTAGGED === $oResponse->ResponseType) {
yield $oResponse; yield $oResponse;
} else { } else {
$oResult->append($oResponse); $oResult->append($oResponse);
@ -558,7 +559,7 @@ class ImapClient extends \MailSo\Net\NetClient
// \SnappyMail\Log::warning('IMAP', "{$oResponse->OptionalResponse[0]}: {$this->lastCommand}"); // \SnappyMail\Log::warning('IMAP', "{$oResponse->OptionalResponse[0]}: {$this->lastCommand}");
} }
if ($sEndTag === $oResponse->Tag || Enumerations\ResponseType::CONTINUATION === $oResponse->ResponseType) { if ($sEndTag === $oResponse->Tag || ResponseType::CONTINUATION === $oResponse->ResponseType) {
if (isset($this->aTagTimeouts[$sEndTag])) { if (isset($this->aTagTimeouts[$sEndTag])) {
$this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', \LOG_DEBUG); $this->writeLog((\microtime(true) - $this->aTagTimeouts[$sEndTag]).' ('.$sEndTag.')', \LOG_DEBUG);

View file

@ -29,7 +29,7 @@ class Response
public bool $IsStatusResponse = false; public bool $IsStatusResponse = false;
public int $ResponseType = 0; public ResponseType $ResponseType = ResponseType::UNKNOWN;
public ?string $Tag = null; public ?string $Tag = null;

View file

@ -119,8 +119,8 @@ class MailClient
{ {
if (\count($oRange)) { if (\count($oRange)) {
if ($this->oImapClient->FolderSelect($sFolderName)->IsFlagSupported($sMessageFlag)) { if ($this->oImapClient->FolderSelect($sFolderName)->IsFlagSupported($sMessageFlag)) {
$sStoreAction = $bSetAction ? StoreAction::ADD_FLAGS_SILENT : StoreAction::REMOVE_FLAGS_SILENT; $eStoreAction = $bSetAction ? StoreAction::ADD_FLAGS_SILENT : StoreAction::REMOVE_FLAGS_SILENT;
$this->oImapClient->MessageStoreFlag($oRange, array($sMessageFlag), $sStoreAction); $this->oImapClient->MessageStoreFlag($oRange, array($sMessageFlag), $eStoreAction);
} else if (!$bSkipUnsupportedFlag) { } else if (!$bSkipUnsupportedFlag) {
throw new \MailSo\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.'); throw new \MailSo\RuntimeException('Message flag "'.$sMessageFlag.'" is not supported.');
} }

View file

@ -16,9 +16,14 @@ namespace MailSo\Mime\Enumerations;
* @package Mime * @package Mime
* @subpackage Enumerations * @subpackage Enumerations
*/ */
abstract class MessagePriority enum MessagePriority: int
{ {
const LOW = 5; case Lowest = 5;
const NORMAL = 3; case Normal = 3;
const HIGH = 1; case Highest = 1;
public function toMIME() : string
{
return $this->value . ' (' . $this->name . ')';
}
} }

View file

@ -196,26 +196,9 @@ class Message extends Part
return $this; return $this;
} }
public function SetPriority(int $iValue) : self public function SetPriority(Enumerations\MessagePriority $eValue) : self
{ {
$sResult = ''; $this->aHeadersValue[Enumerations\Header::X_PRIORITY] = $eValue->toMIME();
switch ($iValue)
{
case Enumerations\MessagePriority::HIGH:
$sResult = Enumerations\MessagePriority::HIGH.' (Highest)';
break;
case Enumerations\MessagePriority::NORMAL:
$sResult = Enumerations\MessagePriority::NORMAL.' (Normal)';
break;
case Enumerations\MessagePriority::LOW:
$sResult = Enumerations\MessagePriority::LOW.' (Lowest)';
break;
}
if (\strlen($sResult)) {
$this->aHeadersValue[Enumerations\Header::X_PRIORITY] = $sResult;
}
return $this; return $this;
} }

View file

@ -600,7 +600,7 @@ class Actions
'SoundNotification' => true, 'SoundNotification' => true,
'NotificationSound' => 'new-mail', 'NotificationSound' => 'new-mail',
'DesktopNotifications' => true, 'DesktopNotifications' => true,
'Layout' => (int) $oConfig->Get('defaults', 'view_layout', Enumerations\Layout::SIDE_PREVIEW), 'Layout' => (int) $oConfig->Get('defaults', 'view_layout', Enumerations\Layout::SIDE_PREVIEW->value),
'EditorDefaultType' => \str_replace('Forced', '', $oConfig->Get('defaults', 'view_editor_type', '')), 'EditorDefaultType' => \str_replace('Forced', '', $oConfig->Get('defaults', 'view_editor_type', '')),
'editorWysiwyg' => 'Squire', 'editorWysiwyg' => 'Squire',
'UseCheckboxesInList' => (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true), 'UseCheckboxesInList' => (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true),
@ -736,10 +736,10 @@ class Actions
} }
$aResult['signMe'] = [ $aResult['signMe'] = [
SignMeType::DefaultOff => 0, SignMeType::DefaultOff->value => 0,
SignMeType::DefaultOn => 1, SignMeType::DefaultOn->value => 1,
SignMeType::Unused => 2 SignMeType::Unused->value => 2
][(string) $oConfig->Get('login', 'sign_me_auto', SignMeType::DefaultOff)]; ][(string) $oConfig->Get('login', 'sign_me_auto', SignMeType::DefaultOff->value)];
} }
} }

View file

@ -1012,7 +1012,7 @@ trait Messages
} }
if (!empty($this->GetActionParam('markAsImportant', 0))) { if (!empty($this->GetActionParam('markAsImportant', 0))) {
$oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::HIGH); $oMessage->SetPriority(\MailSo\Mime\Enumerations\MessagePriority::Highest);
} }
$oMessage->SetSubject($this->GetActionParam('subject', '')); $oMessage->SetSubject($this->GetActionParam('subject', ''));

View file

@ -160,11 +160,11 @@ trait User
return \min(100, \max(10, $iValue)); return \min(100, \max(10, $iValue));
}); });
$this->setSettingsFromParams($oSettings, 'Layout', 'int', function ($iValue) { $this->setSettingsFromParams($oSettings, 'Layout', 'int',
return (int) (\in_array((int) $iValue, array(\RainLoop\Enumerations\Layout::NO_PREVIEW, fn(int $iValue) => (
\RainLoop\Enumerations\Layout::SIDE_PREVIEW, \RainLoop\Enumerations\Layout::BOTTOM_PREVIEW)) ? \RainLoop\Enumerations\Layout::tryFrom($iValue) ?: \RainLoop\Enumerations\Layout::SIDE_PREVIEW
$iValue : \RainLoop\Enumerations\Layout::SIDE_PREVIEW); )->value
}); );
$this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string'); $this->setSettingsFromParams($oSettings, 'EditorDefaultType', 'string');
$this->setSettingsFromParams($oSettings, 'editorWysiwyg', 'string'); $this->setSettingsFromParams($oSettings, 'editorWysiwyg', 'string');

View file

@ -300,7 +300,7 @@ When this value is gethostname, the gethostname() value is used.
'determine_user_language' => array(true, 'Detect language from browser header `Accept-Language`'), 'determine_user_language' => array(true, 'Detect language from browser header `Accept-Language`'),
'determine_user_domain' => array(false, 'Like default_domain but then HTTP_HOST/SERVER_NAME without www.'), 'determine_user_domain' => array(false, 'Like default_domain but then HTTP_HOST/SERVER_NAME without www.'),
'sign_me_auto' => array(\RainLoop\Enumerations\SignMeType::DefaultOff, 'sign_me_auto' => array(\RainLoop\Enumerations\SignMeType::DefaultOff->value,
'This option allows webmail to remember the logged in user 'This option allows webmail to remember the logged in user
once they closed the browser window. once they closed the browser window.

View file

@ -2,9 +2,9 @@
namespace RainLoop\Enumerations; namespace RainLoop\Enumerations;
abstract class Layout enum Layout: int
{ {
const NO_PREVIEW = 0; case NO_PREVIEW = 0;
const SIDE_PREVIEW = 1; case SIDE_PREVIEW = 1;
const BOTTOM_PREVIEW = 2; case BOTTOM_PREVIEW = 2;
} }

View file

@ -2,9 +2,9 @@
namespace RainLoop\Enumerations; namespace RainLoop\Enumerations;
abstract class SignMeType enum SignMeType: string
{ {
const DefaultOff = 'DefaultOff'; case DefaultOff = 'DefaultOff';
const DefaultOn = 'DefaultOn'; case DefaultOn = 'DefaultOn';
const Unused = 'Unused'; case Unused = 'Unused';
} }