. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Tools\OAuthServer\Entities; use Espo\Core\Field\DateTime; use Espo\Core\Field\Link; use Espo\Core\ORM\Entity; use Espo\Entities\User; use SensitiveParameter; use UnexpectedValueException; class AccessToken extends Entity { public const string ENTITY_TYPE = 'OAuthAccessToken'; public const string FIELD_STATUS = 'status'; public const string FIELD_CLIENT = 'client'; public const string FIELD_IDENTIFIER = 'identifier'; public const string FIELD_EXPIRES_AT = 'expiresAt'; public const string FIELD_SCOPES = 'scopes'; public const string FIELD_USER = 'user'; public const string FIELD_HASH = 'hash'; public const string STATUS_ACTIVE = 'Active'; public const string STATUS_REVOKED = 'Revoked'; public const string STATUS_EXPIRED = 'Expired'; public function isActive(): bool { return $this->get(self::FIELD_STATUS) === self::STATUS_ACTIVE; } public function isRevoked(): bool { return $this->get(self::FIELD_STATUS) === self::STATUS_REVOKED; } public function getClient(): Client { $client = $this->relations->getOne(self::FIELD_CLIENT); if (!$client instanceof Client) { throw new UnexpectedValueException("No client."); } return $client; } public function setClient(Client|Link $client): self { return $this->setRelatedLinkOrEntity(self::FIELD_CLIENT, $client); } public function setRevoked(): self { return $this->set(self::FIELD_STATUS, self::STATUS_REVOKED); } public function setExpired(): self { return $this->set(self::FIELD_STATUS, self::STATUS_EXPIRED); } public function setHash(string $hash): self { return $this->set(self::FIELD_HASH, $hash); } public function setIdentifier(#[SensitiveParameter] string $identifier): self { return $this->set(self::FIELD_IDENTIFIER, $identifier); } /** * @return non-empty-string */ public function getIdentifier(): string { /** @var non-empty-string */ return $this->get(self::FIELD_IDENTIFIER) ?? throw new UnexpectedValueException("No identifier."); } public function getExpiresAt(): DateTime { $value = $this->getValueObject(self::FIELD_EXPIRES_AT); if (!$value instanceof DateTime) { throw new UnexpectedValueException("No expiresAt."); } return $value; } public function setExpiresAt(DateTime $expiresAt): self { return $this->setValueObject(self::FIELD_EXPIRES_AT, $expiresAt); } public function isExpired(): bool { return $this->get(self::FIELD_STATUS) === self::STATUS_EXPIRED; } /** * @return non-empty-string[] */ public function getScopes(): array { /** @var non-empty-string[] */ return $this->get(self::FIELD_SCOPES) ?? []; } /** * @param string[] $scopes */ public function setScopes(array $scopes): self { return $this->set(self::FIELD_SCOPES, $scopes); } public function getUser(): Link { $user = $this->getValueObject(self::FIELD_USER); if (!$user instanceof Link) { throw new UnexpectedValueException("No user."); } return $user; } public function setUser(Link|User $user): self { return $this->setRelatedLinkOrEntity(self::FIELD_USER, $user); } }