diff --git a/application/Espo/Entities/User.php b/application/Espo/Entities/User.php index 7950f91db2..3fbbe91dab 100644 --- a/application/Espo/Entities/User.php +++ b/application/Espo/Entities/User.php @@ -43,6 +43,9 @@ class User extends Person public const ATTR_TYPE = 'type'; public const ATTR_IS_ACTIVE = 'isActive'; + /** @since 10.0.0 */ + public const string FIELD_USER_NAME = 'userName'; + public const LINK_ACCOUNTS = 'accounts'; public const LINK_CONTACT = 'contact'; public const LINK_PORTALS = 'portals'; diff --git a/tests/integration/Espo/User/AccessTest.php b/tests/integration/Espo/User/AccessTest.php new file mode 100644 index 0000000000..40df24960d --- /dev/null +++ b/tests/integration/Espo/User/AccessTest.php @@ -0,0 +1,98 @@ +. + * + * 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 tests\integration\Espo\User; + +use Espo\Core\Exceptions\Forbidden; +use Espo\Core\Record\ServiceContainer; +use Espo\Entities\User; +use tests\integration\Core\BaseTestCase; + +class AccessTest extends BaseTestCase +{ + /** + * @noinspection PhpUnhandledExceptionInspection + */ + public function testTypeChange(): void + { + $this->createUser([ + User::FIELD_USER_NAME => 'admin-test', + User::ATTR_TYPE => User::TYPE_ADMIN, + ]); + + $this->auth('admin-test'); + $this->reCreateApplication(); + + $service = $this->getContainer() + ->getByClass(ServiceContainer::class) + ->getByClass(User::class); + + // + + $userRegular = $service->create((object) [ + 'userName' => 'test-regular', + 'type' => User::TYPE_REGULAR + ])->getEntity(); + + // + + $thrown = false; + + try { + $service->create((object) [ + 'userName' => 'test', + 'type' => User::TYPE_SUPER_ADMIN, + ]); + } catch (Forbidden) { + $thrown = true; + } + + $this->assertTrue($thrown); + + // + + $service->update($userRegular->getId(), (object) [ + 'type' => User::TYPE_ADMIN, + ]); + + // + + $thrown = false; + + try { + $service->update($userRegular->getId(), (object) [ + 'type' => User::TYPE_SUPER_ADMIN, + ]); + } catch (Forbidden) { + $thrown = true; + } + + $this->assertTrue($thrown); + } +}