mirror of
https://github.com/friendica/friendica
synced 2025-04-27 18:30:12 +00:00
396 lines
9.8 KiB
PHP
396 lines
9.8 KiB
PHP
<?php
|
|
|
|
namespace Friendica\Test\src\Security\PermissionSet\Repository;
|
|
|
|
use Friendica\Database\Database;
|
|
use Friendica\Security\PermissionSet\Collection\PermissionSets;
|
|
use Friendica\Security\PermissionSet\Exception\PermissionSetNotFoundException;
|
|
use Friendica\Security\PermissionSet\Repository\PermissionSet as PermissionSetRepository;
|
|
use Friendica\Security\PermissionSet\Entity\PermissionSet;
|
|
use Friendica\Security\PermissionSet\Factory\PermissionSet as PermissionSetFactory;
|
|
use Friendica\Test\FixtureTest;
|
|
use Friendica\DI;
|
|
|
|
class PermissionSetTest extends FixtureTest
|
|
{
|
|
/** @var PermissionSetRepository */
|
|
private $repository;
|
|
/** @var PermissionSetFactory */
|
|
private $factory;
|
|
|
|
public function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
$this->repository = DI::permissionSet();
|
|
$this->factory = DI::permissionSetFactory();
|
|
}
|
|
|
|
public function testSelectOneByIdPublic()
|
|
{
|
|
$permissionSet = $this->repository->selectPublicForUser(1);
|
|
|
|
$this->assertInstanceOf(PermissionSet::class, $permissionSet);
|
|
self::assertEmpty($permissionSet->allow_cid);
|
|
self::assertEmpty($permissionSet->allow_gid);
|
|
self::assertEmpty($permissionSet->deny_cid);
|
|
self::assertEmpty($permissionSet->deny_gid);
|
|
self::assertEmpty(PermissionSetRepository::PUBLIC, $permissionSet->id);
|
|
self::assertEquals(1, $permissionSet->uid);
|
|
}
|
|
|
|
/**
|
|
* Test create/update PermissionSets
|
|
*/
|
|
public function testSaving()
|
|
{
|
|
$permissionSet = $this->factory->createFromString(42, '', '<~>');
|
|
|
|
$permissionSet = $this->repository->selectOrCreate($permissionSet);
|
|
|
|
self::assertNotNull($permissionSet->id);
|
|
|
|
$permissionSetSelected = $this->repository->selectOneById($permissionSet->id, 42);
|
|
|
|
self::assertEquals($permissionSet, $permissionSetSelected);
|
|
|
|
$newPermissionSet = $permissionSet->withAllowedContacts(['1', '2']);
|
|
$savedPermissionSet = $this->repository->save($newPermissionSet);
|
|
|
|
self::assertNotNull($savedPermissionSet->id);
|
|
self::assertNull($newPermissionSet->id);
|
|
|
|
$permissionSetSavedSelected = $this->repository->selectOneById($savedPermissionSet->id, 42);
|
|
|
|
self::assertEquals($savedPermissionSet, $permissionSetSavedSelected);
|
|
}
|
|
|
|
/**
|
|
* Asserts that the actual permissionset is equal to the expected permissionset
|
|
* --> It skips the "id" fields
|
|
*
|
|
* @param PermissionSets $expected
|
|
* @param PermissionSets $actual
|
|
*/
|
|
public static function assertEqualPermissionSets(PermissionSets $expected, PermissionSets $actual)
|
|
{
|
|
self::assertEquals($expected->count(), $actual->count(), 'PermissionSets not even ' . PHP_EOL . 'expected: ' . print_r($expected, true) . 'actual: ' . print_r($actual, true));
|
|
|
|
foreach ($expected as $outputPermissionSet) {
|
|
self::assertCount(1, $actual->filter(function (PermissionSet $actualPermissionSet) use ($outputPermissionSet) {
|
|
return (
|
|
$actualPermissionSet->uid == $outputPermissionSet->uid &&
|
|
$actualPermissionSet->allow_cid == $outputPermissionSet->allow_cid &&
|
|
$actualPermissionSet->allow_gid == $outputPermissionSet->allow_gid &&
|
|
$actualPermissionSet->deny_cid == $outputPermissionSet->deny_cid &&
|
|
$actualPermissionSet->deny_gid == $outputPermissionSet->deny_gid
|
|
);
|
|
}), 'PermissionSet not found: ' . print_r($outputPermissionSet, true));
|
|
}
|
|
}
|
|
|
|
public function dataSet()
|
|
{
|
|
return [
|
|
'standard' => [
|
|
'group_member' => [],
|
|
'permissionSets' => [
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '<43>',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '<44>',
|
|
'deny_gid' => '',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '<44>',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '',
|
|
],
|
|
],
|
|
'assertions' => [
|
|
[
|
|
'input' => [
|
|
'cid' => 43,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [43], [], [44], []),
|
|
new PermissionSet(42, [], [], [], []),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 44,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], []),
|
|
new PermissionSet(42, [44], [], [], []),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 47,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], []),
|
|
]),
|
|
],
|
|
],
|
|
],
|
|
'empty' => [
|
|
'group_member' => [],
|
|
'permissionSets' => [
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '',
|
|
],
|
|
],
|
|
'assertions' => [
|
|
[
|
|
'input' => [
|
|
'cid' => 43,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], []),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 44,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], []),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 47,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], []),
|
|
]),
|
|
],
|
|
]
|
|
],
|
|
'nothing' => [
|
|
'group_member' => [],
|
|
'permissionSets' => [
|
|
],
|
|
'assertions' => [
|
|
[
|
|
'input' => [
|
|
'cid' => 43,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets(),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 44,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets(),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 47,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets(),
|
|
],
|
|
]
|
|
],
|
|
'with_groups' => [
|
|
'group_member' => [
|
|
[
|
|
'id' => 1,
|
|
'gid' => 1,
|
|
'contact-id' => 47,
|
|
],
|
|
[
|
|
'id' => 2,
|
|
'gid' => 1,
|
|
'contact-id' => 42,
|
|
],
|
|
[
|
|
'id' => 3,
|
|
'gid' => 2,
|
|
'contact-id' => 43,
|
|
],
|
|
],
|
|
'permissionSets' => [
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '<43>',
|
|
'allow_gid' => '<3>',
|
|
'deny_cid' => '<44>,<46>',
|
|
'deny_gid' => '',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '<2>',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '<44>',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '<1>',
|
|
],
|
|
[
|
|
'uid' => 42,
|
|
'allow_cid' => '<45>',
|
|
'allow_gid' => '',
|
|
'deny_cid' => '',
|
|
'deny_gid' => '<1><2>',
|
|
],
|
|
],
|
|
'assertions' => [
|
|
[
|
|
'input' => [
|
|
'cid' => 42,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 43,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [43], [3], [44, 46], []),
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
new PermissionSet(42, [], [], [], [1]),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 44,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
new PermissionSet(42, [44], [], [], []),
|
|
new PermissionSet(42, [], [], [], [1]),
|
|
new PermissionSet(42, [45], [], [], [1, 2]),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 45,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
new PermissionSet(42, [44], [], [], []),
|
|
new PermissionSet(42, [], [], [], [1]),
|
|
new PermissionSet(42, [45], [], [], [1, 2]),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 46,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
new PermissionSet(42, [], [], [], [1]),
|
|
]),
|
|
],
|
|
[
|
|
'input' => [
|
|
'cid' => 47,
|
|
'uid' => 42,
|
|
],
|
|
'output' => new PermissionSets([
|
|
new PermissionSet(42, [], [], [], [2]),
|
|
new PermissionSet(42, [], [], [], [1]),
|
|
]),
|
|
],
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataSet
|
|
*/
|
|
public function testSelectContactId(array $group_member, array $inputPermissionSets, array $assertions)
|
|
{
|
|
/** @var Database $db */
|
|
$db = $this->dice->create(Database::class);
|
|
|
|
foreach ($group_member as $gmember) {
|
|
$db->insert('group_member', $gmember, true);
|
|
}
|
|
|
|
foreach ($inputPermissionSets as $inputPermissionSet) {
|
|
$db->insert('permissionset', $inputPermissionSet, true);
|
|
}
|
|
|
|
foreach ($assertions as $assertion) {
|
|
$permissionSets = $this->repository->selectByContactId($assertion['input']['cid'], $assertion['input']['uid']);
|
|
self::assertInstanceOf(PermissionSets::class, $permissionSets);
|
|
self::assertEqualPermissionSets($assertion['output'], $permissionSets);
|
|
}
|
|
}
|
|
|
|
public function testSelectOneByIdInvalid()
|
|
{
|
|
self::expectException(PermissionSetNotFoundException::class);
|
|
self::expectExceptionMessage('PermissionSet with id -1 for user 42 doesn\'t exist.');
|
|
|
|
$this->repository->selectOneById(-1, 42);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataSet
|
|
*/
|
|
public function testSelectOneById(array $group_member, array $inputPermissionSets, array $assertions)
|
|
{
|
|
if (count($inputPermissionSets) === 0) {
|
|
self::markTestSkipped('Nothing to assert.');
|
|
}
|
|
|
|
/** @var Database $db */
|
|
$db = $this->dice->create(Database::class);
|
|
|
|
foreach ($inputPermissionSets as $inputPermissionSet) {
|
|
$db->insert('permissionset', $inputPermissionSet);
|
|
$id = $db->lastInsertId();
|
|
|
|
self::assertInstanceOf(PermissionSet::class, $this->repository->selectOneById($id, $inputPermissionSet['uid']));
|
|
}
|
|
}
|
|
}
|