diff --git a/src/app/Domain.php b/src/app/Domain.php --- a/src/app/Domain.php +++ b/src/app/Domain.php @@ -44,6 +44,14 @@ // domain has been created in LDAP public const STATUS_LDAP_READY = 1 << 6; + private int $allowed_states = self::STATUS_NEW | + self::STATUS_ACTIVE | + self::STATUS_SUSPENDED | + self::STATUS_DELETED | + self::STATUS_CONFIRMED | + self::STATUS_VERIFIED | + self::STATUS_LDAP_READY; + // open for public registration public const TYPE_PUBLIC = 1 << 0; // zone hosted with us @@ -170,29 +178,13 @@ */ public function setStatusAttribute($status) { - $new_status = 0; - - $allowed_values = [ - self::STATUS_NEW, - self::STATUS_ACTIVE, - self::STATUS_SUSPENDED, - self::STATUS_DELETED, - self::STATUS_CONFIRMED, - self::STATUS_VERIFIED, - self::STATUS_LDAP_READY, - ]; - - foreach ($allowed_values as $value) { - if ($status & $value) { - $new_status |= $value; - $status ^= $value; - } - } - - if ($status > 0) { + // Detect invalid flags + if ($status & ~$this->allowed_states) { throw new \Exception("Invalid domain status: {$status}"); } + $new_status = $status; + if ($this->isPublic()) { $this->attributes['status'] = $new_status; return; diff --git a/src/app/Group.php b/src/app/Group.php --- a/src/app/Group.php +++ b/src/app/Group.php @@ -44,6 +44,12 @@ // group has been created in LDAP public const STATUS_LDAP_READY = 1 << 4; + private int $allowed_states = self::STATUS_NEW | + self::STATUS_ACTIVE | + self::STATUS_SUSPENDED | + self::STATUS_DELETED | + self::STATUS_LDAP_READY; + /** @var array The attributes that should be cast */ protected $casts = [ 'created_at' => 'datetime:Y-m-d H:i:s', diff --git a/src/app/Resource.php b/src/app/Resource.php --- a/src/app/Resource.php +++ b/src/app/Resource.php @@ -45,6 +45,12 @@ // resource has been created in IMAP public const STATUS_IMAP_READY = 1 << 8; + private int $allowed_states = self::STATUS_NEW | + self::STATUS_ACTIVE | + self::STATUS_DELETED | + self::STATUS_LDAP_READY | + self::STATUS_IMAP_READY; + // A template for the email attribute on a resource creation public const EMAIL_TEMPLATE = 'resource-{id}@{domainName}'; diff --git a/src/app/SharedFolder.php b/src/app/SharedFolder.php --- a/src/app/SharedFolder.php +++ b/src/app/SharedFolder.php @@ -48,6 +48,12 @@ // folder has been created in IMAP public const STATUS_IMAP_READY = 1 << 8; + private int $allowed_states = self::STATUS_NEW | + self::STATUS_ACTIVE | + self::STATUS_DELETED | + self::STATUS_LDAP_READY | + self::STATUS_IMAP_READY; + /** @const array Supported folder type labels */ public const SUPPORTED_TYPES = ['mail', 'event', 'contact', 'task', 'note', 'file']; diff --git a/src/app/Traits/StatusPropertyTrait.php b/src/app/Traits/StatusPropertyTrait.php --- a/src/app/Traits/StatusPropertyTrait.php +++ b/src/app/Traits/StatusPropertyTrait.php @@ -101,34 +101,10 @@ */ public function setStatusAttribute($status) { - $new_status = 0; - - $allowed_states = [ - 'STATUS_NEW', - 'STATUS_ACTIVE', - 'STATUS_SUSPENDED', - 'STATUS_DELETED', - 'STATUS_LDAP_READY', - 'STATUS_IMAP_READY', - ]; - - foreach ($allowed_states as $const) { - if (!defined("static::$const")) { - continue; - } - - $value = constant("static::$const"); - - if ($status & $value) { - $new_status |= $value; - $status ^= $value; - } - } - - if ($status > 0) { + if ($status & ~$this->allowed_states) { throw new \Exception("Invalid status: {$status}"); } - $this->attributes['status'] = $new_status; + $this->attributes['status'] = $status; } } diff --git a/src/app/User.php b/src/app/User.php --- a/src/app/User.php +++ b/src/app/User.php @@ -61,6 +61,15 @@ // a restricted user public const STATUS_RESTRICTED = 1 << 7; + private int $allowed_states = self::STATUS_NEW | + self::STATUS_ACTIVE | + self::STATUS_SUSPENDED | + self::STATUS_DELETED | + self::STATUS_LDAP_READY | + self::STATUS_IMAP_READY | + self::STATUS_DEGRADED | + self::STATUS_RESTRICTED; + /** @var array The attributes that are mass assignable */ protected $fillable = [ 'id', @@ -621,40 +630,6 @@ $this->setPasswordAttribute($password); } - /** - * User status mutator - * - * @throws \Exception - */ - public function setStatusAttribute($status) - { - $new_status = 0; - - $allowed_values = [ - self::STATUS_NEW, - self::STATUS_ACTIVE, - self::STATUS_SUSPENDED, - self::STATUS_DELETED, - self::STATUS_LDAP_READY, - self::STATUS_IMAP_READY, - self::STATUS_DEGRADED, - self::STATUS_RESTRICTED, - ]; - - foreach ($allowed_values as $value) { - if ($status & $value) { - $new_status |= $value; - $status ^= $value; - } - } - - if ($status > 0) { - throw new \Exception("Invalid user status: {$status}"); - } - - $this->attributes['status'] = $new_status; - } - /** * Validate the user credentials *