snapshot of https://github.com/espocrm/espocrm.git (master, 2026-09-18; blobs > 131072B omitted)
Some checks failed
Test / Test on PHP 8.3 (push) Failing after 5s
Test / Test on PHP 8.4 (push) Failing after 4s
Test / Test on PHP 8.5 (push) Failing after 3s
TypeScript static analysis / TypeScript check (push) Failing after 14s
Test Integration on PostgreSQL / Test on PHP 8.4 fix (push) Failing after 1s
Test Integration on PostgreSQL / Test on PHP 8.4 master (push) Failing after 1s
Test Integration on MySQL / Test on PHP 8.3 (push) Failing after 2s
Test Integration on MySQL / Test on PHP 8.5 (push) Failing after 0s

This commit is contained in:
upstream-mirror
2026-09-18 04:19:15 +05:00
commit 7cc7e6b4f3
10077 changed files with 900756 additions and 0 deletions

View File

@@ -0,0 +1,163 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* 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);
}
}

View File

@@ -0,0 +1,157 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* 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 UnexpectedValueException;
class AuthorizationCode extends Entity
{
public const string ENTITY_TYPE = 'OAuthAuthorizationCode';
public const string FIELD_STATUS = 'status';
public const string FILED_CLIENT = 'client';
public const string FIELD_HASH = 'hash';
public const string FIELD_EXPIRES_AT = 'expiresAt';
public const string FIELD_REDIRECT_URI = 'redirectUri';
public const string FIELD_SCOPES = 'scopes';
public const string FIELD_USER = 'user';
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::FILED_CLIENT);
if (!$client instanceof Client) {
throw new UnexpectedValueException("No client.");
}
return $client;
}
public function setClient(Client|Link $client): self
{
return $this->setRelatedLinkOrEntity(self::FILED_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 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 getRedirectUri(): string
{
return $this->get(self::FIELD_REDIRECT_URI) ?? throw new UnexpectedValueException("No redirectUri.");
}
public function setRedirectUri(string $redirectUri): self
{
return $this->set(self::FIELD_REDIRECT_URI, $redirectUri);
}
public function isExpired(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_EXPIRED;
}
/**
* @return string[]
*/
public function getScopes(): array
{
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);
}
}

View File

@@ -0,0 +1,142 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* 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\Name\Field;
use Espo\Core\ORM\Entity;
use Espo\Tools\OAuthServer\ClientType;
use UnexpectedValueException;
class Client extends Entity
{
public const string ENTITY_TYPE = 'OAuthClient';
public const string FIELD_STATUS = 'status';
public const string FIELD_IDENTIFIER = 'identifier';
public const string FIELD_CLIENT_TYPE = 'clientType';
public const string FIELD_SCOPES = 'scopes';
public const string FIELD_REDIRECT_URIS = 'redirectUris';
public const string LINK_SECRETS = 'secrets';
public const string STATUS_ACTIVE = 'Active';
public const string STATUS_INACTIVE = 'Inactive';
public function getName(): ?string
{
return $this->get(Field::NAME);
}
public function setName(string $name): self
{
return $this->set(Field::NAME, $name);
}
public function getClientType(): ClientType
{
$raw = $this->get(self::FIELD_CLIENT_TYPE) ?? throw new UnexpectedValueException("No client type.");
return ClientType::tryFrom($raw) ?? throw new UnexpectedValueException("Bad client type.");
}
public function setClientType(ClientType $clientType): self
{
return $this->set(self::FIELD_CLIENT_TYPE, $clientType->value);
}
/**
* @return ?non-empty-string
*/
public function getIdentifier(): ?string
{
/** @var ?non-empty-string */
return $this->get(self::FIELD_IDENTIFIER);
}
public function setIdentifier(?string $clientId): self
{
return $this->set(self::FIELD_IDENTIFIER, $clientId);
}
public function isActive(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_ACTIVE;
}
public function setActive(): self
{
return $this->set(self::FIELD_STATUS, self::STATUS_ACTIVE);
}
public function setInactive(): self
{
return $this->set(self::FIELD_STATUS, self::STATUS_INACTIVE);
}
/**
* @return non-empty-string[]
*/
public function getScopes(): array
{
$scopes = $this->get(self::FIELD_SCOPES) ?? [];
foreach ($scopes as $scope) {
if (!$scope) {
throw new UnexpectedValueException("Empty scope.");
}
}
return $scopes;
}
/**
* @param string[] $scopes
*/
public function setScopes(array $scopes): self
{
return $this->set(self::FIELD_SCOPES, $scopes);
}
/**
* @return string[]
*/
public function getRedirectUris(): array
{
return $this->get(self::FIELD_REDIRECT_URIS) ?? [];
}
/**
* @param string[] $redirectUris
*/
public function setRedirectUris(array $redirectUris): self
{
return $this->set(self::FIELD_REDIRECT_URIS, $redirectUris);
}
}

