<?php
namespace App\Security;
use App\Entity\Configuracao;
use App\Repository\ConfiguracaoRepository;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class FeaturesVoter extends Voter
{
public const PROJETO_PESQUISA = 'FEATURE_PROJETO_PESQUISA';
public const SECRETARIA_PROJETO_PESQUISA = 'FEATURE_SECRETARIA_PROJETO_PESQUISA';
public const ALUNO_PROJETO_PESQUISA = 'FEATURE_ALUNO_PROJETO_PESQUISA';
public const PROFESSOR_PROJETO_PESQUISA = 'FEATURE_PROFESSOR_PROJETO_PESQUISA';
public const POSDOC_PROJETO_PESQUISA = 'FEATURE_POSDOC_PROJETO_PESQUISA';
public const POS_DOC = 'FEATURE_POS_DOC';
public const LINHAS_POS_DOC = 'LINHAS_POS_DOC';
public const SECRETARIA_POS_DOC = 'FEATURE_SECRETARIA_POS_DOC';
public const PROFESSOR_POS_DOC = 'FEATURE_PROFESSOR_POS_DOC';
public const POSDOC_POS_DOC = 'FEATURE_POSDOC_POS_DOC';
public const ACC_PAP = 'FEATURE_ACC_PAP';
public const SECRETARIA_ACC_PAP = 'FEATURE_SECRETARIA_ACC_PAP';
public const ALUNO_ACC_PAP = 'FEATURE_ALUNO_ACC_PAP';
public const USER_ACC_PAP = 'FEATURE_USER_ACC_PAP';
public const PROFICIENCIA = 'FEATURE_PROFICIENCIA';
public const SECRETARIA_PROFICIENCIA = 'FEATURE_SECRETARIA_PROFICIENCIA';
public const ALUNO_PROFICIENCIA = 'FEATURE_ALUNO_PROFICIENCIA';
public const USER_PROFICIENCIA = 'FEATURE_USER_PROFICIENCIA';
public const DEFESAS = 'FEATURE_DEFESAS';
public const SECRETARIA_DEFESAS = 'FEATURE_SECRETARIA_DEFESAS';
public const DOUTORADO = 'FEATURE_DOUTORADO';
public const RESERVAS = 'FEATURE_RESERVAS';
public const SECRETARIA_RESERVAS = 'FEATURE_SECRETARIA_RESERVAS';
public const BOLSAS = 'FEATURE_BOLSAS';
public const SECRETARIA_BOLSAS = 'FEATURE_SECRETARIA_BOLSAS';
public const FINANCEIRO = 'FEATURE_FINANCEIRO';
public const SECRETARIA_FINANCEIRO = 'FEATURE_SECRETARIA_FINANCEIRO';
public const PROFESSOR_PNPD = 'FEATURE_PROF_PNPD';
public const PROFESSOR_SEM_VAGA = 'FEATURE_PROF_SEM_VAGA';
public const PROFESSOR_VISITANTE = 'FEATURE_PROF_VISITANTE';
public const PROFESSOR_EDITOR = 'FEATURE_PROF_EDITOR';
public const SECRETARIA_PROFESSOR_PNPD = 'FEATURE_SECRETARIA_PROF_PNPD';
public const SECRETARIA_PROFESSOR_SEM_VAGA = 'FEATURE_SECRETARIA_PROF_SEM_VAGA';
public const SECRETARIA_PROFESSOR_VISITANTE = 'FEATURE_SECRETARIA_PROF_VISITANTE';
public const SECRETARIA_PROFESSOR_EDITOR = 'FEATURE_SECRETARIA_PROF_EDITOR';
private ?Configuracao $funcionalidades;
public function __construct(ConfiguracaoRepository $configuracaoRepository)
{
$this->funcionalidades = $configuracaoRepository->getConfiguracao('funcionalidades');
}
protected function supports(string $attribute, $subject): bool
{
return strpos($attribute, 'FEATURE_') === 0 || strpos($attribute, 'LINHAS_POS_DOC') === 0;
}
protected function featureAllowed(string $feature): bool
{
if (!$this->funcionalidades) {
return true;
}
if (!$this->funcionalidades->hasProperty($feature)) {
return true;
}
if ($this->funcionalidades->getProperty($feature)) {
return true;
}
return false;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
$role = null;
if ($attribute === self::LINHAS_POS_DOC) {
$user = $token->getUser();
return $this->featureAllowed('pos_doc') && (
in_array('ROLE_ADMIN', $user->getRoles())
|| in_array('ROLE_SECRETARIA', $user->getRoles())
|| in_array('ROLE_PROFESSOR', $user->getRoles())
);
}
elseif (preg_match('/^FEATURE_(ADMIN|SECRETARIA|PROFESSOR|POSDOC|ALUNO|USER)_([_A-Z]+)$/', $attribute, $match)) {
$role = 'ROLE_'.$match[1];
$feature = strtolower($match[2]);
}
else {
$feature = strtolower(str_replace('FEATURE_', '', $attribute));
}
if (!$this->featureAllowed($feature)) {
return false;
}
if (empty($role)) {
return true;
}
$user = $token->getUser();
return in_array('ROLE_ADMIN', $user->getRoles()) || in_array($role, $user->getRoles());
}
}