[ADD] MUCHAS MODIFICACIONES Y SE AÑADIO EL BBVA API QR

parent 46f6c7be
package web.multitask.trismegistoservices.config; package web.multitask.trismegistoservices.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import io.github.cdimascio.dotenv.Dotenv; import io.github.cdimascio.dotenv.Dotenv;
import web.multitask.trismegistoservices.utils.DotEnvUtil; import web.multitask.trismegistoservices.utils.dotEnvUtils;
@Configuration @Configuration
public class DotEnvConfig { public class DotEnvConfig {
// @Bean // @Bean
Dotenv getDotEnvPath() { Dotenv getDotEnvPath() {
return Dotenv.configure().directory(DotEnvUtil.getDotEnvPath("trismegisto-asistencia")).load(); return Dotenv.configure().directory(dotEnvUtils.getDotEnvPath("trismegisto-asistencia")).load();
} }
} }
\ No newline at end of file
...@@ -11,27 +11,19 @@ import com.google.api.client.auth.oauth2.Credential; ...@@ -11,27 +11,19 @@ import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.gmail.Gmail; import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory; import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory; import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.mail.Address;
@Configuration @Configuration
public class GoogleConfig { public class GoogleConfig {
private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
// private static final String OAUTH2 = "/oAuth2_planilla.json";
private static final String CREDENTIALS_FOLDER_PATH = "/tokens"; private static final String CREDENTIALS_FOLDER_PATH = "/tokens";
private final String APPLICATION_NAME = "FullService Application"; private final String APPLICATION_NAME = "FullService Application";
private String refresh_token_gmail = null; private String refresh_token_gmail = null;
...@@ -80,6 +72,7 @@ public class GoogleConfig { ...@@ -80,6 +72,7 @@ public class GoogleConfig {
.build() .build()
.setAccessToken(getAccessToken(refresh_token_gmail)) .setAccessToken(getAccessToken(refresh_token_gmail))
.setRefreshToken(refresh_token_gmail); .setRefreshToken(refresh_token_gmail);
return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, authorize) return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, authorize)
.setApplicationName(APPLICATION_NAME).build(); .setApplicationName(APPLICATION_NAME).build();
} catch (GeneralSecurityException | IOException e) { } catch (GeneralSecurityException | IOException e) {
...@@ -97,11 +90,11 @@ public class GoogleConfig { ...@@ -97,11 +90,11 @@ public class GoogleConfig {
client_id = clientSecrets.getDetails().getClientId(); client_id = clientSecrets.getDetails().getClientId();
client_secret = clientSecrets.getDetails().getClientSecret(); client_secret = clientSecrets.getDetails().getClientSecret();
if (clientSecrets.getDetails().get("gmail_refresh_token") != null){ if (clientSecrets.getDetails().get("gmail_refresh_token") != null) {
refresh_token_gmail = clientSecrets.getDetails().get("gmail_refresh_token").toString(); refresh_token_gmail = clientSecrets.getDetails().get("gmail_refresh_token").toString();
} }
if (clientSecrets.getDetails().get("drive_refresh_token") != null){ if (clientSecrets.getDetails().get("drive_refresh_token") != null) {
refresh_token_drive = clientSecrets.getDetails().get("drive_refresh_token").toString(); refresh_token_drive = clientSecrets.getDetails().get("drive_refresh_token").toString();
} }
} catch (IOException e) { } catch (IOException e) {
...@@ -116,7 +109,7 @@ public class GoogleConfig { ...@@ -116,7 +109,7 @@ public class GoogleConfig {
params.put("grant_type", "refresh_token"); params.put("grant_type", "refresh_token");
params.put("client_id", client_id); params.put("client_id", client_id);
params.put("client_secret", client_secret); params.put("client_secret", client_secret);
params.put("refresh_token",refresh_token); params.put("refresh_token", refresh_token);
StringBuilder postData = new StringBuilder(); StringBuilder postData = new StringBuilder();
for (Map.Entry<String, Object> param : params.entrySet()) { for (Map.Entry<String, Object> param : params.entrySet()) {
...@@ -129,7 +122,7 @@ public class GoogleConfig { ...@@ -129,7 +122,7 @@ public class GoogleConfig {
} }
byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8);
URL url = new URL("https://accounts.google.com/o/oauth2/token"); URL url = new URL("https://accounts.google.com/o/oauth2/token");
HttpURLConnection con = (HttpURLConnection) url.openConnection(); HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true); con.setDoOutput(true);
con.setUseCaches(false); con.setUseCaches(false);
...@@ -146,8 +139,8 @@ public class GoogleConfig { ...@@ -146,8 +139,8 @@ public class GoogleConfig {
return json.getString("access_token"); return json.getString("access_token");
} catch (Exception ex) { } catch (Exception ex) {
System.out.println("Error: " + ex); System.out.println("Error: " + ex);
return null;
} }
return null;
} }
} }
\ No newline at end of file
...@@ -18,18 +18,16 @@ import org.springframework.web.cors.CorsConfiguration; ...@@ -18,18 +18,16 @@ import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter; import org.springframework.web.filter.CorsFilter;
import web.multitask.trismegistoservices.filter.JWTokenFilter; import web.multitask.trismegistoservices.filter.JWTokenFilter;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton; import web.multitask.trismegistoservices.utils.tokenUtils;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil;
@Configuration @Configuration
@EnableWebSecurity @EnableWebSecurity
@AllArgsConstructor @AllArgsConstructor
public class SecurityConfig{ public class SecurityConfig{
private final JWTokenUtil jwtTokenUtil; private final tokenUtils jwtTokenUtil;
private final TokenSingleton tokenSingleton; private final web.multitask.trismegistoservices.singleton.tokenSingleton tokenSingleton;
private ThreadLocalSingleton threadLocalSingleton; private web.multitask.trismegistoservices.singleton.threadLocalSingleton threadLocalSingleton;
@Bean @Bean
AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
......
package web.multitask.trismegistoservices.filter; package web.multitask.trismegistoservices.filter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand; import org.springframework.messaging.simp.stomp.StompCommand;
...@@ -11,17 +10,15 @@ import org.springframework.messaging.support.MessageHeaderAccessor; ...@@ -11,17 +10,15 @@ import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import web.multitask.trismegistoservices.repository.UserRepository; import web.multitask.trismegistoservices.repository.UserRepository;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.tokenUtils;
import java.util.Objects;
@Component @Component
public class AuthChannelInterceptorAdapter implements ChannelInterceptor { public class AuthChannelInterceptorAdapter implements ChannelInterceptor {
private final JWTokenUtil jwtTokenUtil; private final tokenUtils jwtTokenUtil;
private final UserRepository userRepo = new UserRepository(); private final UserRepository userRepo = new UserRepository();
public AuthChannelInterceptorAdapter(JWTokenUtil jwtTokenUtil) { public AuthChannelInterceptorAdapter(tokenUtils jwtTokenUtil) {
this.jwtTokenUtil = jwtTokenUtil; this.jwtTokenUtil = jwtTokenUtil;
} }
......
...@@ -5,6 +5,7 @@ import javax.servlet.ServletException; ...@@ -5,6 +5,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource; import javax.sql.DataSource;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.json.JSONObject; import org.json.JSONObject;
...@@ -17,45 +18,48 @@ import org.springframework.security.core.context.SecurityContextHolder; ...@@ -17,45 +18,48 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import web.multitask.trismegistoservices.repository.UserRepository; import web.multitask.trismegistoservices.repository.UserRepository;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton; import web.multitask.trismegistoservices.utils.tokenUtils;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import java.nio.charset.StandardCharsets;
import java.util.Objects;
@Component @Component
@Order(1) @Order(1)
//@AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class JWTokenFilter extends OncePerRequestFilter { public class JWTokenFilter extends OncePerRequestFilter {
private final UserRepository userRepo = new UserRepository(); private final UserRepository userRepo = new UserRepository();
private JWTokenUtil jwtTokenUtil = null; private tokenUtils jwtTokenUtil = null;
private TokenSingleton tokenSingleton = null; private web.multitask.trismegistoservices.singleton.tokenSingleton tokenSingleton = null;
private ThreadLocalSingleton threadLocalSingleton = null; private web.multitask.trismegistoservices.singleton.threadLocalSingleton threadLocalSingleton = null;
public JWTokenFilter(JWTokenUtil jwtTokenUtil, TokenSingleton tokenSingleton, ThreadLocalSingleton threadLocalSingleton){ public JWTokenFilter(tokenUtils jwtTokenUtil, web.multitask.trismegistoservices.singleton.tokenSingleton tokenSingleton, web.multitask.trismegistoservices.singleton.threadLocalSingleton threadLocalSingleton) {
this.jwtTokenUtil = jwtTokenUtil; this.jwtTokenUtil = jwtTokenUtil;
this.tokenSingleton = tokenSingleton; this.tokenSingleton = tokenSingleton;
this.threadLocalSingleton = threadLocalSingleton; this.threadLocalSingleton = threadLocalSingleton;
} }
@Override @Override
protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain chain) protected void doFilterInternal(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain chain) throws ServletException, io.jsonwebtoken.io.IOException, java.io.IOException {
throws ServletException, io.jsonwebtoken.io.IOException, java.io.IOException {
response.setContentType("application/json"); response.setContentType("application/json");
final String Authorization = request.getHeader(HttpHeaders.AUTHORIZATION); final String Authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
final String dbConnection = request.getHeader("Database"); final String dbConnection = request.getHeader("Database");
String type;
String token; String token;
try { try {
type = Authorization.split(" ")[0];
token = Authorization.split(" ")[1]; token = Authorization.split(" ")[1];
} catch (Exception e) { } catch (Exception e) {
type = null;
token = null; token = null;
} }
if(dbConnection != null && !dbConnection.isEmpty()){ if (dbConnection != null && !dbConnection.isEmpty()) {
String dataBaseGotten = jwtTokenUtil.getDataToken(dbConnection); String dataBaseGotten = jwtTokenUtil.getDataToken(dbConnection);
DataSource ds = getDataSource(new JSONObject(dataBaseGotten)); DataSource ds = getDataSource(new JSONObject(dataBaseGotten));
threadLocalSingleton.setJdbcTemplate(new JdbcTemplate(ds)); threadLocalSingleton.setJdbcTemplate(new JdbcTemplate(ds));
...@@ -63,13 +67,29 @@ public class JWTokenFilter extends OncePerRequestFilter { ...@@ -63,13 +67,29 @@ public class JWTokenFilter extends OncePerRequestFilter {
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
chain.doFilter(request, response); chain.doFilter(request, response);
} else { } else if (Objects.equals(type, "Basic")) {
if (jwtTokenUtil.validateToken(token) || tokenSingleton.consumeToken(token)){ String credentials = new String(Base64Utils.decodeFromString(token), StandardCharsets.UTF_8);
String[] parts = credentials.split(":", 2);
if (parts.length == 2) {
String username = parts[0];
String password = parts[1];
UserDetails userDetails = userRepo.findByUsername(username);
if (userDetails.getPassword().equals(password)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
}else{
response.sendError(401, "Invalid Token");
}
}else{
response.sendError(401, "Invalid Token");
}
} else if (Objects.equals(type, "Bearer")) {
if (jwtTokenUtil.validateToken(token) || tokenSingleton.consumeToken(token)) {
JSONObject jsonToken = new JSONObject(jwtTokenUtil.getDataToken(token)); JSONObject jsonToken = new JSONObject(jwtTokenUtil.getDataToken(token));
UserDetails userDetails = userRepo.findByUsername(jsonToken.getString("username")); UserDetails userDetails = userRepo.findByUsername(jsonToken.getString("username"));
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
userDetails,
null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response); chain.doFilter(request, response);
......
...@@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; ...@@ -4,7 +4,6 @@ import lombok.AllArgsConstructor;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -14,7 +13,7 @@ import java.util.Objects; ...@@ -14,7 +13,7 @@ import java.util.Objects;
@AllArgsConstructor @AllArgsConstructor
public class RoutineSql { public class RoutineSql {
private final ThreadLocalSingleton threadLocalSingleton; private final web.multitask.trismegistoservices.singleton.threadLocalSingleton threadLocalSingleton;
public JSONObject routineExecutor(String routine, String database, Object[] params) { public JSONObject routineExecutor(String routine, String database, Object[] params) {
......
package web.multitask.trismegistoservices.rest.BBVA;
import org.json.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import web.multitask.trismegistoservices.services.BBVA.bbvaService;
import web.multitask.trismegistoservices.singleton.bbvaSingleton;
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("bbva")
public class bbvaRest {
private final bbvaService service;
private final bbvaSingleton singleton;
public bbvaRest(bbvaService service, bbvaSingleton singleton) {
this.service = service;
this.singleton = singleton;
}
@PostMapping("/private/prepareRequest")
public ResponseEntity<?> getHeader(@RequestBody String json) {
JSONObject response = service.getToken(json);
String token = response.optString("access_token");
if(token.isEmpty()){
return ResponseEntity.internalServerError().body(response.put("status",false).put("token","").toMap());
}else{
singleton.setToken(token);
String digest = service.bodyIntoBase64AfterSHA512(json);
singleton.setDigest(digest);
String txt = service.txtToSign(json ,digest);
String signature = service.createSignature(txt);
singleton.setSignature(signature);
System.out.println("token = "+singleton.getToken());
System.out.println("digest = "+singleton.getDigest());
System.out.println("signature = "+singleton.getSignature());
return ResponseEntity.ok(service.generateQR(singleton.getToken(),singleton.getDigest(),singleton.getSignature(),json).toMap());
}
}
}
package web.multitask.trismegistoservices.rest.BBVA;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("bbva")
@AllArgsConstructor
public class bbvaWebHook {
@PostMapping("/public/webhook")
public String webhook(@RequestBody String json) {
System.out.println(json);
return "Hello World";
}
}
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -12,7 +12,7 @@ import java.io.InputStreamReader; ...@@ -12,7 +12,7 @@ import java.io.InputStreamReader;
@RestController @RestController
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
@RequestMapping("console") @RequestMapping("console")
public class ConsoleApi { public class consoleRest {
@PostMapping("/public/command") @PostMapping("/public/command")
public ResponseEntity<?> pull(@RequestBody String jsonBody) { public ResponseEntity<?> pull(@RequestBody String jsonBody) {
......
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -16,7 +16,7 @@ import javax.annotation.Nullable; ...@@ -16,7 +16,7 @@ import javax.annotation.Nullable;
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
@RequestMapping("drive") @RequestMapping("drive")
@AllArgsConstructor @AllArgsConstructor
public class DriveApi { public class driveRest {
DriveService driveService; DriveService driveService;
......
// package web.multitask.app.api; // package web.multitask.app.api;
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.json.JSONObject; import org.json.JSONObject;
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
@RestController @RestController
@RequestMapping("/gmail") @RequestMapping("/gmail")
@AllArgsConstructor @AllArgsConstructor
public class EmailApi { public class emailRest {
private final GmailService emailService; private final GmailService emailService;
......
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import org.json.JSONObject; import org.json.JSONObject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -19,7 +19,7 @@ import java.io.IOException; ...@@ -19,7 +19,7 @@ import java.io.IOException;
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
@RequestMapping("excel") @RequestMapping("excel")
@AllArgsConstructor @AllArgsConstructor
public class ExcelApi { public class excelRest {
ExcelService excelService; ExcelService excelService;
CommonUtils commonUtils; CommonUtils commonUtils;
......
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
...@@ -14,7 +14,7 @@ import web.multitask.trismegistoservices.utils.CommonUtils; ...@@ -14,7 +14,7 @@ import web.multitask.trismegistoservices.utils.CommonUtils;
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
@RequestMapping("/pdf") @RequestMapping("/pdf")
@AllArgsConstructor @AllArgsConstructor
public class PDFApi { public class pdfRest {
PDFService pdfService; PDFService pdfService;
CommonUtils commonUtils; CommonUtils commonUtils;
......
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.json.JSONArray; import org.json.JSONArray;
...@@ -6,13 +6,12 @@ import org.json.JSONObject; ...@@ -6,13 +6,12 @@ import org.json.JSONObject;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import web.multitask.trismegistoservices.mysql.RoutineSql; import web.multitask.trismegistoservices.mysql.RoutineSql;
import web.multitask.trismegistoservices.repository.UserRepository;
@RestController @RestController
@CrossOrigin("*") @CrossOrigin("*")
@RequestMapping("/api") @RequestMapping("/api")
@AllArgsConstructor @AllArgsConstructor
public class RoutineApi { public class routineRest {
final RoutineSql procedureMysql; final RoutineSql procedureMysql;
......
package web.multitask.trismegistoservices.api; package web.multitask.trismegistoservices.rest;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -6,8 +6,7 @@ import org.springframework.security.core.userdetails.UserDetails; ...@@ -6,8 +6,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import web.multitask.trismegistoservices.model.User; import web.multitask.trismegistoservices.model.User;
import web.multitask.trismegistoservices.repository.UserRepository; import web.multitask.trismegistoservices.repository.UserRepository;
import web.multitask.trismegistoservices.singleton.TokenSingleton; import web.multitask.trismegistoservices.utils.tokenUtils;
import web.multitask.trismegistoservices.utils.JWTokenUtil;
import java.math.BigInteger; import java.math.BigInteger;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
...@@ -20,14 +19,14 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -20,14 +19,14 @@ import org.springframework.web.bind.annotation.RequestBody;
@RestController @RestController
@RequestMapping("/token") @RequestMapping("/token")
@CrossOrigin @CrossOrigin
class JWTokenApi { class tokenRest {
private final UserRepository userRepo = new UserRepository(); private final UserRepository userRepo = new UserRepository();
private final JWTokenUtil jwtTokenUtil; private final tokenUtils jwtTokenUtil;
private final TokenSingleton tokenSingleton; private final web.multitask.trismegistoservices.singleton.tokenSingleton tokenSingleton;
public JWTokenApi(JWTokenUtil jwtTokenUtil, TokenSingleton tokenSingleton) { public tokenRest(tokenUtils jwtTokenUtil, web.multitask.trismegistoservices.singleton.tokenSingleton tokenSingleton) {
this.jwtTokenUtil = jwtTokenUtil; this.jwtTokenUtil = jwtTokenUtil;
this.tokenSingleton = tokenSingleton; this.tokenSingleton = tokenSingleton;
} }
......
package web.multitask.trismegistoservices.services.BBVA;
import okhttp3.*;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import web.multitask.trismegistoservices.utils.CommonUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.zip.GZIPInputStream;
@Service
public class bbvaService {
String globalDate = CommonUtils.getCurrentDateRFC1123();
public JSONObject getToken(String json) {
try {
JSONObject obj = new JSONObject(json);
obj.remove("body");
String host = obj.getString("host");
String formBody = CommonUtils.jsonToUrlEncoded(obj);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://"+host + "/auth/oauth/v2/token")
.post(RequestBody.create(formBody, MediaType.parse("application/x-www-form-urlencoded")))
.build();
Call call = client.newCall(request);
Response response = call.execute();
assert response.body() != null;
String bodyResult = response.body().string();
response.close();
return new JSONObject(bodyResult);
} catch (Exception e) {
System.out.println(e.getMessage());
return new JSONObject().put("status", false).put("message", e.getMessage());
}
}
public String bodyIntoBase64AfterSHA512(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String body = jsonObject.optString("body", "");
byte[] bodyBytes = body.getBytes(StandardCharsets.UTF_8);
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] hashedBytes = digest.digest(bodyBytes);
return Base64.getEncoder().encodeToString(hashedBytes);
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
}
public String txtToSign(String json, String digest) {
JSONObject obj = new JSONObject(json );
String host = obj.getString("host");
String endpoint = obj.getString("endpoint");
String method = obj.getString("method");
return "(request-target):" + method.toLowerCase() + " " + endpoint + "\n"
+ "host:" + host + "\n"
+ "date:" + globalDate + "\n"
+ "digest:SHA-512=" + digest;
}
public String createSignature(String txt) {
PrivateKey privateKey = loadPrivateKey("/tokens/key.p8");
return signContent(txt, privateKey);
}
public PrivateKey loadPrivateKey(String path) {
try(InputStream in = bbvaService.class.getResourceAsStream( path)) {
String keyString = CommonUtils.readInputStream(in);
return loadPrivateKeyFromString(keyString);
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
}
private static PrivateKey loadPrivateKeyFromString(String keyString) throws Exception {
keyString = keyString.replace("-----BEGIN RSA PRIVATE KEY-----", "")
.replace("-----END RSA PRIVATE KEY-----", "")
.trim();
byte[] keyBytes = Base64.getMimeDecoder().decode(keyString);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(spec);
}
public String signContent(String content, PrivateKey privateKey) {
try {
Signature signature = Signature.getInstance("SHA512withRSA");
signature.initSign(privateKey);
signature.update(content.getBytes());
byte[] signedBytes = signature.sign();
return Base64.getEncoder().encodeToString(signedBytes);
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
}
public JSONObject generateQR(String token,String digest,String signature,String json) {
try {
JSONObject obj = new JSONObject(json);
JSONObject body = obj.getJSONObject("body");
String host = obj.getString("host");
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestbody = RequestBody.create(body.toString(), mediaType);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://" + host + "/pe/request-to-pay/v1/qr")
.post(requestbody)
.addHeader("Content-Type", "application/json")
.addHeader("Accept-Encoding", "gzip")
.addHeader("Authorization", "Bearer " + token)
.addHeader("Digest", "SHA-512="+digest)
.addHeader("Signature", "algorithm=\"rsa-sha512\",headers=\"(request-target) host date digest\",signature=\""+signature+"\"")
.addHeader("Host",obj.getString("host"))
.addHeader("Date", globalDate)
.build();
Response response = client.newCall(request).execute();
String bodyResult;
System.out.println("x-request-id = "+response.header("x-request-id"));
if (response.body() != null) {
String encoding = response.header("Content-Encoding", "");
if ("gzip".equalsIgnoreCase(encoding)) {
bodyResult = decompressGzip(response.body().byteStream());
} else {
bodyResult = response.body().string();
}
} else {
bodyResult = "{}";
}
System.out.println(bodyResult);
response.close();
return new JSONObject(bodyResult);
} catch (Exception e) {
System.out.println(e.getMessage());
return new JSONObject().put("status", false).put("message", e.getMessage());
}
}
private String decompressGzip(InputStream compressed) throws IOException {
try (GZIPInputStream gis = new GZIPInputStream(compressed);
BufferedReader reader = new BufferedReader(new InputStreamReader(gis, "UTF-8"))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
}
}
...@@ -2,15 +2,11 @@ package web.multitask.trismegistoservices.services; ...@@ -2,15 +2,11 @@ package web.multitask.trismegistoservices.services;
import java.awt.Color; import java.awt.Color;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.IntStream;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCell;
...@@ -24,7 +20,6 @@ import org.json.JSONArray; ...@@ -24,7 +20,6 @@ import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
......
package web.multitask.trismegistoservices.singleton;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicReference;
@Component
public class bbvaSingleton {
private final AtomicReference<String> token = new AtomicReference<>();
private final AtomicReference<String> digest = new AtomicReference<>();
private final AtomicReference<String> signature = new AtomicReference<>();
public String getToken() {
return this.token.get();
}
public String getDigest () {
return this.digest.get();
}
public String getSignature() {
return this.signature.get();
}
public void setToken(String token){
this.token.set(token);
}
public void setDigest(String digest){
this.digest.set(digest);
}
public void setSignature(String signature){
this.signature.set(signature);
}
}
...@@ -4,7 +4,7 @@ import org.springframework.jdbc.core.JdbcTemplate; ...@@ -4,7 +4,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
public class ThreadLocalSingleton { public class threadLocalSingleton {
private final ThreadLocal<JdbcTemplate> jdbcTemplateThreadLocal = new ThreadLocal<>(); private final ThreadLocal<JdbcTemplate> jdbcTemplateThreadLocal = new ThreadLocal<>();
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
......
...@@ -7,17 +7,17 @@ import org.json.JSONObject; ...@@ -7,17 +7,17 @@ import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.tokenUtils;
@Getter @Getter
@Component @Component
@NoArgsConstructor @NoArgsConstructor
public class TokenSingleton { public class tokenSingleton {
private final JSONArray tokens = new JSONArray(); private final JSONArray tokens = new JSONArray();
@Autowired @Autowired
private JWTokenUtil jwtTokenUtil; private tokenUtils jwtTokenUtil;
public boolean consumeToken(String token) { public boolean consumeToken(String token) {
boolean isAvailable = false; boolean isAvailable = false;
......
package web.multitask.trismegistoservices.utils; package web.multitask.trismegistoservices.utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream; import java.awt.image.BufferedImage;
import java.io.File; import java.io.*;
import java.io.FileInputStream; import java.nio.charset.StandardCharsets;
import java.io.IOException; import java.text.SimpleDateFormat;
import java.util.Base64; import java.util.*;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
...@@ -21,7 +29,7 @@ public class CommonUtils { ...@@ -21,7 +29,7 @@ public class CommonUtils {
private final String FILE_FOLDER = System.getProperty("java.io.tmpdir"); private final String FILE_FOLDER = System.getProperty("java.io.tmpdir");
public String multipartFileToBase64(MultipartFile file) throws IOException { public static String multipartFileToBase64(MultipartFile file) throws IOException {
byte[] byteArray = file.getBytes(); byte[] byteArray = file.getBytes();
return Base64.getEncoder().encodeToString(byteArray); return Base64.getEncoder().encodeToString(byteArray);
} }
...@@ -66,7 +74,7 @@ public class CommonUtils { ...@@ -66,7 +74,7 @@ public class CommonUtils {
return new FileSystemResource(file); return new FileSystemResource(file);
} }
public Resource base64ToResource(String base64, String name) { public static Resource base64ToResource(String base64, String name) {
byte[] byteArray = Base64.getDecoder().decode(base64); byte[] byteArray = Base64.getDecoder().decode(base64);
return new ByteArrayResource(byteArray) { return new ByteArrayResource(byteArray) {
@Override @Override
...@@ -76,7 +84,7 @@ public class CommonUtils { ...@@ -76,7 +84,7 @@ public class CommonUtils {
}; };
} }
public boolean deleteAllFiles() { public static boolean deleteAllFiles() {
try { try {
String tmpFolder = System.getProperty("java.io.tmpdir"); String tmpFolder = System.getProperty("java.io.tmpdir");
File folder = new File(tmpFolder); File folder = new File(tmpFolder);
...@@ -123,4 +131,61 @@ public class CommonUtils { ...@@ -123,4 +131,61 @@ public class CommonUtils {
} }
return byteArrayOutputStream; return byteArrayOutputStream;
} }
public static String minifyJson(String json) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json);
return objectMapper.writeValueAsString(jsonNode);
} catch (Exception e) {
return e.getMessage();
}
}
public static String jsonToUrlEncoded(JSONObject json) {
StringBuilder result = new StringBuilder();
Iterator<String> keys = json.keys();
while (keys.hasNext()) {
String key = keys.next();
String value = json.optString(key);
result.append(key).append("=").append(value);
if (keys.hasNext()) {
result.append("&");
}
}
return result.toString();
}
public static String getCurrentDateRFC1123() {
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.format(new Date());
}
public static String readInputStream(InputStream in) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] temp = new byte[2048];
int bytesRead;
while ((bytesRead = in.read(temp)) != -1) {
buffer.write(temp, 0, bytesRead);
}
return buffer.toString(StandardCharsets.UTF_8.name());
}
public static String generateQRCodeBase64(String message, int width, int height) {
try {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(message, BarcodeFormat.QR_CODE, width, height);
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(qrImage, "PNG", baos);
byte[] imageBytes = baos.toByteArray();
return Base64.getEncoder().encodeToString(imageBytes);
} catch (WriterException | java.io.IOException e) {
System.out.println(e.getMessage());
return null;
}
}
} }
\ No newline at end of file
...@@ -5,13 +5,18 @@ import java.util.HashMap; ...@@ -5,13 +5,18 @@ import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
public class DotEnvUtil { public class dotEnvUtils {
static String detectedOS; static String detectedOS;
public enum OSType { private static final Map<String, String> OS_PATH_MAP = new HashMap<>();
Windows, MacOS, Linux, Other
}; static {
OS_PATH_MAP.put("MacOS", "/opt/dotenv/");
OS_PATH_MAP.put("Linux", "/opt/dotenv/");
OS_PATH_MAP.put("Windows", "abcdefghijklmnopqrstuvwxyz");
}
public static String getOperatingSystemType() { public static String getOperatingSystemType() {
return detectedOS != null ? detectedOS : return detectedOS != null ? detectedOS :
...@@ -19,37 +24,29 @@ public class DotEnvUtil { ...@@ -19,37 +24,29 @@ public class DotEnvUtil {
} }
private static String getOSFromSystemProperty() { private static String getOSFromSystemProperty() {
String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); if (detectedOS == null) {
if (OS.contains("mac") || OS.contains("darwin")) return "MacOS"; String osName = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
if (OS.contains("win")) return "Windows"; if (osName.contains("mac") || osName.contains("darwin")) detectedOS = "MacOS";
if (OS.contains("nux")) return "Linux"; else if (osName.contains("win")) detectedOS = "Windows";
return "Other"; else if (osName.contains("nux")) detectedOS = "Linux";
} else detectedOS = "Other";
}
private static final Map<String, String> OS_PATH_MAP = new HashMap<>(); return detectedOS;
static {
OS_PATH_MAP.put("MacOS", "/opt/dotenv/");
OS_PATH_MAP.put("Linux", "/opt/dotenv/");
OS_PATH_MAP.put("Windows", "abcdefghijklmnopqrstuvwxyz");
} }
public static String getDotEnvPath(String projectName) { public static String getDotEnvPath(String projectName) {
String detectedOs = DotEnvUtil.getOperatingSystemType(); String osType = getOperatingSystemType();
return OS_PATH_MAP.getOrDefault(osType, "") +
return OS_PATH_MAP.getOrDefault(detectedOs, "") ("Windows".equals(osType) ? getWindowsPath(projectName) : projectName);
+ (detectedOs.equals("Windows")
? getWindowsPath(projectName)
: projectName);
} }
private static String getWindowsPath(String projectName) { private static String getWindowsPath(String projectName) {
return OS_PATH_MAP.get("Windows") return OS_PATH_MAP.get("Windows")
.chars() .chars()
.mapToObj(letter -> "/" + (char) letter + ":/dotenv/" + projectName) .mapToObj(letter -> "/" + (char) letter + ":/dotenv/" + projectName)
.filter(path -> new File(path).exists()) .filter(path -> new File(path).exists())
.findFirst() .findFirst()
.orElse(""); .orElse("");
} }
} }
\ No newline at end of file
...@@ -2,23 +2,17 @@ package web.multitask.trismegistoservices.utils; ...@@ -2,23 +2,17 @@ package web.multitask.trismegistoservices.utils;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.ExpiredJwtException;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import web.multitask.trismegistoservices.model.User; import web.multitask.trismegistoservices.model.User;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import javax.annotation.Nullable;
@Component @Component
public class JWTokenUtil implements Serializable{ public class tokenUtils implements Serializable{
@Value("${app.jwtSecret}") @Value("${app.jwtSecret}")
private String jwtSecret; private String jwtSecret;
...@@ -52,7 +46,7 @@ public class JWTokenUtil implements Serializable{ ...@@ -52,7 +46,7 @@ public class JWTokenUtil implements Serializable{
.compact(); .compact();
} }
public String detokenizeData(String token, @Nullable boolean doConsume){ public String detokenizeData(String token, boolean doConsume){
String tokenReturned = ""; String tokenReturned = "";
try{ try{
......
-----BEGIN RSA PRIVATE KEY-----
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
PnpOxl5jWjhzfwkOcU5V+qBdkCd+fWo=
-----END RSA PRIVATE KEY-----
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment