diff --git a/app/Http/Controllers/ConfigController.php b/app/Http/Controllers/ConfigController.php index 368d2c2..3d02848 100644 --- a/app/Http/Controllers/ConfigController.php +++ b/app/Http/Controllers/ConfigController.php @@ -8,44 +8,44 @@ class ConfigController extends Controller { - public function show() - { - // menu "Sincronizar ..." + public function show() + { + // menu "Sincronizar ..." - $this->authorize('admin'); - \UspTheme::activeUrl('configs'); - $config = Config::all()->last(); - if ($config == null) { - $config = new Config; - $config->save(); + $this->authorize('admin'); + \UspTheme::activeUrl('configs'); + $config = Config::all()->last(); + if ($config == null) { + $config = new Config; + $config->save(); + } + $codpes_sem_vinculo = $config->codpes_sem_vinculo; + return view('configs/edit', compact('codpes_sem_vinculo')); } - $codpes_sem_vinculo = $config->codpes_sem_vinculo; - return view('configs/edit', compact('codpes_sem_vinculo')); - } - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param \App\Config $config - * @return \Illuminate\Http\Response - */ - public function update(Request $request) - { - // menu "Sincronizar ..." -> botão "Enviar" + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Config $config + * @return \Illuminate\Http\Response + */ + public function update(Request $request) + { + // menu "Sincronizar ..." -> botão "Enviar" - $this->authorize('admin'); - $request->validate([ - 'codpes_sem_vinculo' => [new Numeros_USP($request->codpes_sem_vinculo)], - ]); - $codpes_sem_vinculo = explode(',', $request->codpes_sem_vinculo); - $codpes_sem_vinculo = array_map('trim', $codpes_sem_vinculo); - $codpes_sem_vinculo = implode(',', $codpes_sem_vinculo); + $this->authorize('admin'); + $request->validate([ + 'codpes_sem_vinculo' => [new Numeros_USP($request->codpes_sem_vinculo)], + ]); + $codpes_sem_vinculo = explode(',', $request->codpes_sem_vinculo); + $codpes_sem_vinculo = array_map('trim', $codpes_sem_vinculo); + $codpes_sem_vinculo = implode(',', $codpes_sem_vinculo); - $config = Config::all()->last(); - $config->codpes_sem_vinculo = $codpes_sem_vinculo; - $request->session()->flash('alert-info', 'Números USP alterados com sucesso'); - $config->save(); - return redirect()->back(); - } + $config = Config::all()->last(); + $config->codpes_sem_vinculo = $codpes_sem_vinculo; + $request->session()->flash('alert-info', 'Números USP alterados com sucesso'); + $config->save(); + return redirect()->back(); + } } diff --git a/app/Http/Controllers/LdapUserController.php b/app/Http/Controllers/LdapUserController.php index 4d6a026..4a78b08 100644 --- a/app/Http/Controllers/LdapUserController.php +++ b/app/Http/Controllers/LdapUserController.php @@ -18,412 +18,395 @@ class LdapUserController extends Controller { - public function __construct() - { - $this->middleware('auth'); - } - - /** - * Display a listing of the resource. - * - * @return \Illuminate\Http\Response - */ - public function index(Request $request) - { - // menu "Usuários Ldap" - - $this->authorize('manager'); - \UspTheme::activeUrl('ldapusers'); - - //vamos validar os campos?? - $request->validate([ - 'perPage' => 'nullable', - 'page' => 'nullable', - 'search' => 'nullable', - 'grupos' => 'nullable', - ]); - - // Registros por página - $perPage = empty($request->perPage) ? config('web-ldap-admin.registrosPorPagina') : $request->perPage; - - // Verifica qual a página - $page = empty($request->page) ? 1 : $request->page; - - // Busca - $ldapusers = User::query(); - - if (!empty($request->search) && isset($request->search)) { - // buscar por username ou por nome - $ldapusers = $ldapusers->orWhere('displayname', 'contains', $request->search) - ->orWhere('samaccountname', 'contains', $request->search); + public function __construct() + { + $this->middleware('auth'); } - if (!empty($request->grupos) && isset($request->grupos)) { - if (count($request->grupos) > 1) { - for ($i = 0; $i < count($request->grupos); $i++) { - $group = Group::findBy('cn', $request->grupos[$i]); - if ($group) { - $ldapusers = $ldapusers->orWhere('memberof', '=', $group->getDn()); - } + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + // menu "Usuários Ldap" + + $this->authorize('manager'); + \UspTheme::activeUrl('ldapusers'); + + //vamos validar os campos?? + $request->validate([ + 'perPage' => 'nullable', + 'page' => 'nullable', + 'search' => 'nullable', + 'grupos' => 'nullable', + ]); + + // Registros por página + $perPage = empty($request->perPage) ? config('web-ldap-admin.registrosPorPagina') : $request->perPage; + + // Verifica qual a página + $page = empty($request->page) ? 1 : $request->page; + + // Busca + $ldapusers = User::query(); + + if (!empty($request->search) && isset($request->search)) { + // buscar por username ou por nome + $ldapusers = $ldapusers->orWhere('displayname', 'contains', $request->search) + ->orWhere('samaccountname', 'contains', $request->search); } - } else { - //TODO: aqui nao acho que precise separado do FOR - $group = Group::findBy('cn', $request->grupos[0]); - if ($group) { - $ldapusers = $ldapusers->where('memberof', '=', $group->getDn()); + + if (!empty($request->grupos) && isset($request->grupos)) { + if (count($request->grupos) > 1) { + for ($i = 0; $i < count($request->grupos); $i++) { + $group = Group::findBy('cn', $request->grupos[$i]); + if ($group) { + $ldapusers = $ldapusers->orWhere('memberof', '=', $group->getDn()); + } + } + } else { + //TODO: aqui nao acho que precise separado do FOR + $group = Group::findBy('cn', $request->grupos[0]); + if ($group) { + $ldapusers = $ldapusers->where('memberof', '=', $group->getDn()); + } + } } - } - } - // oculta usuários default do sistema - foreach (config('web-ldap-admin.ocultarUsuarios') as $usuario) { - $ldapusers = $ldapusers->where('samaccountname', '!=', $usuario); - } + // oculta usuários default do sistema + foreach (config('web-ldap-admin.ocultarUsuarios') as $usuario) { + $ldapusers = $ldapusers->where('samaccountname', '!=', $usuario); + } - // mostra somente os usuários habilitados - // $ldapusers = $ldapusers->whereEnabled(); - - // tentativa de mostrar somente contas não expiradas - // $ldapusers = $ldapusers->whereBetween('accountexpires', [(new \DateTime('October 1st 2010'))->format('YmdHis.0\Z'), now()->format('YmdHis.0\Z')]); - - // Ordenando - $ldapusers = $ldapusers->orderBy('displayname', 'asc'); - - // Paginando - // pagina começa no 0 mas vamos mostrar começando no 1 - - // processamento especial para contar mais de 1000 (a nova versão do LDAP trunca em 1000) - $allUsers = collect(); - $ldapusers->chunk(1000, function ($chunk) use ($allUsers) { - foreach ($chunk as $user) { - $allUsers->push($user); - } - }); - $allUsers = $allUsers->sortBy(function ($user) { - $nome = $user->getFirstAttribute('displayname'); - return empty($nome) ? ' ' : $nome; - }, SORT_NATURAL | SORT_FLAG_CASE)->values(); - - // processamento especial para paginar manualmente - $page = request()->get('page', 1); // Descobrimos a página atual baseada na URL (?page=X) - $offset = ($page - 1) * $perPage; // Fatiamos a coleção para pegar apenas os itens da página atual... offset = onde começa o corte - $itemsForCurrentPage = $allUsers->slice($offset, $perPage)->values(); - $ldapusers = new \Illuminate\Pagination\LengthAwarePaginator($itemsForCurrentPage, $allUsers->count(), $perPage, $page, ['path' => \Illuminate\Pagination\Paginator::resolveCurrentPath()]); // Criamos o Paginador Manualmente para o Blade entender - - $nav = [ - 'pagCor' => $ldapusers->currentPage(), - 'perPag' => $ldapusers->perPage(), - 'totPag' => $ldapusers->lastPage(), - 'total' => $ldapusers->total(), // É esse valor que vai aparecer como 1022 - 'offset' => $ldapusers->firstItem() - 1, - ]; - - $maxLnk = 5; # Máximo de links - $lnkLat = ceil($maxLnk / 2); # Cálculo dos links laterais - $nav['pagIni'] = $nav['pagCor'] - $lnkLat; # Início dos links (esquerda) - $nav['pagFin'] = $nav['pagCor'] + $lnkLat; # Fim dos links (direita) - - $searchGrupos = ''; - $gruposUrl = ''; - if (!empty($request->grupos) && isset($request->grupos)) { - $searchGrupos = implode(', ', $request->grupos); - foreach ($request->grupos as $grupo) { - $gruposUrl .= "&grupos[]=$grupo"; - } - } + // mostra somente os usuários habilitados + // $ldapusers = $ldapusers->whereEnabled(); + + // tentativa de mostrar somente contas não expiradas + // $ldapusers = $ldapusers->whereBetween('accountexpires', [(new \DateTime('October 1st 2010'))->format('YmdHis.0\Z'), now()->format('YmdHis.0\Z')]); + + // Ordenando + $ldapusers = $ldapusers->orderBy('displayname', 'asc'); + + // Paginando + // pagina começa no 0 mas vamos mostrar começando no 1 + + // processamento especial para contar mais de 1000 (a nova versão do LDAP trunca em 1000) + $allUsers = collect(); + $ldapusers->chunk(1000, function ($chunk) use ($allUsers) { + foreach ($chunk as $user) { + $allUsers->push($user); + } + }); + $allUsers = $allUsers->sortBy(function ($user) { + $nome = $user->getFirstAttribute('displayname'); + return empty($nome) ? ' ' : $nome; + }, SORT_NATURAL | SORT_FLAG_CASE)->values(); + + // processamento especial para paginar manualmente + $page = request()->get('page', 1); // Descobrimos a página atual baseada na URL (?page=X) + $offset = ($page - 1) * $perPage; // Fatiamos a coleção para pegar apenas os itens da página atual... offset = onde começa o corte + $itemsForCurrentPage = $allUsers->slice($offset, $perPage)->values(); + $ldapusers = new \Illuminate\Pagination\LengthAwarePaginator($itemsForCurrentPage, $allUsers->count(), $perPage, $page, ['path' => \Illuminate\Pagination\Paginator::resolveCurrentPath()]); // Criamos o Paginador Manualmente para o Blade entender + + $nav = [ + 'pagCor' => $ldapusers->currentPage(), + 'perPag' => $ldapusers->perPage(), + 'totPag' => $ldapusers->lastPage(), + 'total' => $ldapusers->total(), // É esse valor que vai aparecer como 1022 + 'offset' => $ldapusers->firstItem() - 1, + ]; + + $maxLnk = 5; # Máximo de links + $lnkLat = ceil($maxLnk / 2); # Cálculo dos links laterais + $nav['pagIni'] = $nav['pagCor'] - $lnkLat; # Início dos links (esquerda) + $nav['pagFin'] = $nav['pagCor'] + $lnkLat; # Fim dos links (direita) + + $searchGrupos = ''; + $gruposUrl = ''; + if (!empty($request->grupos) && isset($request->grupos)) { + $searchGrupos = implode(', ', $request->grupos); + foreach ($request->grupos as $grupo) { + $gruposUrl .= "&grupos[]=$grupo"; + } + } - $grupos = LdapGroup::listaGrupos(); - - return view('ldapusers.index', compact('ldapusers', 'grupos', 'request', 'nav', 'gruposUrl', 'searchGrupos', 'perPage')); - } - - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create(Request $request) - { - // menu "Criar usuário" - - $this->authorize('manager'); - \UspTheme::activeUrl('ldapusers/create'); - - return view('ldapusers.create'); - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // menu "Criar usuário" -> botão "Enviar Dados" - - $this->authorize('manager'); - - if (isset($request->acao) && $request->acao == 'criar-por-codpes') { - $request->validate([ - 'codpes' => 'required|integer', - ]); - - // verifincado se usuário já existe no ldap - if ($user = LdapUser::obterUserPorCodpes($request->codpes)) { - $request->session()->flash('alert-info', 'Usuário já existe!'); - return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname')); - } - - // verificando se o codpes possui vinculo ativo na unidade - $pessoa = Pessoa::listarVinculosAtivos($request->codpes); - if (!$pessoa) { - $request->session()->flash('alert-warning', 'Número USP ' . $request->codpes . ' não encontrado!'); - return back(); - } - // dd($pessoa); - - // criando usuario a partir do codpes - $user = LdapUser::criarOuAtualizarPorArray($pessoa[0]); - $user->unicodepwd = ($password = $password ?? Utils::senhaAleatoria()); - $user->save(); - - $request->session()->flash('alert-success', 'Usuário cadastrado com sucesso!'); - return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname'))->with('password', $password); + $grupos = LdapGroup::listaGrupos(); + + return view('ldapusers.index', compact('ldapusers', 'grupos', 'request', 'nav', 'gruposUrl', 'searchGrupos', 'perPage')); } - // criando usuário com dados manuais - $request->validate([ - 'username' => ['required', 'regex:/^[a-zA-Z0-9]*$/i', new LdapUsernameRule], - 'nome' => ['required'], - 'email' => ['required', 'email', new LdapEmailRule], - ]); - - $grupos = array_merge($request->grupos, ['NAOREPLICADO']); - $attr = [ - 'nome' => $request->nome, - 'email' => $request->email, - 'setor' => 'NAOREPLICADO', - ]; - $user = LdapUser::createOrUpdate($request->username, $attr, $grupos); - - $request->session()->flash('alert-success', 'Usuário cadastrado com sucesso!'); - return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname')); - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show(Request $request, $username) - { - // menu "Usuários Ldap" -> algum usuário Ldap - - $this->authorize('manager'); - \UspTheme::activeUrl('ldapusers'); - - $user = LdapUser::obterUserPorUsername($username); - if (!$user) { - $request->session()->flash('alert-danger', "A conta $username não existe no ldap."); - return view('ldapusers.show-no-user'); + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create(Request $request) + { + // menu "Criar usuário" + + $this->authorize('manager'); + \UspTheme::activeUrl('ldapusers/create'); + + return view('ldapusers.create'); } - return SELF::showCommon($user); - } + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // menu "Criar usuário" -> botão "Enviar Dados" + + $this->authorize('manager'); + + if (isset($request->acao) && $request->acao == 'criar-por-codpes') { + $request->validate([ + 'codpes' => 'required|integer', + ]); + + // verifincado se usuário já existe no ldap + if ($user = LdapUser::obterUserPorCodpes($request->codpes)) { + $request->session()->flash('alert-info', 'Usuário já existe!'); + return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname')); + } + + // verificando se o codpes possui vinculo ativo na unidade + $pessoa = Pessoa::listarVinculosAtivos($request->codpes); + if (!$pessoa) { + $request->session()->flash('alert-warning', 'Número USP ' . $request->codpes . ' não encontrado!'); + return back(); + } + // dd($pessoa); + + // criando usuario a partir do codpes + $user = LdapUser::criarOuAtualizarPorArray($pessoa[0]); + $user->unicodepwd = ($password = $password ?? Utils::senhaAleatoria()); + $user->save(); + + $request->session()->flash('alert-success', 'Usuário cadastrado com sucesso!'); + return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname'))->with('password', $password); + } - public function my(Request $request) - { - // menu "Minha Conta (trocar senha da rede)" + // criando usuário com dados manuais + $request->validate([ + 'username' => ['required', 'regex:/^[a-zA-Z0-9]*$/i', new LdapUsernameRule], + 'nome' => ['required'], + 'email' => ['required', 'email', new LdapEmailRule], + ]); - $this->authorize('user'); - \UspTheme::activeUrl('ldapusers/my'); + $grupos = array_merge($request->grupos, ['NAOREPLICADO']); + $attr = [ + 'nome' => $request->nome, + 'email' => $request->email, + 'setor' => 'NAOREPLICADO', + ]; + $user = LdapUser::createOrUpdate($request->username, $attr, $grupos); - $user = LdapUser::obterUserPorCodpes(Auth::user()->codpes); - if (!$user) { - $request->session()->flash('alert-danger', 'Sua conta não existe no ldap. '); - return view('ldapusers.show-no-user'); + $request->session()->flash('alert-success', 'Usuário cadastrado com sucesso!'); + return redirect("ldapusers/" . $user->getFirstAttribute('samaccountname')); } - return SELF::showCommon($user); - } - - /** - * parte comum do para show e my - */ - protected function showCommon($user) - { - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" - - $attr = LdapUser::show($user); - $vinculos = []; - // o $codpesValido serve para informar se o codpes extraído veio do campo indicado no config - list($codpes, $codpesValido) = LdapUser::obterCodpes($user, true); - - if ($codpes) { - $vinculos = Replicado::listarVinculosEstendidos($codpes); - $foto = \Uspdev\Wsfoto::obter($codpes); - } else { - $foto = ''; + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show(Request $request, $username) + { + // menu "Usuários Ldap" -> algum usuário Ldap + + $this->authorize('manager'); + \UspTheme::activeUrl('ldapusers'); + + $user = LdapUser::obterUserPorUsername($username); + if (!$user) { + $request->session()->flash('alert-danger', "A conta $username não existe no ldap."); + return view('ldapusers.show-no-user'); + } + + return SELF::showCommon($user); } - return view('ldapusers.show', compact('attr', 'user', 'vinculos', 'codpesValido', 'foto')); - } - - /** - * Show the form for editing the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function edit($id) {} - - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $username) - { - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" - $this->authorize('user'); - - // troca de senha - if (!is_null($request->senha)) { - $request->validate([ - // TODO: 04/07/2022 - ECAdev @alecosta: Parametrizar - // 'senha' => ['required', 'confirmed', 'min:8'], # Sem complexidade - 'senha' => ['required', 'confirmed', 'min:8', 'max:20', 'regex:/[0-9]/', 'regex:/[A-Z]/', 'regex:/[!@#\$%\^&\*()_]/'], # Com complexidade - 'must_change_pwd' => ['nullable', 'in:1'], - ]); + public function my(Request $request) + { + // menu "Minha Conta (trocar senha da rede)" - if (LdapUser::changePassword($username, $request->senha, $request->must_change_pwd)) { - $request->session()->flash('alert-success', 'Senha alterada com sucesso!'); + $this->authorize('user'); + \UspTheme::activeUrl('ldapusers/my'); + + $user = LdapUser::obterUserPorCodpes(Auth::user()->codpes); + if (!$user) { + $request->session()->flash('alert-danger', 'Sua conta não existe no ldap. '); + return view('ldapusers.show-no-user'); + } + return SELF::showCommon($user); + } + + /** + * parte comum do para show e my + */ + protected function showCommon($user) + { + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" + + $attr = LdapUser::show($user); + $vinculos = []; + // o $codpesValido serve para informar se o codpes extraído veio do campo indicado no config + list($codpes, $codpesValido) = LdapUser::obterCodpes($user, true); + + if ($codpes) { + $vinculos = Replicado::listarVinculosEstendidos($codpes); + $foto = \Uspdev\Wsfoto::obter($codpes); } else { - $request->session()->flash('alert-danger', - 'Não foi possível alterar a senha da sua conta! Consulte a política de senha de seu servidor.'); + $foto = ''; } - return redirect()->back(); + return view('ldapusers.show', compact('attr', 'user', 'vinculos', 'codpesValido', 'foto')); } - $this->authorize('manager'); - // atualiza status - if (!is_null($request->status)) { + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) {} + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $username) + { + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" + + $this->authorize('user'); + + // troca de senha + if (!is_null($request->senha)) { + $request->validate([ + // TODO: 04/07/2022 - ECAdev @alecosta: Parametrizar + // 'senha' => ['required', 'confirmed', 'min:8'], # Sem complexidade + 'senha' => ['required', 'confirmed', 'min:8', 'max:20', 'regex:/[0-9]/', 'regex:/[A-Z]/', 'regex:/[!@#\$%\^&\*()_]/'], # Com complexidade + 'must_change_pwd' => ['nullable', 'in:1'], + ]); + + if (LdapUser::changePassword($username, $request->senha, $request->must_change_pwd)) { + $request->session()->flash('alert-success', 'Senha alterada com sucesso!'); + } else { + $request->session()->flash( + 'alert-danger', + 'Não foi possível alterar a senha da sua conta! Consulte a política de senha de seu servidor.' + ); + } - if ($request->status == 'disable') { - LdapUser::disable($username); - $request->session()->flash('alert-success', "Usuário $username desabilitado!"); return redirect()->back(); } - if ($request->status == 'enable') { - LdapUser::enable($username); - $request->session()->flash('alert-success', "Usuário $username habilitado!"); - return redirect()->back(); + $this->authorize('manager'); + // atualiza status + if (!is_null($request->status)) { + + if ($request->status == 'disable') { + LdapUser::disable($username); + $request->session()->flash('alert-success', "Usuário $username desabilitado!"); + return redirect()->back(); + } + + if ($request->status == 'enable') { + LdapUser::enable($username); + $request->session()->flash('alert-success', "Usuário $username habilitado!"); + return redirect()->back(); + } } - } - // atualiza data de expiração - if (!is_null($request->expiry)) { - $request->validate([ - 'expiry' => ['required', Rule::in([7, 30, 365, 0, -1])], - ]); + // atualiza data de expiração + if (!is_null($request->expiry)) { + $request->validate([ + 'expiry' => ['required', Rule::in([7, 30, 365, 0, -1])], + ]); - LdapUser::expirarSenha($username, $request->expiry); - $request->session()->flash('alert-success', "Usuário $username: alterado expiração da senha!"); - return redirect()->back(); + LdapUser::expirarSenha($username, $request->expiry); + $request->session()->flash('alert-success', "Usuário $username: alterado expiração da senha!"); + return redirect()->back(); + } } - // evita que caia em tela vazia caso nada tenha sido alterado pelo usuário - $request->session()->flash('alert-success', "Nenhuma operação realizada."); - return redirect()->back(); -} - - /** - * Remove the specified resource from storage. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function destroy(Request $request, $username) - { - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy(Request $request, $username) + { + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" - $this->authorize('manager'); + $this->authorize('manager'); - $attr = LdapUser::delete($username); + $attr = LdapUser::delete($username); - $request->session()->flash('alert-danger', 'Usuário(a) ' . $username . ' deletado'); - return redirect()->back(); - } + $request->session()->flash('alert-danger', 'Usuário(a) ' . $username . ' deletado'); + return redirect()->back(); + } - public function syncReplicadoForm(Request $request) - { - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" + public function syncReplicadoForm(Request $request) + { + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" - $this->authorize('manager'); - \UspTheme::activeUrl('configs'); + $this->authorize('manager'); + \UspTheme::activeUrl('configs'); - $vinculos = Pessoa::tiposVinculos(config('web-ldap-admin.replicado_unidade')); - foreach ($vinculos as &$vinculo) { - $vinculo['countReplicado'] = Pessoa::ativosVinculo($vinculo['tipvinext'], config('web-ldap-admin.replicado_unidade'), 1)[0]['total']; - $vinculo['countAD'] = count(LdapUser::getUsersGroup($vinculo['tipvinext'])); - $vinculo['style'] = ($vinculo['countAD'] < $vinculo['countReplicado']) ? 'text-danger' : ''; - } + $vinculos = Pessoa::listarTiposVinculoExtenso(); + foreach ($vinculos as &$vinculo) { + $vinculo['countReplicado'] = Pessoa::ativosVinculo($vinculo['tipvinext'], config('web-ldap-admin.replicado_unidade'), 1)[0]['total']; + $vinculo['countAD'] = count(LdapUser::getUsersGroup($vinculo['tipvinext'])); + $vinculo['style'] = ($vinculo['countAD'] < $vinculo['countReplicado']) ? 'text-danger' : ''; + } - return view('ldapusers.sync', compact('vinculos')); - } - - public function syncReplicado(Request $request) - { - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" - - $this->authorize('manager'); - $this->validate($request, [ - 'type' => 'required', - ]); - - SincronizaReplicado::dispatch($request->type); - $request->session()->flash('alert-success', 'Sincronização em andamento'); - return redirect('/ldapusers'); - } - - public function addGroup(Request $request) - { - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Grupo" -> botão "Salvar" - - $this->authorize('manager'); - // Validações - $request->validate([ - 'username' => ['required'], - 'grupos' => ['required'], - ]); - $grupos = $request->grupos; - $user = LdapUser::obterUserPorUsername($request->username); - foreach ($grupos as $grupo) { - $group = LdapGroup::createOrUpdate($grupo); - $group->members()->attach($user); + return view('ldapusers.sync', compact('vinculos')); } - $request->session()->flash('alert-success', 'Grupo(s) adicionado(s) com sucesso.'); - return redirect("/ldapusers/$request->username"); - } - public function deleteUserGroup(Request $request, $username, $group) - { - $this->authorize('manager'); + public function syncReplicado(Request $request) + { + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" - $user = LdapUser::obterUserPorUsername($username); - $group = Group::where('cn', '=', $group)->first(); + $this->authorize('manager'); + $this->validate($request, [ + 'type' => 'required', + ]); - if ( $user->groups()->exists($group) ) { - $user->groups()->detach($group); - $request->session()->flash('alert-success', 'Grupo ' . $group['name'][0] . ' removido com sucesso.'); + SincronizaReplicado::dispatch($request->type); + $request->session()->flash('alert-success', 'Sincronização em andamento'); + return redirect('/ldapusers'); } - return redirect()->back(); - } + public function addGroup(Request $request) + { + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Grupo" -> botão "Salvar" + $this->authorize('manager'); + // Validações + $request->validate([ + 'username' => ['required'], + 'grupos' => ['required'], + ]); + $grupos = $request->grupos; + $user = LdapUser::obterUserPorUsername($request->username); + foreach ($grupos as $grupo) { + $group = LdapGroup::createOrUpdate($grupo); + $group->members()->attach($user); + } + $request->session()->flash('alert-success', 'Grupo(s) adicionado(s) com sucesso.'); + return redirect("/ldapusers/$request->username"); + } } diff --git a/app/Jobs/SincronizaReplicado.php b/app/Jobs/SincronizaReplicado.php index 1c1d343..a1c0b42 100644 --- a/app/Jobs/SincronizaReplicado.php +++ b/app/Jobs/SincronizaReplicado.php @@ -37,9 +37,9 @@ public function __construct(array $type) public function handle() { // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" - + foreach ($this->type as $type) { - foreach (Pessoa::tiposVinculos($this->unidade) as $vinculo) { + foreach (Pessoa::listarTiposVinculoExtenso() as $vinculo) { if ($type == $vinculo['tipvinext']) { $this->sync(Pessoa::ativosVinculo($vinculo['tipvinext'], $this->unidade)); } @@ -50,7 +50,7 @@ public function handle() public function sync($pessoas) { // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" - + if ($pessoas) { // No .env foi configurado para desativar os desligados? if (config('web-ldap-admin.desativarDesligados') == true) { diff --git a/app/Ldap/User.php b/app/Ldap/User.php index db3d329..c423ebf 100644 --- a/app/Ldap/User.php +++ b/app/Ldap/User.php @@ -8,6 +8,7 @@ use Uspdev\Replicado\Graduacao; use Uspdev\Replicado\Estrutura; use Uspdev\Replicado\Pessoa; +use App\Replicado\Pessoa as LdapPessoa; use Uspdev\Utils\Generic as Utils; use LdapRecord\Models\ActiveDirectory\Container; @@ -19,570 +20,570 @@ class User { - /** - * Cria ou atualiza os dados do usuário ldap - * - * Este método está com mais comentários no código pois em geral - * serve de entrada para novos desenvolvedores. - * - * Estrutura do array attr: - * $attr['nome'] : Nome completo - * $attr['email'] : Email - * $attr['setor'] : Departamento - * $attr['descricao'] : Descricao - **/ - public static function createOrUpdate(string $username, array $attr, array $groups = [], $password = null) - { - // invocado por: - // no login (LoginListener::handle -> User::criarOuAtualizarPorArray) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray) - - // vamos ver se o usuário já existe - $user = SELF::obterUserPorUsername($username); - - # Novo usuário - if (is_null($user) or $user == false) { - $user = new LdapUser(); - - // define DN para esse user - $baseDn = $user->getConnection()->getConfiguration()->get('base_dn'); - $user->setDn("CN={$username},CN=Users,{$baseDn}"); - - // se não for fornecido senha vamos gerar aleatório forte - $user->unicodepwd = $password ?? Utils::senhaAleatoria(); - - // Trocar a senha no próximo logon - if (config('web-ldap-admin.obrigaTrocarSenhaNoWindows')) { - $user->pwdlastset = 0; - } - - // Enable the new user (using user account control). - $user->useraccountcontrol = AccountControl::NORMAL_ACCOUNT; - - // vamos expirar senha conforme config - $user->accountExpires = SELF::getExpiryDays(); - } + /** + * Cria ou atualiza os dados do usuário ldap + * + * Este método está com mais comentários no código pois em geral + * serve de entrada para novos desenvolvedores. + * + * Estrutura do array attr: + * $attr['nome'] : Nome completo + * $attr['email'] : Email + * $attr['setor'] : Departamento + * $attr['descricao'] : Descricao + **/ + public static function createOrUpdate(string $username, array $attr, array $groups = [], $password = null) + { + // invocado por: + // no login (LoginListener::handle -> User::criarOuAtualizarPorArray) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray) + + // vamos ver se o usuário já existe + $user = SELF::obterUserPorUsername($username); + + # Novo usuário + if (is_null($user) or $user == false) { + $user = new LdapUser(); + + // define DN para esse user + $baseDn = $user->getConnection()->getConfiguration()->get('base_dn'); + $user->setDn("CN={$username},CN=Users,{$baseDn}"); + + // se não for fornecido senha vamos gerar aleatório forte + $user->unicodepwd = $password ?? Utils::senhaAleatoria(); + + // Trocar a senha no próximo logon + if (config('web-ldap-admin.obrigaTrocarSenhaNoWindows')) { + $user->pwdlastset = 0; + } - // login no windows - $user->samaccountname = $username; - // nome de exibição - $user->displayname = $attr['nome']; - - // atribuindo nome e sobrenome - $nome_array = explode(' ', $attr['nome']); - if (count($nome_array) > 1) { - $user->givenname = trim($nome_array[0]); - unset($nome_array[0]); - $user->sn = implode(' ', $nome_array); - } else { - $user->givenname = trim($nome_array[0]); - } + // Enable the new user (using user account control). + $user->useraccountcontrol = AccountControl::NORMAL_ACCOUNT; - if (!empty($attr['email'])) { - $user->mail = $attr['email']; - } + // vamos expirar senha conforme config + $user->accountExpires = SELF::getExpiryDays(); + } - // caso o codpes venha no employeenumber - if (!empty($attr['employeeNumber'])) { - $user->employeeNumber = $attr['employeeNumber']; - } + // login no windows + $user->samaccountname = $username; + // nome de exibição + $user->displayname = $attr['nome']; + + // atribuindo nome e sobrenome + $nome_array = explode(' ', $attr['nome']); + if (count($nome_array) > 1) { + $user->givenname = trim($nome_array[0]); + unset($nome_array[0]); + $user->sn = implode(' ', $nome_array); + } else { + $user->givenname = trim($nome_array[0]); + } - // Departamento - if (!empty($attr['setor'])) { - $user->department = $attr['setor']; - } + if (!empty($attr['email'])) { + $user->mail = $attr['email']; + } - // Descrição, informa se a conta foi criada a partir da sincronização - if (!empty($attr['descricao'])) { - $user->description = $attr['descricao']; - } + // caso o codpes venha no employeenumber + if (!empty($attr['employeeNumber'])) { + $user->employeeNumber = $attr['employeeNumber']; + } - // Atributos para Linux - $username_integer = (int) $username; - if (config('web-ldap-admin.usarAtributosLinux') && $username_integer != 0) { + // Departamento + if (!empty($attr['setor'])) { + $user->department = $attr['setor']; + } - $user->uid = config('web-ldap-admin.prefixo_linux') . $username; - $user->uidNumber = $username; - $user->gidNumber = config('web-ldap-admin.gid_linux'); - $user->loginShell = '/bin/bash'; - $user->userPrincipalName = $username . '@' . config('web-ldap-admin.ldap_domain'); - $user->unixHomeDirectory = '/home/' . config('web-ldap-admin.prefixo_linux') . $username; - } + // Descrição, informa se a conta foi criada a partir da sincronização + if (!empty($attr['descricao'])) { + $user->description = $attr['descricao']; + } - $user->save(); + // Atributos para Linux + $username_integer = (int) $username; + if (config('web-ldap-admin.usarAtributosLinux') && $username_integer != 0) { - $user->department = $attr['setor']; + $user->uid = config('web-ldap-admin.prefixo_linux') . $username; + $user->uidNumber = $username; + $user->gidNumber = config('web-ldap-admin.gid_linux'); + $user->loginShell = '/bin/bash'; + $user->userPrincipalName = $username . '@' . config('web-ldap-admin.ldap_domain'); + $user->unixHomeDirectory = '/home/' . config('web-ldap-admin.prefixo_linux') . $username; + } - // Adiciona a um ou mais grupo - LdapGroup::addMember($user, $groups); + $user->save(); - // Busca a OU padrão informada no .env - // Se vazio, não é necessário alterar nada, pois o default é a raiz (Thiago) - if (config('web-ldap-admin.ouDefault') != '') { - $ou = OrganizationalUnit::findBy('ou', config('web-ldap-admin.ouDefault')); + $user->department = $attr['setor']; - // Move o usuário para a OU padrão somente se ela existir, - // do contrário deixa o usuário na raiz - $user->move($ou); - } + // Adiciona a um ou mais grupo + LdapGroup::addMember($user, $groups); + // Busca a OU padrão informada no .env + // Se vazio, não é necessário alterar nada, pois o default é a raiz (Thiago) + if (config('web-ldap-admin.ouDefault') != '') { + $ou = OrganizationalUnit::findBy('ou', config('web-ldap-admin.ouDefault')); + // Move o usuário para a OU padrão somente se ela existir, + // do contrário deixa o usuário na raiz + $user->move($ou); + } - return $user; - } - /** - * Retorna o número de dias para expirar a conta com base no config - */ - public static function getExpiryDays() - { - // invocado por: - // no login (LoginListener::handle -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::createOrUpdate) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - if (config('web-ldap-admin.expirarEm') == 0) { - return null; - } else { - return now()->addDays((int) config('web-ldap-admin.expirarEm')); - } - } - - /** - * Define prazo de expiração para senha da conta - */ - public static function expirarSenha($username, $expiry) - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) - - $user = SELF::obterUserPorUsername($username); - if ($user) { - if ($expiry) { - $user->accountExpires = now()->addDays((int) $expiry); - } else { - $user->accountExpires = 0; - } - $user->save(); - return true; + return $user; } - return false; - } - - /** - * Obtém uma instância de usuário com busca pelo codpes - * - * @param Int $codpes - * @return LdapRecord\Models\ActiveDirectory\User - */ - public static function obterUserPorCodpes($codpes) - { - // invocado por: - // menu "Minha Conta (trocar senha da rede)" (LdapUserController::my) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) - - $user = LdapUser::findBy(config('web-ldap-admin.campoCodpes'), $codpes); - - // não vai encontrar se for pelo username, nesse caso vamos usar o CN - if (is_null($user)) { - $user = LdapUser::where('cn', '=', $codpes)->first(); + + /** + * Retorna o número de dias para expirar a conta com base no config + */ + public static function getExpiryDays() + { + // invocado por: + // no login (LoginListener::handle -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::createOrUpdate) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + + if (config('web-ldap-admin.expirarEm') == 0) { + return null; + } else { + return now()->addDays((int) config('web-ldap-admin.expirarEm')); + } } - return $user; - } - - /** - * Obtém uma instância de usuário com busca pelo username - * - * @param String $username - * @return LdapRecord\Models\ActiveDirectory\User - */ - public static function obterUserPorUsername($username) - { - // invocado por: - // no login (LoginListener::handle -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - // menu "Solicitação de Conta de Administrador" -> botão "Enviar" (SolicitaController::store) - // menu "Usuários Ldap" -> algum usuário Ldap (LdapUserController::show) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Grupo" -> botão "Salvar" (LdapUserController::addGroup) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::expirarSenha) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::enable) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::disable) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::changePassword) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" (LdapUserController::destroy -> User::delete) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::createOrUpdate) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray -> User::createOrUpdate) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers -> User::disable) - - return LdapUser::where('cn', '=', $username)->first(); - } - - /** - * Coleta atributos do usuário para serem mostrados - * - * @param LdapRecord\Models\ActiveDirectory\User $user - * @return Array - */ - public static function show(LdapUser $user) - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my) - - $attr = []; - - // Nome e email - $attr['username'] = $user->getFirstAttribute('samaccountname'); - $attr['display_name'] = $user->getFirstAttribute('displayname'); - $attr['email'] = $user->getFirstAttribute('mail'); - $attr['description'] = $user->getFirstAttribute('description'); - $attr['codpes'] = SELF::obterCodpes($user); - - // Data da criação da conta - $ativacao = ldapToCarbon($user, 'whencreated'); - if (!is_null($ativacao)) { - // vamos subtrair 3 horas para bater com o TZ local. TODO: alguma forma de melhorar isso? - $ativacao = $ativacao->subHours(3)->format('d/m/Y H:i:s'); + /** + * Define prazo de expiração para senha da conta + */ + public static function expirarSenha($username, $expiry) + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) + + $user = SELF::obterUserPorUsername($username); + if ($user) { + if ($expiry) { + $user->accountExpires = now()->addDays((int) $expiry); + } else { + $user->accountExpires = 0; + } + $user->save(); + return true; + } + return false; } - $attr['ativacao'] = $ativacao; - // data da última senha alterada - $last = ldapToCarbon($user, 'pwdlastset'); - if (!is_null($last)) { - $last = $last->format('d/m/Y H:i:s'); + /** + * Obtém uma instância de usuário com busca pelo codpes + * + * @param Int $codpes + * @return LdapRecord\Models\ActiveDirectory\User + */ + public static function obterUserPorCodpes($codpes) + { + // invocado por: + // menu "Minha Conta (trocar senha da rede)" (LdapUserController::my) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) + + $user = LdapUser::findBy(config('web-ldap-admin.campoCodpes'), $codpes); + + // não vai encontrar se for pelo username, nesse caso vamos usar o CN + if (is_null($user)) { + $user = LdapUser::where('cn', '=', $codpes)->first(); + } + + return $user; } - $attr['senha_alterada_em'] = $last; - // Data da expiração da conta - $expira = ldapToCarbon($user, 'accountexpires'); - if (!is_null($expira)) { - $expira = $expira->format('d/m/Y'); + /** + * Obtém uma instância de usuário com busca pelo username + * + * @param String $username + * @return LdapRecord\Models\ActiveDirectory\User + */ + public static function obterUserPorUsername($username) + { + // invocado por: + // no login (LoginListener::handle -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + // menu "Solicitação de Conta de Administrador" -> botão "Enviar" (SolicitaController::store) + // menu "Usuários Ldap" -> algum usuário Ldap (LdapUserController::show) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Grupo" -> botão "Salvar" (LdapUserController::addGroup) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::expirarSenha) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::enable) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::disable) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update -> User::changePassword) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" (LdapUserController::destroy -> User::delete) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::createOrUpdate) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::criarOuAtualizarPorArray -> User::createOrUpdate) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers -> User::disable) + + return LdapUser::where('cn', '=', $username)->first(); } - $attr['expira'] = $expira; - - // Grupos: vamos ocultar o grupo "Domain Users" - $grupos = array_diff($user->groups()->get()->pluck('cn')->flatten()->toArray(), ['Domain Users']); - sort($grupos); - $attr['grupos'] = $grupos; - - // Department - $attr['department'] = $user->getFirstAttribute('department'); - - return $attr; - } - - /** - * Retorna o codpes do usuário ldap - * - * O codpes pode ser o username ou o employeeNumber e é setado no config. - * Se não encontrar no campo apropriado faz a busca no outro campo - * para o caso de ter mudado a regra ao longo do uso - * - * Se não retornar codpes o status pode ser qualquer - * - * @param LdapRecord\Models\ActiveDirectory\User $user - * @param $status Se true retorna se o codpes veio do campo correto ou não, segundo o config - * @return Int|Array|Null - */ - public static function obterCodpes(LdapUser $user, Bool $status = false) - { - // invocado por: - // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.index) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my) - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my -> User::show) - - $valido = true; - switch (strtolower(config('web-ldap-admin.campoCodpes'))) { - case 'employeenumber': - if (!is_numeric($codpes = $user->getFirstAttribute('employeenumber'))) { - $codpes = $user->getFirstAttribute('samaccountname'); - $valido = false; + + /** + * Coleta atributos do usuário para serem mostrados + * + * @param LdapRecord\Models\ActiveDirectory\User $user + * @return Array + */ + public static function show(LdapUser $user) + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my) + + $attr = []; + + // Nome e email + $attr['username'] = $user->getFirstAttribute('samaccountname'); + $attr['display_name'] = $user->getFirstAttribute('displayname'); + $attr['email'] = $user->getFirstAttribute('mail'); + $attr['description'] = $user->getFirstAttribute('description'); + $attr['codpes'] = SELF::obterCodpes($user); + + // Data da criação da conta + $ativacao = ldapToCarbon($user, 'whencreated'); + if (!is_null($ativacao)) { + // vamos subtrair 3 horas para bater com o TZ local. TODO: alguma forma de melhorar isso? + $ativacao = $ativacao->subHours(3)->format('d/m/Y H:i:s'); + } + $attr['ativacao'] = $ativacao; + + // data da última senha alterada + $last = ldapToCarbon($user, 'pwdlastset'); + if (!is_null($last)) { + $last = $last->format('d/m/Y H:i:s'); } - break; - case 'username': - default: - if (!is_numeric($codpes = $user->getFirstAttribute('samaccountname'))) { - $codpes = $user->getFirstAttribute('employeenumber'); - $valido = false; + $attr['senha_alterada_em'] = $last; + + // Data da expiração da conta + $expira = ldapToCarbon($user, 'accountexpires'); + if (!is_null($expira)) { + $expira = $expira->format('d/m/Y'); } - break; + $attr['expira'] = $expira; + + // Grupos: vamos ocultar o grupo "Domain Users" + $grupos = array_diff($user->groups()->get()->pluck('cn')->flatten()->toArray(), ['Domain Users']); + sort($grupos); + $attr['grupos'] = implode(', ', $grupos); + + // Department + $attr['department'] = $user->getFirstAttribute('department'); + + return $attr; } - if (is_numeric($codpes)) { - return $status ? [$codpes, $valido] : $codpes; - } else { - return null; + + /** + * Retorna o codpes do usuário ldap + * + * O codpes pode ser o username ou o employeeNumber e é setado no config. + * Se não encontrar no campo apropriado faz a busca no outro campo + * para o caso de ter mudado a regra ao longo do uso + * + * Se não retornar codpes o status pode ser qualquer + * + * @param LdapRecord\Models\ActiveDirectory\User $user + * @param $status Se true retorna se o codpes veio do campo correto ou não, segundo o config + * @return Int|Array|Null + */ + public static function obterCodpes(LdapUser $user, Bool $status = false) + { + // invocado por: + // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.index) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my) + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" (LdapUserController::show, my -> User::show) + + $valido = true; + switch (strtolower(config('web-ldap-admin.campoCodpes'))) { + case 'employeenumber': + if (!is_numeric($codpes = $user->getFirstAttribute('employeenumber'))) { + $codpes = $user->getFirstAttribute('samaccountname'); + $valido = false; + } + break; + case 'username': + default: + if (!is_numeric($codpes = $user->getFirstAttribute('samaccountname'))) { + $codpes = $user->getFirstAttribute('employeenumber'); + $valido = false; + } + break; + } + if (is_numeric($codpes)) { + return $status ? [$codpes, $valido] : $codpes; + } else { + return null; + } } - } - public static function delete(String $username) - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" (LdapUserController::destroy) + public static function delete(String $username) + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> botão "Excluir" (LdapUserController::destroy) - $user = SELF::obterUserPorUsername($username); - if (!is_null($user)) { - $user->delete(); - return true; + $user = SELF::obterUserPorUsername($username); + if (!is_null($user)) { + $user->delete(); + return true; + } + return false; } - return false; - } - - public static function disable(String $username) - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers) - - $user = SELF::obterUserPorUsername($username); - if (!is_null($user)) { - # https://support.microsoft.com/pt-br/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro - $user->useraccountcontrol = AccountControl::ACCOUNTDISABLE; - $user->save(); - return true; + + public static function disable(String $username) + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync -> User::desativarUsers) + + $user = SELF::obterUserPorUsername($username); + if (!is_null($user)) { + # https://support.microsoft.com/pt-br/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro + $user->useraccountcontrol = AccountControl::ACCOUNTDISABLE; + $user->save(); + return true; + } + return false; } - return false; - } - public static function enable(String $username) - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) + public static function enable(String $username) + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) - $user = SELF::obterUserPorUsername($username); + $user = SELF::obterUserPorUsername($username); - if (!is_null($user)) { - # https://support.microsoft.com/pt-br/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro - $user->useraccountcontrol = AccountControl::NORMAL_ACCOUNT; - $user->save(); - return true; + if (!is_null($user)) { + # https://support.microsoft.com/pt-br/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro + $user->useraccountcontrol = AccountControl::NORMAL_ACCOUNT; + $user->save(); + return true; + } + return false; } - return false; - } - public static function changePassword($username, String $password, $must_change_pwd = null): bool - { - // invocado por: - // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) + public static function changePassword($username, String $password, $must_change_pwd = null): bool + { + // invocado por: + // menu "Usuários Ldap" -> algum usuário Ldap, menu "Minha Conta (trocar senha da rede)" -> alguma opção do menu de expiração de conta, alguma opção do menu de habilitar/desabilitar, botão "Alterar" (LdapUserController::update) - $user = SELF::obterUserPorUsername($username); - if (is_null($user)) { - return false; - } + $user = SELF::obterUserPorUsername($username); + if (is_null($user)) { + return false; + } - $user->unicodepwd = $password; - // Leonardo Ruiz: Alteracao de senha nao deve alterar validade da conta - //$user->setAccountExpiry(SELF::getExpiryDays()); + $user->unicodepwd = $password; + // Leonardo Ruiz: Alteracao de senha nao deve alterar validade da conta + //$user->setAccountExpiry(SELF::getExpiryDays()); - if ($must_change_pwd) { - $user->pwdlastset = 0; - } + if ($must_change_pwd) { + $user->pwdlastset = 0; + } - try { - $user->save(); - $result = true; - } catch (\Exception $e) { - echo (Gate::check('manager')) ? $e->getMessage() : null; - $result = false; - } - return $result; - } - - public static function getUsersGroup($grupo) - { - // invocado por: - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" (LdapUserController::syncReplicadoForm) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) - - $ldapusers = []; - $group = LdapGroupModel::findBy('cn', $grupo); - if ($group != false) { - $ldapusers = LdapUser::query(); - $ldapusers = $ldapusers->where('memberof', '=', $group->getDn()); - foreach (config('web-ldap-admin.ocultarUsuarios') as $ocultar) { - $ldapusers = $ldapusers->where('samaccountname', '!=', $ocultar); - } - $ldapusers = $ldapusers->orderBy('displayname', 'asc'); - $ldapusers = $ldapusers->paginate(config('web-ldap-admin.registrosPorPagina')); + try { + $user->save(); + $result = true; + } catch (\Exception $e) { + echo (Gate::check('manager')) ? $e->getMessage() : null; + $result = false; + } + return $result; } - return $ldapusers; - } + public static function getUsersGroup($grupo) + { + // invocado por: + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" (LdapUserController::syncReplicadoForm) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) + + $ldapusers = []; + $group = LdapGroupModel::findBy('cn', $grupo); + if ($group != false) { + $ldapusers = LdapUser::query(); + $ldapusers = $ldapusers->where('memberof', '=', $group->getDn()); + foreach (config('web-ldap-admin.ocultarUsuarios') as $ocultar) { + $ldapusers = $ldapusers->where('samaccountname', '!=', $ocultar); + } + $ldapusers = $ldapusers->orderBy('displayname', 'asc'); + $ldapusers = $ldapusers->paginate(config('web-ldap-admin.registrosPorPagina')); + } - public static function desativarUsers($desligados) - { - // invocado por: - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) + return $ldapusers; + } - foreach ($desligados as $desligado) { - // remover dos grupos - $user = SELF::obterUserPorUsername($desligado); - $groups = $user->groups()->get(); + public static function desativarUsers($desligados) + { + // invocado por: + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) - foreach ($groups as $group) { - echo "{$desligado}:
"; - $group->members()->detach($user); - } + foreach ($desligados as $desligado) { + // remover dos grupos + $user = SELF::obterUserPorUsername($desligado); + $groups = $user->groups()->get(); - // adicionar ao grupo Desativados - LdapGroup::addMember($user, ['Desativados']); + foreach ($groups as $group) { + echo "{$desligado}:
"; + $group->members()->detach($user); + } - // desativar conta - self::disable($desligado); - } - } - - /** - * Cria ou atualiza recebendo o array da pessoa - * - * em $pessoa: codema, codpes, dtanas (tabela pessoa), nomabvset, nompesttd (dados da tabela localizapessoa) - * - * @param array $pessoa - * @author Alessandro Costa de Oliveira 11/03/2022 - */ - public static function criarOuAtualizarPorArray($pessoa, $metodo = '') - { - // invocado por: - // no login (LoginListener::handle) - // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) - // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) - - // setando username e codpes (similar loginListener) - switch (strtolower(config('web-ldap-admin.campoCodpes'))) { - case 'employeenumber': - $email = Pessoa::retornarEmailUsp($pessoa['codpes']) ?? $pessoa['codema']; - $email = empty($email) ?: Pessoa::email($pessoa['codpes']); - $username = explode('@', $email)[0]; - $username = preg_replace("/[^a-zA-Z0-9]+/", "", $username); //email sem caracteres especiais - $username = substr($username, 0, 15); //limitando em 15 caracteres - $attr['employeeNumber'] = $pessoa['codpes']; - // dd($email, $pessoa); - break; - case 'username': - default: - $username = $pessoa['codpes']; - $attr['employeeNumber'] = ''; - break; - } - // setando para testes se não vier dtanas - if (!isset($pessoa['dtanas'])) { - $pessoa['dtanas'] = '1/1/1970'; + // adicionar ao grupo Desativados + LdapGroup::addMember($user, ['Desativados']); + + // desativar conta + self::disable($desligado); + } } - // setando senha - switch (config('web-ldap-admin.senhaPadrao')) { - case 'random': - $password = Utils::senhaAleatoria(); - break; + /** + * Cria ou atualiza recebendo o array da pessoa + * + * em $pessoa: codema, codpes, dtanas (tabela pessoa), nomabvset, nompesttd (dados da tabela localizapessoa) + * + * @param array $pessoa + * @author Alessandro Costa de Oliveira 11/03/2022 + */ + public static function criarOuAtualizarPorArray($pessoa, $metodo = '') + { + // invocado por: + // no login (LoginListener::handle) + // menu "Criar usuário" -> botão "Enviar Dados" (LdapUserController::store) + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" -> botão "Sincronizar" (SincronizaReplicado::handle::sync) + + // setando username e codpes (similar loginListener) + switch (strtolower(config('web-ldap-admin.campoCodpes'))) { + case 'employeenumber': + $email = Pessoa::retornarEmailUsp($pessoa['codpes']) ?? $pessoa['codema']; + $email = empty($email) ?: Pessoa::email($pessoa['codpes']); + $username = explode('@', $email)[0]; + $username = preg_replace("/[^a-zA-Z0-9]+/", "", $username); //email sem caracteres especiais + $username = substr($username, 0, 15); //limitando em 15 caracteres + $attr['employeeNumber'] = $pessoa['codpes']; + // dd($email, $pessoa); + break; + case 'username': + default: + $username = $pessoa['codpes']; + $attr['employeeNumber'] = ''; + break; + } + // setando para testes se não vier dtanas + if (!isset($pessoa['dtanas'])) { + $pessoa['dtanas'] = '1/1/1970'; + } - case 'data_nascimento': - default: - $password = ($pessoa['dtanas'] != '') ? date('dmY', strtotime($pessoa['dtanas'])) : Utils::senhaAleatoria(); - } + // setando senha + switch (config('web-ldap-admin.senhaPadrao')) { + case 'random': + $password = Utils::senhaAleatoria(); + break; + + case 'data_nascimento': + default: + $password = ($pessoa['dtanas'] != '') ? date('dmY', strtotime($pessoa['dtanas'])) : Utils::senhaAleatoria(); + } - if ($pessoa['nomabvset']) { - // o setor é o vínculo estendido + setor (sem o código da unidade) - $setor = $pessoa['tipvinext'] . ' ' . explode('-', $pessoa['nomabvset'])[0]; - } else { - $setor = $pessoa['tipvinext']; - if ($pessoa['tipvinext'] == 'Aluno de Graduação') { - if (empty(config('web-ldap-admin.grCursoSetor'))) { - try { - $nomabvset = Graduacao::setorAluno($pessoa['codpes'], config('web-ldap-admin.replicado_unidade'))['nomabvset']; - } catch (\Exception $e) { - $nomabvset = 'Sem departamento'; - } + if ($pessoa['nomabvset']) { + // o setor é o vínculo estendido + setor (sem o código da unidade) + $setor = $pessoa['tipvinext'] . ' ' . explode('-', $pessoa['nomabvset'])[0]; } else { - $curso = Graduacao::curso($pessoa['codpes'], config('web-ldap-admin.replicado_unidade')); - $codcur = $curso['codcur']; - $codhab = $curso['codhab']; - foreach (config('web-ldap-admin.grCursoSetor') as $grCursoSetor) { - if ($grCursoSetor['codcur'] == $codcur && $grCursoSetor['codhab'] == $codhab) { - $nomabvset = $grCursoSetor['nomabvset']; + $setor = $pessoa['tipvinext']; + if ($pessoa['tipvinext'] == 'Aluno de Graduação') { + if (empty(config('web-ldap-admin.grCursoSetor'))) { + try { + $nomabvset = Graduacao::obterSetorAluno($pessoa['codpes'], config('web-ldap-admin.replicado_unidade'))['nomabvset']; + } catch (\Exception $e) { + $nomabvset = 'Sem departamento'; + } + } else { + $curso = Graduacao::obterCursoAtivo($pessoa['codpes']); + $codcur = $curso['codcur']; + $codhab = $curso['codhab']; + foreach (config('web-ldap-admin.grCursoSetor') as $grCursoSetor) { + if ($grCursoSetor['codcur'] == $codcur && $grCursoSetor['codhab'] == $codhab) { + $nomabvset = $grCursoSetor['nomabvset']; + } + } + } + $setor = (isset($nomabvset)) ? trim($pessoa['tipvinext'] . ' ' . $nomabvset) : $pessoa['tipvinext']; } - } + // aqui poderia tratar os outros casos de Pós Graduação, Posdoc, etc + } + $attr['setor'] = $setor; + + $attr['nome'] = $pessoa['nompesttd'] ?? $pessoa['nompes']; + $attr['email'] = $pessoa['codema']; + + $attr['descricao'] = 'Sincronizado com o replicado'; + + if ($pessoa['tipvinext'] != 'Externo') { + if (config('web-ldap-admin.tipoNomesGrupos') == 'extenso') { + $vinculosSetores = LdapPessoa::listarVinculosSetores($pessoa['codpes'], config('web-ldap-admin.replicado_unidade')); + foreach ($vinculosSetores as $key => $value) { + if ($value == 'Aluno de Graduação' && isset($nomabvset)) { + $vinculosSetores[1] = 'Aluno de Graduação ' . $nomabvset; + } + } + $grupos = ($pessoa['tipvinext'] != 'Externo') ? $vinculosSetores : [$pessoa['tipvinext']]; + } + if (config('web-ldap-admin.tipoNomesGrupos') == 'siglas') { + $setores = Pessoa::obterSiglasSetoresAtivos($pessoa['codpes']); + $vinculos = Pessoa::obterSiglasVinculosAtivos($pessoa['codpes']); + // caso não haja vinculos ou setores, vamos deixar como array + if (is_null($setores)) $setores = []; + if (is_null($vinculos)) $vinculos = []; + $grupos = array_merge($setores, $vinculos); + } + } else { + $grupos = [$pessoa['tipvinext']]; } - $setor = (isset($nomabvset)) ? trim($pessoa['tipvinext'] . ' ' . $nomabvset) : $pessoa['tipvinext']; - } - // aqui poderia tratar os outros casos de Pós Graduação, Posdoc, etc - } - $attr['setor'] = $setor; - $attr['nome'] = $pessoa['nompesttd'] ?? $pessoa['nompes']; - $attr['email'] = $pessoa['codema']; + // Se a sincronização dos grupos com o replicado for desativada, vamos mandar esse array vazio + if (config('web-ldap-admin.syncGroupsWithReplicado') == 'no') { + $grupos = []; + } - $attr['descricao'] = 'Sincronizado com o replicado'; + $grupos = array_unique($grupos); + sort($grupos); - if ($pessoa['tipvinext'] != 'Externo') { - if (config('web-ldap-admin.tipoNomesGrupos') == 'extenso') { - $vinculosSetores = Pessoa::vinculosSetores($pessoa['codpes'], config('web-ldap-admin.replicado_unidade')); - foreach ($vinculosSetores as $key => $value) { - if ($value == 'Aluno de Graduação' && isset($nomabvset)) { - $vinculosSetores[1] = 'Aluno de Graduação ' . $nomabvset; - } - } - $grupos = ($pessoa['tipvinext'] != 'Externo') ? $vinculosSetores : [$pessoa['tipvinext']]; - } - if (config('web-ldap-admin.tipoNomesGrupos') == 'siglas') { - $setores = Pessoa::obterSiglasSetoresAtivos($pessoa['codpes']); - $vinculos = Pessoa::obterSiglasVinculosAtivos($pessoa['codpes']); - // caso não haja vinculos ou setores, vamos deixar como array - if (is_null($setores)) $setores = []; - if (is_null($vinculos)) $vinculos = []; - $grupos = array_merge($setores, $vinculos); - } - } else { - $grupos = [$pessoa['tipvinext']]; + // só grava o usuário no servidor LDAP se ele pertencer a vínculos autorizados para tal + // (tanto no login do usuário quanto na sincronização com o replicado) + //if ((array_filter(config('web-ldap-admin.vinculos_autorizados')) === []) || // quando a variável não foi configurada, permitimos todos os usuários (como sempre havia sido) + // !empty(array_intersect($grupos, config('web-ldap-admin.vinculos_autorizados')))) // só permite se o usuário for de um dos vínculos autorizados + return self::createOrUpdate($username, $attr, $grupos, $password); } - // Se a sincronização dos grupos com o replicado for desativada, vamos mandar esse array vazio - if (config('web-ldap-admin.syncGroupsWithReplicado') == 'no') { - $grupos = []; + /** + * Verifica se a conta está expirada (Retorna true/false) + */ + public static function getIsExpired($user) + { + // invocado por: + // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.partials.expiry) + + $expira = ldapToCarbon($user, 'accountexpires'); + return $expira ? $expira->isPast() : false; } - $grupos = array_unique($grupos); - sort($grupos); - - // só grava o usuário no servidor LDAP se ele pertencer a vínculos autorizados para tal - // (tanto no login do usuário quanto na sincronização com o replicado) - //if ((array_filter(config('web-ldap-admin.vinculos_autorizados')) === []) || // quando a variável não foi configurada, permitimos todos os usuários (como sempre havia sido) - // !empty(array_intersect($grupos, config('web-ldap-admin.vinculos_autorizados')))) // só permite se o usuário for de um dos vínculos autorizados - return self::createOrUpdate($username, $attr, $grupos, $password); - } - - /** - * Verifica se a conta está expirada (Retorna true/false) - */ - public static function getIsExpired($user) - { - // invocado por: - // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.partials.expiry) - - $expira = ldapToCarbon($user, 'accountexpires'); - return $expira ? $expira->isPast() : false; - } - - /** - * Retorna a data de expiração como objeto Carbon ou null - */ - public static function getExpirationDate($user) - { - // invocado por: - // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.partials.expiry) - - return ldapToCarbon($user, 'accountexpires'); - } - - /** - * Retorna um array com os nomes (CN) dos grupos do usuário - */ - public static function getGroupNames($user) - { - // invocado por: - // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.index) - - return $user->groups()->get()->pluck('cn')->flatten()->toArray(); - } + /** + * Retorna a data de expiração como objeto Carbon ou null + */ + public static function getExpirationDate($user) + { + // invocado por: + // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.partials.expiry) + + return ldapToCarbon($user, 'accountexpires'); + } + + /** + * Retorna um array com os nomes (CN) dos grupos do usuário + */ + public static function getGroupNames($user) + { + // invocado por: + // menu "Usuários Ldap" (LdapUserController::index -> ldapusers.index) + + return $user->groups()->get()->pluck('cn')->flatten()->toArray(); + } } diff --git a/app/Policies/LdapUserPolicy.php b/app/Policies/LdapUserPolicy.php index a302d6e..ad82b14 100644 --- a/app/Policies/LdapUserPolicy.php +++ b/app/Policies/LdapUserPolicy.php @@ -11,85 +11,85 @@ class LdapUserPolicy { - use HandlesAuthorization; + use HandlesAuthorization; - public $is_superAdmin; + public $is_superAdmin; - public function __construct() - { - $this->is_superAdmin = Gate::allows('admin'); - } + public function __construct() + { + $this->is_superAdmin = Gate::allows('admin'); + } - /** - * Determine whether the user can view the ldap user. - * - * @param \App\User $user - * @param \App\LdapUser $ldapUser - * @return mixed - */ - public function view(User $user, $id) - { - $owner = $user->username_senhaunica === $id; - return $owner || $this->is_superAdmin; - } + /** + * Determine whether the user can view the ldap user. + * + * @param \App\User $user + * @param \App\LdapUser $ldapUser + * @return mixed + */ + public function view(User $user, $id) + { + $owner = $user->username_senhaunica === $id; + return $owner || $this->is_superAdmin; + } - /** - * Determine whether the user can create ldap users. - * - * @param \App\User $user - * @return mixed - */ - public function create(User $user) - { - // - } + /** + * Determine whether the user can create ldap users. + * + * @param \App\User $user + * @return mixed + */ + public function create(User $user) + { + // + } - /** - * Determine whether the user can update the ldap user. - * - * @param \App\User $user - * @param \App\LdapUser $ldapUser - * @return mixed - */ - public function update(User $user, $id) - { - $owner = $user->username_senhaunica === $id; - return $owner || $this->is_superAdmin; - } + /** + * Determine whether the user can update the ldap user. + * + * @param \App\User $user + * @param \App\LdapUser $ldapUser + * @return mixed + */ + public function update(User $user, $id) + { + $owner = $user->username_senhaunica === $id; + return $owner || $this->is_superAdmin; + } - /** - * Determine whether the user can delete the ldap user. - * - * @param \App\User $user - * @param \App\LdapUser $ldapUser - * @return mixed - */ - public function delete(User $user) - { - // - } + /** + * Determine whether the user can delete the ldap user. + * + * @param \App\User $user + * @param \App\LdapUser $ldapUser + * @return mixed + */ + public function delete(User $user) + { + // + } - /** - * Determine whether the user can restore the ldap user. - * - * @param \App\User $user - * @param \App\LdapUser $ldapUser - * @return mixed - */ - public function restore(User $user) - { - // - } + /** + * Determine whether the user can restore the ldap user. + * + * @param \App\User $user + * @param \App\LdapUser $ldapUser + * @return mixed + */ + public function restore(User $user) + { + // + } - /** - * Determine whether the user can permanently delete the ldap user. - * - * @param \App\User $user - * @param \App\LdapUser $ldapUser - * @return mixed - */ - public function forceDelete(User $user) - { - // - } + /** + * Determine whether the user can permanently delete the ldap user. + * + * @param \App\User $user + * @param \App\LdapUser $ldapUser + * @return mixed + */ + public function forceDelete(User $user) + { + // + } } diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index 04a89d0..05099a0 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -8,56 +8,56 @@ class ViewServiceProvider extends ServiceProvider { - /** - * Register any application services. - * - * @return void - */ - public function register() - { - // - } + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } - /** - * Bootstrap any application services. - * - * @return void - */ - public function boot() - { - // Using class based composers... - View::composer('profile', ProfileComposer::class); + /** + * Bootstrap any application services. + * + * @return void + */ + public function boot() + { + // Using class based composers... + View::composer('profile', ProfileComposer::class); - // Using closure based composers... - View::composer('*', function ($view) { - // Menu dinâmico solicita conta admin - $menuContaAdmin = [ - 'text' => 'Solicitação de Conta de Administrador', - 'url' => 'solicita', - 'can' => 'ninguem', - ]; + // Using closure based composers... + View::composer('*', function ($view) { + // Menu dinâmico solicita conta admin + $menuContaAdmin = [ + 'text' => 'Solicitação de Conta de Administrador', + 'url' => 'solicita', + 'can' => 'ninguem', + ]; - if (config('web-ldap-admin.solicitaContaAdmin') == 1) { - $menuContaAdmin['can'] = 'user'; - \UspTheme::addMenu('solicitaContaAdmin', $menuContaAdmin); - } elseif (config('web-ldap-admin.solicitaContaAdmin') == 2) { - $menuContaAdmin['can'] = 'servidor'; - \UspTheme::addMenu('solicitaContaAdmin', $menuContaAdmin); - } + if (config('web-ldap-admin.solicitaContaAdmin') == 1) { + $menuContaAdmin['can'] = 'user'; + \UspTheme::addMenu('solicitaContaAdmin', $menuContaAdmin); + } elseif (config('web-ldap-admin.solicitaContaAdmin') == 2) { + $menuContaAdmin['can'] = 'servidor'; + \UspTheme::addMenu('solicitaContaAdmin', $menuContaAdmin); + } - // menu dinâmico badge indicando syncronização de login ativa - if (config('web-ldap-admin.sincLdapLogin') == 1) { - $text = 'on '; - $title = 'Sincronização automática ativada'; - } else { - $text = ' off '; - $title = 'Sincronização automática desativada'; - } - \UspTheme::addMenu('web-ldap-admin', [ - 'text' => $text, - 'title' => $title, - 'can' => 'manager', - ]); - }); - } + // menu dinâmico badge indicando syncronização de login ativa + if (config('web-ldap-admin.sincLdapLogin') == 1) { + $text = 'on '; + $title = 'Sincronização automática ativada'; + } else { + $text = ' off '; + $title = 'Sincronização automática desativada'; + } + \UspTheme::addMenu('web-ldap-admin', [ + 'text' => $text, + 'title' => $title, + 'can' => 'manager', + ]); + }); + } } diff --git a/app/Replicado/Pessoa.php b/app/Replicado/Pessoa.php index 6ff08eb..2d07e30 100644 --- a/app/Replicado/Pessoa.php +++ b/app/Replicado/Pessoa.php @@ -4,6 +4,7 @@ use Uspdev\Replicado\DB; use Uspdev\Replicado\Pessoa as ReplicadoPessoa; +use Uspdev\Replicado\Graduacao as Graduacao; class Pessoa extends ReplicadoPessoa { @@ -51,7 +52,7 @@ public static function listarVinculosSetores(int $codpes, $codundclg = null) # c AND codundclg IN ({$codundclg})"; $param['codpes'] = $codpes; $result = DB::fetchAll($query, $param); - dd($result); + //dd($result); // Inicializa o array de vínculos e setores $vinculosSetores = array(); foreach ($result as $row) { @@ -62,7 +63,7 @@ public static function listarVinculosSetores(int $codpes, $codundclg = null) # c // Adiciona o departamento quando também for Aluno de Graduação if (trim($row['tipvinext']) == 'Aluno de Graduação') { // Considerando o primeiro código de unidade - $setorGraduacao = Graduacao::setorAluno($row['codpes'], $arrCodUnidades[0])['nomabvset']; + $setorGraduacao = Graduacao::obterSetorAluno($row['codpes'], $arrCodUnidades[0])['nomabvset']; array_push($vinculosSetores, $row['tipvinext'] . ' ' . $setorGraduacao); } } @@ -81,6 +82,4 @@ public static function listarVinculosSetores(int $codpes, $codundclg = null) # c sort($vinculosSetores); return $vinculosSetores; } - - } diff --git a/app/helpers.php b/app/helpers.php index 0dc6488..1e17da5 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -4,29 +4,29 @@ use LdapRecord\Models\Model; if (!function_exists('ldapToCarbon')) { - /** - * Converte um atributo do LDAP em Carbon, aceitando int, string ou objetos - */ - function ldapToCarbon($user, string $attribute) - { - if (!$user instanceof Model) - return null; + /** + * Converte um atributo do LDAP em Carbon, aceitando int, string ou objetos + */ + function ldapToCarbon($user, string $attribute) + { + if (!$user instanceof Model) + return null; - $raw = $user->getFirstAttribute($attribute); + $raw = $user->getFirstAttribute($attribute); - // se já for um objeto de data (Carbon ou DateTime), retorna direto! - if ($raw instanceof DateTimeInterface) - return Carbon::instance($raw); + // se já for um objeto de data (Carbon ou DateTime), retorna direto! + if ($raw instanceof DateTimeInterface) + return Carbon::instance($raw); - // checagem dos valores "eternos" do Active Directory - if (empty($raw) || $raw == 0 || $raw == '9223372036854775807') - return null; + // checagem dos valores "eternos" do Active Directory + if (empty($raw) || $raw == 0 || $raw == '9223372036854775807') + return null; - try { - // o asDateTime() faz a mágica de converter int para objeto - return Carbon::instance($user->asDateTime($raw)); - } catch (\Exception $e) { - return null; + try { + // o asDateTime() faz a mágica de converter int para objeto + return Carbon::instance($user->asDateTime($raw)); + } catch (\Exception $e) { + return null; + } } - } } diff --git a/composer.lock b/composer.lock index ebbdb0b..acdcb30 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4656a4ea565a3115b5d9fad89e8a463d", + "content-hash": "0e61b759215c063812a4bc7c073996f6", "packages": [ { "name": "brick/math", @@ -1482,16 +1482,16 @@ }, { "name": "laravel/framework", - "version": "v12.61.1", + "version": "v12.51.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "e8472ca9774452fe50841d9bdced060679f4d58d" + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/e8472ca9774452fe50841d9bdced060679f4d58d", - "reference": "e8472ca9774452fe50841d9bdced060679f4d58d", + "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16", + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16", "shasum": "" }, "require": { @@ -1700,7 +1700,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-06-04T14:22:52+00:00" + "time": "2026-02-10T18:20:19+00:00" }, { "name": "laravel/helpers", @@ -1761,16 +1761,16 @@ }, { "name": "laravel/prompts", - "version": "v0.3.18", + "version": "v0.3.13", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72" + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/a19af51bb144bf87f08397921fa619f85c7d4e72", - "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72", + "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", "shasum": "" }, "require": { @@ -1814,22 +1814,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.18" + "source": "https://github.com/laravel/prompts/tree/v0.3.13" }, - "time": "2026-05-19T00:47:18+00:00" + "time": "2026-02-06T12:17:10+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.13", + "version": "v2.0.9", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e", + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e", "shasum": "" }, "require": { @@ -1877,7 +1877,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-04-16T14:03:50+00:00" + "time": "2026-02-03T06:55:34+00:00" }, { "name": "laravel/socialite", @@ -2925,16 +2925,16 @@ }, { "name": "nette/schema", - "version": "v1.3.5", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7", + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7", "shasum": "" }, "require": { @@ -2942,10 +2942,8 @@ "php": "8.1 - 8.5" }, "require-dev": { - "nette/phpstan-rules": "^1.0", "nette/tester": "^2.6", - "phpstan/extension-installer": "^1.4@stable", - "phpstan/phpstan": "^2.1.39@stable", + "phpstan/phpstan": "^2.0@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -2986,22 +2984,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.5" + "source": "https://github.com/nette/schema/tree/v1.3.4" }, - "time": "2026-02-23T03:47:12+00:00" + "time": "2026-02-08T02:54:00+00:00" }, { "name": "nette/utils", - "version": "v4.1.4", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7", - "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -3077,9 +3075,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.4" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2026-05-11T20:49:54+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -3993,16 +3991,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.23", + "version": "v0.12.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4" + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4", - "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373", + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373", "shasum": "" }, "require": { @@ -4066,9 +4064,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.23" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.20" }, - "time": "2026-05-23T13:41:31+00:00" + "time": "2026-02-11T15:05:28+00:00" }, { "name": "ralouphie/getallheaders", @@ -4457,16 +4455,16 @@ }, { "name": "spatie/laravel-permission", - "version": "7.4.2", + "version": "6.24.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b" + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/15a9daf02ba02d3ae77aaa6da582708231ef999b", - "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/eefc9d17eba80d023d6bff313f882cb2bcd691a3", + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3", "shasum": "" }, "require": { @@ -4532,7 +4530,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/7.4.2" + "source": "https://github.com/spatie/laravel-permission/tree/6.24.1" }, "funding": [ { @@ -4540,7 +4538,7 @@ "type": "github" } ], - "time": "2026-05-30T19:21:26+00:00" + "time": "2026-02-09T21:10:03+00:00" }, { "name": "symfony/clock", @@ -7886,16 +7884,16 @@ }, { "name": "laravel/sail", - "version": "v1.62.0", + "version": "v1.53.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e" + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e", - "reference": "3aaeefc979f8ba6586fbc5b6e0b1b3638058f98e", + "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb", "shasum": "" }, "require": { @@ -7945,7 +7943,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-05-27T04:02:01+00:00" + "time": "2026-02-06T12:16:02+00:00" }, { "name": "lucascudo/laravel-pt-br-localization", @@ -8431,16 +8429,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.7", + "version": "12.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "186dab580576598076de6818596d12b61801880e" + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/186dab580576598076de6818596d12b61801880e", - "reference": "186dab580576598076de6818596d12b61801880e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", "shasum": "" }, "require": { @@ -8495,7 +8493,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" }, "funding": [ { @@ -8515,7 +8513,7 @@ "type": "tidelift" } ], - "time": "2026-06-01T13:24:19+00:00" + "time": "2026-02-06T06:01:44+00:00" }, { "name": "phpunit/php-file-iterator", @@ -8776,16 +8774,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.29", + "version": "12.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9aa66a47db3ea70f1a468e66dd969f67e594945a" + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9aa66a47db3ea70f1a468e66dd969f67e594945a", - "reference": "9aa66a47db3ea70f1a468e66dd969f67e594945a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", "shasum": "" }, "require": { @@ -8799,7 +8797,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.7", + "phpunit/php-code-coverage": "^12.5.3", "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", @@ -8812,7 +8810,7 @@ "sebastian/global-state": "^8.0.3", "sebastian/object-enumerator": "^7.0.0", "sebastian/recursion-context": "^7.0.1", - "sebastian/type": "^6.0.4", + "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, @@ -8854,7 +8852,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.11" }, "funding": [ { @@ -8862,7 +8860,7 @@ "type": "other" } ], - "time": "2026-06-04T06:14:42+00:00" + "time": "2026-02-10T12:32:02+00:00" }, { "name": "sebastian/cli-parser", diff --git a/config/laravel-usp-theme.php b/config/laravel-usp-theme.php index 2d3d6c6..19b31c1 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -1,59 +1,59 @@ 'Minha Conta (trocar senha da rede)', - 'url' => 'ldapusers/my', - 'can' => 'user', - ], - [ - 'key' => 'solicitaContaAdmin', # menu dinâmico solicita conta admin - ], - [ - 'text' => 'Usuários Ldap', - 'url' => 'ldapusers', - 'can' => 'manager', - ], - [ - 'text' => 'Criar usuário', - 'url' => 'ldapusers/create', - 'can' => 'manager', - ] + [ + 'text' => 'Minha Conta (trocar senha da rede)', + 'url' => 'ldapusers/my', + 'can' => 'user', + ], + [ + 'key' => 'solicitaContaAdmin', # menu dinâmico solicita conta admin + ], + [ + 'text' => 'Usuários Ldap', + 'url' => 'ldapusers', + 'can' => 'manager', + ], + [ + 'text' => 'Criar usuário', + 'url' => 'ldapusers/create', + 'can' => 'manager', + ] ]; $right_menu = [ - [ - 'key' => 'web-ldap-admin', - ], - [ - 'key' => 'senhaunica-socialite', - ], - [ - 'text' => ' Sincronizar ' . env('LDAP_OU_DEFAULT'), - 'title' => 'Configurações', - 'url' => 'configs', - 'align' => 'right', - 'can' => 'admin', - ], + [ + 'key' => 'web-ldap-admin', + ], + [ + 'key' => 'senhaunica-socialite', + ], + [ + 'text' => ' Sincronizar ' . env('LDAP_OU_DEFAULT'), + 'title' => 'Configurações', + 'url' => 'configs', + 'align' => 'right', + 'can' => 'admin', + ], ]; return [ - 'title' => config('app.name'), + 'title' => config('app.name'), - # USP_THEME_SKIN deve ser colocado no .env da aplicação - 'skin' => env('USP_THEME_SKIN', 'uspdev'), + # USP_THEME_SKIN deve ser colocado no .env da aplicação + 'skin' => env('USP_THEME_SKIN', 'uspdev'), - # chave da sessão. Troque em caso de colisão com outra variável de sessão. - 'session_key' => 'laravel-usp-theme', + # chave da sessão. Troque em caso de colisão com outra variável de sessão. + 'session_key' => 'laravel-usp-theme', - # usado na tag base, permite usar caminhos relativos nos menus e demais elementos html - # na versão 1 era dashboard_url - 'app_url' => config('app.url'), + # usado na tag base, permite usar caminhos relativos nos menus e demais elementos html + # na versão 1 era dashboard_url + 'app_url' => config('app.url'), - # login e logout - 'logout_method' => 'POST', - 'logout_url' => 'logout', - 'login_url' => 'login', - 'menu' => $menu, - 'right_menu' => $right_menu, + # login e logout + 'logout_method' => 'POST', + 'logout_url' => 'logout', + 'login_url' => 'login', + 'menu' => $menu, + 'right_menu' => $right_menu, ];