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;
use RainLoop\Enumerations\SignMeType;
class SnappyMailResponse extends \OCP\AppFramework\Http\Response
{
public function render(): string
@ -184,7 +186,7 @@ class SnappyMailHelper
try {
$oAccount = $oActions->LoginProcess($aCredentials[1], $aCredentials[2]);
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);
}

View file

@ -354,11 +354,10 @@ trait Messages
* @throws \MailSo\RuntimeException
* @throws \MailSo\Net\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;
}
@ -372,7 +371,7 @@ trait Messages
return $this->SendRequestGetResponse(
$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
* @subpackage Enumerations
*/
abstract class ResponseType
enum ResponseType
{
const UNKNOWN = 0;
const TAGGED = 1;
const UNTAGGED = 2;
const CONTINUATION = 3;
case UNKNOWN;
case TAGGED;
case UNTAGGED;
case CONTINUATION;
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -196,26 +196,9 @@ class Message extends Part
return $this;
}
public function SetPriority(int $iValue) : self
public function SetPriority(Enumerations\MessagePriority $eValue) : self
{
$sResult = '';
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;
}
$this->aHeadersValue[Enumerations\Header::X_PRIORITY] = $eValue->toMIME();
return $this;
}

View file

@ -600,7 +600,7 @@ class Actions
'SoundNotification' => true,
'NotificationSound' => 'new-mail',
'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', '')),
'editorWysiwyg' => 'Squire',
'UseCheckboxesInList' => (bool) $oConfig->Get('defaults', 'view_use_checkboxes', true),
@ -736,10 +736,10 @@ class Actions
}
$aResult['signMe'] = [
SignMeType::DefaultOff => 0,
SignMeType::DefaultOn => 1,
SignMeType::Unused => 2
][(string) $oConfig->Get('login', 'sign_me_auto', SignMeType::DefaultOff)];
SignMeType::DefaultOff->value => 0,
SignMeType::DefaultOn->value => 1,
SignMeType::Unused->value => 2
][(string) $oConfig->Get('login', 'sign_me_auto', SignMeType::DefaultOff->value)];
}
}

View file

@ -1012,7 +1012,7 @@ trait Messages
}
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', ''));

View file

@ -160,11 +160,11 @@ trait User
return \min(100, \max(10, $iValue));
});
$this->setSettingsFromParams($oSettings, 'Layout', 'int', function ($iValue) {
return (int) (\in_array((int) $iValue, array(\RainLoop\Enumerations\Layout::NO_PREVIEW,
\RainLoop\Enumerations\Layout::SIDE_PREVIEW, \RainLoop\Enumerations\Layout::BOTTOM_PREVIEW)) ?
$iValue : \RainLoop\Enumerations\Layout::SIDE_PREVIEW);
});
$this->setSettingsFromParams($oSettings, 'Layout', 'int',
fn(int $iValue) => (
\RainLoop\Enumerations\Layout::tryFrom($iValue) ?: \RainLoop\Enumerations\Layout::SIDE_PREVIEW
)->value
);
$this->setSettingsFromParams($oSettings, 'EditorDefaultType', '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_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
once they closed the browser window.

View file

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

View file

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