diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java index 673fc707..f0d52e32 100644 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java @@ -7,7 +7,6 @@ import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContextInitializer; @@ -45,46 +44,47 @@ public class ConfigInitializer } } } else { -// Path templatePath = -// Paths.get( -// getClass() -// .getClassLoader() -// .getResource("settings.yml.template") -// .toURI()); -// Path userPath = Paths.get("configs", "settings.yml"); -// -// List templateLines = Files.readAllLines(templatePath); -// List userLines = -// Files.exists(userPath) ? Files.readAllLines(userPath) : new ArrayList<>(); -// -// List resultLines = new ArrayList<>(); -// int position = 0; -// for (String templateLine : templateLines) { -// // Check if the line is a comment -// if (templateLine.trim().startsWith("#")) { -// String entry = templateLine.trim().substring(1).trim(); -// if (!entry.isEmpty()) { -// // Check if this comment has been uncommented in userLines -// String key = entry.split(":")[0].trim(); -// addLine(resultLines, userLines, templateLine, key, position); -// } else { -// resultLines.add(templateLine); -// } -// } -// // Check if the line is a key-value pair -// else if (templateLine.contains(":")) { -// String key = templateLine.split(":")[0].trim(); -// addLine(resultLines, userLines, templateLine, key, position); -// } -// // Handle empty lines -// else if (templateLine.trim().length() == 0) { -// resultLines.add(""); -// } -// position++; -// } -// -// // Write the result to the user settings file -// Files.write(userPath, resultLines); + // Path templatePath = + // Paths.get( + // getClass() + // .getClassLoader() + // .getResource("settings.yml.template") + // .toURI()); + // Path userPath = Paths.get("configs", "settings.yml"); + // + // List templateLines = Files.readAllLines(templatePath); + // List userLines = + // Files.exists(userPath) ? Files.readAllLines(userPath) : new + // ArrayList<>(); + // + // List resultLines = new ArrayList<>(); + // int position = 0; + // for (String templateLine : templateLines) { + // // Check if the line is a comment + // if (templateLine.trim().startsWith("#")) { + // String entry = templateLine.trim().substring(1).trim(); + // if (!entry.isEmpty()) { + // // Check if this comment has been uncommented in userLines + // String key = entry.split(":")[0].trim(); + // addLine(resultLines, userLines, templateLine, key, position); + // } else { + // resultLines.add(templateLine); + // } + // } + // // Check if the line is a key-value pair + // else if (templateLine.contains(":")) { + // String key = templateLine.split(":")[0].trim(); + // addLine(resultLines, userLines, templateLine, key, position); + // } + // // Handle empty lines + // else if (templateLine.trim().length() == 0) { + // resultLines.add(""); + // } + // position++; + // } + // + // // Write the result to the user settings file + // Files.write(userPath, resultLines); } Path customSettingsPath = Paths.get("configs", "custom_settings.yml"); diff --git a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java index be6e28a7..8b31cc95 100644 --- a/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java +++ b/src/main/java/stirling/software/SPDF/config/FileFallbackTemplateResolver.java @@ -1,16 +1,18 @@ package stirling.software.SPDF.config; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver; -import org.thymeleaf.templateresource.ClassLoaderTemplateResource; import org.thymeleaf.templateresource.FileTemplateResource; import org.thymeleaf.templateresource.ITemplateResource; +import stirling.software.SPDF.model.InputStreamTemplateResource; + public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateResolver { private final ResourceLoader resourceLoader; @@ -40,9 +42,13 @@ public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateRe } - return new ClassLoaderTemplateResource( - Thread.currentThread().getContextClassLoader(), - "classpath:/templates/" + resourceName, - characterEncoding); + InputStream inputStream = + Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("templates/" + resourceName); + if (inputStream != null) { + return new InputStreamTemplateResource(inputStream, "UTF-8"); + } + return null; } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index 44a51a3a..6415167c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -66,46 +66,46 @@ public class UserController { RedirectAttributes redirectAttributes) { if (!userService.isUsernameValid(newUsername)) { - return new RedirectView("/account?messageType=invalidUsername",true); + return new RedirectView("/account?messageType=invalidUsername", true); } if (principal == null) { - return new RedirectView("/account?messageType=notAuthenticated",true); + return new RedirectView("/account?messageType=notAuthenticated", true); } // The username MUST be unique when renaming Optional userOpt = userService.findByUsername(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound",true); + return new RedirectView("/account?messageType=userNotFound", true); } User user = userOpt.get(); if (user.getUsername().equals(newUsername)) { - return new RedirectView("/account?messageType=usernameExists",true); + return new RedirectView("/account?messageType=usernameExists", true); } if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword",true); + return new RedirectView("/account?messageType=incorrectPassword", true); } if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { - return new RedirectView("/account?messageType=usernameExists",true); + return new RedirectView("/account?messageType=usernameExists", true); } if (newUsername != null && newUsername.length() > 0) { try { userService.changeUsername(user, newUsername); } catch (IllegalArgumentException e) { - return new RedirectView("/account?messageType=invalidUsername",true); + return new RedirectView("/account?messageType=invalidUsername", true); } } // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED,true); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -118,19 +118,19 @@ public class UserController { HttpServletResponse response, RedirectAttributes redirectAttributes) { if (principal == null) { - return new RedirectView("/change-creds?messageType=notAuthenticated",true); + return new RedirectView("/change-creds?messageType=notAuthenticated", true); } Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/change-creds?messageType=userNotFound",true); + return new RedirectView("/change-creds?messageType=userNotFound", true); } User user = userOpt.get(); if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/change-creds?messageType=incorrectPassword",true); + return new RedirectView("/change-creds?messageType=incorrectPassword", true); } userService.changePassword(user, newPassword); @@ -138,7 +138,7 @@ public class UserController { // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED,true); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -151,19 +151,19 @@ public class UserController { HttpServletResponse response, RedirectAttributes redirectAttributes) { if (principal == null) { - return new RedirectView("/account?messageType=notAuthenticated",true); + return new RedirectView("/account?messageType=notAuthenticated", true); } Optional userOpt = userService.findByUsernameIgnoreCase(principal.getName()); if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound",true); + return new RedirectView("/account?messageType=userNotFound", true); } User user = userOpt.get(); if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword",true); + return new RedirectView("/account?messageType=incorrectPassword", true); } userService.changePassword(user, newPassword); @@ -171,7 +171,7 @@ public class UserController { // Logout using Spring's utility new SecurityContextLogoutHandler().logout(request, response, null); - return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED,true); + return new RedirectView(LOGIN_MESSAGETYPE_CREDSUPDATED, true); } @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @@ -204,7 +204,7 @@ public class UserController { boolean forceChange) { if (!userService.isUsernameValid(username)) { - return new RedirectView("/addUsers?messageType=invalidUsername",true); + return new RedirectView("/addUsers?messageType=invalidUsername", true); } Optional userOpt = userService.findByUsernameIgnoreCase(username); @@ -212,26 +212,27 @@ public class UserController { if (userOpt.isPresent()) { User user = userOpt.get(); if (user != null && user.getUsername().equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=usernameExists",true); + return new RedirectView("/addUsers?messageType=usernameExists", true); } } if (userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=usernameExists",true); + return new RedirectView("/addUsers?messageType=usernameExists", true); } try { // Validate the role Role roleEnum = Role.fromString(role); if (roleEnum == Role.INTERNAL_API_USER) { // If the role is INTERNAL_API_USER, reject the request - return new RedirectView("/addUsers?messageType=invalidRole",true); + return new RedirectView("/addUsers?messageType=invalidRole", true); } } catch (IllegalArgumentException e) { // If the role ID is not valid, redirect with an error message - return new RedirectView("/addUsers?messageType=invalidRole",true); + return new RedirectView("/addUsers?messageType=invalidRole", true); } userService.saveUser(username, password, role, forceChange); - return new RedirectView("/addUsers",true); // Redirect to account page after adding the user + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user } @PreAuthorize("hasRole('ROLE_ADMIN')") @@ -244,33 +245,34 @@ public class UserController { Optional userOpt = userService.findByUsernameIgnoreCase(username); if (!userOpt.isPresent()) { - return new RedirectView("/addUsers?messageType=userNotFound",true); + return new RedirectView("/addUsers?messageType=userNotFound", true); } if (!userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=userNotFound",true); + return new RedirectView("/addUsers?messageType=userNotFound", true); } // Get the currently authenticated username String currentUsername = authentication.getName(); // Check if the provided username matches the current session's username if (currentUsername.equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=downgradeCurrentUser",true); + return new RedirectView("/addUsers?messageType=downgradeCurrentUser", true); } try { // Validate the role Role roleEnum = Role.fromString(role); if (roleEnum == Role.INTERNAL_API_USER) { // If the role is INTERNAL_API_USER, reject the request - return new RedirectView("/addUsers?messageType=invalidRole",true); + return new RedirectView("/addUsers?messageType=invalidRole", true); } } catch (IllegalArgumentException e) { // If the role ID is not valid, redirect with an error message - return new RedirectView("/addUsers?messageType=invalidRole",true); + return new RedirectView("/addUsers?messageType=invalidRole", true); } User user = userOpt.get(); userService.changeRole(user, role); - return new RedirectView("/addUsers",true); // Redirect to account page after adding the user + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user } @PreAuthorize("hasRole('ROLE_ADMIN')") @@ -279,7 +281,7 @@ public class UserController { @PathVariable(name = "username") String username, Authentication authentication) { if (!userService.usernameExistsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=deleteUsernameExists",true); + return new RedirectView("/addUsers?messageType=deleteUsernameExists", true); } // Get the currently authenticated username @@ -287,11 +289,11 @@ public class UserController { // Check if the provided username matches the current session's username if (currentUsername.equalsIgnoreCase(username)) { - return new RedirectView("/addUsers?messageType=deleteCurrentUser",true); + return new RedirectView("/addUsers?messageType=deleteCurrentUser", true); } invalidateUserSessions(username); userService.deleteUser(username); - return new RedirectView("/addUsers",true); + return new RedirectView("/addUsers", true); } @Autowired private SessionRegistry sessionRegistry; diff --git a/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java new file mode 100644 index 00000000..b4271df0 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/InputStreamTemplateResource.java @@ -0,0 +1,45 @@ +package stirling.software.SPDF.model; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; + +import org.thymeleaf.templateresource.ITemplateResource; + +public class InputStreamTemplateResource implements ITemplateResource { + private InputStream inputStream; + private String characterEncoding; + + public InputStreamTemplateResource(InputStream inputStream, String characterEncoding) { + this.inputStream = inputStream; + this.characterEncoding = characterEncoding; + } + + @Override + public Reader reader() throws IOException { + return new InputStreamReader(inputStream, characterEncoding); + } + + @Override + public ITemplateResource relative(String relativeLocation) { + // Implement logic for relative resources, if needed + throw new UnsupportedOperationException("Relative resources not supported"); + } + + @Override + public String getDescription() { + return "InputStream resource [Stream]"; + } + + @Override + public String getBaseName() { + return "streamResource"; + } + + @Override + public boolean exists() { + // TODO Auto-generated method stub + return false; + } +}