1
0
Fork 0
mirror of synced 2024-07-09 08:27:01 +12:00
appwrite/tests/unit/Auth/AuthTest.php

318 lines
12 KiB
PHP
Raw Normal View History

2019-12-29 05:37:39 +13:00
<?php
namespace Appwrite\Tests;
use Appwrite\Auth\Auth;
2021-10-08 08:19:58 +13:00
use Utopia\Database\Document;
2021-10-08 08:27:23 +13:00
use Utopia\Database\Validator\Authorization;
2019-12-29 05:37:39 +13:00
use PHPUnit\Framework\TestCase;
class AuthTest extends TestCase
{
2020-10-01 10:08:58 +13:00
public function setUp(): void
2019-12-29 05:37:39 +13:00
{
}
2021-10-08 09:24:09 +13:00
/**
* Reset Roles
*/
2020-10-01 10:08:58 +13:00
public function tearDown(): void
2019-12-29 05:37:39 +13:00
{
2021-10-08 09:24:09 +13:00
Authorization::cleanRoles();
Authorization::setRole('role:all');
2019-12-29 05:37:39 +13:00
}
public function testCookieName()
{
$name = 'cookie-name';
$this->assertEquals(Auth::setCookieName($name), $name);
$this->assertEquals(Auth::$cookieName, $name);
}
public function testEncodeDecodeSession()
{
$id = 'id';
$secret = 'secret';
$session = 'eyJpZCI6ImlkIiwic2VjcmV0Ijoic2VjcmV0In0=';
$this->assertEquals(Auth::encodeSession($id, $secret), $session);
$this->assertEquals(Auth::decodeSession($session), ['id' => $id, 'secret' => $secret]);
}
2022-05-24 02:54:50 +12:00
2019-12-29 05:37:39 +13:00
public function testHash()
{
$secret = 'secret';
$this->assertEquals(Auth::hash($secret), '2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b');
}
2022-05-24 02:54:50 +12:00
2019-12-29 05:37:39 +13:00
public function testPassword()
{
$secret = 'secret';
$static = '$2y$08$PDbMtV18J1KOBI9tIYabBuyUwBrtXPGhLxCy9pWP6xkldVOKLrLKy';
$dynamic = Auth::passwordHash($secret);
2022-05-24 02:54:50 +12:00
2019-12-29 05:37:39 +13:00
$this->assertEquals(Auth::passwordVerify($secret, $dynamic), true);
$this->assertEquals(Auth::passwordVerify($secret, $static), true);
}
2022-05-24 02:54:50 +12:00
2019-12-29 05:37:39 +13:00
public function testPasswordGenerator()
{
$this->assertEquals(\mb_strlen(Auth::passwordGenerator()), 40);
$this->assertEquals(\mb_strlen(Auth::passwordGenerator(5)), 10);
}
2022-05-24 02:54:50 +12:00
2019-12-29 05:37:39 +13:00
public function testTokenGenerator()
{
$this->assertEquals(\mb_strlen(Auth::tokenGenerator()), 256);
$this->assertEquals(\mb_strlen(Auth::tokenGenerator(5)), 10);
}
2022-05-24 02:54:50 +12:00
2021-02-20 01:12:47 +13:00
public function testSessionVerify()
{
$secret = 'secret1';
$hash = Auth::hash($secret);
$tokens1 = [
new Document([
'$id' => 'token1',
'expire' => time() + 60 * 60 * 24,
'secret' => $hash,
'provider' => Auth::SESSION_PROVIDER_EMAIL,
'providerUid' => 'test@example.com',
]),
new Document([
'$id' => 'token2',
'expire' => time() - 60 * 60 * 24,
'secret' => 'secret2',
'provider' => Auth::SESSION_PROVIDER_EMAIL,
'providerUid' => 'test@example.com',
]),
];
$tokens2 = [
new Document([ // Correct secret and type time, wrong expire time
'$id' => 'token1',
'expire' => time() - 60 * 60 * 24,
'secret' => $hash,
'provider' => Auth::SESSION_PROVIDER_EMAIL,
'providerUid' => 'test@example.com',
]),
new Document([
'$id' => 'token2',
'expire' => time() - 60 * 60 * 24,
'secret' => 'secret2',
'provider' => Auth::SESSION_PROVIDER_EMAIL,
'providerUid' => 'test@example.com',
]),
];
$this->assertEquals(Auth::sessionVerify($tokens1, $secret), 'token1');
$this->assertEquals(Auth::sessionVerify($tokens1, 'false-secret'), false);
$this->assertEquals(Auth::sessionVerify($tokens2, $secret), false);
$this->assertEquals(Auth::sessionVerify($tokens2, 'false-secret'), false);
}
2019-12-29 05:37:39 +13:00
public function testTokenVerify()
{
$secret = 'secret1';
$hash = Auth::hash($secret);
$tokens1 = [
new Document([
2020-02-17 20:16:11 +13:00
'$id' => 'token1',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_RECOVERY,
2019-12-29 05:37:39 +13:00
'expire' => time() + 60 * 60 * 24,
'secret' => $hash,
]),
new Document([
2020-02-17 20:16:11 +13:00
'$id' => 'token2',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_RECOVERY,
2019-12-29 05:37:39 +13:00
'expire' => time() - 60 * 60 * 24,
'secret' => 'secret2',
]),
];
$tokens2 = [
new Document([ // Correct secret and type time, wrong expire time
2020-02-17 20:16:11 +13:00
'$id' => 'token1',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_RECOVERY,
2019-12-29 05:37:39 +13:00
'expire' => time() - 60 * 60 * 24,
'secret' => $hash,
]),
new Document([
2020-02-17 20:16:11 +13:00
'$id' => 'token2',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_RECOVERY,
2019-12-29 05:37:39 +13:00
'expire' => time() - 60 * 60 * 24,
'secret' => 'secret2',
]),
];
$tokens3 = [ // Correct secret and expire time, wrong type
new Document([
2020-02-17 20:16:11 +13:00
'$id' => 'token1',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_INVITE,
2019-12-29 05:37:39 +13:00
'expire' => time() + 60 * 60 * 24,
'secret' => $hash,
]),
new Document([
2020-02-17 20:16:11 +13:00
'$id' => 'token2',
2021-02-20 01:12:47 +13:00
'type' => Auth::TOKEN_TYPE_RECOVERY,
2019-12-29 05:37:39 +13:00
'expire' => time() - 60 * 60 * 24,
'secret' => 'secret2',
]),
];
2021-02-20 01:12:47 +13:00
$this->assertEquals(Auth::tokenVerify($tokens1, Auth::TOKEN_TYPE_RECOVERY, $secret), 'token1');
$this->assertEquals(Auth::tokenVerify($tokens1, Auth::TOKEN_TYPE_RECOVERY, 'false-secret'), false);
$this->assertEquals(Auth::tokenVerify($tokens2, Auth::TOKEN_TYPE_RECOVERY, $secret), false);
$this->assertEquals(Auth::tokenVerify($tokens2, Auth::TOKEN_TYPE_RECOVERY, 'false-secret'), false);
$this->assertEquals(Auth::tokenVerify($tokens3, Auth::TOKEN_TYPE_RECOVERY, $secret), false);
$this->assertEquals(Auth::tokenVerify($tokens3, Auth::TOKEN_TYPE_RECOVERY, 'false-secret'), false);
2019-12-29 05:37:39 +13:00
}
2020-11-20 19:48:25 +13:00
public function testIsPrivilegedUser()
2020-11-20 19:48:25 +13:00
{
2021-03-02 10:04:53 +13:00
$this->assertEquals(false, Auth::isPrivilegedUser([]));
2022-05-24 02:54:50 +12:00
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_MEMBER]));
$this->assertEquals(true, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_ADMIN]));
$this->assertEquals(true, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_DEVELOPER]));
$this->assertEquals(true, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_OWNER]));
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_APP]));
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_SYSTEM]));
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_APP, 'role:' . Auth::USER_ROLE_APP]));
$this->assertEquals(false, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_APP, 'role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(true, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_OWNER, 'role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(true, Auth::isPrivilegedUser(['role:' . Auth::USER_ROLE_OWNER, 'role:' . Auth::USER_ROLE_ADMIN, 'role:' . Auth::USER_ROLE_DEVELOPER]));
2020-11-20 19:48:25 +13:00
}
2022-05-24 02:54:50 +12:00
2020-11-20 19:48:25 +13:00
public function testIsAppUser()
{
$this->assertEquals(false, Auth::isAppUser([]));
2022-05-24 02:54:50 +12:00
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_MEMBER]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_ADMIN]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_DEVELOPER]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_OWNER]));
$this->assertEquals(true, Auth::isAppUser(['role:' . Auth::USER_ROLE_APP]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_SYSTEM]));
$this->assertEquals(true, Auth::isAppUser(['role:' . Auth::USER_ROLE_APP, 'role:' . Auth::USER_ROLE_APP]));
$this->assertEquals(true, Auth::isAppUser(['role:' . Auth::USER_ROLE_APP, 'role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_OWNER, 'role:' . Auth::USER_ROLE_GUEST]));
$this->assertEquals(false, Auth::isAppUser(['role:' . Auth::USER_ROLE_OWNER, 'role:' . Auth::USER_ROLE_ADMIN, 'role:' . Auth::USER_ROLE_DEVELOPER]));
2020-11-20 19:48:25 +13:00
}
2021-06-30 01:11:14 +12:00
public function testGuestRoles()
{
$user = new Document([
'$id' => ''
]);
$roles = Auth::getRoles($user);
$this->assertCount(1, $roles);
$this->assertContains('role:guest', $roles);
2021-06-30 01:11:14 +12:00
}
public function testUserRoles()
{
$user = new Document([
'$id' => '123',
'memberships' => [
[
'teamId' => 'abc',
'roles' => [
'administrator',
'moderator'
]
],
[
'teamId' => 'def',
'roles' => [
'guest'
]
]
]
]);
$roles = Auth::getRoles($user);
2021-07-01 19:19:48 +12:00
$this->assertCount(7, $roles);
$this->assertContains('role:member', $roles);
2021-06-30 01:11:14 +12:00
$this->assertContains('user:123', $roles);
$this->assertContains('team:abc', $roles);
$this->assertContains('team:abc/administrator', $roles);
$this->assertContains('team:abc/moderator', $roles);
$this->assertContains('team:def', $roles);
$this->assertContains('team:def/guest', $roles);
}
2021-09-04 03:59:02 +12:00
public function testPrivilegedUserRoles()
2021-09-04 04:05:50 +12:00
{
2022-05-24 02:54:50 +12:00
Authorization::setRole('role:' . Auth::USER_ROLE_OWNER);
2021-09-04 04:05:50 +12:00
$user = new Document([
'$id' => '123',
'memberships' => [
[
'teamId' => 'abc',
'roles' => [
'administrator',
'moderator'
]
],
[
'teamId' => 'def',
'roles' => [
'guest'
]
]
]
]);
$roles = Auth::getRoles($user);
$this->assertCount(5, $roles);
$this->assertNotContains('role:member', $roles);
$this->assertNotContains('user:123', $roles);
$this->assertContains('team:abc', $roles);
$this->assertContains('team:abc/administrator', $roles);
$this->assertContains('team:abc/moderator', $roles);
$this->assertContains('team:def', $roles);
$this->assertContains('team:def/guest', $roles);
}
public function testAppUserRoles()
2021-09-04 03:59:02 +12:00
{
2022-05-24 02:54:50 +12:00
Authorization::setRole('role:' . Auth::USER_ROLE_APP);
2021-09-04 03:59:02 +12:00
$user = new Document([
'$id' => '123',
'memberships' => [
[
'teamId' => 'abc',
'roles' => [
'administrator',
'moderator'
]
],
[
'teamId' => 'def',
'roles' => [
'guest'
]
]
]
]);
$roles = Auth::getRoles($user);
$this->assertCount(5, $roles);
$this->assertNotContains('role:member', $roles);
$this->assertNotContains('user:123', $roles);
$this->assertContains('team:abc', $roles);
$this->assertContains('team:abc/administrator', $roles);
$this->assertContains('team:abc/moderator', $roles);
$this->assertContains('team:def', $roles);
$this->assertContains('team:def/guest', $roles);
}
2020-10-01 10:08:58 +13:00
}