53 lines
1.9 KiB
PHP
53 lines
1.9 KiB
PHP
<?php
|
||||
|
|
|
|||
|
|
namespace App\Support;
|
|||
|
|
|
|||
|
|
use Illuminate\Http\Request;
|
|||
|
|
use Illuminate\Support\Str;
|
|||
|
|
|
|||
|
|
final class AuthenticatedRedirect
|
|||
|
|
{
|
|||
|
|
private const UNSAFE = ['/', '/login', '/admin/login', '/logout', '/register', '/forgot-password', '/reset-password', '/locale'];
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Müşteri giriş adresinden doğrulanan kullanıcıyı müşteri paneline yönlendirir.
|
|||
|
|
*
|
|||
|
|
* Kullanıcının ek yönetim rolleri hedef paneli değiştirmez; panel bağlamını
|
|||
|
|
* kimlik doğrulamasının başlatıldığı giriş adresi belirler.
|
|||
|
|
*
|
|||
|
|
* @return string Müşteri kontrol panelinin göreli adresi.
|
|||
|
|
*
|
|||
|
|
* @author Gökhan Engin - İletişim : https://bit.ly/YazılımUzmanı
|
|||
|
|
*/
|
|||
|
|
public function landing(): string
|
|||
|
|
{
|
|||
|
|
return route('dashboard', absolute: false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public function intended(Request $r): ?string
|
|||
|
|
{
|
|||
|
|
$value = $r->session()->pull('url.intended');
|
|||
|
|
if (! is_string($value) || $value === '') {
|
|||
|
|
return null;
|
|||
|
|
}$parts = parse_url($value);
|
|||
|
|
if ($parts === false) {
|
|||
|
|
return null;
|
|||
|
|
}if (isset($parts['host'])) {
|
|||
|
|
$port = $parts['port'] ?? (($parts['scheme'] ?? '') === 'https' ? 443 : 80);
|
|||
|
|
if (($parts['scheme'] ?? null) !== $r->getScheme() || $parts['host'] !== $r->getHost() || $port !== $r->getPort()) {
|
|||
|
|
return null;
|
|||
|
|
}$value = ($parts['path'] ?? '/').(isset($parts['query']) ? '?'.$parts['query'] : '');
|
|||
|
|
}$decoded = $value;
|
|||
|
|
for ($i = 0; $i < 3; $i++) {
|
|||
|
|
$decoded = rawurldecode($decoded);
|
|||
|
|
}if (! str_starts_with($decoded, '/') || str_starts_with($decoded, '//') || Str::contains($decoded, ["\r", "\n", '\\'])) {
|
|||
|
|
return null;
|
|||
|
|
}$path = '/'.ltrim((string) parse_url($decoded, PHP_URL_PATH), '/');
|
|||
|
|
if (in_array(rtrim($path, '/') ?: '/', self::UNSAFE, true) || str_starts_with($path, '/admin')) {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $value;
|
|||
|
|
}
|
|||
|
|
}
|