diff --git a/MdWsSeiRest.php b/MdWsSeiRest.php index 9f62cdc..ee9f9cd 100644 --- a/MdWsSeiRest.php +++ b/MdWsSeiRest.php @@ -285,6 +285,13 @@ public function montarMensagemProcesso(ProcedimentoAPI $objProcedimentoAPI) public function adicionarElementoMenu() { + + $desabilitarQrCodeAplicativo = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'DesabilitarQrCodeAplicativo', false, false); + + if($desabilitarQrCodeAplicativo){ + return ''; + } + try{ $nomeArquivo = 'QRCODE_' . self::NOME_MODULO diff --git a/controlador_ws.php b/controlador_ws.php index 32ca0d6..68acc3d 100644 --- a/controlador_ws.php +++ b/controlador_ws.php @@ -66,6 +66,71 @@ public function __invoke($request, $response, $next) } } +/** + * Classe com regra para verificar se existe permissão para execução dos serviços + */ +class ServicePermissionsMiddleware { + + /** + * Aplica regra + * + * @param \Slim\Http\Request $request + * @param \Slim\Http\Response $response + * @param Closure $next + * @return \Slim\Http\Response + */ + public function __invoke($request, $response, $next) + { + + $servicosHabilitados = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'ServicosHabilitados', false, false); + $servicosDesabilitados = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'ServicosDesabilitados', false, false); + + $servicoHabilitado = true; + $servicoDesabilitado = false; + + if($servicosHabilitados){ + $servicoHabilitado = $this->isRequestInPatternList($request, $servicosHabilitados); + } + + if($servicosDesabilitados){ + $servicoDesabilitado = $this->isRequestInPatternList($request, $servicosDesabilitados); + } + + if(!$servicoHabilitado || $servicoDesabilitado){ + $response = $response->withJson( + array( + "sucesso" => false, + "mensagem" => utf8_encode('Serviço ' . $request->getMethod() . ':' . str_replace('api/v2/', '', $request->getUri()->getPath()) . ' não permitido'), + "exception" => null + ), + 405 + ); + }else{ + $response = $next($request, $response); + } + + return $response; + } + + /** + * verifica se path da requisição passa na espressão regular da lista + * + * @param \Slim\Http\Request $request + * @param array $lista + * @return boolean retorna true se $request->getUri()->getPath() combina com com algum $pattern, false se não der match em nenhum registro + */ + private function isRequestInPatternList($request, $lista){ + $result = false; + foreach ($lista as $pattern) { + $pattern = '/^api\/v2\/' . $pattern . '$/m'; + if(preg_match($pattern, $request->getUri()->getPath())){ + $result = true; + break; + } + } + return $result; + } +} $config = array( 'settings' => array( diff --git a/docs/instalacao.md b/docs/instalacao.md index 6f4bbe9..e6c397f 100644 --- a/docs/instalacao.md +++ b/docs/instalacao.md @@ -47,7 +47,14 @@ 'UrlServicoNotificacao' => '{URL do serviço de notificação}', 'IdApp' => '{ID do app registrado no serviço de notificação}', 'ChaveAutorizacao' => '{Chave de autorização do serviço de notificação}', - 'TokenSecret' => '{chave unica com pelo menos 32 chars. Pode usar o comando uuidgen para gerar}' + 'TokenSecret' => '{chave unica com pelo menos 32 chars. Pode usar o comando uuidgen para gerar}', + + //chaves opcionais + 'DesabilitarQrCodeAplicativo' => '{(bool) se true desabilita a visão do QrCode do aplicativo no menu do SEI. Padrão=false.}', + 'DesabilitarServicoNotificacao' => '{(bool) se true desabilita o serviço de autenticação. Padrão=false}', + 'ServicosHabilitados' => '{(array|bool) lista de expressões regulares para habilitar apenas os serviços que combinem com os padrões listados. Padrão=false. Exemplo "ServicosHabilitados" => ["hipoteseLegal.*"]}', + 'ServicosDesabilitados' => '{(array|bool) lista de expressões regulares para desabilitar apenas os serviços que combinem com os padrões listados. Padrão=false. Exemplo "ServicosDesabilitados" => ["bloco/assinatura.*","versao"]}', + 'Sleep' => '{int} valor padrão para sleeps nas chamadas ', ), (...) diff --git a/rn/MdWsSeiAgendamentoRN.php b/rn/MdWsSeiAgendamentoRN.php index 295bc70..9288fe9 100644 --- a/rn/MdWsSeiAgendamentoRN.php +++ b/rn/MdWsSeiAgendamentoRN.php @@ -13,6 +13,14 @@ protected function inicializarObjInfraIBanco() protected function notificacaoAtividadesControlado() { + + $desabilitarServicoNotificacao = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'DesabilitarServicoNotificacao', false, false); + + if($desabilitarServicoNotificacao){ + LogSEI::getInstance()->gravar('Notificações não realizadas pois "DesabilitarServicoNotificacao = true". ', InfraLog::$INFORMACAO); + return; + } + try { ini_set('max_execution_time', '0'); ini_set('memory_limit', '1024M'); diff --git a/rn/MdWsSeiBlocoRN.php b/rn/MdWsSeiBlocoRN.php index ff8c3f5..ffbf4df 100644 --- a/rn/MdWsSeiBlocoRN.php +++ b/rn/MdWsSeiBlocoRN.php @@ -39,7 +39,7 @@ protected function retornarBlocoControlado(BlocoDTO $blocoDTO){ public function apiAssinarBloco($idBloco, $idOrgao, $strCargoFuncao, $siglaUsuario, $senhaUsuario, $idUsuario) { try{ - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); $objRelBlocoProtocoloDTO = new RelBlocoProtocoloDTO(); $objRelBlocoProtocoloDTO->setNumIdBloco($idBloco); $objRelBlocoProtocoloDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); @@ -80,7 +80,7 @@ public function apiAssinarBloco($idBloco, $idOrgao, $strCargoFuncao, $siglaUsuar public function apiAssinarDocumentos($idOrgao, $strCargoFuncao, $siglaUsuario, $senhaUsuario, $idUsuario, $arrIdDocumentos) { try{ - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); if(!$arrIdDocumentos){ return MdWsSeiRest::formataRetornoSucessoREST('Nenhum documento foi informado para ser assinado.'); } diff --git a/rn/MdWsSeiBloco_V1_RN.php b/rn/MdWsSeiBloco_V1_RN.php index fbdf999..6353ef0 100644 --- a/rn/MdWsSeiBloco_V1_RN.php +++ b/rn/MdWsSeiBloco_V1_RN.php @@ -39,7 +39,7 @@ protected function retornarControlado(BlocoDTO $blocoDTO){ public function apiAssinarBloco($idBloco, $idOrgao, $strCargoFuncao, $siglaUsuario, $senhaUsuario, $idUsuario) { try{ - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); $objRelBlocoProtocoloDTO = new RelBlocoProtocoloDTO(); $objRelBlocoProtocoloDTO->setNumIdBloco($idBloco); $objRelBlocoProtocoloDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); diff --git a/rn/MdWsSeiDocumentoRN.php b/rn/MdWsSeiDocumentoRN.php index 750bd12..449f55d 100644 --- a/rn/MdWsSeiDocumentoRN.php +++ b/rn/MdWsSeiDocumentoRN.php @@ -844,7 +844,7 @@ public function apiAssinarDocumento($idDocumento, $idOrgao, $strCargoFuncao, $si public function assinarDocumentoControlado(AssinaturaDTO $assinaturaDTO) { try { - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); $assinaturaDTO->setStrStaFormaAutenticacao(AssinaturaRN::$TA_SENHA); // $assinaturaDTO->setNumIdContextoUsuario(null); $documentoRN = new DocumentoRN(); diff --git a/rn/MdWsSeiDocumento_V1_RN.php b/rn/MdWsSeiDocumento_V1_RN.php index 3a342c4..98347ac 100644 --- a/rn/MdWsSeiDocumento_V1_RN.php +++ b/rn/MdWsSeiDocumento_V1_RN.php @@ -1236,7 +1236,7 @@ public function apiAssinarDocumento($idDocumento, $idOrgao, $strCargoFuncao, $si */ public function assinarDocumentoControlado(AssinaturaDTO $assinaturaDTO) { try { - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); $assinaturaDTO->setStrStaFormaAutenticacao(AssinaturaRN::$TA_SENHA); // $assinaturaDTO->setNumIdContextoUsuario(null); $documentoRN = new DocumentoRN(); diff --git a/rn/MdWsSeiUsuarioRN.php b/rn/MdWsSeiUsuarioRN.php index 1214c93..02e0d99 100644 --- a/rn/MdWsSeiUsuarioRN.php +++ b/rn/MdWsSeiUsuarioRN.php @@ -191,7 +191,7 @@ public function apiAutenticar(UsuarioDTO $usuarioDTO, OrgaoDTO $orgaoDTO){ ); if(!$ret){ - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); throw new InfraException('Usuário ou senha inválido!'); } diff --git a/scripts/sei_atualizar_versao_modulo_wssei.php b/scripts/sei_atualizar_versao_modulo_wssei.php index 8809e76..09017d0 100644 --- a/scripts/sei_atualizar_versao_modulo_wssei.php +++ b/scripts/sei_atualizar_versao_modulo_wssei.php @@ -85,7 +85,13 @@ public function versao_0_8_12($strVersaoAtual) $infraAgemdanemtoTarefaDTO->setStrPeriodicidadeComplemento('0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23'); } - $infraAgemdanemtoTarefaDTO->setStrSinAtivo('S'); + $desabilitarServicoNotificacao = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'DesabilitarServicoNotificacao', false, false); + if($desabilitarServicoNotificacao){ + $infraAgemdanemtoTarefaDTO->setStrSinAtivo('N'); + }else{ + $infraAgemdanemtoTarefaDTO->setStrSinAtivo('S'); + } + $infraAgemdanemtoTarefaDTO->setStrSinSucesso('S'); $infraAgemdanemtoTarefaBD = new InfraAgendamentoTarefaBD(BancoSEI::getInstance()); @@ -116,9 +122,10 @@ public function versao_1_0_3($strVersaoAtual) public function versao_1_0_4($strVersaoAtual) { $this->logar("VERIFICANDO SE A CHAVE: TokenSecret ESTA PRESENTE NO ARQUIVO DE CONFIGURACOES."); + $desabilitarServicoNotificacao = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'DesabilitarServicoNotificacao', false, false); $token = ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'TokenSecret', false); - if((!$token) || (strlen($token)<25)){ + if(!$desabilitarServicoNotificacao && ((!$token) || (strlen($token)<25))){ $msg = 'Token Secret inexistente ou tamanho menor que o permitido! Verifique o manual de instalacao do módulo. '; $msg = $msg . 'O script de instalacao foi interrompido. Módulo nao instalado corretamente. '; $msg = $msg . 'Ajuste a chave e rode novamente o script.'; diff --git a/testes/PhpUnit/src/paginas/PaginaDocumento.php b/testes/PhpUnit/src/paginas/PaginaDocumento.php index 2797d12..3427650 100644 --- a/testes/PhpUnit/src/paginas/PaginaDocumento.php +++ b/testes/PhpUnit/src/paginas/PaginaDocumento.php @@ -71,7 +71,7 @@ public function adicionarInteressado($arrayNomeInteressado) $input->value($nomeInteressado); $this->test->keys(Keys::ENTER); $this->test->acceptAlert(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); } } } diff --git a/testes/PhpUnit/src/paginas/PaginaEditarProcesso.php b/testes/PhpUnit/src/paginas/PaginaEditarProcesso.php index 079e4de..708ae90 100644 --- a/testes/PhpUnit/src/paginas/PaginaEditarProcesso.php +++ b/testes/PhpUnit/src/paginas/PaginaEditarProcesso.php @@ -76,7 +76,7 @@ public function adicionarInteressado($arrayNomeInteressado) $input->value($nomeInteressado); $this->test->keys(Keys::ENTER); $this->test->acceptAlert(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); } } } diff --git a/testes/PhpUnit/src/paginas/PaginaIncluirDocumento.php b/testes/PhpUnit/src/paginas/PaginaIncluirDocumento.php index 15af226..a4ff680 100644 --- a/testes/PhpUnit/src/paginas/PaginaIncluirDocumento.php +++ b/testes/PhpUnit/src/paginas/PaginaIncluirDocumento.php @@ -22,13 +22,13 @@ public function selecionarTipoDocumento($tipoDocumento) { try{ $this->test->byId('txtFiltro')->value($tipoDocumento); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->test->byLinkText($tipoDocumento)->click(); } catch (Exception $e){ $this->test->byId("imgExibirSeries")->click(); $this->test->byId('txtFiltro')->value($tipoDocumento); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->test->byLinkText($tipoDocumento)->click(); } } @@ -90,7 +90,7 @@ public function adicionarInteressado($nomeInteressado) $this->test->keys(Keys::ENTER); $this->test->acceptAlert(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); } public function salvarDocumento() @@ -124,7 +124,7 @@ public function gerarDocumentoTeste(array $dadosDocumento = null) $this->test->frame(null); $this->test->frame("ifrVisualizacao"); $this->test->byXPath("//img[@alt='Incluir Documento']")->click(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $dadosDocumento = $dadosDocumento ?: array(); $dadosDocumento["TIPO_DOCUMENTO"] = @$dadosDocumento["TIPO_DOCUMENTO"] ?: "Ofício"; @@ -162,7 +162,7 @@ public function gerarDocumentoExternoTeste(array $dadosDocumento) $this->test->frame(null); $this->test->frame("ifrVisualizacao"); $this->test->byXPath("//img[@alt='Incluir Documento']")->click(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $dadosDocumento = $dadosDocumento ?: array(); $dadosDocumento["TIPO_DOCUMENTO"] = @$dadosDocumento["TIPO_DOCUMENTO"] ?: "Ofício"; @@ -175,9 +175,9 @@ public function gerarDocumentoExternoTeste(array $dadosDocumento) $dadosDocumento["HIPOTESE_LEGAL"] = @$dadosDocumento["HIPOTESE_LEGAL"] ?: ""; $this->selecionarTipoDocumentoExterno(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->tipoDocumento($dadosDocumento["TIPO_DOCUMENTO"]); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->dataElaboracao($dadosDocumento["DATA_ELABORACAO"]); $this->formato($dadosDocumento["FORMATO_DOCUMENTO"]); diff --git a/testes/PhpUnit/src/paginas/PaginaIniciarProcesso.php b/testes/PhpUnit/src/paginas/PaginaIniciarProcesso.php index 84a2257..65d1430 100644 --- a/testes/PhpUnit/src/paginas/PaginaIniciarProcesso.php +++ b/testes/PhpUnit/src/paginas/PaginaIniciarProcesso.php @@ -18,13 +18,13 @@ public function selecionarTipoProcesso($tipoProcesso) { try{ $this->test->byId('txtFiltro')->value($tipoProcesso); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->test->byLinkText($tipoProcesso)->click(); } catch (Exception $e){ $this->test->byId("imgExibirTiposProcedimento")->click(); $this->test->byId('txtFiltro')->value($tipoProcesso); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $this->test->byLinkText($tipoProcesso)->click(); } } @@ -96,7 +96,7 @@ public function adicionarInteressado($arrayNomeInteressado) $input->value($nomeInteressado); $this->test->keys(Keys::ENTER); $this->test->acceptAlert(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); } } } diff --git a/testes/PhpUnit/src/paginas/PaginaProcesso.php b/testes/PhpUnit/src/paginas/PaginaProcesso.php index e2fc060..74365f8 100644 --- a/testes/PhpUnit/src/paginas/PaginaProcesso.php +++ b/testes/PhpUnit/src/paginas/PaginaProcesso.php @@ -58,7 +58,7 @@ public function navegarParaTramitarProcesso() $this->test->frame("ifrVisualizacao"); $this->editarProcessoButton = $this->test->byXPath("//img[@alt='Envio Externo de Processo']"); $this->editarProcessoButton->click(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $testCase->assertContains('Envio Externo de Processo', $testCase->byCssSelector('body')->text()); return true; }, 100000); @@ -73,7 +73,7 @@ public function navegarParaConsultarAndamentos() $this->test->frame(null); $this->test->frame("ifrVisualizacao"); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $testCase->assertContains('Histórico do Processo', $testCase->byCssSelector('body')->text()); return true; }, 100000); @@ -89,7 +89,7 @@ public function navegarParaConsultarRecibos() $this->test->frame("ifrVisualizacao"); $this->editarProcessoButton = $this->test->byXPath("//img[@alt='Consultar Recibos']"); $this->editarProcessoButton->click(); - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $testCase->assertContains('Consultar Recibos', $testCase->byCssSelector('body')->text()); return true; }, 100000); @@ -147,7 +147,7 @@ public function selecionarDocumento($nomeDocumentoArvore) public function selecionarProcesso() { $this->selecionarItemArvore($this->listarArvoreProcesso()[0]); - sleep(1); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 1)); } public function listarDocumentos() diff --git a/testes/PhpUnit/src/paginas/PaginaTeste.php b/testes/PhpUnit/src/paginas/PaginaTeste.php index 7bc0536..49f3930 100644 --- a/testes/PhpUnit/src/paginas/PaginaTeste.php +++ b/testes/PhpUnit/src/paginas/PaginaTeste.php @@ -15,7 +15,7 @@ public function titulo() public function alertTextAndClose($confirm = true) { - sleep(2); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 2)); $result = $this->test->alertText(); $result = (!is_array($result) ? $result : null); diff --git a/versao/v2/MdWsSeiServicosV2.php b/versao/v2/MdWsSeiServicosV2.php index b2094f3..96cac57 100644 --- a/versao/v2/MdWsSeiServicosV2.php +++ b/versao/v2/MdWsSeiServicosV2.php @@ -44,7 +44,7 @@ public function registrarServicos() */ $this->post('/autenticar', function ($request, $response, $args) { /** @var $response Slim\Http\Response */ - sleep(3); + sleep(ConfiguracaoSEI::getInstance()->getValor('WSSEI', 'Sleep', false, 3)); $rn = new MdWsSeiUsuarioRN(); $usuarioDTO = new UsuarioDTO(); $usuarioDTO->setStrSigla($request->getParam('usuario')); @@ -1742,9 +1742,10 @@ public function registrarServicos() }); })->add(new TokenValidationMiddleware()); - }) - ->add(new ModuleVerificationMiddleware()) - ->add(new EncodingMiddleware()); + }) + ->add(new ModuleVerificationMiddleware()) + ->add(new EncodingMiddleware()) + ->add(new ServicePermissionsMiddleware()); return $this->slimApp; }