[ADD] AVANCE DE GMAIL Y DRIVE

parent 4020f7a1
...@@ -68,6 +68,11 @@ ...@@ -68,6 +68,11 @@
<version>8.2.0</version> <version>8.2.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId> <artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope> <scope>provided</scope>
...@@ -168,7 +173,7 @@ ...@@ -168,7 +173,7 @@
<dependency> <dependency>
<groupId>com.google.api-client</groupId> <groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId> <artifactId>google-api-client</artifactId>
<version>2.0.0</version> <version>1.35.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.oauth-client</groupId> <groupId>com.google.oauth-client</groupId>
...@@ -178,7 +183,13 @@ ...@@ -178,7 +183,13 @@
<dependency> <dependency>
<groupId>com.google.apis</groupId> <groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId> <artifactId>google-api-services-drive</artifactId>
<version>v3-rev20220815-2.0.0</version> <version>v3-rev197-1.25.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-gmail -->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-gmail</artifactId>
<version>v1-rev110-1.25.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.auth</groupId> <groupId>com.google.auth</groupId>
...@@ -186,15 +197,15 @@ ...@@ -186,15 +197,15 @@
<version>1.3.0</version> <version>1.3.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>com.google.api-client</groupId>
<artifactId>log4j-to-slf4j</artifactId> <artifactId>google-api-client-gson</artifactId>
<version>2.20.0</version> <version>1.21.0</version>
</dependency>
<dependency>
<groupId>com.google.gdata</groupId>
<artifactId>core</artifactId>
<version>1.47.1</version>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.kafka</groupId>-->
<!-- <artifactId>spring-kafka</artifactId>-->
<!-- <version>2.9.0</version>-->
<!-- </dependency>-->
</dependencies> </dependencies>
<build> <build>
<finalName>trismegisto-services</finalName> <finalName>trismegisto-services</finalName>
......
...@@ -3,9 +3,11 @@ package web.multitask.trismegistoservices; ...@@ -3,9 +3,11 @@ package web.multitask.trismegistoservices;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication @SpringBootApplication
@EnableAsync @EnableAsync
@EnableScheduling
public class AppApplication { public class AppApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -8,7 +8,7 @@ import org.springframework.http.ResponseEntity; ...@@ -8,7 +8,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import web.multitask.trismegistoservices.model.DriveRequest; import web.multitask.trismegistoservices.model.DriveRequest;
import web.multitask.trismegistoservices.services.DriveService; import web.multitask.trismegistoservices.services.google.DriveService;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@RestController @RestController
...@@ -25,16 +25,21 @@ public class DriveApi { ...@@ -25,16 +25,21 @@ public class DriveApi {
String folder_id = request.getFolder_id(); String folder_id = request.getFolder_id();
String file_name = request.getFile_name(); String file_name = request.getFile_name();
MultipartFile file = request.getFile(); MultipartFile file = request.getFile();
String responseDrive = driveService.uploadFile(folder_id, file_name, file, new JSONObject()); String base64 = request.getBase64();
String id_file_response = driveService.uploadFile(folder_id, file_name, file, base64);
JSONObject response = new JSONObject(); JSONObject response = new JSONObject();
if (responseDrive == null) { if (id_file_response == null) {
response.put("status", false); response.put("status", false);
response.put("message", "Error al subir el archivo"); response.put("message", "No se pudo subir el archivo," +
" existe multiples razones por las cuales esto puede ocurrir," +
" por favor verifique que el archivo no sea muy grande o que el formato sea correcto");
return ResponseEntity.badRequest().body(response.toMap()); return ResponseEntity.badRequest().body(response.toMap());
} else { } else {
response.put("status", true); response.put("status", true);
response.put("message", "Archivo subido correctamente"); response.put("message", "Archivo subido correctamente");
response.put("file_id", responseDrive); response.put("file_id", id_file_response);
response.put("file_url", "https://drive.google.com/file/d/" + id_file_response + "/view?usp=sharing");
response.put("download_url", "https://drive.google.com/uc?export=download&id="+id_file_response);
return ResponseEntity.ok(response.toMap()); return ResponseEntity.ok(response.toMap());
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -44,8 +49,7 @@ public class DriveApi { ...@@ -44,8 +49,7 @@ public class DriveApi {
@GetMapping(path = "/public/download/{id}") @GetMapping(path = "/public/download/{id}")
public ResponseEntity<?> downloadFile(@PathVariable String id, @Nullable @RequestParam(name = "base64") Boolean base64) { public ResponseEntity<?> downloadFile(@PathVariable String id, @Nullable @RequestParam(name = "base64") Boolean base64) {
if(base64 == null) base64 = false; return driveService.getFile(id, !(base64 == null));
return driveService.getFile(id, base64);
} }
......
// package web.multitask.app.api; // package web.multitask.app.api;
package web.multitask.trismegistoservices.api;
// import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
// import io.github.cdimascio.dotenv.Dotenv; import io.github.cdimascio.dotenv.Dotenv;
// import org.json.JSONObject; import lombok.AllArgsConstructor;
// import org.springframework.http.MediaType; import org.json.JSONObject;
// import org.springframework.http.ResponseEntity; import org.springframework.http.MediaType;
// import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.http.ResponseEntity;
// import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.ModelAttribute;
// import web.multitask.app.model.EmailRequest; import org.springframework.web.bind.annotation.RestController;
// import web.multitask.app.mysql.EmailMysql; import org.springframework.web.bind.annotation.RequestMapping;
// import web.multitask.app.service.EmailService; import org.springframework.web.bind.annotation.RequestMethod;
// import org.springframework.web.bind.annotation.RequestMapping; import web.multitask.trismegistoservices.model.GmailRequest;
// import org.springframework.web.bind.annotation.RequestMethod; import web.multitask.trismegistoservices.mysql.EmailMysql;
import web.multitask.trismegistoservices.services.google.GmailService;
// @RestController
// @RequestMapping("/email") @RestController
@RequestMapping("/gmail")
// public class EmailApi { @AllArgsConstructor
// private final Dotenv dotenv; public class EmailApi {
// private final EmailService emailService; private final Dotenv dotenv;
// private final EmailMysql emailMysql; private final GmailService emailService;
private final EmailMysql emailMysql;
// public EmailApi(EmailService emailService, EmailMysql emailMysql, Dotenv dotenv) {
// this.emailService = emailService; @RequestMapping(path = "/public/generate", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
// this.emailMysql = emailMysql; public ResponseEntity<?> full(@ModelAttribute GmailRequest request) {
// this.dotenv = dotenv; try {
// } MimeMessage message = emailService.htmlMessage(request);
JSONObject response = emailService.send(message);
// @RequestMapping(path = "/public/simple_generate", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) return ResponseEntity.ok(response.toMap());
// public ResponseEntity<?> simple(@ModelAttribute EmailRequest request) { } catch (Exception e) {
// try { return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
// MimeMessage message = emailService.simpleMessage(request); }
// JSONObject response = emailService.send(message); }
// return ResponseEntity.ok(response.toMap());
// } catch (Exception e) { @RequestMapping(path = "/service/confirmation", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
// return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap()); public ResponseEntity<?> template(@ModelAttribute GmailRequest request) {
// } try {
// } String URL = dotenv.get("URL_CONFIRMATION");
assert URL != null;
// @RequestMapping(path = "/private/generate", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) JSONObject extra = request.getExtra();
// public ResponseEntity<?> full(@ModelAttribute EmailRequest request) { JSONObject response = emailMysql.getHTMLTemplate(extra);
// try { if(response.getBoolean("status")){
// MimeMessage message = emailService.htmlMessage(request); JSONObject data = response.getJSONArray("data").getJSONObject(0);
// JSONObject response = emailService.send(message); String html = data.getString("html");
// return ResponseEntity.ok(response.toMap()); html = html.replaceAll("TOKEN", extra.getString("token"));
// } catch (Exception e) { html = html.replaceAll("URL", URL);
// return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap()); request.setBody(html);
// } MimeMessage message = emailService.htmlMessage(request);
// } JSONObject responseEmail = emailService.send(message);
return ResponseEntity.ok(responseEmail.toMap());
// @RequestMapping(path = "/service/confirmation", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) }else{
// public ResponseEntity<?> template(@ModelAttribute EmailRequest request) { return ResponseEntity.internalServerError().body(new JSONObject().put("message", response.getString("message")).put("status", false).toMap());
// try { }
// String URL = dotenv.get("URL_CONFIRMATION"); } catch (Exception e) {
// assert URL != null; return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
// JSONObject extra = request.getExtra(); }
// JSONObject response = emailMysql.getHTMLTemplate(extra); }
// if(response.getBoolean("status")){
// JSONObject data = response.getJSONArray("data").getJSONObject(0); }
// String html = data.getString("html"); \ No newline at end of file
// html = html.replaceAll("TOKEN", extra.getString("token"));
// html = html.replaceAll("URL", URL);
// request.setBody(html);
// MimeMessage message = emailService.htmlMessage(request);
// JSONObject responseEmail = emailService.send(message);
// return ResponseEntity.ok(responseEmail.toMap());
// }else{
// return ResponseEntity.internalServerError().body(new JSONObject().put("message", response.getString("message")).put("status", false).toMap());
// }
// } catch (Exception e) {
// return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
// }
// }
// }
\ No newline at end of file
...@@ -8,6 +8,7 @@ import org.springframework.security.core.userdetails.UserDetails; ...@@ -8,6 +8,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.UserRespository; import web.multitask.trismegistoservices.repository.UserRespository;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
import java.math.BigInteger; import java.math.BigInteger;
...@@ -25,6 +26,18 @@ class JWTokenApi { ...@@ -25,6 +26,18 @@ class JWTokenApi {
private final JWTokenUtil jwtTokenUtil; private final JWTokenUtil jwtTokenUtil;
private final UserRespository userRepo; private final UserRespository userRepo;
private final TokenSingleton tokenSingleton;
@PostMapping("/database")
public ResponseEntity<?> setDatabase(@RequestBody String token) {
JSONObject json = new JSONObject(token);
if(json.has("db") && json.has("user") && json.has("password") && json.has("url")) {
String dataToken = jwtTokenUtil.generateDataSource(json);
return ResponseEntity.ok(new JSONObject().put("token", dataToken).put("message", "Generated").put("status", true).toMap());
}else{
return ResponseEntity.status(400).body(new JSONObject().put("token", "").put("message", "Invalid Data").put("status", false).toMap());
}
}
@PostMapping("/authenticate") @PostMapping("/authenticate")
public ResponseEntity<?> createAuthenticationToken(@RequestBody String authenticationRequest) { public ResponseEntity<?> createAuthenticationToken(@RequestBody String authenticationRequest) {
...@@ -37,7 +50,12 @@ class JWTokenApi { ...@@ -37,7 +50,12 @@ class JWTokenApi {
response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false); response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false);
return ResponseEntity.status(401).body(response.toMap()); return ResponseEntity.status(401).body(response.toMap());
} else { } else {
return ResponseEntity.ok(new JSONObject().put("token", jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", BigInteger.valueOf(3600000)))).put("message", "Generated").put("status", true).toMap()); boolean onelife = json.optBoolean("onelife", false);
String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)));
if(onelife){
tokenSingleton.addToken(generatedToken);
}
return ResponseEntity.ok(new JSONObject().put("token",generatedToken).put("message", "Generated").put("status", true).toMap());
} }
} catch (Exception e) { } catch (Exception e) {
response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false); response = new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false);
...@@ -89,7 +107,12 @@ class JWTokenApi { ...@@ -89,7 +107,12 @@ class JWTokenApi {
if (userDetails == null) { if (userDetails == null) {
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap()); return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
} else if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("SERVICE"))) { } else if (userDetails.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("SERVICE"))) {
return ResponseEntity.ok(new JSONObject().put("token", jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", BigInteger.valueOf(3600000)))).put("message", "Generated").put("status", true).toMap()); boolean onelife = json.optBoolean("onelife", false);
String generatedToken = jwtTokenUtil.generateToken((User) userDetails, json.optBigInteger("ms", onelife ? BigInteger.valueOf(0) : BigInteger.valueOf(3600000)));
if(onelife){
tokenSingleton.addToken(generatedToken);
}
return ResponseEntity.ok(new JSONObject().put("token",generatedToken).put("message", "Generated").put("status", true).toMap());
} else { } else {
return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap()); return ResponseEntity.status(401).body(new JSONObject().put("token", "").put("message", "Invalid Credentials").put("status", false).toMap());
} }
...@@ -98,7 +121,7 @@ class JWTokenApi { ...@@ -98,7 +121,7 @@ class JWTokenApi {
@PostMapping("/remaining") @PostMapping("/remaining")
public ResponseEntity<?> remainingTime(@RequestBody String token) { public ResponseEntity<?> remainingTime(@RequestBody String token) {
JSONObject json = new JSONObject(token); JSONObject json = new JSONObject(token);
try{ try {
int remaining = jwtTokenUtil.getExperyTime(json.getString("token")); int remaining = jwtTokenUtil.getExperyTime(json.getString("token"));
return ResponseEntity.ok(new JSONObject().put("remaining", remaining).put("message", "OK").put("status", true).toMap()); return ResponseEntity.ok(new JSONObject().put("remaining", remaining).put("message", "OK").put("status", true).toMap());
} catch (Exception e) { } catch (Exception e) {
......
...@@ -5,25 +5,29 @@ import org.json.JSONArray; ...@@ -5,25 +5,29 @@ import org.json.JSONArray;
import org.json.JSONObject; 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.ProcedureMysql; import web.multitask.trismegistoservices.mysql.RoutineSql;
import web.multitask.trismegistoservices.repository.UserRespository; import web.multitask.trismegistoservices.repository.UserRespository;
@RestController @RestController
@CrossOrigin("*") @CrossOrigin("*")
@RequestMapping("/api") @RequestMapping("/api")
@AllArgsConstructor @AllArgsConstructor
public class AppApi { public class RoutineApi {
final ProcedureMysql procedureMysql; final RoutineSql procedureMysql;
final UserRespository userRepo; final UserRespository userRepo;
@PostMapping("/private/procedure") @PostMapping("/public/routine")
public ResponseEntity<?> callProcedure(@RequestBody String body) { public ResponseEntity<?> callRoutine(@RequestBody String body) {
JSONObject json = new JSONObject(body); JSONObject json = new JSONObject(body);
if (json.has("procedure")) { if (json.has("routine")) {
try { try {
JSONArray params = json.isNull("params") ? new JSONArray() : json.getJSONArray("params"); JSONArray params = json.isNull("params") ? new JSONArray() : json.getJSONArray("params");
JSONObject response = procedureMysql.ProcedureExecution(json.getString("procedure"), json.getString("database"), params.toList().toArray()); String routine = json.getString("routine");
String database = json.optString("database");
JSONObject response = procedureMysql.routineExecutor(routine,
database,
params.toList().toArray());
return ResponseEntity.ok(response.toMap()); return ResponseEntity.ok(response.toMap());
} catch (Exception e) { } catch (Exception e) {
return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap()); return ResponseEntity.internalServerError().body(new JSONObject().put("message", e.getMessage()).put("status", false).toMap());
......
// package web.multitask.trismegistoservices.config; package web.multitask.trismegistoservices.config;
// import org.springframework.context.annotation.Bean; 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.DotEnvUtil;
// @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(DotEnvUtil.getDotEnvPath("trismegisto-asistencia")).load();
// } }
// } }
\ No newline at end of file \ No newline at end of file
// package web.multitask.app.config; //
// package web.multitask.trismegistoservices.config;
// import java.util.Properties; // import java.util.Properties;
//
// import javax.mail.Session; // import javax.mail.Session;
//
// import lombok.AllArgsConstructor;
// import lombok.NoArgsConstructor;
// import org.springframework.context.annotation.Bean; // 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;
//
// @Configuration // @Configuration
//// @AllArgsConstructor
// public class EmailConfig { // public class EmailConfig {
//
// Dotenv dotenv; //// Dotenv dotenv;
//
// public EmailConfig(Dotenv dotenv) {
// this.dotenv = dotenv;
// }
// @Bean // @Bean
// public Session setSession() { // public Session setSession() {
// Properties properties = new Properties(); // Properties properties = new Properties();
// String enabled = dotenv.get("EMAIL_STARTTLS_ENABLE"); // String enabled = "true";//dotenv.get("EMAIL_STARTTLS_ENABLE");
// String email = dotenv.get("EMAIL_CORREO"); // String email = "trismegisto.planilla@sacooliveros.edu.pe";//dotenv.get("EMAIL_CORREO");
// String password = dotenv.get("EMAIL_PASSWORD"); // String password = "Saco1357$";//dotenv.get("EMAIL_PASSWORD");
// String port = dotenv.get("EMAIL_PORT"); // String port = "587";//dotenv.get("EMAIL_PORT");
// String host = dotenv.get("EMAIL_HOST"); // String host = "smtp.gmail.com";//dotenv.get("EMAIL_HOST");
// properties.put("mail.smtp.host", host); // properties.put("mail.smtp.host", host);
// properties.put("mail.smtp.starttls.enable", enabled); // properties.put("mail.smtp.starttls.enable", enabled);
// properties.put("mail.smtp.port", port); // properties.put("mail.smtp.port", port);
...@@ -33,11 +32,11 @@ ...@@ -33,11 +32,11 @@
// properties.put("mail.smtp.password", password); // properties.put("mail.smtp.password", password);
// properties.put("mail.smtp.user", email); // properties.put("mail.smtp.user", email);
// properties.put("mail.smtp.auth", enabled); // properties.put("mail.smtp.auth", enabled);
// properties.put("mail.smtp.ssl.trust", "smtp.gmail.com"); // properties.put("mail.smtp.ssl.trust", "smtp.gmail.com");
// properties.put("mail.smtp.socketFactory.port", port); // properties.put("mail.smtp.socketFactory.port", port);
// properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
// properties.put("mail.smtp.ssl.protocols", "TLSv1.2"); // properties.put("mail.smtp.ssl.protocols", "TLSv1.2");
// return Session.getDefaultInstance(properties); // return Session.getDefaultInstance(properties);
// } // }
//
// } // }
package web.multitask.trismegistoservices.config; package web.multitask.trismegistoservices.config;
import java.io.FileNotFoundException; import java.io.*;
import java.io.IOException; import java.net.HttpURLConnection;
import java.io.InputStream; import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.Collections; import java.util.*;
import java.util.List; 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.GoogleCredential;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import org.json.JSONObject;
import org.springframework.context.annotation.Bean; 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;
...@@ -17,33 +24,108 @@ import com.google.api.services.drive.DriveScopes; ...@@ -17,33 +24,108 @@ import com.google.api.services.drive.DriveScopes;
import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials; import com.google.auth.oauth2.GoogleCredentials;
import javax.annotation.PostConstruct;
@Configuration @Configuration
public class GoogleConfig { public class GoogleConfig {
private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE); private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
private static final String CREDENTIALS_FILE_PATH = "/trimegistro-mongo-3e687dba9acb.json"; private static final String OAUTH2 = "/oAuth2.json";
private static final String CREDENTIALS_FOLDER_PATH = "/tokens"; private static final String CREDENTIALS_FOLDER_PATH = "/tokens";
private final String APPLICATION_NAME = "FullService Application";
@Bean private String refresh_token_gmail = null;
private String refresh_token_drive = null;
private String client_id = null;
private String client_secret = null;
@PostConstruct
public void getGoogleCredentials() {
try {
InputStream in = GoogleConfig.class.getResourceAsStream(CREDENTIALS_FOLDER_PATH + OAUTH2);
if (in == null)
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FOLDER_PATH + OAUTH2);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
client_id = clientSecrets.getDetails().getClientId();
client_secret = clientSecrets.getDetails().getClientSecret();
refresh_token_gmail = clientSecrets.getDetails().get("gmail_refresh_token").toString();
refresh_token_drive = clientSecrets.getDetails().get("drive_refresh_token").toString();
}catch (IOException e) {
System.out.println("Error: " + e);
}
}
public Drive getDrive() { public Drive getDrive() {
try { try {
String APPLICATION_NAME = "FullService Application"; NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); Credential authorize = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); .setJsonFactory(JSON_FACTORY)
return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, .setClientSecrets(client_id, client_secret)
new HttpCredentialsAdapter(getCredentials(HTTP_TRANSPORT))) .build()
.setApplicationName(APPLICATION_NAME) .setAccessToken(getAccessToken(refresh_token_drive))
.build(); .setRefreshToken(refresh_token_drive);
return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, authorize)
.setApplicationName(APPLICATION_NAME).build();
} catch (GeneralSecurityException | IOException e) { } catch (GeneralSecurityException | IOException e) {
System.out.println("Error: " + e); System.out.println("Error: " + e);
return null; return null;
} }
} }
GoogleCredentials getCredentials(final NetHttpTransport HTTP_TRANSPORT) public Gmail getGmail() {
throws IOException { try {
InputStream in = GoogleConfig.class.getResourceAsStream(CREDENTIALS_FOLDER_PATH+CREDENTIALS_FILE_PATH); NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
if (in == null) throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FOLDER_PATH+CREDENTIALS_FILE_PATH); Credential authorize = new GoogleCredential.Builder().setTransport(GoogleNetHttpTransport.newTrustedTransport())
return GoogleCredentials.fromStream(in).createScoped(SCOPES); .setJsonFactory(JSON_FACTORY)
.setClientSecrets(client_id, client_secret)
.build()
.setAccessToken(getAccessToken(refresh_token_gmail))
.setRefreshToken(refresh_token_gmail);
return new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, authorize)
.setApplicationName(APPLICATION_NAME).build();
} catch (GeneralSecurityException | IOException e) {
System.out.println("Error: " + e);
return null;
}
} }
public String getAccessToken(String refresh_token) {
try {
Map<String, Object> params = new LinkedHashMap<>();
params.put("grant_type", "refresh_token");
params.put("client_id", client_id);
params.put("client_secret", client_secret);
params.put("refresh_token",refresh_token);
StringBuilder postData = new StringBuilder();
for (Map.Entry<String, Object> param : params.entrySet()) {
if (postData.length() != 0) {
postData.append('&');
}
postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
}
byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8);
URL url = new URL("https://accounts.google.com/o/oauth2/token");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.getOutputStream().write(postDataBytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuilder buffer = new StringBuilder();
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
return json.getString("access_token");
} catch (Exception ex) {
System.out.println("Error: " + ex);
}
return null;
}
} }
\ No newline at end of file
...@@ -10,7 +10,7 @@ public class MVCConfig ...@@ -10,7 +10,7 @@ public class MVCConfig
implements WebMvcConfigurer { implements WebMvcConfigurer {
@Override @Override
public void addCorsMappings(@NonNull CorsRegistry registry) { public void addCorsMappings(@NonNull CorsRegistry registry) {
registry.addMapping("/**") // registry.addMapping("/**")
.allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH"); // .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
} }
} }
\ No newline at end of file
...@@ -19,6 +19,8 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; ...@@ -19,6 +19,8 @@ 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.repository.UserRespository; import web.multitask.trismegistoservices.repository.UserRespository;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
@Configuration @Configuration
...@@ -28,6 +30,8 @@ public class SecurityConfig{ ...@@ -28,6 +30,8 @@ public class SecurityConfig{
private final UserRespository userRepo; private final UserRespository userRepo;
private final JWTokenUtil jwtTokenUtil; private final JWTokenUtil jwtTokenUtil;
private final TokenSingleton tokenSingleton;
private ThreadLocalSingleton threadLocalSingleton;
@Bean @Bean
AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
...@@ -46,12 +50,8 @@ public class SecurityConfig{ ...@@ -46,12 +50,8 @@ public class SecurityConfig{
.regexMatchers(".*/public/.*").permitAll() .regexMatchers(".*/public/.*").permitAll()
.regexMatchers(".*/service/.*").hasAnyAuthority("ADMIN", "SERVICE") .regexMatchers(".*/service/.*").hasAnyAuthority("ADMIN", "SERVICE")
.antMatchers(HttpMethod.GET, "/**").permitAll() .antMatchers(HttpMethod.GET, "/**").permitAll()
// .antMatchers(HttpMethod.POST, "/**").permitAll()
.antMatchers("/token/**").permitAll()); .antMatchers("/token/**").permitAll());
http.addFilterBefore(new JWTokenFilter(jwtTokenUtil, userRepo, tokenSingleton,threadLocalSingleton), UsernamePasswordAuthenticationFilter.class);
// .anyRequest()
// .authenticated());
http.addFilterBefore(new JWTokenFilter(jwtTokenUtil, userRepo), UsernamePasswordAuthenticationFilter.class);
return http.build(); return http.build();
} }
...@@ -60,16 +60,15 @@ public class SecurityConfig{ ...@@ -60,16 +60,15 @@ public class SecurityConfig{
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
} }
@Bean // @Bean
CorsFilter corsFilter() { // CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration(); // CorsConfiguration config = new CorsConfiguration();
// config.setAllowCredentials(true); // config.addAllowedOrigin("*");
config.addAllowedOrigin("*"); // config.addAllowedHeader("*");
config.addAllowedHeader("*"); // config.addAllowedMethod("*");
config.addAllowedMethod("*"); // source.registerCorsConfiguration("/**", config);
source.registerCorsConfiguration("/**", config); // return new CorsFilter(source);
return new CorsFilter(source); // }
}
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ import javax.servlet.FilterChain; ...@@ -4,6 +4,7 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException; 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 lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -11,15 +12,18 @@ import org.jetbrains.annotations.NotNull; ...@@ -11,15 +12,18 @@ import org.jetbrains.annotations.NotNull;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder; 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.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import io.jsonwebtoken.io.IOException; import io.jsonwebtoken.io.IOException;
import web.multitask.trismegistoservices.repository.UserRespository; import web.multitask.trismegistoservices.repository.UserRespository;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton;
import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
@Component @Component
...@@ -30,24 +34,34 @@ public class JWTokenFilter extends OncePerRequestFilter { ...@@ -30,24 +34,34 @@ public class JWTokenFilter extends OncePerRequestFilter {
private JWTokenUtil jwtTokenUtil = null; private JWTokenUtil jwtTokenUtil = null;
private UserRespository userRepo = null; private UserRespository userRepo = null;
private TokenSingleton tokenSingleton = null;
private ThreadLocalSingleton threadLocalSingleton = null;
@Override @Override
protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain chain) protected void doFilterInternal(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull FilterChain chain)
throws ServletException, IOException, java.io.IOException { throws ServletException, 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");
String token; String token;
try { try {
token = Authorization.split(" ")[1]; token = Authorization.split(" ")[1];
} catch (Exception e) { } catch (Exception e) {
token = null; token = null;
} }
if(dbConnection != null && !dbConnection.isEmpty()){
String dataBaseGotten = jwtTokenUtil.getDataToken(dbConnection);
DataSource ds = getDataSource(new JSONObject(dataBaseGotten));
threadLocalSingleton.setJdbcTemplate(new JdbcTemplate(ds));
}
if (token == null || token.isEmpty()) { if (token == null || token.isEmpty()) {
chain.doFilter(request, response); chain.doFilter(request, response);
} else { } else {
if (jwtTokenUtil.validateToken(token)) { 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(
...@@ -61,4 +75,28 @@ public class JWTokenFilter extends OncePerRequestFilter { ...@@ -61,4 +75,28 @@ public class JWTokenFilter extends OncePerRequestFilter {
} }
} }
} }
private DriverManagerDataSource getDataSource(JSONObject json) {
String driver = "";
switch (json.getString("db")) {
case "mysql":
driver = "com.mysql.cj.jdbc.Driver";
break;
case "postgresql":
driver = "org.postgresql.Driver";
break;
case "oracle":
driver = "oracle.jdbc.driver.OracleDriver";
break;
case "sqlserver":
driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
break;
}
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(json.getString("url"));
dataSource.setUsername(json.getString("user"));
dataSource.setPassword(json.getString("password"));
return dataSource;
}
} }
\ No newline at end of file
...@@ -8,7 +8,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -8,7 +8,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.OutputStream; import java.io.OutputStream;
public interface IDriveService { public interface IDriveService {
String uploadFile(String folder_id, String file_name, MultipartFile file, JSONObject base64); String uploadFile(String folder_id, String file_name, MultipartFile file, String base64);
String createFolder(String folder_id, String folder_name); String createFolder(String folder_id, String folder_name);
String deleteFile(String file_id); String deleteFile(String file_id);
String deleteFolder(String folder_id); String deleteFolder(String folder_id);
......
...@@ -13,8 +13,6 @@ public class DriveRequest { ...@@ -13,8 +13,6 @@ public class DriveRequest {
private String folder_id; private String folder_id;
private String file_name; private String file_name;
private MultipartFile file; private MultipartFile file;
private String base64;
private String base64_name;
private String base64_file;
} }
\ No newline at end of file
...@@ -9,7 +9,9 @@ import lombok.Setter; ...@@ -9,7 +9,9 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
public class EmailRequest { public class GmailRequest {
private String from;
private String alias;
private String to; private String to;
private String cc; private String cc;
private String bcc; private String bcc;
......
package web.multitask.trismegistoservices.mysql; package web.multitask.trismegistoservices.mysql;
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;
import java.util.Objects;
@Service @Service
public class ProcedureMysql { @AllArgsConstructor
public class RoutineSql {
private final JdbcTemplate jdbcTemplate;
public ProcedureMysql(JdbcTemplate jdbcTemplate) { private final ThreadLocalSingleton threadLocalSingleton;
this.jdbcTemplate = jdbcTemplate;
public JSONObject routineExecutor(String routine, String database, Object[] params) {
String jdbcUrl;
JdbcTemplate jdbcTemplate = threadLocalSingleton.getJdbcTemplate();
try {
jdbcUrl = Objects.requireNonNull(jdbcTemplate.getDataSource()).getConnection().getMetaData().getURL();
} catch (Exception e) {
return new JSONObject().put("message", e.getMessage()).put("status", false);
}
switch (jdbcUrl.split(":")[1]) {
case "mysql":
return mysqlProcedure(routine, database, params, jdbcTemplate);
case "postgresql":
return postgreFunction(routine, database, params, jdbcTemplate);
default:
return new JSONObject().put("message", "Database not supported").put("status", false);
}
} }
public JSONObject ProcedureExecution(String procedure ,String database, Object[] params) { private JSONObject mysqlProcedure(String routine, String database, Object[] params, JdbcTemplate jdbcTemplate) {
try { try {
StringBuilder query = new StringBuilder("CALL " + database + "." + procedure); StringBuilder query = new StringBuilder("CALL " + database + "." + routine);
if (params.length > 0) { if (params.length > 0) {
query.append("("); query.append("(");
...@@ -32,9 +52,9 @@ public class ProcedureMysql { ...@@ -32,9 +52,9 @@ public class ProcedureMysql {
query.append(")"); query.append(")");
} }
String checkProcedure = "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '" + database + "' AND routine_name = '" + procedure; String checkProcedure = "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '" + database + "' AND routine_name = '" + routine + "'";
List<Map<String, Object>> countProcedure = jdbcTemplate.queryForList(checkProcedure); List<Map<String, Object>> countProcedure = jdbcTemplate.queryForList(checkProcedure);
if (countProcedure.get(0).get("COUNT(*)").toString().equals("0")) { if (countProcedure.get(0).get("COUNT(*)").toString().equals("0")) {
return new JSONObject().put("message", "Procedure not found").put("status", false); return new JSONObject().put("message", "Procedure not found").put("status", false);
} }
...@@ -49,4 +69,39 @@ public class ProcedureMysql { ...@@ -49,4 +69,39 @@ public class ProcedureMysql {
return new JSONObject().put("data", new JSONObject()).put("message", e.getMessage()).put("status", false); return new JSONObject().put("data", new JSONObject()).put("message", e.getMessage()).put("status", false);
} }
} }
private JSONObject postgreFunction(String routine, String database, Object[] params,JdbcTemplate jdbcTemplate) {
try {
StringBuilder query = new StringBuilder("SELECT * FROM " + database + "." + routine);
if (params.length > 0) {
query.append("(");
for (int i = 0; i < params.length; i++) {
query.append("?");
if (i < params.length - 1) {
query.append(",");
}
}
query.append(")");
}
String checkFunction = "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '" + database + "' AND routine_name = '" + routine + "'";
List<Map<String, Object>> countFunction = jdbcTemplate.queryForList(checkFunction);
if (countFunction.get(0).get("count").toString().equals("0")) {
return new JSONObject().put("message", "Function not found").put("status", false);
}
List<Map<String, Object>> list = jdbcTemplate.queryForList(query.toString(), params);
JSONObject result = new JSONObject();
result.put("data", list);
result.put("message", "Success");
result.put("status", true);
return result;
} catch (Exception e) {
System.out.println(e.getMessage());
return new JSONObject().put("data", new JSONObject()).put("message", e.getMessage()).put("status", false);
}
}
} }
\ No newline at end of file
package web.multitask.trismegistoservices.services;
// package web.multitask.app.service;
// import java.io.ByteArrayInputStream;
// import java.io.File;
// import java.io.FileInputStream;
// import java.io.FileNotFoundException;
// import java.io.FileOutputStream;
// import java.io.IOException;
// import java.io.InputStream;
// import java.io.UnsupportedEncodingException;
// import java.util.Objects;
// import java.util.Properties;
// import java.util.stream.Collectors;
// import java.util.stream.Stream;
// import javax.activation.DataHandler;
// import javax.activation.FileDataSource;
// import javax.mail.BodyPart;
// import javax.mail.MessagingException;
// import javax.mail.Multipart;
// import javax.mail.Session;
// import javax.mail.Transport;
// import javax.mail.internet.AddressException;
// import javax.mail.internet.InternetAddress;
// import javax.mail.internet.MimeBodyPart;
// import javax.mail.internet.MimeMessage;
// import javax.mail.internet.MimeMultipart;
// import org.json.JSONObject;
// import org.springframework.stereotype.Service;
// import org.springframework.web.multipart.MultipartFile;
// import io.github.cdimascio.dotenv.Dotenv;
// import web.multitask.app.model.EmailRequest;
// import web.multitask.app.utils.CommonUtils;
// @Service
// public class EmailService {
// Dotenv dotenv;
// Session session;
// CommonUtils commonUtils;
// public EmailService(Dotenv dotenv, Session session, CommonUtils commonUtils) {
// this.dotenv = dotenv;
// this.session = session;
// this.commonUtils = commonUtils;
// }
// public MimeMessage htmlMessage(EmailRequest request) throws UnsupportedEncodingException {
// try {
// String email = dotenv.get("EMAIL_CORREO");
// MimeMessage message = new MimeMessage(session);
// message.setFrom(new InternetAddress(email, "FULLSERVICE APPLICATION"));
// message.setSender(new InternetAddress(email, "FULLSERVICE APPLICATION"));
// message.setRecipients(MimeMessage.RecipientType.TO,
// buildRecipients(new JSONObject().put("to", request.getTo()), "to"));
// if (request.getCc() != null) {
// message.setRecipients(MimeMessage.RecipientType.CC,
// buildRecipients(new JSONObject().put("cc", request.getCc()), "cc"));
// }
// if (request.getBcc() != null) {
// message.setRecipients(MimeMessage.RecipientType.BCC,
// buildRecipients(new JSONObject().put("bcc", request.getBcc()), "bcc"));
// }
// message.setSubject(request.getSubject());
// MimeBodyPart texto = new MimeBodyPart();
// texto.setContent(request.getBody(), "text/html; charset=utf-8");
// MimeMultipart multiParte = new MimeMultipart();
// multiParte.addBodyPart(texto);
// try {
// String file_folder = dotenv.get("FILE_FOLDER");
// MultipartFile[] files = request.getFiles();
// for (MultipartFile file : files) {
// BodyPart adjunto = new MimeBodyPart();
// String fileName = file.getOriginalFilename();
// convertByteArrayToFile(file.getBytes(), fileName, file_folder);
// FileDataSource fds = new FileDataSource(file_folder +"/"+ fileName);
// adjunto.setDataHandler(new DataHandler(fds));
// adjunto.setFileName(fds.getName());
// multiParte.addBodyPart(adjunto);
// }
// } catch (Exception e) {
// System.out.println(e.getMessage());
// }
// message.setContent(multiParte);
// return message;
// } catch (MessagingException e) {
// System.out.println(e.getMessage());
// return null;
// }
// }
// public void convertByteArrayToFile (byte[] byteArray, String fileName, String file_folder){
// try (FileOutputStream fos = new FileOutputStream(file_folder +"/"+ fileName)) {
// fos.write(byteArray);
// }catch(Exception e){
// System.out.println(e.getMessage());
// }
// }
// public MimeMessage simpleMessage(EmailRequest request) throws UnsupportedEncodingException {
// try {
// MimeMessage message = new MimeMessage(session);
// String email = dotenv.get("EMAIL_CORREO");
// message.setFrom(new InternetAddress(email, "FULLSERVICE APPLICATION"));
// message.setSender(new InternetAddress(email, "FULLSERVICE APPLICATION"));
// message.setRecipients(MimeMessage.RecipientType.TO,
// buildRecipients(new JSONObject().put("to", request.getTo()), "to"));
// message.setSubject(request.getSubject());
// message.setText(request.getBody());
// return message;
// } catch (MessagingException e) {
// e.printStackTrace();
// return null;
// }
// }
// public JSONObject send(MimeMessage message) {
// try {
// Transport t = session.getTransport("smtp");
// String email = dotenv.get("EMAIL_CORREO");
// String password = dotenv.get("EMAIL_PASSWORD");
// t.connect(email, password);
// t.sendMessage(message, message.getAllRecipients());
// t.close();
// // CommonUtils.deleteAllFiles();
// boolean deletes = commonUtils.deleteAllFiles();
// if(!deletes){
// System.out.println("Error al eliminar los archivos");
// }
// return new JSONObject().put("message", "OK").put("status", true);
// } catch (Exception e) {
// System.out.println(e.getMessage());
// return new JSONObject().put("message", e.getMessage()).put("status", false);
// }
// }
// public InternetAddress[] buildRecipients(JSONObject json, String type) {
// String[] recipients = json.optString(type).split(",");
// InternetAddress[] addresses = new InternetAddress[recipients.length];
// Stream.of(recipients).map(recipient -> {
// try {
// return new InternetAddress(recipient);
// } catch (AddressException e) {
// System.out.println(e.getMessage());
// return null;
// }
// }).filter(Objects::nonNull).collect(Collectors.toList()).toArray(addresses);
// return addresses;
// }
// }
\ No newline at end of file
package web.multitask.trismegistoservices.services; package web.multitask.trismegistoservices.services.google;
import java.io.*; import java.io.*;
import java.nio.file.Files;
import java.util.Collections; import java.util.Collections;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -27,7 +28,7 @@ public class DriveService implements IDriveService { ...@@ -27,7 +28,7 @@ public class DriveService implements IDriveService {
private final CommonUtils commonUtils; private final CommonUtils commonUtils;
@Override @Override
public String uploadFile(String folder_id, String file_name, MultipartFile file, JSONObject base64) { public String uploadFile(String folder_id, String file_name, MultipartFile file, String base64) {
try { try {
if (null != file) { if (null != file) {
File fileMetadata = new File(); File fileMetadata = new File();
...@@ -40,6 +41,20 @@ public class DriveService implements IDriveService { ...@@ -40,6 +41,20 @@ public class DriveService implements IDriveService {
new ByteArrayInputStream(file.getBytes()))) new ByteArrayInputStream(file.getBytes())))
.setFields("id").execute(); .setFields("id").execute();
return uploadFile.getId(); return uploadFile.getId();
}else if (!base64.isEmpty()) {
java.io.File fileBytes = commonUtils.base64ToFile(base64,file_name);
File fileMetadata = new File();
fileMetadata.setParents(Collections.singletonList(folder_id));
fileMetadata.setName(file_name);
File uploadFile = googleConfig.getDrive()
.files()
.create(fileMetadata, new InputStreamContent(
MediaType.APPLICATION_OCTET_STREAM_VALUE,
Files.newInputStream(fileBytes.toPath())))
.setFields("id").execute();
return uploadFile.getId();
}else{
return null;
} }
} catch (Exception e) { } catch (Exception e) {
System.out.printf("Error: " + e); System.out.printf("Error: " + e);
......
package web.multitask.trismegistoservices.services.google;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import com.google.api.client.util.Base64;
import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import com.google.api.services.gmail.model.Message;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import web.multitask.trismegistoservices.config.GoogleConfig;
import web.multitask.trismegistoservices.model.GmailRequest;
@Service
public class GmailService {
private final GoogleConfig googleConfig;
public GmailService(GoogleConfig googleConfig) {
this.googleConfig = googleConfig;
}
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
public MimeMessage htmlMessage(GmailRequest request) throws UnsupportedEncodingException {
try {
MimeMessage message = new MimeMessage(session);
String alias = (request.getAlias() == null || request.getAlias().isEmpty()) ? request.getFrom() : request.getAlias();
message.setFrom(new InternetAddress(
request.getFrom(), alias
));
message.setSender(new InternetAddress(
request.getFrom(),alias
));
message.setRecipients(MimeMessage.RecipientType.TO,
buildRecipients(new JSONObject().put("to", request.getTo()), "to"));
if (request.getCc() != null) {
message.setRecipients(MimeMessage.RecipientType.CC,
buildRecipients(new JSONObject().put("cc", request.getCc()), "cc"));
}
if (request.getBcc() != null) {
message.setRecipients(MimeMessage.RecipientType.BCC,
buildRecipients(new JSONObject().put("bcc", request.getBcc()), "bcc"));
}
message.setSubject(request.getSubject());
MimeBodyPart texto = new MimeBodyPart();
texto.setContent(request.getBody(), "text/html; charset=utf-8");
MimeMultipart multiParte = new MimeMultipart();
multiParte.addBodyPart(texto);
try {
String file_folder = "";
MultipartFile[] files = request.getFiles();
for (MultipartFile file : files) {
BodyPart adjunto = new MimeBodyPart();
String fileName = file.getOriginalFilename();
convertByteArrayToFile(file.getBytes(), fileName, file_folder);
FileDataSource fds = new FileDataSource(file_folder +"/"+ fileName);
adjunto.setDataHandler(new DataHandler(fds));
adjunto.setFileName(fds.getName());
multiParte.addBodyPart(adjunto);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
message.setContent(multiParte);
return message;
} catch (MessagingException e) {
System.out.println(e.getMessage());
return null;
}
}
public void convertByteArrayToFile (byte[] byteArray, String fileName, String file_folder){
try (FileOutputStream fos = new FileOutputStream(file_folder +"/"+ fileName)) {
fos.write(byteArray);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public JSONObject send(MimeMessage email) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
email.writeTo(baos);
String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
Message message = new Message();
message.setRaw(encodedEmail);
System.out.println(googleConfig.getGmail().users().messages().send("me", message).execute());
return new JSONObject().put("message", "Email enviado correctamente").put("status", true);
} catch (Exception e) {
System.out.println(e.getMessage());
return new JSONObject().put("message", e.getMessage()).put("status", false);
}
}
public InternetAddress[] buildRecipients(JSONObject json, String type) {
String[] recipients = json.optString(type).split(",");
InternetAddress[] addresses = new InternetAddress[recipients.length];
Stream.of(recipients).map(recipient -> {
try {
return new InternetAddress(recipient);
} catch (AddressException e) {
System.out.println(e.getMessage());
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList()).toArray(addresses);
return addresses;
}
}
\ No newline at end of file
package web.multitask.trismegistoservices.singleton;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class ThreadLocalSingleton {
private final ThreadLocal<JdbcTemplate> jdbcTemplateThreadLocal = new ThreadLocal<>();
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
jdbcTemplateThreadLocal.set(jdbcTemplate);
}
public JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = jdbcTemplateThreadLocal.get();
if (jdbcTemplate == null) {
jdbcTemplate = new JdbcTemplate();
jdbcTemplateThreadLocal.set(jdbcTemplate);
}
return jdbcTemplate;
}
}
package web.multitask.trismegistoservices.singleton;
import lombok.Getter;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.stream.IntStream;
@Getter
@Component
public class TokenSingleton {
private final JSONArray tokens = new JSONArray();
public boolean consumeToken(String token) {
boolean isAvailable = false;
for (int i = 0; i < tokens.length(); i++) {
if (tokens.getJSONObject(i).getString("token").equals(token)) {
if (tokens.getJSONObject(i).getBoolean("available")) {
tokens.getJSONObject(i).put("available", false);
isAvailable = true;
}
break;
}
}
return isAvailable;
}
public void addToken(String token) {
tokens.put(new JSONObject().put("token", token).put("available", true));
}
public TokenSingleton() {
}
@Scheduled(fixedRate = 3600000)
public void removeUnavailableTokens() {
System.out.println("Removing unavailable tokens");
IntStream.range(0, tokens.length()).forEach(i -> {
if (!tokens.getJSONObject(i).getBoolean("available")) {
tokens.remove(i);
}
});
}
}
...@@ -70,4 +70,28 @@ public class CommonUtils { ...@@ -70,4 +70,28 @@ public class CommonUtils {
} }
}; };
} }
public boolean deleteAllFiles() {
try {
String tmpFolder = System.getProperty("java.io.tmpdir");
File folder = new File(tmpFolder);
if (!folder.exists() || !folder.isDirectory()) {
return false;
}
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
if (!file.delete()) {
System.err.println("Failed to delete file: " + file.getAbsolutePath());
}
}
}
}
return true;
} catch (SecurityException e) {
System.err.println("Security exception occurred: " + e.getMessage());
return false;
}
}
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ import java.io.Serializable; ...@@ -4,6 +4,7 @@ import java.io.Serializable;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Date; import java.util.Date;
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;
...@@ -17,6 +18,7 @@ public class JWTokenUtil implements Serializable{ ...@@ -17,6 +18,7 @@ public class JWTokenUtil implements Serializable{
@Value("${app.jwtSecret}") @Value("${app.jwtSecret}")
private String jwtSecret; private String jwtSecret;
public String generateToken(User user, BigInteger ms) { public String generateToken(User user, BigInteger ms) {
if(ms == null){ if(ms == null){
ms = BigInteger.valueOf(3600000); ms = BigInteger.valueOf(3600000);
...@@ -33,6 +35,15 @@ public class JWTokenUtil implements Serializable{ ...@@ -33,6 +35,15 @@ public class JWTokenUtil implements Serializable{
.compact(); .compact();
} }
public String generateDataSource(JSONObject json){
return Jwts.builder()
.setSubject(json.toString())
.setIssuedAt(new Date())
.setExpiration(new Date(new Date().getTime() + 36000000))
.signWith(Keys.hmacShaKeyFor(jwtSecret.getBytes()))
.compact();
}
public boolean validateToken(String token) { public boolean validateToken(String token) {
try { try {
Jwts.parserBuilder() Jwts.parserBuilder()
...@@ -52,7 +63,9 @@ public class JWTokenUtil implements Serializable{ ...@@ -52,7 +63,9 @@ public class JWTokenUtil implements Serializable{
.build() .build()
.parseClaimsJws(token) .parseClaimsJws(token)
.getBody().getSubject(); .getBody().getSubject();
}catch (Exception e){ } catch (ExpiredJwtException expiredJwtException) {
return expiredJwtException.getClaims().getSubject();
} catch (Exception e) {
System.out.println(e.getMessage()); System.out.println(e.getMessage());
return null; return null;
} }
......
...@@ -2,12 +2,11 @@ spring.datasource.url=jdbc:mysql://172.16.1.32:3306/seguridad ...@@ -2,12 +2,11 @@ spring.datasource.url=jdbc:mysql://172.16.1.32:3306/seguridad
spring.datasource.username=desarrollo spring.datasource.username=desarrollo
spring.datasource.password=5vC0$2019$ spring.datasource.password=5vC0$2019$
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
server.port=8081 server.port=8081
server.address=0.0.0.0 server.address=0.0.0.0
# spring.jpa.show-sql=true # spring.jpa.show-sql=true
app.jwtSecret=9a4f2c8d3b7a1e6f45c8a0b3f267d8b1d4e6f3c8a9d2b5f8e3a9c8b5f6v8a3d9 app.jwtSecret=9a4f2c8d3b7a1e6f45c8a0b3f267d8b1d4e6f3c8a9d2b5f8e3a9c8b5f6v8a3d9
spring.jpa.hibernate.ddl-auto = update spring.jpa.hibernate.ddl-auto=update
spring.security.filter.order=1 spring.security.filter.order=1
spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB spring.servlet.multipart.max-request-size=100MB
\ No newline at end of file
{
"web": {
"client_id": "783525806421-34sgkcpfctk7d55mbs7j9v2ktlqeants.apps.googleusercontent.com",
"project_id": "trimegisto-planilla",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_secret": "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",
"redirect_uris": [
"http://localhost:8081"
],
"gmail_refresh_token" : "1//0h1Vav6bFY6CNCgYIARAAGBESNwF-L9IrsBAFQpLDY9ct5JLIjRoybv-rl3fWXmzbP1lKMqfOD2B0EYFBPNtaBpo6QcHB5hh4wBA",
"drive_refresh_token" : "1//05uUWOcbm9wDzCgYIARAAGAUSNwF-L9IrWjCmPvmc5aSwcJzRfWYClp4Vr9NEXbdaFCBbbbkmpBi3zuaPoXJc0lr21Ql2dH0Jrdc"
}
}
\ No newline at end of file
{
"type": "service_account",
"project_id": "trimegisto-planilla",
"private_key_id": "ec3ed783ba6ce35de0367caacbff70b35baa4d8e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYi4NVOq7o5axq\nXpfiHaMUhpfDfty56AkzjD3mf9phPar3OsCtudKjNFt4S5i3IhBRXq8ytfV0h5F5\nFF+cNOZKacTCv66vT3hUS2qvWdlsm+0LKZEGWXMBRAJfQUroCxQP37jd7am+rFCA\nioGRR2+n3a++HRa/y1olV2uY3rJFd35yFCi1oS9ObjxzFCWM2kHemM1XBjUWDbFf\nynC/PEj1lv1ASVIO5wr9iL6ZXlLItmewmWd1ZvLfV9dcpvZSOhK1AaPIy1CQcSkh\ny6ul5c6TPK7XZEMs23kSy7mSKitTVQrnzu1qn0szxVqYyI8eqVbfgsoXShaf4kWh\nvsyo9kzBAgMBAAECggEAIXRkZO19ClQ5b/GPS4rCoDAvEC/wT/RuP32CLrM//Nf3\nKtzz2aMkzLwRCaO8Q0bK+JdFP/NmqYssSWWBY/O0RHjUwjW0+jav424HXHHoKmRo\nmdnhIvb80ow8RZUjynezsMQinn7SQ7gBc+pyHAzKTkfsl9WMpzL2iWBZKjP1nM+R\nhAJXYTKPdPX4aOEo/CldvoU23lfxhhMM8aCcKWb9kpu/W5qdInhh8FnJZdRk+Ad3\nziJQRJvzLGCvxbCjYwNQbybjMFH3vJQp/jvcA9JluxQQfFfqCZd7bON+r+aDFALR\nLy/TFAwtLcB6ggXx2Gm//1QIdwWImFoFaoFcceSxxQKBgQDsfeoqs1tsNFw76l/O\nUkxIp8wqwxgvbmxA9bshZE4xiE76HOWJ3SVCPCmW984hVzwzh85vcdWQeHakrorG\nJ5d8HnR83/MItiJRB9GD8o8HuhRkEjGYymgtzCuln2HmNJrUfkoYF8QLEN3ctQrd\n49vxKjs8hMlsScqSfjjFXPU56wKBgQDqaF9oSfqz6xT56dS7n4ehLZ9Q/2qmaOL5\ngxOwfu4388IvZswpJ/v6Pieps5IYMv1bFNc/I7+1x7IKI/K+7bVWblEEpQEJdqQj\nQradiCTASaafKGbq+ObqyG9kSm/NT7r3VCDhDwNe1TchL5tPOFWxVJfIwrgY9Nw2\nZlRSTtUdAwKBgFNDWcjC8TM9lCO8NxMLQrRp76Y2njNE63RLkCEHkcg6t6OzvNU3\nOUECsZnnkXmHnzh9Xh86svh0kUEV+uIdWmZmypiUuJqelaJ14DxWkCkmSLua9D9Z\nNCi7s7pSTUOhzcl21Vt6Mpm6zIJCc5r/+JYGSmjaT5iCuoGtUwuZ2PUVAoGBANRu\nrHA2A0cEd+kY+Zrjs6XlU6mzH/MZwQFAwhpEnh0FAum0breprdkWdRl9TJwzsZnW\npE9rVXUnOfmopHhVsu5WYYQlCXCLHat67UaMuEmvNZqtob+2vIbwCMtKDlJxvE4i\n5v0vfu11q1We8FB2DGr97+SYWwD6/4spZ6eEG+0DAoGARXQLveeSo4OVpbg29eQ9\n0bPOfYKjF7vNAGf0yDB19fgrQmz/MxaN0KKfIqXb91kFL2TZg9ekwNwN42cH0TJU\nlvIXfOjF4oXcCC1x2b5J7a3FlLrYGJZXiWapF0rg9KtvsfnEFwfucwvfWG6tOYh9\n3UgwfMV9qHCMRN1tvfbzXJo=\n-----END PRIVATE KEY-----\n",
"client_email": "tp-services@trimegisto-planilla.iam.gserviceaccount.com",
"client_id": "109307993437397271961",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/tp-services%40trimegisto-planilla.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
\ No newline at end of file
{
"type": "service_account",
"project_id": "trimegistro-mongo",
"private_key_id": "3e687dba9acbe6cfdf2b0ea5dbdac21de0f1c040",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQfiCmdlpaJd7f\nNohbvnun3CbfVOy+dUuUOTYWGOAnyAh/ARQ6XC3+Ceplg7uc3XiKQYMPl+dKAv2G\nbIcpwb4BIz6rpknd1AM5I1ObJcwmxHblsKLUq55Ixkjke5IQYWvBkwdNENORZMgP\nWTuj1x9HGhCynWZCimFXsKvsJnWwlTkFAZJWwXtJDt6m0TqCH/aGKrH2C5pZvQyd\nlZHlQF3dlQ1PlOVB4stD0tKSXtU6dxrZzTv8os+uwfZel6lF+90TkE2DfOT0bWxD\n+7GVqWPTtrY6TvCOaucGSR08cnncqA030/X7MORuyXp4tmmWNK4iFdacPOdA/X1k\nCVe4Pv7TAgMBAAECggEAL1yPfzEAilzy+YLSTAED5xhgLjiFBSjxD81FR5TECtVq\ndKtilHVPL1fCSug3bMV0tfd21cp8jHgMboZl1+r+hhSjDmwaeI1KZCbtvZ9C9oWH\nutq6ypPnw4Fjmp+liRoQV+tV68BIR019EtuC7E+Yd9bodyLBUZlMzpZAH8eG0aNT\nUYYvxbJvHKGr7/YSM+k5Uhngw9rDoVFHJsBywQ0NmU4/VJxEB5M5V4jmnUn4OXaY\nnt+NhmEa7NJCsB6ASnYdxxojJBFzCwt3YqHQk9kBhB2SnoUyx4YZXXYphJnFpI/0\natzChjWSbdQKX3pwKiVQ9nXgIWTgPZtW98E5FQ6eVQKBgQDr9Z8WTYawWvpNnx3L\nYRGAyQVqa7mvxonHaxiRWCt6DzMRn/gzt0fup8NnW+82EobHuwpmq4GegVHQ8a/Y\ntCMD98bnlF/ZQADIMEisjES2OJrliOAZok2h+xAAIZ/NjJQSAanY6ylJPus7TDjq\nolRc6yisE4EJjk8KMC440yaPhQKBgQDiM05pgEwad5+TKPltFUmOrO9xNb4lWShy\nOTXHGbpeld83c6zP4JQoKauy4XrDpXPpr4czWAOnQtxS4lcA1HS47od94k9MTN9C\ndtiLqJSWaCpBaKw7POJimiKzFKCllWRYbqhf2dpsG2fnKFls9LpN7xyU4Dmh71IK\nFYLOhIeodwKBgCk1zsEgbSOj4A9qeNOqclohwbZidh3C+RFBHRtVYNKCkRLE855k\npkWCO1hz8AVrmuqLOjfQQGUkhNuPOn0IiQ0KW0za1xqkWP6doDOyk9WXcUYhb7JK\nbHCb3qGHPdeyc7HpZHakK6PFP2Qt3crs6vsHfyT+iwzWM+u9mnUGO7fZAoGBAKJ4\n2ax7w64LGCpadvW8IY6CdqXpRT+MT7njj9YHi87edWteAdV6aNCERdiBjm0yzRQf\nyMu/PziHlLtP6dAlygT/B4EK6YxTdtVFifqeRsPV4+wBZBxUegL61Uut2Em3CVFf\ngj7+up2F/daSK9FP4vWRdwUUHTFMNbAajU8K8Gm3AoGAN39pkgWds/2n8QWNG6xg\n7fgvNdKlOChYzEwfKYSsBWSJYVbycxZwYf2Z56DFs8k5Gkq1TmUP5wZJEXgQEgQL\nSyBZpYeidMJTZeBAdoQP/YcD/BbbrZERBEB7AOFkqio4tZvsQ+P+05D8EZFaxfWL\n+n6qKIWmY/pmTz1UMq38Z44=\n-----END PRIVATE KEY-----\n",
"client_email": "drive-full-service@trimegistro-mongo.iam.gserviceaccount.com",
"client_id": "112792567782824987338",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/drive-full-service%40trimegistro-mongo.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
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