View File

@@ -0,0 +1,135 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* 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\Date;
use Espo\Core\Name\Field;
use Espo\Core\ORM\Entity;
use SensitiveParameter;
use UnexpectedValueException;
class ClientSecret extends Entity
{
public const string ENTITY_TYPE = 'OAuthClientSecret';
public const string FIELD_STATUS = 'status';
public const string FIELD_HASH = 'hash';
public const string FIELD_CLIENT = 'client';
public const string FIELD_EXPIRATION_DATE = 'expirationDate';
public const string FIELD_VALUE = 'value';
public const string STATUS_ACTIVE = 'Active';
public const string STATUS_REVOKED = 'Revoked';
public const string STATUS_EXPIRED = 'Expired';
public const string ATTR_CLIENT_ID = 'clientId';
public function setName(string $name): self
{
return $this->set(Field::NAME, $name);
}
public function getName(): ?string
{
return $this->get(Field::NAME);
}
public function getHash(): string
{
return $this->get(self::FIELD_HASH) ?? throw new UnexpectedValueException("No hash.");
}
public function setHash(string $value): self
{
return $this->set(self::FIELD_HASH, $value);
}
public function isActive(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_ACTIVE;
}
public function isExpired(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_EXPIRED;
}
public function isRevoked(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_REVOKED;
}
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 getExpirationDate(): ?Date
{
/** @var ?Date */
return $this->getValueObject(self::FIELD_EXPIRATION_DATE);
}
public function setExpirationDate(?Date $date): self
{
return $this->setValueObject(self::FIELD_EXPIRATION_DATE, $date);
}
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 $client): self
{
return $this->setRelatedLinkOrEntity(self::FIELD_CLIENT, $client);
}
public function setValue(#[SensitiveParameter] string $value): self
{
return $this->set(self::FIELD_VALUE, $value);
}
public function getValue(): string
{
return $this->get(self::FIELD_VALUE) ?? throw new UnexpectedValueException("No value.");
}
}

View File

@@ -0,0 +1,146 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2026 EspoCRM, Inc.
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* 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 UnexpectedValueException;
class RefreshToken extends Entity
{
public const string ENTITY_TYPE = 'OAuthRefreshToken';
public const string FIELD_STATUS = 'status';
public const string FIELD_CLIENT = 'client';
public const string FIELD_EXPIRES_AT = 'expiresAt';
public const string FIELD_USER = 'user';
public const string FIELD_ACCESS_TOKEN = 'accessToken';
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 setHash(string $value): self
{
return $this->set(self::FIELD_HASH, $value);
}
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 setStatus(string $status): self
{
return $this->set(self::FIELD_STATUS, $status);
}
public function getClient(): Client
{
$client = $this->relations->getOne(self::FIELD_CLIENT);
if (!$client instanceof Client) {
throw new UnexpectedValueException("No client.");
}
return $client;
}
public function setAccessToken(AccessToken $accessToken): self
{
return $this->setRelatedLinkOrEntity(self::FIELD_ACCESS_TOKEN, $accessToken);
}
public function setClient(Client $client): self
{
return $this->setRelatedLinkOrEntity(self::FIELD_CLIENT, $client);
}
public function isExpired(): bool
{
return $this->get(self::FIELD_STATUS) === self::STATUS_EXPIRED;
}
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 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 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);
}
public function getAccessToken(): ?AccessToken
{
/** @var ?AccessToken */
return $this->relations->getOne(self::FIELD_ACCESS_TOKEN);
}
}