From 2053a6950dbc35e689d5a875ebc705cf78089666 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 26 Aug 2023 12:27:52 +0100 Subject: [PATCH] config template --- .../software/SPDF/SPdfApplication.java | 10 ++- .../software/SPDF/config/AppConfig.java | 85 ++++++++++-------- .../SPDF/config/security/InitialSetup.java | 88 +++++++++++++++++++ src/main/resources/application.yml.template | 27 ++++++ 4 files changed, 174 insertions(+), 36 deletions(-) create mode 100644 src/main/resources/application.yml.template diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index 5955c339..68cf60fe 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -51,7 +52,14 @@ public class SPdfApplication { } public static void main(String[] args) { - SpringApplication.run(SPdfApplication.class, args); + SpringApplication app = new SpringApplication(SPdfApplication.class); + if (Files.exists(Paths.get("configs/application.yml"))) { + app.setDefaultProperties(Collections.singletonMap("spring.config.location", "file:configs/application.yml")); + } else { + System.out.println("External configuration file 'configs/application.yml' does not exist. Using default configuration and environment configuration instead."); + } + app.run(args); + try { Thread.sleep(1000); } catch (InterruptedException e) { diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index 29290a32..4ae4b86d 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -1,37 +1,34 @@ package stirling.software.SPDF.config; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; @Configuration public class AppConfig { - - - @Bean(name = "rateLimit") - public boolean rateLimit() { - String appName = System.getProperty("rateLimit"); - if (appName == null) - appName = System.getenv("rateLimit"); - System.out.println("rateLimit=" + appName); - return (appName != null) ? Boolean.valueOf(appName) : false; - } - - @Bean(name = "loginEnabled") + @Value("${login.enabled:false}") + private boolean defaultLoginEnabled; + + @Value("${ui.homeName:Stirling PDF}") + private String defaultAppName; + + @Value("${ui.homeDescription:null}") + private String defaultHomeText; + + @Value("${ui.navbarName:Stirling PDF}") + private String defaultNavBarText; + + @Bean(name = "loginEnabled") public boolean loginEnabled() { - String appName = System.getProperty("login.enabled"); - if (appName == null) - appName = System.getenv("login.enabled"); - System.out.println("loginEnabled=" + appName); - return (appName != null) ? Boolean.valueOf(appName) : false; + return getBooleanValue("login.enabled", defaultLoginEnabled); } - + @Bean(name = "appName") public String appName() { - String appName = System.getProperty("APP_HOME_NAME"); - if (appName == null) - appName = System.getenv("APP_HOME_NAME"); - return (appName != null) ? appName : "Stirling PDF"; + return getStringValue("APP_HOME_NAME", defaultAppName); } @Bean(name = "appVersion") @@ -42,22 +39,40 @@ public class AppConfig { @Bean(name = "homeText") public String homeText() { - String homeText = System.getProperty("APP_HOME_DESCRIPTION"); - if (homeText == null) - homeText = System.getenv("APP_HOME_DESCRIPTION"); - return (homeText != null) ? homeText : "null"; + return getStringValue("APP_HOME_DESCRIPTION", defaultHomeText); } @Bean(name = "navBarText") public String navBarText() { - String navBarText = System.getProperty("APP_NAVBAR_NAME"); - if (navBarText == null) - navBarText = System.getenv("APP_NAVBAR_NAME"); - if (navBarText == null) - navBarText = System.getProperty("APP_HOME_NAME"); - if (navBarText == null) - navBarText = System.getenv("APP_HOME_NAME"); - - return (navBarText != null) ? navBarText : "Stirling PDF"; + String navBarText = getStringValue("APP_NAVBAR_NAME", null); + if (navBarText == null) { + navBarText = getStringValue("APP_HOME_NAME", defaultNavBarText); + } + return navBarText; } + + private boolean getBooleanValue(String key, boolean defaultValue) { + String value = System.getProperty(key); + if (value == null) + value = System.getenv(key); + return (value != null) ? Boolean.valueOf(value) : defaultValue; + } + + private String getStringValue(String key, String defaultValue) { + String value = System.getProperty(key); + if (value == null) + value = System.getenv(key); + return (value != null) ? value : defaultValue; + } + + @Bean(name = "rateLimit") + public boolean rateLimit() { + String appName = System.getProperty("rateLimit"); + if (appName == null) + appName = System.getenv("rateLimit"); + System.out.println("rateLimit=" + appName); + return (appName != null) ? Boolean.valueOf(appName) : false; + } + + } \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSetup.java index d1d286dc..e4510167 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSetup.java @@ -1,11 +1,22 @@ package stirling.software.SPDF.config.security; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; import stirling.software.SPDF.model.Role; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.*; +import java.util.*; + +import org.springframework.core.env.Environment; +import org.springframework.core.io.ClassPathResource; + @Component public class InitialSetup { @@ -23,4 +34,81 @@ public class InitialSetup { } } + + + + + @Value("${AutomaticallyGeneratedDoNotEdit.key:}") + private String secretKey; + + @Autowired + private Environment environment; + + + public void ensureConfigExists() throws IOException { + // Define the path to the external config directory + Path destPath = Paths.get("configs", "application.yml"); + + // Check if the file already exists + if (Files.notExists(destPath)) { + // Ensure the destination directory exists + Files.createDirectories(destPath.getParent()); + + // Copy the resource from classpath to the external directory + try (InputStream in = getClass().getClassLoader().getResourceAsStream("application.yml.template")) { + if (in != null) { + Files.copy(in, destPath); + } else { + throw new FileNotFoundException("Resource file not found: application.yml.template"); + } + } + } + } + + @PostConstruct + public void initSecretKey() throws IOException { + ensureConfigExists(); + if (secretKey == null || secretKey.isEmpty() || "placeholder".equals(secretKey)) { + secretKey = UUID.randomUUID().toString(); // Generating a random UUID as the secret key + saveKeyToConfig(secretKey); + } + } + + private void saveKeyToConfig(String key) throws IOException { + Path path = Paths.get("configs", "application.yml"); // Target the configs/application.yml + List lines = Files.readAllLines(path); + boolean keyFound = false; + + // Search for the existing key to replace it or place to add it + for (int i = 0; i < lines.size(); i++) { + if (lines.get(i).startsWith("AutomaticallyGeneratedDoNotEdit:")) { + keyFound = true; + if (i + 1 < lines.size() && lines.get(i + 1).trim().startsWith("key:")) { + lines.set(i + 1, " key: " + key); + break; + } else { + lines.add(i + 1, " key: " + key); + break; + } + } + } + + // If the section doesn't exist, append it + if (!keyFound) { + lines.add("AutomaticallyGeneratedDoNotEdit:"); + lines.add(" key: " + key); + } + + // Add a comment (if not already added) + if (!lines.get(0).startsWith("# Automatically Generated Settings (Do Not Edit Directly)")) { + lines.add(0, "# Automatically Generated Settings (Do Not Edit Directly)"); + } + + // Write back to the file + Files.write(path, lines); + } + + + + } diff --git a/src/main/resources/application.yml.template b/src/main/resources/application.yml.template new file mode 100644 index 00000000..eb2364bc --- /dev/null +++ b/src/main/resources/application.yml.template @@ -0,0 +1,27 @@ +security: + enableLogin: false # set to 'true' to enable login + initialLogin: + username: 'username' # Specify the initial username for first boot (e.g. 'admin') + password: 'password'# Specify the initial password for first boot (e.g. 'password123') + csrfDisabled: true + +system: + defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) + googlevisibility: false # 'true' to allow Google visibility, 'false' to disallow + rootPath: / # Set the application's root URI (e.g. /pdf-app) + customstaticFilePath: '/customFiles/static/' # Directory path for custom static files + maxFileSize: 2000 # Set the maximum file size in MB + +ui: + #homeName: 'Stirling PDF Application' # Application's visible name + #homeDescription: "The best PDF tool. Short description or tagline." + #navbarName: 'Stirling Navbar' # Name displayed on the navigation bar + +endpoints: + toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) + groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) + +metrics: + enabled: true # 'true' to enable metric API endpoints, 'false' to disable + +