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 = '
';
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 = '';
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!');
}
}