From 0ec3c62a5ff1329bde4343ddca0e3ba564e9fb91 Mon Sep 17 00:00:00 2001 From: gleimar Date: Wed, 27 Apr 2022 18:50:22 +0000 Subject: [PATCH] fixes bug#20900 dev:alberto qua:wally git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Web/trunk/ventaboletos@112043 d1611594-4594-4d17-8e1d-87c2c4800839 --- .../web/utilerias/api/ApiCallRunnable.java | 126 +++++++++++++++++ .../ItemMenuLimparCacheEmbarcadaAPI.java | 99 ++++++++++++++ .../ItemMenuLimparCacheLocalidadesAPI.java | 129 +----------------- .../menu/item/seguridad/MenuAPI.java | 16 +++ .../utilerias/menu/menu_original.properties | 4 +- web/WEB-INF/i3-label_pt_BR.label | 7 + 6 files changed, 256 insertions(+), 125 deletions(-) create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/api/ApiCallRunnable.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheEmbarcadaAPI.java create mode 100644 src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/MenuAPI.java diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/api/ApiCallRunnable.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/api/ApiCallRunnable.java new file mode 100644 index 000000000..a946dc7ca --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/api/ApiCallRunnable.java @@ -0,0 +1,126 @@ +package com.rjconsultores.ventaboletos.web.utilerias.api; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; + +import javax.xml.bind.DatatypeConverter; + +import org.apache.http.HttpResponse; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.log4j.Logger; + +import com.nimbusds.jose.JOSEException; +import com.nimbusds.jose.JWSAlgorithm; +import com.nimbusds.jose.JWSHeader; +import com.nimbusds.jose.JWSObject; +import com.nimbusds.jose.Payload; +import com.nimbusds.jose.crypto.MACSigner; +import com.nimbusds.jwt.JWTClaimsSet; + +public class ApiCallRunnable implements Runnable { + + private static Logger log = Logger.getLogger(ApiCallRunnable.class); + private static final int minutesExpireToken = 10; + private static final String secret = "#KO&Fm4_k.sU9M8`6Mx'F\\\"H:*Qxu]6F4r,)JmZ2Jwafd)I.2[RET'1:)VQ6mG9,"; + + private final String url; + private final String tenant; + private String retorno; + private String urlBase; + + public String getUrl() { + return url; + } + + public String getTenant() { + return tenant; + } + + public String getRetorno() { + return retorno; + } + + public void setRetorno(String retorno) { + this.retorno = retorno; + } + + public String getUrlBase() { + return urlBase; + } + + public void setUrlBase(String urlBase) { + this.urlBase = urlBase; + } + + public ApiCallRunnable(String url, String tenant, String urlOriginal) { + this.url = url; + this.tenant = tenant; + this.urlBase = urlOriginal; + } + + public void run() { + HttpClient client = new DefaultHttpClient(); + HttpGet request = new HttpGet(url); + UsernamePasswordCredentials creds = null; + + try { + creds = new UsernamePasswordCredentials("internal", getToken()); + request.addHeader(new BasicScheme().authenticate(creds, request)); + + if (tenant != null) { + request.addHeader("x-tenant-id", tenant); + } + + HttpResponse response = client.execute(request); + if (response != null && response.getStatusLine() != null) { + log.info(String.format(":: Response Status Code %d :: Headers = %s", response.getStatusLine().getStatusCode(),Arrays.toString(response.getAllHeaders()))); + } + + Integer codigoRetorno = (response != null && response.getStatusLine() != null) ? response.getStatusLine().getStatusCode() : null; + + retorno = montarMensagemRetorno(tenant, urlBase, codigoRetorno, null); + + } catch (Exception e) { + retorno = montarMensagemRetorno(tenant, urlBase, null, e.getMessage()); + log.error("Ocorreu um erro ao executar a requisição de limpar cache de localidade da API", e); + } + } + private String montarMensagemRetorno(String tenant, String url, Integer codigoRetorno, String mensagemErro) { + + StringBuilder mensagemRetorno = new StringBuilder(); + mensagemRetorno.append("ULR -> ").append(url).append("\n"); + mensagemRetorno.append("tenant -> ").append(tenant).append("\n"); + if (mensagemErro == null) { + mensagemRetorno.append("Resposta -> ").append((codigoRetorno != null && codigoRetorno.equals(200)) ? "Solicitação de limpeza de cache executada com sucesso, código " + codigoRetorno : "Erro ao enviar solicitação, código " + codigoRetorno); + } else { + mensagemRetorno.append("Resposta -> ").append(mensagemErro); + } + + return mensagemRetorno.toString(); + } + private String getToken() throws JOSEException { + long ttlMillis = minutesExpireToken * 60000; + long nowMillis = System.currentTimeMillis(); + long expMillis = nowMillis + ttlMillis; + + JWTClaimsSet claims = new JWTClaimsSet.Builder() + .claim("sub", new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date())) + .claim("userId", "adm") + .claim("role", "ROLE_TOKEN") + .claim("exp", expMillis) + .build(); + + JWSObject jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.HS256), + new Payload(claims.toJSONObject())); + + jwsObject.sign(new MACSigner(DatatypeConverter.parseBase64Binary(secret))); + + return jwsObject.serialize(); + } + +} \ No newline at end of file diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheEmbarcadaAPI.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheEmbarcadaAPI.java new file mode 100644 index 000000000..cc2906985 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheEmbarcadaAPI.java @@ -0,0 +1,99 @@ +package com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.context.ApplicationContext; +import org.zkoss.util.resource.Labels; +import org.zkoss.zk.ui.util.Clients; +import org.zkoss.zul.Messagebox; + +import com.rjconsultores.ventaboletos.service.ConstanteService; +import com.rjconsultores.ventaboletos.web.utilerias.api.ApiCallRunnable; +import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; +import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext; + +public class ItemMenuLimparCacheEmbarcadaAPI extends DefaultItemMenuSistema { + private static Logger log = Logger.getLogger(ItemMenuLimparCacheEmbarcadaAPI.class); + + + public ItemMenuLimparCacheEmbarcadaAPI() { + super("indexController.mniLimparCacheEmbarcadaAPI.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.SEGURIDAD.MENU.RECARREGARCACHEEMBARCADASINCRONIZACAOAPI"; + } + + @Override + public void ejecutar() { + + try { + + int resp = Messagebox.show( + Labels.getLabel("limparCacheEmbarcadaAPI.message.pergunta"), + Labels.getLabel("limparCacheEmbarcadaAPI.title"), Messagebox.YES | Messagebox.NO, Messagebox.QUESTION); + + if (resp == Messagebox.YES) { + + String[] urls = getURLSAPI(); + + if (urls == null || urls.length == 0) { + Clients.alert(org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.message.naoconfigurado"), + org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.title"), Messagebox.INFORMATION); + return; + } + + for (String url : urls) { + + if (StringUtils.isBlank(url) || url.contains("|")) { + Clients.alert(org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.message.naoconfigurado"), + org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.title"), Messagebox.INFORMATION); + return; + } + + String tenant = StringUtils.substringBetween(url, "[", "]"); + if (tenant != null) { + url = url.replaceAll("\\[.*?\\]", ""); + } + String urlBase = url; + url = montarUrlRequest(url); + + ApiCallRunnable cache = new ApiCallRunnable(url, tenant, urlBase); + Thread thread = new Thread(cache); + thread.start(); + thread.join(); + + Clients.alert(cache.getRetorno(), org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.title"), Messagebox.INFORMATION); + } + + } + + } catch (Exception e) { + Clients.alert(e.getMessage(), + org.zkoss.util.resource.Labels.getLabel("limparCacheEmbarcadaAPI.title"), Messagebox.ERROR); + log.error(e.getMessage(), e); + } + + } + + private String montarUrlRequest(String url) { + + url = url.toLowerCase(); + + if (!url.endsWith("/")) { + url += "/"; + } + + return url.concat("embarcadasync/excluirCacheSincronizacaoTramos"); + } + + private String[] getURLSAPI() { + ApplicationContext appContext = AppContext.getApplicationContext(); + ConstanteService constanteService = (ConstanteService) appContext.getBean("constanteService"); + String constante = constanteService.buscarURLAPI(); + + return constante == null ? null : constante.split("\\|"); + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheLocalidadesAPI.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheLocalidadesAPI.java index b4189be87..c8735cb55 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheLocalidadesAPI.java +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/ItemMenuLimparCacheLocalidadesAPI.java @@ -1,39 +1,20 @@ package com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad; -import java.text.SimpleDateFormat; -import java.util.Date; - -import javax.xml.bind.DatatypeConverter; - import org.apache.commons.lang.StringUtils; -import org.apache.http.HttpResponse; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.DefaultHttpClient; import org.apache.log4j.Logger; import org.springframework.context.ApplicationContext; import org.zkoss.util.resource.Labels; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zul.Messagebox; -import com.nimbusds.jose.JOSEException; -import com.nimbusds.jose.JWSAlgorithm; -import com.nimbusds.jose.JWSHeader; -import com.nimbusds.jose.JWSObject; -import com.nimbusds.jose.Payload; -import com.nimbusds.jose.crypto.MACSigner; -import com.nimbusds.jwt.JWTClaimsSet; import com.rjconsultores.ventaboletos.service.ConstanteService; +import com.rjconsultores.ventaboletos.web.utilerias.api.ApiCallRunnable; import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext; public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema { private static Logger log = Logger.getLogger(ItemMenuLimparCacheLocalidadesAPI.class); - - private static final String secret = "#KO&Fm4_k.sU9M8`6Mx'F\\\"H:*Qxu]6F4r,)JmZ2Jwafd)I.2[RET'1:)VQ6mG9,"; - private static final int minutesExpireToken = 10; + public ItemMenuLimparCacheLocalidadesAPI() { super("indexController.mniLimparCacheLocalidadesAPI.label"); @@ -75,10 +56,10 @@ public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema { if (tenant != null) { url = url.replaceAll("\\[.*?\\]", ""); } - String urlOriginal = url; + String urlBase = url; url = montarUrlRequest(url); - ThreadCache cache = new ThreadCache(url, tenant, urlOriginal); + ApiCallRunnable cache = new ApiCallRunnable(url, tenant, urlBase); Thread thread = new Thread(cache); thread.start(); thread.join(); @@ -114,105 +95,5 @@ public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema { return constante == null ? null : constante.split("\\|"); } - - private String getToken() throws JOSEException { - long ttlMillis = minutesExpireToken * 60000; - long nowMillis = System.currentTimeMillis(); - long expMillis = nowMillis + ttlMillis; - - JWTClaimsSet claims = new JWTClaimsSet.Builder() - .claim("sub", new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date())) - .claim("userId", "adm") - .claim("role", "ROLE_TOKEN") - .claim("exp", expMillis) - .build(); - - JWSObject jwsObject = new JWSObject(new JWSHeader(JWSAlgorithm.HS256), - new Payload(claims.toJSONObject())); - - jwsObject.sign(new MACSigner(DatatypeConverter.parseBase64Binary(secret))); - - return jwsObject.serialize(); - } - - public class ThreadCache implements Runnable { - - private final String url; - private final String tenant; - private String retorno; - private String urlOriginal; - - public String getUrl() { - return url; - } - - public String getTenant() { - return tenant; - } - - public String getRetorno() { - return retorno; - } - - public void setRetorno(String retorno) { - this.retorno = retorno; - } - - public String getUrlOriginal() { - return urlOriginal; - } - - public void setUrlOriginal(String urlOriginal) { - this.urlOriginal = urlOriginal; - } - - public ThreadCache(String url, String tenant, String urlOriginal) { - this.url = url; - this.tenant = tenant; - this.urlOriginal = urlOriginal; - } - - public void run() { - HttpClient client = new DefaultHttpClient(); - HttpGet request = new HttpGet(url); - UsernamePasswordCredentials creds = null; - - try { - creds = new UsernamePasswordCredentials("internal", getToken()); - request.addHeader(new BasicScheme().authenticate(creds, request)); - - if (tenant != null) { - request.addHeader("x-tenant-id", tenant); - } - - HttpResponse response = client.execute(request); - if (response != null && response.getStatusLine() != null) { - log.info(String.format(":: Response Status Code %d ::", response.getStatusLine().getStatusCode())); - } - - Integer codigoRetorno = (response != null && response.getStatusLine() != null) ? response.getStatusLine().getStatusCode() : null; - - retorno = montarMensagemRetorno(tenant, urlOriginal, codigoRetorno, null); - - } catch (Exception e) { - retorno = montarMensagemRetorno(tenant, urlOriginal, null, e.getMessage()); - log.error("Ocorreu um erro ao executar a requisição de limpar cache de localidade da API", e); - } - } - - } - - private String montarMensagemRetorno(String tenant, String url, Integer codigoRetorno, String mensagemErro) { - - StringBuilder mensagemRetorno = new StringBuilder(); - mensagemRetorno.append("ULR -> ").append(url).append("\n"); - mensagemRetorno.append("tenant -> ").append(tenant).append("\n"); - if (mensagemErro == null) { - mensagemRetorno.append("Resposta -> ").append((codigoRetorno != null && codigoRetorno.equals(200)) ? "Solicitação de limpeza de cache executada com sucesso, código " + codigoRetorno : "Erro ao enviar solicitação, código " + codigoRetorno); - } else { - mensagemRetorno.append("Resposta -> ").append(mensagemErro); - } - - return mensagemRetorno.toString(); - } + } diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/MenuAPI.java b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/MenuAPI.java new file mode 100644 index 000000000..bfe5fc137 --- /dev/null +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/item/seguridad/MenuAPI.java @@ -0,0 +1,16 @@ +package com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad; + +import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; + +public class MenuAPI extends DefaultItemMenuSistema { + + public MenuAPI() { + super("indexController.mniAPI.label"); + } + + @Override + public String getClaveMenu() { + return "COM.RJCONSULTORES.ADMINISTRACION.GUI.SEGURIDAD.MENU.API"; + } + +} diff --git a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties index fc6011db2..b25a71576 100644 --- a/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties +++ b/src/java/com/rjconsultores/ventaboletos/web/utilerias/menu/menu_original.properties @@ -304,7 +304,9 @@ seguridad.painelBpe=com.rjconsultores.ventaboletos.web.utilerias.menu.item.segur seguridad.contingencia=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuContingencia seguridad.reenvioBpe=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuReenvioBPe seguridad.reenvioBpe=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuExtrairBPeXml -seguridad.limparCacheLocalidadesAPI=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuLimparCacheLocalidadesAPI +seguridad.menuAPI=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.MenuAPI +seguridad.menuAPI.limparCacheLocalidadesAPI=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuLimparCacheLocalidadesAPI +seguridad.menuAPI.limparCacheEmbarcadaAPI=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuLimparCacheEmbarcadaAPI seguridad.logAuditoria=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuLogAuditoria pasajerofrecuente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.MenuPasajeroFrecuente pasajerofrecuente.cliente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.ItemMenuCliente diff --git a/web/WEB-INF/i3-label_pt_BR.label b/web/WEB-INF/i3-label_pt_BR.label index 9aa39bc5d..d2d115258 100644 --- a/web/WEB-INF/i3-label_pt_BR.label +++ b/web/WEB-INF/i3-label_pt_BR.label @@ -460,6 +460,8 @@ indexController.mniReenvioBpe.label = Reenvio BP-e indexController.mniVisualizaSenhaInstalacaoVendaEmbarcada.label = Visualizar Senha Instalação indexController.mniExtrairBpeXmlController.label = Extrair BP-e XML +indexController.mniAPI.label = Api + indexController.mniEscola.label = Escola indexController.mniCurso.label = Curso indexController.mniPracaPedagio.label = Praça Pedágio @@ -10016,6 +10018,11 @@ limparCacheLocalidadesAPI.title = Localidades (API) limparCacheLocalidadesAPI.message.naoconfigurado=A constante de configuração da URL da API não foi encontrada. limparCacheLocalidadesAPI.message.pergunta=Deseja recarregar Cache de Localidades (API) ? (API de Localidade ficará indisponível durante a execução) +indexController.mniLimparCacheEmbarcadaAPI.label = Recarregar Cache Sincronização Embarcada (API) +limparCacheEmbarcadaAPI.title = Cache Embarcada (API) +limparCacheEmbarcadaAPI.message.naoconfigurado=A constante de configuração da URL da API não foi encontrada. +limparCacheEmbarcadaAPI.message.pergunta=Deseja recarregar o Cache de Sincronização (API) ? + #Relatório de Aproveitamento Financeiro relatorioAproveitamentoFinanceiroController.window.title = Relatório de Aproveitamento Financeiro relatorioAproveitamentoFinanceiroController.lbDatInicial.value = Data inicial