1
0
Fork 0
mirror of synced 2024-05-19 20:22:33 +12:00

adapt to review

This commit is contained in:
Torsten Dittmann 2021-07-13 17:18:02 +02:00
parent c89f7b4c1f
commit 882686952e
7 changed files with 104 additions and 101 deletions

View file

@ -206,7 +206,7 @@ App::shutdown(function ($utopia, $request, $response, $project, $events, $audits
$response->getPayload(),
$events->getParam('event'),
$target['channels'],
$target['permissions'],
$target['roles'],
[
'permissionsChanged' => $target['permissionsChanged'],
'userId' => $events->getParam('userId')

View file

@ -96,12 +96,12 @@ $server->onWorkerStart(function (int $workerId) use ($server, $register, $stats,
$event = [
'event' => 'stats.connections',
'channels' => ['project'],
'permissions' => ['role:member'],
'roles' => ['role:member'],
'timestamp' => time(),
'payload' => $payload
];
$server->send($realtime->getReceivers($event), json_encode($event));
$server->send($realtime->getSubscribers($event), json_encode($event));
}
});
@ -156,7 +156,7 @@ $server->onWorkerStart(function (int $workerId) use ($server, $register, $stats,
$register->get('redisPool')->put($cache);
}
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
// Temporarily print debug logs by default for Alpha testing.
// if (App::isDevelopment() && !empty($receivers)) {
@ -263,7 +263,7 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server,
$roles = Auth::getRoles($user);
$channels = Realtime::convertChannels($request->getQuery('channels', []), $user);
$channels = Realtime::convertChannels($request->getQuery('channels', []), $user->getId());
/**
* Channels Check

View file

@ -450,12 +450,12 @@ class FunctionsV1 extends Worker
else {
Console::info('Container is ready to run');
}
$stdout = '';
$stderr = '';
$executionStart = \microtime(true);
$exitCode = Console::execute("docker exec ".\implode(" ", $vars)." {$container} {$command}"
, '', $stdout, $stderr, $function->getAttribute('timeout', (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)));
@ -466,7 +466,7 @@ class FunctionsV1 extends Worker
Console::info("Function executed in " . ($executionEnd - $executionStart) . " seconds with exit code {$exitCode}");
Authorization::disable();
$execution = $database->updateDocument(array_merge($execution->getArrayCopy(), [
'tagId' => $tag->getId(),
'status' => $functionStatus,
@ -475,7 +475,7 @@ class FunctionsV1 extends Worker
'stderr' => \mb_substr($stderr, -4000), // log last 4000 chars output
'time' => $executionTime,
]));
Authorization::reset();
if (false === $function) {
@ -501,7 +501,7 @@ class FunctionsV1 extends Worker
$execution->getArrayCopy(),
'functions.executions.update',
$target['channels'],
$target['permissions']
$target['roles']
);
$usage = new Event('v1-usage', 'UsageV1');
@ -515,7 +515,7 @@ class FunctionsV1 extends Worker
->setParam('networkRequestSize', 0)
->setParam('networkResponseSize', 0)
;
if(App::getEnv('_APP_USAGE_STATS', 'enabled') == 'enabled') {
$usage->trigger();
}

View file

@ -43,6 +43,7 @@ class Realtime extends Adapter
*/
public function subscribe(string $projectId, mixed $connection, array $roles, array $channels): void
{
//TODO: merge project & channel to a single layer
if (!isset($this->subscriptions[$projectId])) { // Init Project
$this->subscriptions[$projectId] = [];
}
@ -65,7 +66,7 @@ class Realtime extends Adapter
}
/**
* Removes Subscription.
* Removes Subscription.
*
* @param mixed $connection
* @return void
@ -101,10 +102,11 @@ class Realtime extends Adapter
* @param string $projectId
* @param string $role
* @param string $channel
* @return bool
* @return bool
*/
public function hasSubscriber(string $projectId, string $role, string $channel = ''): bool
{
//TODO: look into moving it to an abstract class in the parent class
if (empty($channel)) {
return array_key_exists($projectId, $this->subscriptions)
&& array_key_exists($role, $this->subscriptions[$projectId]);
@ -121,22 +123,22 @@ class Realtime extends Adapter
* @param array $payload
* @param string $event
* @param array $channels
* @param array $permissions
* @param array $roles
* @param array $options
* @return void
*/
public static function send(string $project, array $payload, string $event, array $channels, array $permissions, array $options = []): void
public static function send(string $project, array $payload, string $event, array $channels, array $roles, array $options = []): void
{
if (empty($channels) || empty($permissions) || empty($project)) return;
$permissionsChanged = array_key_exists('permissionsChanged', $options) && $options['permissionsChanged'];
$userId = array_key_exists('userId', $options) ? $options['userId'] : null;
$redis = new \Redis();
$redis = new \Redis(); //TODO: make this part of the constructor
$redis->connect(App::getEnv('_APP_REDIS_HOST', ''), App::getEnv('_APP_REDIS_PORT', ''));
$redis->publish('realtime', json_encode([
'project' => $project,
'permissions' => $permissions,
'roles' => $roles,
'permissionsChanged' => $permissionsChanged,
'userId' => $userId,
'data' => [
@ -161,18 +163,19 @@ class Realtime extends Adapter
*
* @param array $event
*/
public function getReceivers(array $event)
public function getSubscribers(array $event)
{
//TODO: do comments
$receivers = [];
if (isset($this->subscriptions[$event['project']])) {
foreach ($this->subscriptions[$event['project']] as $role => $subscription) {
foreach ($event['data']['channels'] as $channel) {
if (
\array_key_exists($channel, $this->subscriptions[$event['project']][$role])
&& (\in_array($role, $event['permissions']) || \in_array('*', $event['permissions']))
&& (\in_array($role, $event['roles']) || \in_array('*', $event['roles']))
) {
foreach (array_keys($this->subscriptions[$event['project']][$role][$channel]) as $ids) {
$receivers[$ids] = 0;
foreach (array_keys($this->subscriptions[$event['project']][$role][$channel]) as $id) {
$receivers[$id] = 0;
}
break;
}
@ -187,10 +190,10 @@ class Realtime extends Adapter
* Converts the channels from the Query Params into an array.
* Also renames the account channel to account.USER_ID and removes all illegal account channel variations.
* @param array $channels
* @param Document $user
* @param string $userId
* @return array
*/
public static function convertChannels(array $channels, Document $user): array
public static function convertChannels(array $channels, string $userId): array
{
$channels = array_flip($channels);
@ -201,8 +204,8 @@ class Realtime extends Adapter
break;
case $key === 'account':
if (!empty($user->getId())) {
$channels['account.' . $user->getId()] = $value;
if (!empty($userId)) {
$channels['account.' . $userId] = $value;
}
unset($channels['account']);
break;
@ -210,8 +213,8 @@ class Realtime extends Adapter
}
if (\array_key_exists('account', $channels)) {
if ($user->getId()) {
$channels['account.' . $user->getId()] = $channels['account'];
if ($userId) {
$channels['account.' . $userId] = $channels['account'];
}
unset($channels['account']);
}
@ -227,7 +230,7 @@ class Realtime extends Adapter
public static function fromPayload(string $event, Document $payload): array
{
$channels = [];
$permissions = [];
$roles = [];
$permissionsChanged = false;
switch (true) {
@ -236,46 +239,46 @@ class Realtime extends Adapter
case strpos($event, 'account.verification.') === 0:
$channels[] = 'account';
$channels[] = 'account.' . $payload->getAttribute('userId');
$permissions = ['user:' . $payload->getAttribute('userId')];
$roles = ['user:' . $payload->getAttribute('userId')];
break;
case strpos($event, 'account.') === 0:
$channels[] = 'account';
$channels[] = 'account.' . $payload->getId();
$permissions = ['user:' . $payload->getId()];
$roles = ['user:' . $payload->getId()];
break;
case strpos($event, 'teams.memberships') === 0:
$permissionsChanged = in_array($event, ['teams.memberships.update', 'teams.memberships.delete', 'teams.memberships.update.status']);
$channels[] = 'memberships';
$channels[] = 'memberships.' . $payload->getId();
$permissions = ['team:' . $payload->getAttribute('teamId')];
$roles = ['team:' . $payload->getAttribute('teamId')];
break;
case strpos($event, 'teams.') === 0:
$permissionsChanged = $event === 'teams.create';
$channels[] = 'teams';
$channels[] = 'teams.' . $payload->getId();
$permissions = ['team:' . $payload->getId()];
$roles = ['team:' . $payload->getId()];
break;
case strpos($event, 'database.collections.') === 0:
$channels[] = 'collections';
$channels[] = 'collections.' . $payload->getId();
$permissions = $payload->getAttribute('$permissions.read');
$roles = $payload->getAttribute('$permissions.read');
break;
case strpos($event, 'database.documents.') === 0:
$channels[] = 'documents';
$channels[] = 'collections.' . $payload->getAttribute('$collection') . '.documents';
$channels[] = 'documents.' . $payload->getId();
$permissions = $payload->getAttribute('$permissions.read');
$roles = $payload->getAttribute('$permissions.read');
break;
case strpos($event, 'storage.') === 0:
$channels[] = 'files';
$channels[] = 'files.' . $payload->getId();
$permissions = $payload->getAttribute('$permissions.read');
$roles = $payload->getAttribute('$permissions.read');
break;
case strpos($event, 'functions.executions.') === 0:
@ -283,14 +286,14 @@ class Realtime extends Adapter
$channels[] = 'executions';
$channels[] = 'executions.' . $payload->getId();
$channels[] = 'functions.' . $payload->getAttribute('functionId');
$permissions = $payload->getAttribute('$permissions.read');
$roles = $payload->getAttribute('$permissions.read');
}
break;
}
return [
'channels' => $channels,
'permissions' => $permissions,
'roles' => $roles,
'permissionsChanged' => $permissionsChanged
];
}

View file

@ -62,7 +62,7 @@ class MessagingChannelsTest extends TestCase
$roles = Auth::getRoles($user);
$parsedChannels = Realtime::convertChannels([0 => $channel], $user);
$parsedChannels = Realtime::convertChannels([0 => $channel], $user->getId());
$this->realtime->subscribe(
'1',
@ -86,7 +86,7 @@ class MessagingChannelsTest extends TestCase
$roles = Auth::getRoles($user);
$parsedChannels = Realtime::convertChannels([0 => $channel], $user);
$parsedChannels = Realtime::convertChannels([0 => $channel], $user->getId());
$this->realtime->subscribe(
'1',
@ -153,7 +153,7 @@ class MessagingChannelsTest extends TestCase
foreach ($this->allChannels as $index => $channel) {
$event = [
'project' => '1',
'permissions' => ['*'],
'roles' => ['*'],
'data' => [
'channels' => [
0 => $channel,
@ -161,7 +161,7 @@ class MessagingChannelsTest extends TestCase
]
];
$receivers = $this->realtime->getReceivers($event);
$receivers = $this->realtime->getSubscribers($event);
/**
* Every Client subscribed to the Wildcard should receive this event.
@ -186,7 +186,7 @@ class MessagingChannelsTest extends TestCase
$event = [
'project' => '1',
'permissions' => $permissions,
'roles' => $permissions,
'data' => [
'channels' => [
0 => $channel,
@ -194,7 +194,7 @@ class MessagingChannelsTest extends TestCase
]
];
$receivers = $this->realtime->getReceivers($event);
$receivers = $this->realtime->getSubscribers($event);
/**
* Every Role subscribed to a Channel should receive this event.
@ -220,7 +220,7 @@ class MessagingChannelsTest extends TestCase
}
$event = [
'project' => '1',
'permissions' => $permissions,
'roles' => $permissions,
'data' => [
'channels' => [
0 => $channel,
@ -228,7 +228,7 @@ class MessagingChannelsTest extends TestCase
]
];
$receivers = $this->realtime->getReceivers($event);
$receivers = $this->realtime->getSubscribers($event);
/**
* Every Client subscribed to a Channel should receive this event.
@ -254,7 +254,7 @@ class MessagingChannelsTest extends TestCase
}
$event = [
'project' => '1',
'permissions' => $permissions,
'roles' => $permissions,
'data' => [
'channels' => [
0 => $channel,
@ -262,7 +262,7 @@ class MessagingChannelsTest extends TestCase
]
];
$receivers = $this->realtime->getReceivers($event);
$receivers = $this->realtime->getSubscribers($event);
/**
* Every Team Member should receive this event.
@ -280,7 +280,7 @@ class MessagingChannelsTest extends TestCase
$event = [
'project' => '1',
'permissions' => $permissions,
'roles' => $permissions,
'data' => [
'channels' => [
0 => $channel,
@ -288,7 +288,7 @@ class MessagingChannelsTest extends TestCase
]
];
$receivers = $this->realtime->getReceivers($event);
$receivers = $this->realtime->getSubscribers($event);
/**
* Only 1 Team Member of a role should have access to a specific channel.

View file

@ -20,7 +20,7 @@ class MessagingGuestTest extends TestCase
$event = [
'project' => '1',
'permissions' => ['*'],
'roles' => ['*'],
'data' => [
'channels' => [
0 => 'documents',
@ -29,89 +29,89 @@ class MessagingGuestTest extends TestCase
]
];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['role:guest'];
$event['roles'] = ['role:guest'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['role:member'];
$event['roles'] = ['role:member'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['user:123'];
$event['roles'] = ['user:123'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:abc'];
$event['roles'] = ['team:abc'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:abc/administrator'];
$event['roles'] = ['team:abc/administrator'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:abc/god'];
$event['roles'] = ['team:abc/god'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:def'];
$event['roles'] = ['team:def'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:def/guest'];
$event['roles'] = ['team:def/guest'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['user:456'];
$event['roles'] = ['user:456'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:def/member'];
$event['roles'] = ['team:def/member'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['*'];
$event['roles'] = ['*'];
$event['data']['channels'] = ['documents.123'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['data']['channels'] = ['documents.789'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['project'] = '2';
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);

View file

@ -29,7 +29,7 @@ class MessagingTest extends TestCase
$event = [
'project' => '1',
'permissions' => ['*'],
'roles' => ['*'],
'data' => [
'channels' => [
0 => 'account.123',
@ -37,89 +37,89 @@ class MessagingTest extends TestCase
]
];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['role:member'];
$event['roles'] = ['role:member'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['user:123'];
$event['roles'] = ['user:123'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['team:abc'];
$event['roles'] = ['team:abc'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['team:abc/administrator'];
$event['roles'] = ['team:abc/administrator'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['team:abc/moderator'];
$event['roles'] = ['team:abc/moderator'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['team:def'];
$event['roles'] = ['team:def'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['team:def/guest'];
$event['roles'] = ['team:def/guest'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['permissions'] = ['user:456'];
$event['roles'] = ['user:456'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['team:def/member'];
$event['roles'] = ['team:def/member'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['permissions'] = ['*'];
$event['roles'] = ['*'];
$event['data']['channels'] = ['documents.123'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
$event['data']['channels'] = ['documents.789'];
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertCount(1, $receivers);
$this->assertEquals(1, $receivers[0]);
$event['project'] = '2';
$receivers = $realtime->getReceivers($event);
$receivers = $realtime->getSubscribers($event);
$this->assertEmpty($receivers);
@ -148,7 +148,7 @@ class MessagingTest extends TestCase
4 => 'account.456'
];
$channels = Realtime::convertChannels($channels, $user);
$channels = Realtime::convertChannels($channels, $user->getId());
$this->assertCount(3, $channels);
$this->assertArrayHasKey('files', $channels);
$this->assertArrayHasKey('documents', $channels);
@ -185,7 +185,7 @@ class MessagingTest extends TestCase
4 => 'account.456'
];
$channels = Realtime::convertChannels($channels, $user);
$channels = Realtime::convertChannels($channels, $user->getId());
$this->assertCount(4, $channels);
$this->assertArrayHasKey('files', $channels);