[FIXED] YA NO SE REQUIERE DOTENV NI BASE DE DATOS PARA QUE FUNCIONE…

[FIXED] YA NO SE REQUIERE DOTENV NI BASE DE DATOS PARA QUE FUNCIONE COMPLETAMENTE INDEPENDIENTE Y GENERAL
parent bcc3c3a5
...@@ -56,11 +56,11 @@ ...@@ -56,11 +56,11 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <!-- <dependency>-->
<groupId>org.springframework.boot</groupId> <!-- <groupId>org.springframework.boot</groupId>-->
<artifactId>spring-boot-starter-data-jpa</artifactId> <!-- <artifactId>spring-boot-starter-data-jpa</artifactId>-->
<version>2.5.6</version> <!-- <version>2.5.6</version>-->
</dependency> <!-- </dependency>-->
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId> <artifactId>mysql-connector-j</artifactId>
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import web.multitask.trismegistoservices.model.GmailRequest; import web.multitask.trismegistoservices.model.GmailRequest;
import web.multitask.trismegistoservices.mysql.EmailMysql; // import web.multitask.trismegistoservices.mysql.EmailMysql;
import web.multitask.trismegistoservices.services.google.GmailService; import web.multitask.trismegistoservices.services.google.GmailService;
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
@RequestMapping("/gmail") @RequestMapping("/gmail")
@AllArgsConstructor @AllArgsConstructor
public class EmailApi { public class EmailApi {
private final Dotenv dotenv; // private final Dotenv dotenv;
private final GmailService emailService; private final GmailService emailService;
private final EmailMysql emailMysql; // private final EmailMysql emailMysql;
@RequestMapping(path = "/public/generate", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) @RequestMapping(path = "/public/generate", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<?> full(@ModelAttribute GmailRequest request) { public ResponseEntity<?> full(@ModelAttribute GmailRequest request) {
...@@ -35,28 +35,28 @@ ...@@ -35,28 +35,28 @@
} }
} }
@RequestMapping(path = "/service/confirmation", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) // @RequestMapping(path = "/service/confirmation", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<?> template(@ModelAttribute GmailRequest request) { // public ResponseEntity<?> template(@ModelAttribute GmailRequest request) {
try { // try {
String URL = dotenv.get("URL_CONFIRMATION"); // String URL = dotenv.get("URL_CONFIRMATION");
assert URL != null; // assert URL != null;
JSONObject extra = request.getExtra(); // JSONObject extra = request.getExtra();
JSONObject response = emailMysql.getHTMLTemplate(extra); // JSONObject response = emailMysql.getHTMLTemplate(extra);
if(response.getBoolean("status")){ // if(response.getBoolean("status")){
JSONObject data = response.getJSONArray("data").getJSONObject(0); // JSONObject data = response.getJSONArray("data").getJSONObject(0);
String html = data.getString("html"); // String html = data.getString("html");
html = html.replaceAll("TOKEN", extra.getString("token")); // html = html.replaceAll("TOKEN", extra.getString("token"));
html = html.replaceAll("URL", URL); // html = html.replaceAll("URL", URL);
request.setBody(html); // request.setBody(html);
MimeMessage message = emailService.htmlMessage(request); // MimeMessage message = emailService.htmlMessage(request);
JSONObject responseEmail = emailService.send(message); // JSONObject responseEmail = emailService.send(message);
return ResponseEntity.ok(responseEmail.toMap()); // return ResponseEntity.ok(responseEmail.toMap());
}else{ // }else{
return ResponseEntity.internalServerError().body(new JSONObject().put("message", response.getString("message")).put("status", false).toMap()); // return ResponseEntity.internalServerError().body(new JSONObject().put("message", response.getString("message")).put("status", false).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());
} // }
} // }
} }
\ No newline at end of file
...@@ -7,7 +7,7 @@ import org.springframework.http.ResponseEntity; ...@@ -7,7 +7,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails; 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.UserRepository;
import web.multitask.trismegistoservices.singleton.TokenSingleton; import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
...@@ -21,13 +21,19 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -21,13 +21,19 @@ import org.springframework.web.bind.annotation.RequestBody;
@RestController @RestController
@RequestMapping("/token") @RequestMapping("/token")
@CrossOrigin @CrossOrigin
@AllArgsConstructor //@AllArgsConstructor
class JWTokenApi { class JWTokenApi {
private final UserRepository userRepo = new UserRepository();
private final JWTokenUtil jwtTokenUtil; private final JWTokenUtil jwtTokenUtil;
private final UserRespository userRepo;
private final TokenSingleton tokenSingleton; private final TokenSingleton tokenSingleton;
public JWTokenApi (JWTokenUtil jwtTokenUtil, TokenSingleton tokenSingleton){
this.jwtTokenUtil = jwtTokenUtil;
this.tokenSingleton = tokenSingleton;
}
@PostMapping("/database") @PostMapping("/database")
public ResponseEntity<?> setDatabase(@RequestBody String token) { public ResponseEntity<?> setDatabase(@RequestBody String token) {
JSONObject json = new JSONObject(token); JSONObject json = new JSONObject(token);
......
...@@ -6,7 +6,7 @@ import org.json.JSONObject; ...@@ -6,7 +6,7 @@ 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.UserRespository; import web.multitask.trismegistoservices.repository.UserRepository;
@RestController @RestController
@CrossOrigin("*") @CrossOrigin("*")
...@@ -15,7 +15,6 @@ import web.multitask.trismegistoservices.repository.UserRespository; ...@@ -15,7 +15,6 @@ import web.multitask.trismegistoservices.repository.UserRespository;
public class RoutineApi { public class RoutineApi {
final RoutineSql procedureMysql; final RoutineSql procedureMysql;
final UserRespository userRepo;
@PostMapping("/public/routine") @PostMapping("/public/routine")
public ResponseEntity<?> callRoutine(@RequestBody String body) { public ResponseEntity<?> callRoutine(@RequestBody String body) {
...@@ -37,9 +36,4 @@ public class RoutineApi { ...@@ -37,9 +36,4 @@ public class RoutineApi {
} }
} }
@GetMapping("/private/users")
public ResponseEntity<?> getUsers() {
return ResponseEntity.ok(new JSONObject().put("data", userRepo.findAll()).put("message", "Success").put("status", true).toMap());
}
} }
\ No newline at end of file
...@@ -18,7 +18,7 @@ import org.springframework.web.cors.CorsConfiguration; ...@@ -18,7 +18,7 @@ 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.repository.UserRespository; import web.multitask.trismegistoservices.repository.UserRepository;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton; import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton;
import web.multitask.trismegistoservices.singleton.TokenSingleton; import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
...@@ -28,7 +28,7 @@ import web.multitask.trismegistoservices.utils.JWTokenUtil; ...@@ -28,7 +28,7 @@ import web.multitask.trismegistoservices.utils.JWTokenUtil;
@AllArgsConstructor @AllArgsConstructor
public class SecurityConfig{ public class SecurityConfig{
private final UserRespository userRepo; // private final UserRepository userRepo;
private final JWTokenUtil jwtTokenUtil; private final JWTokenUtil jwtTokenUtil;
private final TokenSingleton tokenSingleton; private final TokenSingleton tokenSingleton;
private ThreadLocalSingleton threadLocalSingleton; private ThreadLocalSingleton threadLocalSingleton;
...@@ -51,7 +51,7 @@ public class SecurityConfig{ ...@@ -51,7 +51,7 @@ public class SecurityConfig{
.regexMatchers(".*/service/.*").hasAnyAuthority("ADMIN", "SERVICE") .regexMatchers(".*/service/.*").hasAnyAuthority("ADMIN", "SERVICE")
.antMatchers(HttpMethod.GET, "/**").permitAll() .antMatchers(HttpMethod.GET, "/**").permitAll()
.antMatchers("/token/**").permitAll()); .antMatchers("/token/**").permitAll());
http.addFilterBefore(new JWTokenFilter(jwtTokenUtil, userRepo, tokenSingleton,threadLocalSingleton), UsernamePasswordAuthenticationFilter.class); http.addFilterBefore(new JWTokenFilter(jwtTokenUtil, tokenSingleton,threadLocalSingleton), UsernamePasswordAuthenticationFilter.class);
return http.build(); return http.build();
} }
......
...@@ -12,7 +12,7 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio ...@@ -12,7 +12,7 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio
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 org.springframework.util.LinkedMultiValueMap;
import web.multitask.trismegistoservices.repository.UserRespository; import web.multitask.trismegistoservices.repository.UserRepository;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
import java.util.Objects; import java.util.Objects;
...@@ -20,11 +20,10 @@ import java.util.Objects; ...@@ -20,11 +20,10 @@ import java.util.Objects;
public class AuthChannelInterceptorAdapter implements ChannelInterceptor { public class AuthChannelInterceptorAdapter implements ChannelInterceptor {
private final JWTokenUtil jwtTokenUtil; private final JWTokenUtil jwtTokenUtil;
private final UserRespository userRepo; private final UserRepository userRepo = new UserRepository();
public AuthChannelInterceptorAdapter(JWTokenUtil jwtTokenUtil, UserRespository userRepo) { public AuthChannelInterceptorAdapter(JWTokenUtil jwtTokenUtil) {
this.jwtTokenUtil = jwtTokenUtil; this.jwtTokenUtil = jwtTokenUtil;
this.userRepo = userRepo;
} }
@Override @Override
......
...@@ -16,27 +16,38 @@ import org.springframework.jdbc.core.JdbcTemplate; ...@@ -16,27 +16,38 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource; 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.User;
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.UserRepository;
import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton; import web.multitask.trismegistoservices.singleton.ThreadLocalSingleton;
import web.multitask.trismegistoservices.singleton.TokenSingleton; import web.multitask.trismegistoservices.singleton.TokenSingleton;
import web.multitask.trismegistoservices.utils.JWTokenUtil; import web.multitask.trismegistoservices.utils.JWTokenUtil;
@Component @Component
@Order(1) @Order(1)
@AllArgsConstructor //@AllArgsConstructor
@NoArgsConstructor //@NoArgsConstructor
public class JWTokenFilter extends OncePerRequestFilter { public class JWTokenFilter extends OncePerRequestFilter {
public JWTokenFilter(){}
private final UserRepository userRepo = new UserRepository();
private JWTokenUtil jwtTokenUtil = null; private JWTokenUtil jwtTokenUtil = null;
private UserRespository userRepo = null;
private TokenSingleton tokenSingleton = null; private TokenSingleton tokenSingleton = null;
private ThreadLocalSingleton threadLocalSingleton = null; private ThreadLocalSingleton threadLocalSingleton = null;
public JWTokenFilter(JWTokenUtil jwtTokenUtil, TokenSingleton tokenSingleton, ThreadLocalSingleton threadLocalSingleton){
this.jwtTokenUtil = jwtTokenUtil;
this.tokenSingleton = tokenSingleton;
this.threadLocalSingleton = threadLocalSingleton;
}
@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 {
......
package web.multitask.trismegistoservices.model; package web.multitask.trismegistoservices.model;
import javax.persistence.*; import lombok.*;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
@Data //@Data
@AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Getter @Getter
@Setter @Setter
@Entity(name = "roles") //@Entity(name = "roles")
public class Role { public class Role {
@Id // @Id
@GeneratedValue(strategy = GenerationType.AUTO) // @GeneratedValue(strategy = GenerationType.AUTO)
private int id; private int id;
@NonNull // @NonNull
private String descripcion; private String descripcion;
} }
\ No newline at end of file
package web.multitask.trismegistoservices.model; package web.multitask.trismegistoservices.model;
import javax.persistence.*;
import lombok.*; import lombok.*;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
...@@ -9,26 +8,26 @@ import org.springframework.security.core.userdetails.UserDetails; ...@@ -9,26 +8,26 @@ import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@Data //@Data
@NoArgsConstructor @NoArgsConstructor
@Getter @Getter
@Setter @Setter
@Entity(name = "users") //@Entity(name = "users")
public class User implements UserDetails { public class User implements UserDetails {
@Id // @Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY) // @GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Long id; private Long id;
@NonNull // @NonNull
private String username; private String username;
@NonNull // @NonNull
private String password; private String password;
@ManyToMany(fetch = javax.persistence.FetchType.EAGER, cascade = CascadeType.ALL) // @ManyToMany(fetch = javax.persistence.FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_roles", // @JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"), // joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name="role_id")) // inverseJoinColumns = @JoinColumn(name="role_id"))
private java.util.Set<Role> roles = new java.util.HashSet<>(); private java.util.Set<Role> roles = new java.util.HashSet<>();
@Override @Override
......
package web.multitask.trismegistoservices.mysql; //package web.multitask.trismegistoservices.mysql;
//
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 java.util.List; //import java.util.List;
import java.util.Map; //import java.util.Map;
//
@Service //@Service
public class EmailMysql { //public class EmailMysql {
//
private final JdbcTemplate jdbcTemplate; // private final JdbcTemplate jdbcTemplate;
//
public EmailMysql(JdbcTemplate jdbcTemplate) { // public EmailMysql(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate; // this.jdbcTemplate = jdbcTemplate;
} // }
//
public JSONObject getHTMLTemplate (JSONObject json) { // public JSONObject getHTMLTemplate (JSONObject json) {
String id = json.optString("id",null); // String id = json.optString("id",null);
if(id == null){ // if(id == null){
return new JSONObject().put("message", "Invalid Request").put("status", false); // return new JSONObject().put("message", "Invalid Request").put("status", false);
} // }
String sql = "SELECT * FROM security.email_template WHERE id = ?"; // String sql = "SELECT * FROM security.email_template WHERE id = ?";
Object[] params = new Object[] { id }; // Object[] params = new Object[] { id };
try{ // try{
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, params); // List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, params);
return new JSONObject().put("data", rows).put("message", "Success").put("status", true); // return new JSONObject().put("data", rows).put("message", "Success").put("status", true);
}catch (Exception e){ // }catch (Exception e){
return new JSONObject().put("message", e.getMessage()).put("status", false); // return new JSONObject().put("message", e.getMessage()).put("status", false);
} // }
} // }
} //}
\ No newline at end of file \ No newline at end of file
package web.multitask.trismegistoservices.repository;
//@Repository
//public interface UserRepository extends JpaRepository<User, Long> {
//
// UserDetails findByUsername(String username)
// throws UsernameNotFoundException;
//
//}
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.security.core.userdetails.UserDetails;
import web.multitask.trismegistoservices.model.Role;
import web.multitask.trismegistoservices.model.User;
import java.util.*;
public class UserRepository{
private final HashMap<String, User> users = new HashMap<>();
Set<Role> roles = new HashSet<>();
public UserRepository(){
roles.add(new Role(1, "ADMIN"));
roles.add(new Role(2, "USER"));
roles.add(new Role(3, "SERVICE"));
User user = new User();
user.setUsername("admin");
user.setId(1L);
user.setPassword("admin");
user.setRoles(roles);
users.put("admin", user);
}
public UserDetails findByUsername(String username){
return users.get(username);
}
public static void main(String[] args) {
UserRepository userRepository = new UserRepository();
System.out.println(userRepository.findByUsername("admin").getAuthorities());
}
}
\ No newline at end of file
package web.multitask.trismegistoservices.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import web.multitask.trismegistoservices.model.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRespository extends JpaRepository<User, Long> {
UserDetails findByUsername(String username)
throws UsernameNotFoundException;
}
\ No newline at end of file
...@@ -20,6 +20,8 @@ import web.multitask.trismegistoservices.config.GoogleConfig; ...@@ -20,6 +20,8 @@ import web.multitask.trismegistoservices.config.GoogleConfig;
import web.multitask.trismegistoservices.interfaces.IDriveService; import web.multitask.trismegistoservices.interfaces.IDriveService;
import web.multitask.trismegistoservices.utils.CommonUtils; import web.multitask.trismegistoservices.utils.CommonUtils;
import javax.annotation.Nullable;
@Service @Service
@AllArgsConstructor @AllArgsConstructor
public class DriveService implements IDriveService { public class DriveService implements IDriveService {
...@@ -28,12 +30,13 @@ public class DriveService implements IDriveService { ...@@ -28,12 +30,13 @@ 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, String base64) { public String uploadFile(String folder_id, @Nullable String file_name, MultipartFile file, String base64) {
try { try {
if (null != file) { if (null != file) {
File fileMetadata = new File(); File fileMetadata = new File();
fileMetadata.setParents(Collections.singletonList(folder_id)); fileMetadata.setParents(Collections.singletonList(folder_id));
fileMetadata.setName(file.getOriginalFilename()); assert file_name != null;
fileMetadata.setName( file_name.isEmpty() ? file.getOriginalFilename() : file_name);
File uploadFile = googleConfig.getDrive() File uploadFile = googleConfig.getDrive()
.files() .files()
.create(fileMetadata, new InputStreamContent( .create(fileMetadata, new InputStreamContent(
......
spring.datasource.url=jdbc:mysql://172.16.1.32:3306/seguridad #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 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
server.port=8080
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
......
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