diff --git a/src/app/Domain.php b/src/app/Domain.php --- a/src/app/Domain.php +++ b/src/app/Domain.php @@ -110,13 +110,13 @@ } /** - * Return list of public+active domain names + * Return list of public+active domain names (for current tenant) */ public static function getPublicDomains(): array { - $where = sprintf('(type & %s)', Domain::TYPE_PUBLIC); - - return self::whereRaw($where)->get(['namespace'])->pluck('namespace')->toArray(); + return self::withEnvTenant() + ->whereRaw(sprintf('(type & %s)', Domain::TYPE_PUBLIC)) + ->get(['namespace'])->pluck('namespace')->toArray(); } /** diff --git a/src/app/Http/Controllers/API/V4/DomainsController.php b/src/app/Http/Controllers/API/V4/DomainsController.php --- a/src/app/Http/Controllers/API/V4/DomainsController.php +++ b/src/app/Http/Controllers/API/V4/DomainsController.php @@ -152,7 +152,7 @@ */ public function status($id) { - $domain = Domain::find($id); + $domain = Domain::withEnvTenant()->findOrFail($id); // Only owner (or admin) has access to the domain if (!Auth::guard()->user()->canRead($domain)) { diff --git a/src/app/User.php b/src/app/User.php --- a/src/app/User.php +++ b/src/app/User.php @@ -301,12 +301,19 @@ /** * List the domains to which this user is entitled. + * Note: Active public domains are also returned (for the user tenant). * - * @return Domain[] + * @return Domain[] List of Domain objects */ - public function domains() + public function domains(): array { - $domains = Domain::whereRaw(sprintf('(type & %s)', Domain::TYPE_PUBLIC)) + if ($this->tenant_id) { + $domains = Domain::where('tenant_id', $this->tenant_id); + } else { + $domains = Domain::withEnvTenant(); + } + + $domains = $domains->whereRaw(sprintf('(type & %s)', Domain::TYPE_PUBLIC)) ->whereRaw(sprintf('(status & %s)', Domain::STATUS_ACTIVE)) ->get() ->all(); diff --git a/src/tests/Feature/DomainTest.php b/src/tests/Feature/DomainTest.php --- a/src/tests/Feature/DomainTest.php +++ b/src/tests/Feature/DomainTest.php @@ -123,12 +123,18 @@ $public_domains = Domain::getPublicDomains(); $this->assertNotContains('public-active.com', $public_domains); - $domain = Domain::where('namespace', 'public-active.com')->first(); $domain->type = Domain::TYPE_PUBLIC; $domain->save(); $public_domains = Domain::getPublicDomains(); $this->assertContains('public-active.com', $public_domains); + + // Domains of other tenants should not be returned + $domain->tenant_id = 2; + $domain->save(); + + $public_domains = Domain::getPublicDomains(); + $this->assertNotContains('public-active.com', $public_domains); } /** 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 @@ -297,26 +297,32 @@ public function testDomains(): void { $user = $this->getTestUser('john@kolab.org'); - $domains = []; + $domain = $this->getTestDomain('useraccount.com', [ + 'status' => Domain::STATUS_NEW | Domain::STATUS_ACTIVE, + 'type' => Domain::TYPE_PUBLIC, + ]); - foreach ($user->domains() as $domain) { - $domains[] = $domain->namespace; - } + $domains = collect($user->domains())->pluck('namespace')->all(); - $this->assertContains(\config('app.domain'), $domains); + $this->assertContains($domain->namespace, $domains); $this->assertContains('kolab.org', $domains); // Jack is not the wallet controller, so for him the list should not // include John's domains, kolab.org specifically $user = $this->getTestUser('jack@kolab.org'); - $domains = []; - foreach ($user->domains() as $domain) { - $domains[] = $domain->namespace; - } + $domains = collect($user->domains())->pluck('namespace')->all(); - $this->assertContains(\config('app.domain'), $domains); + $this->assertContains($domain->namespace, $domains); $this->assertNotContains('kolab.org', $domains); + + // Public domains of other tenants should not be returned + $domain->tenant_id = 2; + $domain->save(); + + $domains = collect($user->domains())->pluck('namespace')->all(); + + $this->assertNotContains($domain->namespace, $domains); } public function testUserQuota(): void