'radio|reports', 'radio.historyReport' => 'radio|reports', 'radio.historyReportPdf' => 'radio|reports', 'radio.historyReportTitles' => 'radio|reports', 'radio.reportGen' => 'radio|reports', 'execAction' => 'radio|home', 'ajaxSchedule' => 'radio|schedules', 'ajaxTestRelay' => 'radio|relays', 'uploadCoverRadio' => 'settings', 'removeAvatarRadio' => 'settings', 'uploadThumb' => 'site|posts', ]; /** Screens that only exist for a site with a radio stream. */ private const STREAM_ONLY_ROUTES = ['site.camera.*', 'radio.apps.*', 'radio.app.*', 'radio.alexa.*']; /** setPos orders several lists: the list being ordered decides the item. */ private const SORT_PERMISSIONS = [ 'videos' => 'site|videos', 'featured' => 'site|featured', 'albums_photos' => 'site|album', 'album' => 'site|album', ]; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse */ public function handle(Request $request, Closure $next) { if(!Auth::id()){ return redirect(env('CENTRAL_URL', 'https://account.brascast.com/home?ui=1')); } $headers = $request->header(); if(isset($headers['user-agent']) && str_contains($headers['user-agent'][0], 'BRASCAST_APP')){ Config::set('constants.IS_APP',true); $sepAgent = explode('_UD:',$headers['user-agent'][0]); $device = (count($sepAgent) && count($sepAgent) == 2 ? $sepAgent[1] : 'none'); Config::set('constants.APP_DEVICE',$device); } $usertoCheck = User::where('id', '=', Auth::id())->get()->first(); if(Auth::id() && !session('siteID') || Auth::id() && !session('serverID')){ return redirect(env('CENTRAL_URL', 'https://account.brascast.com/home?ui=2'));} $siteInfo = DB::connection('mysql_site_'.session('serverID'))->table('sites')->where('id','=',session('siteID'))->first(); if(!$siteInfo){ return redirect(((string) ($usertoCheck->type ?? '') === '2' ? route('selectSite') : env('CENTRAL_URL', 'https://account.brascast.com/home?ui=3'))); } $isAdm = (int) Auth::id() !== (int) $siteInfo->user_id; if($isAdm){ $admData = DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('user_id','=',Auth::id()) ->where('site_id','=',session('siteID')) ->where('active','=','1') ->first(); /* removed or deactivated while signed in: drop the session instead of failing on every page */ if(!$admData){ Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login')->with('error', __('general.admin_access_removed')); } //if(Auth::id() && $usertoCheck->type == '2'){ $separateRoute = explode('.',$request->route()->getName()); $routeCheck = $separateRoute[0]; if(count($separateRoute) >= 3){ if($separateRoute[1] == 'theme'){ $routeCheck = $separateRoute[0].'|'.$separateRoute[2]; /* site.theme.u.icon.do: the item comes after the "u" */ if ($separateRoute[2] == 'u' && isset($separateRoute[3])) { $routeCheck = $separateRoute[0].'|'.$separateRoute[3]; } if ($separateRoute[2] == 'change') { $routeCheck = 'site|themes'; } }elseif($separateRoute[0] == 'emails'){ $routeCheck = 'emails'; }elseif($separateRoute[0] == 'settings'){ $routeCheck = 'settings'; }else{ $routeCheck = $separateRoute[0].'|'.$separateRoute[1]; } } if($routeCheck == 'radio'){ $routeCheck = 'radio|home'; } //if(Auth::id() == '4415'){ return dd($routeCheck,session('siteID'),$usertoCheck->id, $separateRoute); } if($routeCheck == 'site|podcastsEps'){ $routeCheck = 'site|podcasts'; } if($routeCheck == 'radio|api-integration'){ $routeCheck = 'radio|api'; } if($routeCheck =='radio|alexa'){ $routeCheck = 'radio|apps'; } $routeCheck = self::ROUTE_PERMISSIONS[$request->route()->getName()] ?? $routeCheck; if($request->route()->getName() === 'setPos'){ $routeCheck = self::SORT_PERMISSIONS[$request->route('type')] ?? 'site|videos'; } $verifyPerm = DB::connection('mysql_site_'.session('serverID'))->table('permissions') ->where('name','=',$routeCheck) ->where('user_id', '=',$admData->user_id) ->where('site_id', '=',session('siteID')) ->get()->count(); $sempreAberta = in_array($routeCheck, ['stations', 'activities'], true); if(!$verifyPerm && !$sempreAberta){ return redirect()->route('noPermission'); } } date_default_timezone_set($siteInfo->timezone); /* the row here is always fresh: the cached one can be up to a minute old */ $request->attributes->set('siteRow', $siteInfo); $withoutSite = (string) ($siteInfo->without ?? '0') === '1'; if ($siteInfo->status == '4') { if ( $request->routeIs('site.*') && !$request->routeIs('site.pagelink.*') && /* the website home explains what the plan is missing, so it stays reachable */ !($withoutSite && $request->routeIs('site.home.r')) ) { return redirect()->route('site.pagelink.r'); } } /* plan without the website: every screen of it leads back to the invitation */ if ($withoutSite && $request->routeIs('site.*') && !$request->routeIs('site.home.r') && !$request->routeIs('site.pagelink.*')) { return redirect()->route('site.home.r'); } /* TV-only site: no radio stream means no studio camera and no radio apps to open */ if (empty($siteInfo->stream_port) && $request->routeIs(...self::STREAM_ONLY_ROUTES)) { return redirect()->route('dashboard.r'); } return $next($request); } }