mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 19:34:04 +00:00
Fix origin id w/ empty header & using full-hostname subdomain records
This makes it possible to have Domain records in both `foo` and
`foo.{centralDomain}` format when using the combined domain/subdomain
identification middleware, or the origin header id mw which extends it.
This commit also refactors some related logic.
This commit is contained in:
parent
c199a6e0c8
commit
56dd4117ab
7 changed files with 131 additions and 63 deletions
|
|
@ -44,7 +44,12 @@ class InitializeTenancyByDomain extends IdentificationMiddleware
|
|||
*/
|
||||
public function requestHasTenant(Request $request): bool
|
||||
{
|
||||
return ! in_array($this->getDomain($request), config('tenancy.identification.central_domains'));
|
||||
$domain = $this->getDomain($request);
|
||||
|
||||
// Mainly used with origin identification if the header isn't specified and e.g. universal routes are used
|
||||
if (! $domain) return false;
|
||||
|
||||
return ! in_array($domain, config('tenancy.identification.central_domains'));
|
||||
}
|
||||
|
||||
public function getDomain(Request $request): string
|
||||
|
|
|
|||
|
|
@ -8,8 +8,9 @@ use Closure;
|
|||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Str;
|
||||
use Stancl\Tenancy\Concerns\UsableWithEarlyIdentification;
|
||||
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
|
||||
use Stancl\Tenancy\Contracts\TenantCouldNotBeIdentifiedException;
|
||||
|
||||
class InitializeTenancyByDomainOrSubdomain extends InitializeTenancyBySubdomain
|
||||
{
|
||||
|
|
@ -23,34 +24,46 @@ class InitializeTenancyByDomainOrSubdomain extends InitializeTenancyBySubdomain
|
|||
}
|
||||
|
||||
$domain = $this->getDomain($request);
|
||||
$subdomain = null;
|
||||
|
||||
if ($this->isSubdomain($domain)) {
|
||||
$domain = $this->makeSubdomain($domain);
|
||||
if (DomainTenantResolver::isSubdomain($domain)) {
|
||||
$subdomain = $this->makeSubdomain($domain);
|
||||
|
||||
if ($domain instanceof Exception) {
|
||||
if ($subdomain instanceof Exception) {
|
||||
$onFail = static::$onFail ?? function ($e) {
|
||||
throw $e;
|
||||
};
|
||||
|
||||
return $onFail($domain, $request, $next);
|
||||
}
|
||||
|
||||
// If a Response instance was returned, we return it immediately.
|
||||
// todo@samuel when does this execute?
|
||||
if ($domain instanceof Response) {
|
||||
return $domain;
|
||||
return $onFail($subdomain, $request, $next);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->initializeTenancy(
|
||||
$request,
|
||||
$next,
|
||||
$domain
|
||||
);
|
||||
}
|
||||
try {
|
||||
$this->tenancy->initialize(
|
||||
$this->resolver->resolve($subdomain ?? $domain)
|
||||
);
|
||||
} catch (TenantCouldNotBeIdentifiedException $e) {
|
||||
if ($subdomain) {
|
||||
try {
|
||||
$this->tenancy->initialize(
|
||||
$this->resolver->resolve($domain)
|
||||
);
|
||||
} catch (TenantCouldNotBeIdentifiedException $e) {
|
||||
$onFail = static::$onFail ?? function ($e) {
|
||||
throw $e;
|
||||
};
|
||||
|
||||
protected function isSubdomain(string $hostname): bool
|
||||
{
|
||||
return Str::endsWith($hostname, config('tenancy.identification.central_domains'));
|
||||
return $onFail($e, $request, $next);
|
||||
}
|
||||
} else {
|
||||
$onFail = static::$onFail ?? function ($e) {
|
||||
throw $e;
|
||||
};
|
||||
|
||||
return $onFail($e, $request, $next);
|
||||
}
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,9 @@ use Closure;
|
|||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
use Illuminate\Support\Str;
|
||||
use Stancl\Tenancy\Concerns\UsableWithEarlyIdentification;
|
||||
use Stancl\Tenancy\Exceptions\NotASubdomainException;
|
||||
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
|
||||
|
||||
class InitializeTenancyBySubdomain extends InitializeTenancyByDomain
|
||||
{
|
||||
|
|
@ -57,20 +57,16 @@ class InitializeTenancyBySubdomain extends InitializeTenancyByDomain
|
|||
);
|
||||
}
|
||||
|
||||
/** @return string|Response|Exception|mixed */
|
||||
/** @return string|Exception */
|
||||
protected function makeSubdomain(string $hostname)
|
||||
{
|
||||
$parts = explode('.', $hostname);
|
||||
|
||||
$isLocalhost = count($parts) === 1;
|
||||
$isIpAddress = count(array_filter($parts, 'is_numeric')) === count($parts);
|
||||
|
||||
// If we're on localhost or an IP address, then we're not visiting a subdomain.
|
||||
$isACentralDomain = in_array($hostname, config('tenancy.identification.central_domains'), true);
|
||||
$notADomain = $isLocalhost || $isIpAddress;
|
||||
$thirdPartyDomain = ! Str::endsWith($hostname, config('tenancy.identification.central_domains'));
|
||||
$thirdPartyDomain = ! DomainTenantResolver::isSubdomain($hostname);
|
||||
|
||||
if ($isACentralDomain || $notADomain || $thirdPartyDomain) {
|
||||
if ($isACentralDomain || $isIpAddress || $thirdPartyDomain) {
|
||||
return new NotASubdomainException($hostname);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ use Stancl\Tenancy\Contracts\SingleDomainTenant;
|
|||
use Stancl\Tenancy\Contracts\Tenant;
|
||||
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException;
|
||||
use Stancl\Tenancy\Tenancy;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class DomainTenantResolver extends Contracts\CachedTenantResolver
|
||||
{
|
||||
|
|
@ -55,6 +56,11 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
|||
return $tenant;
|
||||
}
|
||||
|
||||
public static function isSubdomain(string $domain): bool
|
||||
{
|
||||
return Str::endsWith($domain, config('tenancy.identification.central_domains'));
|
||||
}
|
||||
|
||||
public function resolved(Tenant $tenant, mixed ...$args): void
|
||||
{
|
||||
$this->setCurrentDomain($tenant, $args[0]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue