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
master
gleimar 2022-04-27 18:50:22 +00:00
parent 7a8c4d22c2
commit 0ec3c62a5f
6 changed files with 256 additions and 125 deletions

View File

@ -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();
}
}

View File

@ -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("\\|");
}
}

View File

@ -1,39 +1,20 @@
package com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad; 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.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.apache.log4j.Logger;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.zkoss.util.resource.Labels; import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Messagebox; 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.service.ConstanteService;
import com.rjconsultores.ventaboletos.web.utilerias.api.ApiCallRunnable;
import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema; import com.rjconsultores.ventaboletos.web.utilerias.menu.DefaultItemMenuSistema;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext; import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;
public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema { public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema {
private static Logger log = Logger.getLogger(ItemMenuLimparCacheLocalidadesAPI.class); 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() { public ItemMenuLimparCacheLocalidadesAPI() {
super("indexController.mniLimparCacheLocalidadesAPI.label"); super("indexController.mniLimparCacheLocalidadesAPI.label");
@ -75,10 +56,10 @@ public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema {
if (tenant != null) { if (tenant != null) {
url = url.replaceAll("\\[.*?\\]", ""); url = url.replaceAll("\\[.*?\\]", "");
} }
String urlOriginal = url; String urlBase = url;
url = montarUrlRequest(url); url = montarUrlRequest(url);
ThreadCache cache = new ThreadCache(url, tenant, urlOriginal); ApiCallRunnable cache = new ApiCallRunnable(url, tenant, urlBase);
Thread thread = new Thread(cache); Thread thread = new Thread(cache);
thread.start(); thread.start();
thread.join(); thread.join();
@ -115,104 +96,4 @@ public class ItemMenuLimparCacheLocalidadesAPI extends DefaultItemMenuSistema {
return constante == null ? null : constante.split("\\|"); 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();
}
} }

View File

@ -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";
}
}

View File

@ -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.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.ItemMenuReenvioBPe
seguridad.reenvioBpe=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuExtrairBPeXml 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 seguridad.logAuditoria=com.rjconsultores.ventaboletos.web.utilerias.menu.item.seguridad.ItemMenuLogAuditoria
pasajerofrecuente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.MenuPasajeroFrecuente pasajerofrecuente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.MenuPasajeroFrecuente
pasajerofrecuente.cliente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.ItemMenuCliente pasajerofrecuente.cliente=com.rjconsultores.ventaboletos.web.utilerias.menu.item.pasajerofrecuente.ItemMenuCliente

View File

@ -460,6 +460,8 @@ indexController.mniReenvioBpe.label = Reenvio BP-e
indexController.mniVisualizaSenhaInstalacaoVendaEmbarcada.label = Visualizar Senha Instalação indexController.mniVisualizaSenhaInstalacaoVendaEmbarcada.label = Visualizar Senha Instalação
indexController.mniExtrairBpeXmlController.label = Extrair BP-e XML indexController.mniExtrairBpeXmlController.label = Extrair BP-e XML
indexController.mniAPI.label = Api
indexController.mniEscola.label = Escola indexController.mniEscola.label = Escola
indexController.mniCurso.label = Curso indexController.mniCurso.label = Curso
indexController.mniPracaPedagio.label = Praça Pedágio 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.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) 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 #Relatório de Aproveitamento Financeiro
relatorioAproveitamentoFinanceiroController.window.title = Relatório de Aproveitamento Financeiro relatorioAproveitamentoFinanceiroController.window.title = Relatório de Aproveitamento Financeiro
relatorioAproveitamentoFinanceiroController.lbDatInicial.value = Data inicial relatorioAproveitamentoFinanceiroController.lbDatInicial.value = Data inicial