route('login'); } $userLogged = User::where('id', '=', Auth::id())->get()->first(); $allNotifications = DB::table('notifications')->orderBy('id','desc')->limit('3')->get(); $siteData = SiteContext::current(); /** * Scoped by the pair: the same site_id exists on other servers, so * without server_id this listed people from another site entirely. * Rows are resolved in bulk, the view used to query twice per line. */ $ids = DB::table('user_sites') ->where('site_id','=',session('siteID')) ->where('server_id','=',session('serverID')) ->where('user_id','!=',Auth::id()) ->pluck('user_id')->all(); $allAdmins = collect(); if ($ids) { $people = DB::table('users')->whereIn('id', $ids)->get()->keyBy('id'); $rows = DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('site_id','=',session('siteID'))->whereIn('user_id', $ids)->get()->keyBy('user_id'); $counts = DB::connection('mysql_site_'.session('serverID'))->table('permissions') ->where('site_id','=',session('siteID'))->whereIn('user_id', $ids) ->selectRaw('user_id, COUNT(*) as total')->groupBy('user_id')->pluck('total','user_id'); foreach ($ids as $id) { $person = $people[$id] ?? null; if (! $person) { continue; } $row = $rows[$id] ?? null; $allAdmins->push((object) [ 'user_id' => $id, 'name' => $row->nickname ?? $person->name, 'email' => $person->email, 'active' => (bool) ($row->active ?? false), 'last_login' => $row->last_login ?? $person->last_login, 'permissions' => (int) ($counts[$id] ?? 0), ]); } } $allAdmins = $allAdmins->sortBy('name')->values(); return view('users', ['userLogged' => $userLogged , 'allNotifications' => $allNotifications, 'topHref' => 'general', 'siteData' => $siteData, 'allAdmins' => $allAdmins]); } public function create() { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $userLogged = User::where('id', '=', Auth::id())->get()->first(); $allNotifications = DB::table('notifications')->orderBy('id','desc')->limit('3')->get(); $siteData = SiteContext::current(); return view('userCreate', ['userLogged' => $userLogged , 'allNotifications' => $allNotifications, 'topHref' => 'general', 'siteData' => $siteData]); } public function store(Request $request) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $emailInput = filter_var($request->email, FILTER_SANITIZE_EMAIL); $siteData = SiteContext::current(); if ($siteData) { $owner = User::find($siteData->user_id); if ($owner && $owner->email === $emailInput) { return redirect()->back()->with('error', 'O proprietário não pode ser adicionado como administrador.'); } } $checkUserExists = User::where('email', '=', $emailInput)->get(); if ($checkUserExists->count()) { $checkAdminExists = DB::connection('mysql_site_'.session('serverID')) ->table('administrators') ->where('user_id', '=', $checkUserExists[0]->id) ->where('site_id', '=', session('siteID')) ->get(); if ($checkAdminExists->count()) { return redirect()->route('users.r')->with('error', 'Este usuário já administra sua rádio.'); } } if($checkUserExists->count()){ DB::connection('mysql_site_'.session('serverID'))->table('administrators')->insert([ 'site_id' => session('siteID'), 'user_id' => $checkUserExists[0]->id, 'nickname' => filter_var($request->name, FILTER_SANITIZE_STRING), 'active' => '0', 'created_at' => NOW() ]); DB::table('user_sites')->insert([ 'user_id' => $checkUserExists[0]->id, 'site_id' => session('siteID'), 'server_id' => session('serverID'), 'created_at' => NOW() ]); SendMail('activate',$checkUserExists[0]->id,$checkUserExists[0]->id.'|'.session('siteID').'|'.session('serverID').'|'.$siteData->name); return redirect()->route('users.u.perm',$checkUserExists[0]->id); } $randomPass = substr(md5(uniqid(rand(1,6))), 0, 8); $idLast = DB::table('users')->insertGetId([ 'name' => filter_var($request->name, FILTER_SANITIZE_STRING), 'email' => filter_var($request->email, FILTER_SANITIZE_EMAIL), 'password' => bcrypt($randomPass), 'type' => '2', 'active' => '0', 'created_at' => NOW() ]); DB::connection('mysql_site_'.session('serverID'))->table('administrators')->insert([ 'site_id' => session('siteID'), 'user_id' => $idLast, 'nickname' => filter_var($request->name, FILTER_SANITIZE_STRING), 'active' => '0', 'created_at' => NOW() ]); DB::table('user_sites')->insert([ 'user_id' => $idLast, 'site_id' => session('siteID'), 'server_id' => session('serverID'), 'created_at' => NOW() ]); SendMail('activate',$idLast,$idLast.'|'.$siteData->id.'|'.$siteData->server_id.'|'.$siteData->name); return redirect()->route('users.u.perm',$idLast); } public function permission($id = null) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $checkUserAdm = DB::table('user_sites')->where('user_id','=',$id) ->where('site_id','=',session('siteID'))->where('server_id','=',session('serverID'))->count(); if(!$checkUserAdm || !$id){ return redirect()->route('users.r'); } $userLogged = User::where('id', '=', Auth::id())->get()->first(); $allNotifications = DB::table('notifications')->orderBy('id','desc')->limit('3')->get(); $siteData = SiteContext::current(); $adminData = DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('user_id','=',$id)->where('site_id','=',session('siteID'))->first(); /** * Every granted name in one query. The screen used to ask the database * once per checkbox, which was fifty queries to draw a form. */ $granted = DB::connection('mysql_site_'.session('serverID'))->table('permissions') ->where('user_id','=',$id)->where('site_id','=',session('siteID')) ->pluck('name')->flip()->all(); $hasTv = ($siteData->stream_tv ?? null) === '1' && ! empty($siteData->stream_tv_name); return view('userPermissions', ['userLogged' => $userLogged , 'allNotifications' => $allNotifications, 'topHref' => 'general', 'siteData' => $siteData, 'adminData' => $adminData, 'id_user' => $id, 'groups' => permission_groups($hasTv, ! empty($siteData->stream_port)), 'granted' => $granted]); } public function permissionDo(Request $request) { if(!$request->user_id){ return redirect()->route('users.r'); } $siteData = SiteContext::current(); $hasTv = ($siteData->stream_tv ?? null) === '1' && ! empty($siteData->stream_tv_name); $groups = permission_groups($hasTv, ! empty($siteData->stream_port)); /** * Rebuilt from the same tree the screen draws, instead of one hand * written block per section. Dashboard is always granted: without it * the person signs in with nowhere to land. */ $posted = (array) $request->input('permission', []); $names = ['dashboard']; foreach ($groups as $groupKey => $group) { foreach ($group['sections'] as $sectionKey => $section) { foreach (array_keys($section['items']) as $item) { if (empty($posted[$groupKey][$sectionKey][$item])) { continue; } $names[] = permission_name($groups, $groupKey, $item); } } } $names = array_values(array_unique($names)); DB::connection('mysql_site_'.session('serverID'))->table('permissions') ->where('user_id','=',$request->user_id)->where('site_id','=',session('siteID'))->delete(); DB::connection('mysql_site_'.session('serverID'))->table('permissions')->insert( array_map(fn ($name) => [ 'user_id' => $request->user_id, 'site_id' => session('siteID'), 'name' => $name, 'c' => '1', 'r' => '1', 'u' => '1', 'd' => '1', ], $names) ); UserLog::write('admin.permissions', [ 'entity' => 'administrator', 'entity_id' => $request->user_id, 'description' => count($names) . ' permissoes', ]); return redirect()->route('users.r')->with('success', 'Permissões atualizadas com sucesso!'); } public function activate($hash = null) { $noAdm = '

Administrador não encontrado.

Ir para login
'; if(!$hash){ return $noAdm; } $getHash = str_replace('|brasbar','/',$hash); $hashDecrypt = EncryptBras($getHash,'d'); $expDecrypt = explode('|',$hashDecrypt); $mailDecrypt = $expDecrypt[0]; $checkAdminUser = User::where('email','=',$mailDecrypt)->get(); if($checkAdminUser->count()){ $checkUserSites = DB::table('user_sites')->where('user_id','=',$checkAdminUser[0]->id)->where('site_id','!=',$expDecrypt[1])->get()->count(); } if($checkAdminUser->count() && $checkAdminUser[0]->type == '1' || $checkAdminUser->count() && $checkUserSites){ SendMail('aceptedAdmin',$checkAdminUser[0]->id,$checkAdminUser[0]->id.'|'.$expDecrypt[1].'|'.$expDecrypt[2].'|'.$expDecrypt[3]); User::where('email','=',$mailDecrypt)->where('active','=','0')->update(['active' => '1']); DB::connection('mysql_site_'.$expDecrypt[2])->table('administrators')->where('user_id','=',$checkAdminUser[0]->id)->where('site_id','=',$expDecrypt[1])->update(['active' => '1']); return redirect()->route('login')->with('success', 'Convite aceito com sucesso!
Digite suas credenciais cadastradas para conectar.'); } $checkUser = User::where('email','=',$mailDecrypt)->where('type','=','2')->where('active','=','0')->get()->count(); if(!$checkUser){ return $noAdm; } return view('activatePass',['email' => $mailDecrypt, 'hash' => $hash]); } public function activateDo(Request $request) { if(!$request->password){ return redirect()->route('activate.admin',$request->hash)->with('error_password', 'Campo de senha obrigatório'); } if(!$request->password2){ return redirect()->route('activate.admin',$request->hash)->with('error_password', 'As senhas não coincidem')->with('error_password2', 'As senhas não coincidem'); } if(isset($request->password) && isset($request->password2) && $request->password != $request->password2){ return redirect()->route('activate.admin',$request->hash)->with('error_password', 'As senhas não coincidem')->with('error_password2', 'As senhas não coincidem'); } if(isset($request->password) && isset($request->password2) && $request->password == $request->password2 && strlen($request->password) <= 5){ return redirect()->route('activate.admin',$request->hash)->with('error_password', 'As senhas precisam ter ao menos 6 caracteres'); } if(!$request->valterms){ return redirect()->route('activate.admin',$request->hash)->with('error_terms', 'Você precisa concordar com os termos'); } $noAdm = '

Administrador não encontrado.

Ir para login
'; if(!$request->hash){ return $noAdm; } $getHash = str_replace('|brasbar','/',$request->hash); $hashDecrypt = EncryptBras($getHash,'d'); $expDecrypt = explode('|',$hashDecrypt); $mailDecrypt = $expDecrypt[0]; $checkUser = User::where('email','=',$mailDecrypt)->where('type','=','2')->where('active','=','0')->get()->count(); $siteData = DB::connection('mysql_site_'.$expDecrypt[2])->table('sites')->where('id','=',$expDecrypt[1])->get()->first(); if(!$checkUser){ return $noAdm; } $userData = User::where('email','=',$mailDecrypt)->where('type','=','2')->get()->first(); SendMail('aceptedAdmin',$userData->id,$userData->id.'|'.$siteData->id.'|'.$expDecrypt[2].'|'.$expDecrypt[3]); DB::connection('mysql_site_'.$expDecrypt[2])->table('administrators')->where('user_id','=',$userData->id)->where('site_id','=',$siteData->id)->update(['active' => '1']); User::where('email','=',$mailDecrypt)->where('type','=','2')->where('active','=','0')->update(['active' => '1', 'password' => bcrypt($request->password)]); return redirect()->route('login')->with('success', 'Convite aceito com sucesso!
Digite suas credenciais cadastradas para conectar.'); } public function resendMail(Request $request) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } if(!$request->user_id){ return response()->json(array('status' => false), 200); } $siteData = SiteContext::current(); SendMail('activate',$request->user_id,$request->user_id.'|'.$siteData->id.'|'.$siteData->server_id.'|'.$siteData->name); return response()->json(array('status' => true,'data' => $request->user_id.'|'.$siteData->id.'|'.$siteData->server_id.'|'.$siteData->name), 200); } /** * Sends the invitation again to someone who has not accepted it yet. * * Only a pending invite of this site pair qualifies. The file store holds * the one minute pause because the default cache store is disabled, and * that pause is what keeps a double click from sending two mails. */ public function resendInvite($id) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $linked = DB::table('user_sites')->where('user_id','=',$id) ->where('site_id','=',session('siteID'))->where('server_id','=',session('serverID'))->exists(); $pending = $linked && DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('user_id','=',$id)->where('site_id','=',session('siteID'))->where('active','=','0')->exists(); $person = $pending ? DB::table('users')->where('id','=',$id)->first() : null; if(! $person){ return redirect()->route('users.r')->with('error', __('general.admins_resend_invalid')); } $pause = 'invite-resend:'.session('serverID').':'.session('siteID').':'.$id; if(! Cache::store('file')->add($pause, 1, 60)){ return redirect()->route('users.r')->with('error', __('general.admins_resend_wait')); } try { $siteData = SiteContext::current(); SendMail('activate',$id,$id.'|'.session('siteID').'|'.session('serverID').'|'.$siteData->name); } catch (Throwable $e) { Cache::store('file')->forget($pause); Log::warning('admin invite resend failed', ['user_id' => $id, 'site_id' => session('siteID'), 'error' => $e->getMessage()]); return redirect()->route('users.r')->with('error', __('general.admins_resend_failed')); } UserLog::write('admin.invite', ['entity' => 'administrator', 'entity_id' => $id, 'description' => $person->email]); return redirect()->route('users.r')->with('success', __('general.admins_resend_done', ['email' => $person->email])); } public function edit($id = null) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $verifyUser = DB::table('user_sites')->where('user_id','=',$id)->where('site_id','=',session('siteID'))->get()->count(); if(!$id || !$verifyUser){ return redirect()->route('users.r'); } $userLogged = User::where('id', '=', Auth::id())->get()->first(); $allNotifications = DB::table('notifications')->orderBy('id','desc')->limit('3')->get(); $siteData = SiteContext::current(); $dataCurrentUser = DB::table('users')->where('id','=',$id)->get()->first(); $currentAdmin = DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('user_id','=',$id)->where('site_id','=',session('siteID'))->get()->first(); return view('userEdit', ['userLogged' => $userLogged , 'allNotifications' => $allNotifications, 'topHref' => 'general', 'siteData' => $siteData , 'dataCurrentUser' => $dataCurrentUser, 'currentAdmin' => $currentAdmin]); } public function update(Request $request, $id) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $verifyUser = DB::table('user_sites')->where('user_id','=',$id)->where('site_id','=',session('siteID'))->get()->count(); if(!$id || !$verifyUser){ return redirect()->route('users.r'); } $userLogged = User::where('id', '=', Auth::id())->get()->first(); if(!$request->name){ return redirect()->route('users.u',$id)->withInput()->with('error', 'O campo Nome é obrigatório.'); } DB::connection('mysql_site_'.session('serverID'))->table('administrators') ->where('user_id','=',$id)->where('site_id','=',session('siteID')) ->update(['nickname' => $request->name]); return redirect()->route('users.r')->with('success', 'Administrador atualizado com sucesso!'); } public function destroy($id) { if(Auth::check() === false){ Auth::logout(); return redirect()->route('login'); } $verifyUser = DB::table('users')->where('id','=',$id)->get(); if(!$verifyUser->count() || !$id){ return redirect()->route('users.r'); } $siteData = SiteContext::current(); if($verifyUser[0]->active){ SendMail('removedAdmin',$id,$id.'|'.$siteData->id.'|'.session('serverID').'|'.$siteData->name); } DB::connection('mysql_site_'.session('serverID'))->table('permissions')->where('user_id','=',$id)->where('site_id','=',session('siteID'))->delete(); DB::connection('mysql_site_'.session('serverID'))->table('administrators')->where('user_id','=',$id)->where('site_id','=',session('siteID'))->delete(); // scoped by the pair: unscoped it also unlinked the same id on other servers DB::table('user_sites')->where('user_id','=',$id) ->where('site_id','=',session('siteID'))->where('server_id','=',session('serverID'))->delete(); UserLog::write('admin.delete', ['entity' => 'administrator', 'entity_id' => $id, 'description' => $verifyUser[0]->email]); $countSitesUser = DB::table('user_sites')->where('user_id','=',$id)->get()->count(); if($countSitesUser == 0){ DB::table('users')->where('type','=','2')->where('id','=',$id)->delete(); } return redirect()->route('users.r')->with('success', 'Administrador removido com sucesso!'); } }