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 4f57240..4a78b08 100644 --- a/app/Http/Controllers/LdapUserController.php +++ b/app/Http/Controllers/LdapUserController.php @@ -18,395 +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"; + } + } + + $grupos = LdapGroup::listaGrupos(); + + return view('ldapusers.index', compact('ldapusers', 'grupos', 'request', 'nav', 'gruposUrl', 'searchGrupos', 'perPage')); } - // 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"; - } + /** + * 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'); } - $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!'); + /** + * 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); + } + + // 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')); - } - - // 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); } - // 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'); - } + /** + * 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 SELF::showCommon($user); + } - public function my(Request $request) - { - // menu "Minha Conta (trocar senha da rede)" + public function my(Request $request) + { + // menu "Minha Conta (trocar senha da rede)" - $this->authorize('user'); - \UspTheme::activeUrl('ldapusers/my'); + $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'); + $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); } - 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 = ''; + + /** + * 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 = ''; + } + + return view('ldapusers.show', compact('attr', 'user', 'vinculos', 'codpesValido', 'foto')); } - 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'], - ]); - - 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.' - ); - } - - return redirect()->back(); + /** + * 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.' + ); + } + + 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])], + ]); + + LdapUser::expirarSenha($username, $request->expiry); + $request->session()->flash('alert-success', "Usuário $username: alterado expiração da senha!"); + return redirect()->back(); + } } - $this->authorize('manager'); - // atualiza status - if (!is_null($request->status)) { + /** + * 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" - if ($request->status == 'disable') { - LdapUser::disable($username); - $request->session()->flash('alert-success', "Usuário $username desabilitado!"); - return redirect()->back(); - } + $this->authorize('manager'); - if ($request->status == 'enable') { - LdapUser::enable($username); - $request->session()->flash('alert-success', "Usuário $username habilitado!"); + $attr = LdapUser::delete($username); + + $request->session()->flash('alert-danger', 'Usuário(a) ' . $username . ' deletado'); return redirect()->back(); - } } - // atualiza data de expiração - if (!is_null($request->expiry)) { - $request->validate([ - 'expiry' => ['required', Rule::in([7, 30, 365, 0, -1])], - ]); + public function syncReplicadoForm(Request $request) + { + // menu "Sincronizar ..." -> botão "Sincronizar com replicado" + + $this->authorize('manager'); + \UspTheme::activeUrl('configs'); + + $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' : ''; + } - LdapUser::expirarSenha($username, $request->expiry); - $request->session()->flash('alert-success', "Usuário $username: alterado expiração da senha!"); - return redirect()->back(); + return view('ldapusers.sync', compact('vinculos')); } - } - - /** - * 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'); - - $attr = LdapUser::delete($username); - - $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" - - $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' : ''; + + 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'); } - 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); + 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"); } - $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 272da1e..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'] = implode(', ', $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 2a1781a..e29366f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "38f24a8cfe2fc3576bbf892413c102e5", + "content-hash": "0e61b759215c063812a4bc7c073996f6", "packages": [ { "name": "brick/math", - "version": "0.14.2", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "55c950aa71a2cabc1d8f2bec1f8a7020bd244aa2" + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/55c950aa71a2cabc1d8f2bec1f8a7020bd244aa2", - "reference": "55c950aa71a2cabc1d8f2bec1f8a7020bd244aa2", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, "require": { @@ -56,7 +56,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.14.2" + "source": "https://github.com/brick/math/tree/0.14.8" }, "funding": [ { @@ -64,7 +64,7 @@ "type": "github" } ], - "time": "2026-01-30T14:03:11+00:00" + "time": "2026-02-10T14:33:43+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -373,9 +373,6 @@ "psr/cache": "^1|^2|^3", "psr/log": "^1|^2|^3" }, - "conflict": { - "doctrine/cache": "< 1.11" - }, "require-dev": { "doctrine/coding-standard": "14.0.0", "fig/log-test": "^1", @@ -464,29 +461,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" + "phpunit/phpunit": "<=7.5 || >=14" }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -506,9 +503,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" }, - "time": "2025-04-07T20:06:18+00:00" + "time": "2026-02-07T07:09:04+00:00" }, { "name": "doctrine/inflector", @@ -1478,16 +1475,16 @@ }, { "name": "laravel/framework", - "version": "v12.49.0", + "version": "v12.51.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5" + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/4bde4530545111d8bdd1de6f545fa8824039fcb5", - "reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5", + "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16", + "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16", "shasum": "" }, "require": { @@ -1696,7 +1693,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-01-28T03:40:49+00:00" + "time": "2026-02-10T18:20:19+00:00" }, { "name": "laravel/helpers", @@ -1757,30 +1754,30 @@ }, { "name": "laravel/prompts", - "version": "v0.3.11", + "version": "v0.3.13", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217" + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/dd2a2ed95acacbcccd32fd98dee4c946ae7a7217", - "reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217", + "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", + "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", "shasum": "" }, "require": { "composer-runtime-api": "^2.2", "ext-mbstring": "*", "php": "^8.1", - "symfony/console": "^6.2|^7.0" + "symfony/console": "^6.2|^7.0|^8.0" }, "conflict": { "illuminate/console": ">=10.17.0 <10.25.0", "laravel/framework": ">=10.17.0 <10.25.0" }, "require-dev": { - "illuminate/collections": "^10.0|^11.0|^12.0", + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.5", "pestphp/pest": "^2.3|^3.4|^4.0", "phpstan/phpstan": "^1.12.28", @@ -1810,33 +1807,33 @@ "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.11" + "source": "https://github.com/laravel/prompts/tree/v0.3.13" }, - "time": "2026-01-27T02:55:06+00:00" + "time": "2026-02-06T12:17:10+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.8", + "version": "v2.0.9", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b" + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/7581a4407012f5f53365e11bafc520fd7f36bc9b", - "reference": "7581a4407012f5f53365e11bafc520fd7f36bc9b", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e", + "reference": "8f631589ab07b7b52fead814965f5a800459cb3e", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", "nesbot/carbon": "^2.67|^3.0", "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", "extra": { @@ -1873,7 +1870,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-01-08T16:22:46+00:00" + "time": "2026-02-03T06:55:34+00:00" }, { "name": "laravel/socialite", @@ -1949,16 +1946,16 @@ }, { "name": "laravel/tinker", - "version": "v2.11.0", + "version": "v2.11.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468" + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/3d34b97c9a1747a81a3fde90482c092bd8b66468", - "reference": "3d34b97c9a1747a81a3fde90482c092bd8b66468", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", "shasum": "" }, "require": { @@ -2009,9 +2006,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.0" + "source": "https://github.com/laravel/tinker/tree/v2.11.1" }, - "time": "2025-12-19T19:16:45+00:00" + "time": "2026-02-06T14:12:35+00:00" }, { "name": "laravel/ui", @@ -2921,16 +2918,16 @@ }, { "name": "nette/schema", - "version": "v1.3.3", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004" + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/2befc2f42d7c715fd9d95efc31b1081e5d765004", - "reference": "2befc2f42d7c715fd9d95efc31b1081e5d765004", + "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7", + "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7", "shasum": "" }, "require": { @@ -2938,8 +2935,8 @@ "php": "8.1 - 8.5" }, "require-dev": { - "nette/tester": "^2.5.2", - "phpstan/phpstan-nette": "^2.0@stable", + "nette/tester": "^2.6", + "phpstan/phpstan": "^2.0@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -2980,22 +2977,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.3" + "source": "https://github.com/nette/schema/tree/v1.3.4" }, - "time": "2025-10-30T22:57:59+00:00" + "time": "2026-02-08T02:54:00+00:00" }, { "name": "nette/utils", - "version": "v4.1.1", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/c99059c0315591f1a0db7ad6002000288ab8dc72", - "reference": "c99059c0315591f1a0db7ad6002000288ab8dc72", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -3007,8 +3004,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -3069,9 +3068,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.1" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2025-12-22T12:14:32+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -3985,16 +3984,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.18", + "version": "v0.12.20", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196" + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ddff0ac01beddc251786fe70367cd8bbdb258196", - "reference": "ddff0ac01beddc251786fe70367cd8bbdb258196", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373", + "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373", "shasum": "" }, "require": { @@ -4058,9 +4057,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.18" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.20" }, - "time": "2025-12-17T14:35:46+00:00" + "time": "2026-02-11T15:05:28+00:00" }, { "name": "ralouphie/getallheaders", @@ -4234,9 +4233,6 @@ "extra": { "captainhook": { "force-install": true - }, - "branch-alias": { - "dev-main": "4.x-dev" } }, "autoload": { @@ -4381,16 +4377,16 @@ }, { "name": "spatie/laravel-permission", - "version": "6.24.0", + "version": "6.24.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7" + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/76adb1fc8d07c16a0721c35c4cc330b7a12598d7", - "reference": "76adb1fc8d07c16a0721c35c4cc330b7a12598d7", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/eefc9d17eba80d023d6bff313f882cb2bcd691a3", + "reference": "eefc9d17eba80d023d6bff313f882cb2bcd691a3", "shasum": "" }, "require": { @@ -4452,7 +4448,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.24.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.24.1" }, "funding": [ { @@ -4460,7 +4456,7 @@ "type": "github" } ], - "time": "2025-12-13T21:45:21+00:00" + "time": "2026-02-09T21:10:03+00:00" }, { "name": "symfony/clock", @@ -5535,10 +5531,6 @@ "url": "https://github.com/nicolas-grekas", "type": "github" }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -7689,28 +7681,28 @@ }, { "name": "laravel/sail", - "version": "v1.52.0", + "version": "v1.53.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3" + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/64ac7d8abb2dbcf2b76e61289451bae79066b0b3", - "reference": "64ac7d8abb2dbcf2b76e61289451bae79066b0b3", + "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb", "shasum": "" }, "require": { - "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0", - "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0", + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0", - "symfony/yaml": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", "phpstan/phpstan": "^2.0" }, "bin": [ @@ -7748,7 +7740,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-01-01T02:46:03+00:00" + "time": "2026-02-06T12:16:02+00:00" }, { "name": "lucascudo/laravel-pt-br-localization", @@ -8171,16 +8163,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.2", + "version": "12.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", "shasum": "" }, "require": { @@ -8236,7 +8228,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.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" }, "funding": [ { @@ -8256,20 +8248,20 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:03:04+00:00" + "time": "2026-02-06T06:01:44+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { @@ -8309,15 +8301,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", @@ -8505,16 +8509,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.8", + "version": "12.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", "shasum": "" }, "require": { @@ -8528,8 +8532,8 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.2", - "phpunit/php-file-iterator": "^6.0.0", + "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", "phpunit/php-timer": "^8.0.0", @@ -8540,6 +8544,7 @@ "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" @@ -8582,7 +8587,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.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.11" }, "funding": [ { @@ -8606,7 +8611,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T06:12:29+00:00" + "time": "2026-02-10T12:32:02+00:00" }, { "name": "sebastian/cli-parser", @@ -10072,8 +10077,8 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2" + "php": "^8.3" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } 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, ];