commit 08-2025
This commit is contained in:
parent
9ae662f63e
commit
480fdc65ed
404 changed files with 65310 additions and 2600431 deletions
|
|
@ -16,11 +16,22 @@ class Admin
|
|||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ( Auth::check() && Auth::user()->isAdmin() )
|
||||
{
|
||||
if (!Auth::check()) {
|
||||
return redirect('/home');
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
// Explizit VIPs blockieren (admin = 1)
|
||||
if ($user->admin == 1) {
|
||||
abort(403, 'VIP-Benutzer haben keinen Zugang zum Admin-Bereich.');
|
||||
}
|
||||
|
||||
// Nur echte Admins (admin >= 2) durchlassen
|
||||
if ($user->admin >= 2) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
return redirect('/home');
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,20 +22,24 @@ class Checkout
|
|||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
\Log::debug('Checkout Middleware: ausgeführt', [
|
||||
'url' => $request->url(),
|
||||
'host' => $request->getHost()
|
||||
]);
|
||||
$instance = 'checkout';
|
||||
if($shopping_instance = ShoppingInstance::where('identifier', $request->route('identifier'))->first()){
|
||||
//user shop
|
||||
|
||||
//set Lang
|
||||
\Session::put('locale', $shopping_instance->getLocale());
|
||||
\App::setLocale($shopping_instance->getLocale());
|
||||
$user_shop = $shopping_instance->user_shop;
|
||||
|
||||
if($user_shop && $user_shop->active == 1 && $user_shop->user->isActiveShop()){
|
||||
Util::setPostRoute('user/');
|
||||
\Session::put('user_shop', $user_shop);
|
||||
\Session::put('user_shop_domain', $shopping_instance->subdomain);
|
||||
\Session::put('user_shop_payment', $shopping_instance->payment);
|
||||
\Session::put('user_shop_identifier', $shopping_instance->identifier);
|
||||
\Session::put('isCheckout', true);
|
||||
|
||||
if($shopping_instance->auth_user_id){
|
||||
\Session::put('auth_user', $shopping_instance->auth_user);
|
||||
|
|
@ -45,21 +49,23 @@ class Checkout
|
|||
\Session::put('back_link', $shopping_instance->back);
|
||||
}
|
||||
\Session::put('new_session', true);
|
||||
Yard::instance('shopping')->destroy();
|
||||
Yard::instance($instance)->destroy();
|
||||
//restore yard
|
||||
if($shopping_instance->payment !== 6){
|
||||
Yard::instance('shopping')->restore($request->route('identifier'));
|
||||
Yard::instance($instance)->restore($request->route('identifier'), [], true, $instance);
|
||||
}else{
|
||||
//dont delete shopping instance
|
||||
Yard::instance('shopping')->restore($request->route('identifier'), [], false);
|
||||
Yard::instance($instance)->restore($request->route('identifier'), [], false, $instance);
|
||||
}
|
||||
Yard::instance('shopping')->putYardExtra('user_shop_payment', $shopping_instance->payment);
|
||||
|
||||
Yard::instance('shopping')->putYardExtra('shopping_data', $shopping_instance->shopping_data);
|
||||
Yard::instance($instance)->putYardExtra('user_shop_payment', $shopping_instance->payment);
|
||||
|
||||
Yard::instance($instance)->putYardExtra('shopping_data', $shopping_instance->shopping_data);
|
||||
$is_for = isset($shopping_instance->shopping_data['is_for']) ? $shopping_instance->shopping_data['is_for'] : 'ot-member';
|
||||
Yard::instance('shopping')->setUserPriceInfos($shopping_instance->shopping_data['user_price_infos']);
|
||||
Yard::instance('shopping')->setShippingCountryWithPrice($shopping_instance->country_id, $is_for);
|
||||
|
||||
Yard::instance($instance)->setUserPriceInfos($shopping_instance->shopping_data['user_price_infos']);
|
||||
Yard::instance($instance)->setShippingCountryWithPrice($shopping_instance->country_id, $is_for);
|
||||
|
||||
if($shopping_instance->payment !== 6){
|
||||
//delete shopping instance is not save for restore, payment link
|
||||
ShoppingInstance::where('identifier', $request->route('identifier'))->delete();
|
||||
|
|
@ -69,11 +75,11 @@ class Checkout
|
|||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
if(\Session::has('user_shop') && \Session::has('isCheckout') && Yard::instance('shopping')->count()){
|
||||
// \Session::has('user_shop_identifier')
|
||||
if(\Session::has('user_shop') && Yard::instance($instance)->count() > 0){
|
||||
return $next($request);
|
||||
}
|
||||
return redirect(config('app.url'));
|
||||
|
||||
return redirect(Util::getUserCardBackUrl('/card/show', 'checkout'));
|
||||
|
||||
}
|
||||
}
|
||||
146
app/Http/Middleware/DomainResolver.php
Normal file
146
app/Http/Middleware/DomainResolver.php
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use App\Services\Util;
|
||||
use App\Models\UserShop;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Domain\DomainContext;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
|
||||
class DomainResolver
|
||||
{
|
||||
/**
|
||||
* Behandelt eine eingehende Anfrage, um den Domain-Kontext aufzulösen.
|
||||
*
|
||||
* Diese Middleware ist schlank gehalten. Die Hauptlogik zur Erstellung
|
||||
* des DomainContext befindet sich im DomainServiceProvider, um eine
|
||||
* saubere Trennung der Verantwortlichkeiten zu gewährleisten.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
/** @var DomainContext $context */
|
||||
$context = app(DomainContext::class);
|
||||
// Session-Domain je nach Kontext setzen
|
||||
if ($context->type === 'shop') {
|
||||
Config::set('session.domain', '.'.config('app.domain').config('app.tld_shop'));
|
||||
} else {
|
||||
Config::set('session.domain', '.'.config('app.domain').config('app.tld_care'));
|
||||
}
|
||||
// Wenn der DomainServiceProvider die Domain nicht identifizieren konnte,
|
||||
// leiten wir sicher auf die Hauptdomain um.
|
||||
if ($context->isUnknown()) {
|
||||
// Detailliertes Logging für spätere Analyse
|
||||
\Log::warning('Unknown domain accessed', [
|
||||
'host' => $request->getHost(),
|
||||
'subdomain' => $context->subdomain,
|
||||
'user_agent' => $request->userAgent(),
|
||||
'ip' => $request->ip(),
|
||||
'referer' => $request->header('referer'),
|
||||
'path' => $request->getPathInfo()
|
||||
]);
|
||||
|
||||
// Holt die URL der Hauptdomain vom DomainService und leitet um.
|
||||
$mainUrl = app(\App\Services\DomainService::class)->buildUrl('main');
|
||||
return redirect()->away($mainUrl, 301);
|
||||
}
|
||||
\Log::debug('DomainResolver: context', [
|
||||
'context' => $context,
|
||||
'subdomain' => $context->subdomain
|
||||
]);
|
||||
|
||||
// Für User-Shop-Domains: Validierung und Route-Parameter-Bereinigung
|
||||
if ($context->isUserShop()) {
|
||||
// Validiere UserShop-Berechtigung (bereits im DomainServiceProvider geprüft,
|
||||
// aber zusätzliche Sicherheitsebene)
|
||||
if (!$context->userShop) {
|
||||
\Log::warning('UserShop not found', [
|
||||
'subdomain' => $context->subdomain,
|
||||
'host' => $context->host
|
||||
]);
|
||||
abort(503, 'Shop not available');
|
||||
}
|
||||
|
||||
if (!$context->userShop->active) {
|
||||
\Log::info('UserShop inactive accessed', [
|
||||
'shop_id' => $context->userShop->id,
|
||||
'subdomain' => $context->subdomain
|
||||
]);
|
||||
abort(503, 'Shop temporarily unavailable');
|
||||
}
|
||||
|
||||
if (!$context->userShop->user || !$context->userShop->user->isActiveShop()) {
|
||||
\Log::info('UserShop with expired payment accessed', [
|
||||
'shop_id' => $context->userShop->id,
|
||||
'user_id' => $context->userShop->user_id ?? null,
|
||||
'subdomain' => $context->subdomain
|
||||
]);
|
||||
abort(503, 'Shop access denied');
|
||||
}
|
||||
|
||||
// Entferne subdomain Parameter aus der Route
|
||||
// damit catch-all Routen wie /{site}/{subsite?}/{product_slug?} funktionieren
|
||||
if ($request->route('subdomain')) {
|
||||
$request->route()->forgetParameter('subdomain');
|
||||
}
|
||||
}
|
||||
|
||||
// Richtet den Anwendungskontext für Abwärtskompatibilität ein.
|
||||
$this->setupLegacyContext($context);
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stellt die Kompatibilität mit älteren Teilen der Anwendung her,
|
||||
* die direkt auf Session-Daten oder dynamische Konfigurationen zugreifen.
|
||||
*
|
||||
* @param DomainContext $context
|
||||
*/
|
||||
private function setupLegacyContext(DomainContext $context): void
|
||||
{
|
||||
// TODO: [TECH-DEBT] Diese Methode sollte langfristig entfernt werden.
|
||||
// Alle Teile der Anwendung sollten den DomainContext direkt verwenden.
|
||||
if ($context->userShop) {
|
||||
// Setzt die alten Session-Variablen, die von einigen Views/Controllern erwartet werden.
|
||||
Session::put('user_shop', $context->userShop);
|
||||
Session::put('user_shop_domain', $context->host);
|
||||
\Log::debug('DomainResolver: user_shop gesetzt', ['user_id' => $context->userShop->user_id ?? null]);
|
||||
|
||||
// Setzt die app.url zur Laufzeit, um URL-Generierung in alten Teilen zu ermöglichen.
|
||||
Config::set('app.url', $context->host);
|
||||
|
||||
// Kompatibilität mit der Util-Klasse.
|
||||
Util::setPostRoute('user/');
|
||||
} else {
|
||||
if($context->type === 'main'){
|
||||
Session::forget('user_shop');
|
||||
Session::forget('user_shop_domain');
|
||||
Session::save(); // Sofortige Session-Speicherung
|
||||
\Log::debug('DomainResolver: user_shop entfernt (' . $context->type . ' domain)', ['user_shop' => session('user_shop')]);
|
||||
Config::set('app.url', $context->host);
|
||||
}elseif($context->type === 'shop'){
|
||||
Util::setPostRoute('user/');
|
||||
$user_shop = UserShop::where('slug', 'aloevera')->first();
|
||||
Session::put('user_shop', $user_shop);
|
||||
Session::put('user_shop_domain', $context->host);
|
||||
Session::save(); // Sofortige Session-Speicherung
|
||||
\Log::debug('DomainResolver: user_shop hinzugefügt (' . $context->type . ' domain)', ['user_shop' => session('user_shop')]);
|
||||
|
||||
Config::set('app.url', $context->host);
|
||||
}else{
|
||||
// Für Domains ohne UserShop: Session-Daten sofort löschen
|
||||
// Session::forget('user_shop');
|
||||
// Session::put('user_shop_domain', $context->host);
|
||||
// Session::save(); // Sofortige Session-Speicherung
|
||||
// \Log::debug('DomainResolver: user_shop_domain hinzugefügt (' . $context->type . ' domain)', ['user_shop' => session('user_shop')]);
|
||||
Config::set('app.url', $context->host);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Models\UserShop;
|
||||
use App\Services\Util;
|
||||
use Closure;
|
||||
use Auth;
|
||||
use Config;
|
||||
use phpDocumentor\Reflection\DocBlock\Tags\Uses;
|
||||
|
||||
class Subdomain
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
$tld = config('app.tld_care');
|
||||
if(!empty($request->route('subdomain'))){
|
||||
//sub.mivita.care
|
||||
$user_shop = UserShop::where('slug', $request->route('subdomain'))->first();
|
||||
$request->route()->forgetParameter('subdomain');
|
||||
Util::setPostRoute('user/');
|
||||
if($user_shop){
|
||||
if(!$user_shop->active){
|
||||
abort(503);
|
||||
}
|
||||
if(!$user_shop->user){
|
||||
abort(503);
|
||||
}
|
||||
if(!$user_shop->user->isActiveShop()){
|
||||
abort(503);
|
||||
}
|
||||
\Session::put('user_shop', $user_shop);
|
||||
\Session::put('user_shop_domain', config('app.protocol').$user_shop->slug.".".config('app.domain').config('app.tld_care'));
|
||||
Config::set('app.url', $user_shop->slug.".".config('app.domain').config('app.tld_care'));
|
||||
return $next($request);
|
||||
}
|
||||
}else{
|
||||
//mivita.shop
|
||||
$tld = config('app.tld_shop');
|
||||
$user_shop = UserShop::where('slug', 'aloevera')->first();
|
||||
//$request->route()->forgetParameter('subdomain');
|
||||
Util::setPostRoute('user/');
|
||||
if($user_shop){
|
||||
\Session::put('user_shop', $user_shop);
|
||||
\Session::put('user_shop_domain', config('app.protocol').config('app.domain').config('app.tld_shop'));
|
||||
Config::set('app.url', config('app.domain').config('app.tld_shop'));
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
return redirect(config('app.url'));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -16,11 +16,17 @@ class SuperAdmin
|
|||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ( Auth::check() && Auth::user()->isSuperAdmin() )
|
||||
{
|
||||
if (!Auth::check()) {
|
||||
return redirect('/home');
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
// Nur SuperAdmins (admin >= 3) durchlassen
|
||||
if ($user->admin >= 3) {
|
||||
return $next($request);
|
||||
}
|
||||
return redirect('/home');
|
||||
|
||||
|
||||
abort(403, 'Sie benötigen SuperAdmin-Rechte für diesen Bereich.');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,11 +16,17 @@ class SysAdmin
|
|||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ( Auth::check() && Auth::user()->isSySAdmin() )
|
||||
{
|
||||
if (!Auth::check()) {
|
||||
return redirect('/home');
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
// Nur SysAdmins (admin >= 4) durchlassen
|
||||
if ($user->admin >= 4) {
|
||||
return $next($request);
|
||||
}
|
||||
return redirect('/home');
|
||||
|
||||
|
||||
abort(403, 'Sie benötigen SysAdmin-Rechte für diesen Bereich.');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,22 +2,28 @@
|
|||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Http\Middleware\TrustProxies as Middleware;
|
||||
use Illuminate\Http\Request;
|
||||
use Fideloper\Proxy\TrustProxies as Middleware;
|
||||
|
||||
class TrustProxies extends Middleware
|
||||
{
|
||||
/**
|
||||
* The trusted proxies for this application.
|
||||
*
|
||||
* @var array
|
||||
* @var array|string|null
|
||||
*/
|
||||
protected $proxies;
|
||||
protected $proxies = '*';
|
||||
|
||||
/**
|
||||
* The headers that should be used to detect proxies.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $headers = Request::HEADER_X_FORWARDED_ALL;
|
||||
|
||||
protected $headers =
|
||||
Request::HEADER_X_FORWARDED_FOR |
|
||||
Request::HEADER_X_FORWARDED_HOST |
|
||||
Request::HEADER_X_FORWARDED_PORT |
|
||||
Request::HEADER_X_FORWARDED_PROTO |
|
||||
Request::HEADER_X_FORWARDED_AWS_ELB;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,6 @@ class VerifyCsrfToken extends Middleware
|
|||
* @var array
|
||||
*/
|
||||
protected $except = [
|
||||
//
|
||||
'portal/login/verify', // Temporär für OTP-Login
|
||||
];
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue