Page MenuHomePhorge

D5244.1775341812.diff
No OneTemporary

Authored By
Unknown
Size
5 KB
Referenced Files
None
Subscribers
None

D5244.1775341812.diff

diff --git a/src/app/Backends/Roundcube.php b/src/app/Backends/Roundcube.php
--- a/src/app/Backends/Roundcube.php
+++ b/src/app/Backends/Roundcube.php
@@ -265,7 +265,7 @@
}
/**
- * Validate user identities, remove these these that user no longer has access to.
+ * Validate user identities, remove those that user no longer has access to.
*
* @param User $user User
*/
diff --git a/src/app/Jobs/User/Delegation/UserRefreshJob.php b/src/app/Jobs/User/Delegation/UserRefreshJob.php
new file mode 100644
--- /dev/null
+++ b/src/app/Jobs/User/Delegation/UserRefreshJob.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Jobs\User\Delegation;
+
+use App\Jobs\UserJob;
+use App\Support\Facades\Roundcube;
+
+class UserRefreshJob extends UserJob
+{
+ /**
+ * Execute the job.
+ *
+ * @throws \Exception
+ */
+ public function handle()
+ {
+ $this->logJobStart("{$this->userId} ({$this->userEmail})");
+
+ if (!\config('database.connections.roundcube')) {
+ return;
+ }
+
+ $user = $this->getUser();
+
+ if (!$user || $user->trashed()) {
+ return;
+ }
+
+ // Delete delegators' identities in Roundcube
+ Roundcube::resetIdentities($user);
+ }
+}
diff --git a/src/app/Observers/UserAliasObserver.php b/src/app/Observers/UserAliasObserver.php
--- a/src/app/Observers/UserAliasObserver.php
+++ b/src/app/Observers/UserAliasObserver.php
@@ -78,6 +78,11 @@
if ($alias->user) {
UpdateJob::dispatch($alias->user_id);
+ \App\Delegation::where('user_id', $alias->user_id)->pluck('delegatee_id')
+ ->each(static function ($delegatee_id) {
+ \App\Jobs\User\Delegation\UserRefreshJob::dispatch($delegatee_id);
+ });
+
if (Tenant::getConfig($alias->user->tenant_id, 'pgp.enable')) {
KeyDeleteJob::dispatch($alias->user_id, $alias->alias);
}
diff --git a/src/tests/Feature/Jobs/User/Delegation/UserRefreshTest.php b/src/tests/Feature/Jobs/User/Delegation/UserRefreshTest.php
new file mode 100644
--- /dev/null
+++ b/src/tests/Feature/Jobs/User/Delegation/UserRefreshTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Tests\Feature\Jobs\User\Delegation;
+
+use App\Delegation;
+use App\Support\Facades\Roundcube;
+use App\User;
+use Illuminate\Support\Facades\Queue;
+use Tests\TestCase;
+
+class UserRefreshTest extends TestCase
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function setUp(): void
+ {
+ parent::setUp();
+
+ $this->deleteTestUser('delegation-user1@' . \config('app.domain'));
+ $this->deleteTestUser('delegation-user2@' . \config('app.domain'));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function tearDown(): void
+ {
+ $this->deleteTestUser('delegation-user1@' . \config('app.domain'));
+ $this->deleteTestUser('delegation-user2@' . \config('app.domain'));
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test job handle
+ */
+ public function testHandle(): void
+ {
+ Queue::fake();
+
+ $user = $this->getTestUser('delegation-user1@' . \config('app.domain'));
+
+ // Test successful creation
+ Roundcube::shouldReceive('resetIdentities')->once()->with($user);
+
+ $job = (new \App\Jobs\User\Delegation\UserRefreshJob($user->id))->withFakeQueueInteractions();
+ $job->handle();
+ $job->assertNotFailed();
+ }
+}
diff --git a/src/tests/Feature/UserTest.php b/src/tests/Feature/UserTest.php
--- a/src/tests/Feature/UserTest.php
+++ b/src/tests/Feature/UserTest.php
@@ -1425,6 +1425,9 @@
$user->tenant->setSetting('pgp.enable', 1);
+ $userB = $this->getTestUser('UserAccountB@UserAccount.com');
+ $delegation = Delegation::create(['user_id' => $user->id, 'delegatee_id' => $userB->id]);
+
// Remove an alias
$this->fakeQueueReset();
$user->setAliases(['UserAlias1@UserAccount.com']);
@@ -1441,16 +1444,28 @@
return $userId == $user->id && $userEmail === 'useralias2@useraccount.com';
}
);
+ Queue::assertPushed(\App\Jobs\User\Delegation\UserRefreshJob::class, 1);
+ Queue::assertPushed(
+ \App\Jobs\User\Delegation\UserRefreshJob::class,
+ function ($job) use ($userB) {
+ $userId = TestCase::getObjectProperty($job, 'userId');
+ $userEmail = TestCase::getObjectProperty($job, 'userEmail');
+ return $userId == $userB->id && $userEmail === $userB->email;
+ }
+ );
$aliases = $user->aliases()->get();
$this->assertCount(1, $aliases);
$this->assertSame('useralias1@useraccount.com', $aliases[0]['alias']);
+ $delegation->delete();
+
// Remove all aliases
$this->fakeQueueReset();
$user->setAliases([]);
Queue::assertPushed(UpdateJob::class, 1);
+ Queue::assertPushed(\App\Jobs\User\Delegation\UserRefreshJob::class, 0);
$this->assertCount(0, $user->aliases()->get());
}

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 4, 10:30 PM (13 m, 2 s ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18831434
Default Alt Text
D5244.1775341812.diff (5 KB)

Event Timeline