Files
sysPass/tests/SP/Core/Acl/AclTest.php
Rubén D 8e96ec4285 * [MOD] Code refactoring by enforcing type checks (WIP)
* [MOD] Update dependencies

Signed-off-by: Rubén D <nuxsmin@syspass.org>
2021-01-17 14:56:56 +01:00

892 lines
26 KiB
PHP

<?php
/**
* sysPass
*
* @author nuxsmin
* @link https://syspass.org
* @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org
*
* This file is part of sysPass.
*
* sysPass is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* sysPass 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with sysPass. If not, see <http://www.gnu.org/licenses/>.
*/
namespace SP\Tests\Core\Acl;
use DI\DependencyException;
use DI\NotFoundException;
use PHPUnit\Framework\TestCase;
use SP\Core\Acl\Acl;
use SP\Core\Acl\ActionsInterface;
use SP\Core\Context\ContextException;
use SP\Core\Context\ContextInterface;
use SP\DataModel\ProfileData;
use SP\Services\User\UserLoginResponse;
use function SP\Tests\setupContext;
/**
* Class AclTest
*
* @package SP\Tests\SP\Core\Acl
*/
class AclTest extends TestCase
{
/**
* @var ContextInterface
*/
private $context;
/**
* @var Acl
*/
private $acl;
/**
* @dataProvider actionsProvider
*
* @param $id
* @param $expected
*/
public function testGetActionRoute($id, $expected)
{
$this->assertEquals($expected, Acl::getActionRoute($id));
}
/**
* testGetActionRouteUnknown
*/
public function testGetActionRouteUnknown()
{
$this->assertEmpty(Acl::getActionRoute(10000));
}
/**
* @dataProvider actionsProvider
*
* @param $id
*/
public function testCheckUserAccessAdminApp($id)
{
$this->assertTrue($this->acl->checkUserAccess($id));
}
/**
* testCheckUserAccessAccountView
*/
public function testCheckUserAccessAccountView()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccView(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_VIEW]);
}
/**
* @param int[] $actionsId Masked action Id
*/
private function checkUserAccess(array $actionsId)
{
$actionsMask = array_merge([
ActionsInterface::ACCOUNT_REQUEST,
ActionsInterface::NOTIFICATION,
ActionsInterface::NOTIFICATION_VIEW,
ActionsInterface::NOTIFICATION_SEARCH,
ActionsInterface::NOTIFICATION_CHECK,
], $actionsId);
$actionsFalse = array_filter($this->actionsProvider(), function ($action) use ($actionsMask) {
return !in_array($action[0], $actionsMask);
});
$actionsTrue = array_filter($this->actionsProvider(), function ($action) use ($actionsMask) {
return in_array($action[0], $actionsMask);
});
foreach ($actionsFalse as $action) {
$this->assertFalse($this->acl->checkUserAccess($action[0]));
}
foreach ($actionsTrue as $action) {
$this->assertTrue($this->acl->checkUserAccess($action[0]));
}
}
/**
* @return array
*/
public function actionsProvider()
{
return [
[2, 'account/search'],
[1, 'account/index'],
[20, 'account/listFile'],
[12, 'account/requestAccess'],
[30, 'favorite/index'],
[1201, 'wiki/index'],
[5001, 'itemManager/index'],
[101, 'category/index'],
[301, 'client/index'],
[1001, 'authToken/index'],
[401, 'customField/index'],
[501, 'publicLink/index'],
[601, 'file/index'],
[1301, 'accountManager/index'],
[201, 'tag/index'],
[1101, 'plugin/index'],
[5002, 'accessManager/index'],
[701, 'user/index'],
[801, 'group/index'],
[901, 'profile/index'],
[1701, 'eventlog/index'],
[1702, 'eventlog/search'],
[1703, 'eventlog/clear'],
[3, 'account/view'],
[4, 'account/create'],
[5, 'account/edit'],
[6, 'account/delete'],
[7, 'account/viewPass'],
[8, 'account/editPass'],
[9, 'account/restore'],
[10, 'account/copy'],
[11, 'account/copyPass'],
[21, 'accountFile/view'],
[22, 'accountFile/upload'],
[23, 'accountFile/download'],
[24, 'accountFile/delete'],
[25, 'accountFile/search'],
[26, 'accountFile/list'],
[31, 'favorite/view'],
[32, 'accountFavorite/mark'],
[33, 'accountFavorite/unmark'],
[40, 'account/viewHistory'],
[41, 'account/viewPassHistory'],
[42, 'account/copyPassHistory'],
[1203, 'wiki/view'],
[1204, 'wiki/create'],
[1205, 'wiki/edit'],
[1206, 'wiki/delete'],
[103, 'category/view'],
[104, 'category/create'],
[105, 'category/edit'],
[106, 'category/delete'],
[102, 'category/search'],
[303, 'client/view'],
[304, 'client/create'],
[305, 'client/edit'],
[306, 'client/delete'],
[302, 'client/search'],
[1004, 'authToken/create'],
[1003, 'authToken/view'],
[1005, 'authToken/edit'],
[1006, 'authToken/delete'],
[1002, 'authToken/search'],
[404, 'customField/create'],
[403, 'customField/view'],
[405, 'customField/edit'],
[406, 'customField/delete'],
[402, 'customField/search'],
[504, 'publicLink/create'],
[503, 'publicLink/view'],
[506, 'publicLink/delete'],
[507, 'publicLink/refresh'],
[502, 'publicLink/search'],
[603, 'file/view'],
[605, 'file/download'],
[606, 'file/delete'],
[604, 'file/upload'],
[602, 'file/search'],
[1303, 'accountManager/view'],
[1304, 'accountManager/delete'],
[1302, 'accountManager/search'],
[204, 'tag/create'],
[203, 'tag/view'],
[205, 'tag/edit'],
[206, 'tag/delete'],
[202, 'tag/search'],
[1104, 'plugin/create'],
[1103, 'plugin/view'],
[1102, 'plugin/search'],
[1105, 'plugin/enable'],
[1106, 'plugin/disable'],
[1107, 'plugin/reset'],
[703, 'user/view'],
[704, 'user/create'],
[705, 'user/edit'],
[706, 'user/delete'],
[707, 'user/editPass'],
[702, 'user/search'],
[803, 'userGroup/view'],
[804, 'userGroup/create'],
[805, 'userGroup/edit'],
[806, 'userGroup/delete'],
[802, 'userGroup/search'],
[903, 'userProfile/view'],
[904, 'userProfile/create'],
[905, 'userProfile/edit'],
[906, 'userProfile/delete'],
[902, 'userProfile/search'],
[5010, 'userSettingsManager/index'],
[5011, 'userSettings/general'],
[1401, 'notification/index'],
[1501, 'configManager/index'],
[1502, 'configManager/general'],
[1510, 'account/config'],
[1520, 'wiki/config'],
[1530, 'encryption/config'],
[1531, 'encryption/updateHash'],
[1532, 'encryption/createTempPass'],
[1540, 'backup/config'],
[1541, 'backup/backup'],
[1550, 'import/config'],
[1551, 'import/csv'],
[1552, 'import/xml'],
[1560, 'export/config'],
[1561, 'export/export'],
[1570, 'mail/config'],
[1580, 'ldap/config'],
[1581, 'ldap/sync'],
[1311, 'accountHistoryManager/index'],
[1314, 'accountHistoryManager/delete'],
[1312, 'accountHistoryManager/search'],
[1315, 'accountHistoryManager/restore'],
[1403, 'notification/view'],
[1404, 'notification/create'],
[1405, 'notification/edit'],
[1406, 'notification/delete'],
[1407, 'notification/check'],
[1402, 'notification/search'],
[1801, 'itemPreset/index'],
[1802, 'itemPreset/search'],
[1803, 'itemPreset/view'],
[1804, 'itemPreset/create'],
[1805, 'itemPreset/edit'],
[1806, 'itemPreset/delete']
];
}
/**
* testCheckUserAccessAdminAcc
*/
public function testCheckUserAccessAdminAcc()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userData->setIsAdminAcc(true);
$this->context->setUserData($userData);
$this->context->setUserProfile(new ProfileData());
$this->checkUserAccess([
ActionsInterface::ACCOUNT_VIEW,
ActionsInterface::ACCOUNT_VIEW_PASS,
ActionsInterface::ACCOUNT_HISTORY_VIEW,
ActionsInterface::ACCOUNT_EDIT,
ActionsInterface::ACCOUNT_EDIT_PASS,
ActionsInterface::ACCOUNT_CREATE,
ActionsInterface::ACCOUNT_COPY,
ActionsInterface::ACCOUNT_DELETE,
ActionsInterface::ACCOUNT_FILE,
ActionsInterface::ACCOUNTMGR,
ActionsInterface::ACCOUNTMGR_SEARCH,
ActionsInterface::ACCOUNTMGR_HISTORY,
ActionsInterface::ACCOUNTMGR_HISTORY_SEARCH,
ActionsInterface::ITEMS_MANAGE
]);
}
/**
* testCheckUserAccessAccountEdit
*/
public function testCheckUserAccessAccountEdit()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccEdit(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_EDIT, ActionsInterface::ACCOUNT_VIEW]);
}
/**
* testCheckUserAccessAccountEditPass
*/
public function testCheckUserAccessAccountEditPass()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccEditPass(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_EDIT_PASS]);
}
/**
* testCheckUserAccessAccountCreate
*/
public function testCheckUserAccessAccountCreate()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccAdd(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_CREATE]);
}
/**
* testCheckUserAccessAccountCopy
*/
public function testCheckUserAccessAccountCopy()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccAdd(true);
$userProfile->setAccView(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ACCOUNT_COPY,
ActionsInterface::ACCOUNT_VIEW,
ActionsInterface::ACCOUNT_CREATE
]);
}
/**
* testCheckUserAccessAccountDelete
*/
public function testCheckUserAccessAccountDelete()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccDelete(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_DELETE]);
}
/**
* testCheckUserAccessAccountFile
*/
public function testCheckUserAccessAccountFile()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccFiles(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_FILE]);
}
/**
* testCheckUserAccessConfigGeneral
*/
public function testCheckUserAccessConfigGeneral()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setConfigGeneral(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::CONFIG,
ActionsInterface::CONFIG_GENERAL,
ActionsInterface::PLUGIN,
ActionsInterface::PLUGIN_SEARCH,
ActionsInterface::PLUGIN_DISABLE,
ActionsInterface::PLUGIN_ENABLE,
ActionsInterface::PLUGIN_RESET,
ActionsInterface::PLUGIN_VIEW,
ActionsInterface::CONFIG_ACCOUNT,
ActionsInterface::CONFIG_WIKI,
ActionsInterface::CONFIG_LDAP,
ActionsInterface::CONFIG_MAIL
]);
}
/**
* testCheckUserAccessConfigImport
*/
public function testCheckUserAccessConfigImport()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setConfigImport(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::CONFIG,
ActionsInterface::CONFIG_IMPORT
]);
}
/**
* testCheckUserAccessCategory
*/
public function testCheckUserAccessCategory()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmCategories(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::CATEGORY,
ActionsInterface::CATEGORY_SEARCH,
ActionsInterface::CATEGORY_VIEW,
ActionsInterface::CATEGORY_CREATE,
ActionsInterface::CATEGORY_EDIT,
ActionsInterface::CATEGORY_DELETE
]);
}
/**
* testCheckUserAccessClient
*/
public function testCheckUserAccessClient()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmCustomers(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::CLIENT,
ActionsInterface::CLIENT_SEARCH,
ActionsInterface::CLIENT_VIEW,
ActionsInterface::CLIENT_CREATE,
ActionsInterface::CLIENT_EDIT,
ActionsInterface::CLIENT_DELETE
]);
}
/**
* testCheckUserAccessCustomField
*/
public function testCheckUserAccessCustomField()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmCustomFields(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::CUSTOMFIELD,
ActionsInterface::CUSTOMFIELD_SEARCH,
ActionsInterface::CUSTOMFIELD_VIEW,
ActionsInterface::CUSTOMFIELD_CREATE,
ActionsInterface::CUSTOMFIELD_EDIT,
ActionsInterface::CUSTOMFIELD_DELETE
]);
}
/**
* testCheckUserAccessPublicLink
*/
public function testCheckUserAccessPublicLink()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmPublicLinks(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::PUBLICLINK,
ActionsInterface::PUBLICLINK_SEARCH,
ActionsInterface::PUBLICLINK_CREATE,
ActionsInterface::PUBLICLINK_REFRESH,
ActionsInterface::PUBLICLINK_VIEW,
ActionsInterface::PUBLICLINK_EDIT,
ActionsInterface::PUBLICLINK_DELETE
]);
}
/**
* testCheckUserAccessPublicLinkCreate
*/
public function testCheckUserAccessPublicLinkCreate()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccPublicLinks(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::PUBLICLINK_CREATE,
ActionsInterface::PUBLICLINK_REFRESH
]);
}
/**
* testCheckUserAccessAccount
*/
public function testCheckUserAccessAccount()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmAccounts(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::ACCOUNTMGR,
ActionsInterface::ACCOUNTMGR_SEARCH,
ActionsInterface::ACCOUNTMGR_HISTORY,
ActionsInterface::ACCOUNTMGR_HISTORY_SEARCH
]);
}
/**
* testCheckUserAccessFile
*/
public function testCheckUserAccessFile()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmFiles(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::FILE,
ActionsInterface::FILE_SEARCH,
ActionsInterface::FILE_DELETE,
ActionsInterface::FILE_VIEW,
ActionsInterface::FILE_DOWNLOAD
]);
}
/**
* testCheckUserAccessTag
*/
public function testCheckUserAccessTag()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmTags(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ITEMS_MANAGE,
ActionsInterface::TAG,
ActionsInterface::TAG_SEARCH,
ActionsInterface::TAG_VIEW,
ActionsInterface::TAG_CREATE,
ActionsInterface::TAG_EDIT,
ActionsInterface::TAG_DELETE
]);
}
/**
* testCheckUserAccessConfigCrypt
*/
public function testCheckUserAccessConfigCrypt()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setConfigEncryption(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::CONFIG,
ActionsInterface::CONFIG_CRYPT
]);
}
/**
* testCheckUserAccessConfigBackup
*/
public function testCheckUserAccessConfigBackup()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setConfigBackup(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::CONFIG,
ActionsInterface::CONFIG_BACKUP
]);
}
/**
* testCheckUserAccessUser
*/
public function testCheckUserAccessUser()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmUsers(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ACCESS_MANAGE,
ActionsInterface::USER,
ActionsInterface::USER_SEARCH,
ActionsInterface::USER_VIEW,
ActionsInterface::USER_CREATE,
ActionsInterface::USER_EDIT,
ActionsInterface::USER_DELETE,
ActionsInterface::USER_EDIT_PASS
]);
}
/**
* testCheckUserAccessUserGroup
*/
public function testCheckUserAccessUserGroup()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmGroups(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ACCESS_MANAGE,
ActionsInterface::GROUP,
ActionsInterface::GROUP_SEARCH,
ActionsInterface::GROUP_VIEW,
ActionsInterface::GROUP_CREATE,
ActionsInterface::GROUP_EDIT,
ActionsInterface::GROUP_DELETE
]);
}
/**
* testCheckUserAccessUserProfile
*/
public function testCheckUserAccessUserProfile()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmProfiles(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ACCESS_MANAGE,
ActionsInterface::PROFILE,
ActionsInterface::PROFILE_SEARCH,
ActionsInterface::PROFILE_VIEW,
ActionsInterface::PROFILE_CREATE,
ActionsInterface::PROFILE_EDIT,
ActionsInterface::PROFILE_DELETE
]);
}
/**
* testCheckUserAccessAuthToken
*/
public function testCheckUserAccessAuthToken()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setMgmApiTokens(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::ACCESS_MANAGE,
ActionsInterface::AUTHTOKEN,
ActionsInterface::AUTHTOKEN_SEARCH,
ActionsInterface::AUTHTOKEN_VIEW,
ActionsInterface::AUTHTOKEN_CREATE,
ActionsInterface::AUTHTOKEN_EDIT,
ActionsInterface::AUTHTOKEN_DELETE
]);
}
/**
* testCheckUserAccessEventlog
*/
public function testCheckUserAccessEventlog()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setEvl(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([
ActionsInterface::EVENTLOG,
ActionsInterface::EVENTLOG_SEARCH,
ActionsInterface::EVENTLOG_CLEAR
]);
}
/**
* testCheckUserAccessAccountViewPass
*/
public function testCheckUserAccessAccountViewPass()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccViewPass(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->checkUserAccess([ActionsInterface::ACCOUNT_VIEW_PASS, ActionsInterface::CUSTOMFIELD_VIEW_PASS]);
}
/**
* testCheckUserAccessAccountHistoryView
*/
public function testCheckUserAccessAccountHistoryView()
{
$userData = new UserLoginResponse();
$userData->setId(2);
$userProfile = new ProfileData();
$userProfile->setAccViewHistory(true);
$this->context->setUserData($userData);
$this->context->setUserProfile($userProfile);
$this->assertTrue($this->acl->checkUserAccess(ActionsInterface::ACCOUNT_HISTORY_VIEW));
$this->checkUserAccess([ActionsInterface::ACCOUNT_HISTORY_VIEW]);
}
/**
* @dataProvider actionsProvider
*
* @param $id
*/
public function testGetActionInfo($id)
{
$this->assertNotEmpty(Acl::getActionInfo($id));
}
/**
* testGetActionInfoUnknown
*/
public function testGetActionInfoUnknown()
{
$this->assertEmpty(Acl::getActionInfo(10000));
}
/**
* @throws DependencyException
* @throws NotFoundException
* @throws ContextException
*/
protected function setUp(): void
{
$dic = setupContext();
$this->acl = $dic->get(Acl::class);
$this->context = $dic->get(ContextInterface::class);
}
}