mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	New common module (#3573)
# Description of Changes Introduced a new `common` module for shared libs and commonly used classes. See the screenshot below for the file structure and classes that have been moved. --- <img width="452" alt="Screenshot 2025-05-22 at 11 46 56" src="https://github.com/user-attachments/assets/c9badabc-48f9-4079-b83e-7cfde0fb840f" /> <img width="470" alt="Screenshot 2025-05-22 at 11 47 30" src="https://github.com/user-attachments/assets/e8315b09-2e78-4c50-b9de-4dd9b9b0ecb1" /> ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [x] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [x] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details.
This commit is contained in:
		
							parent
							
								
									be1a9cc8da
								
							
						
					
					
						commit
						bedc3d02d7
					
				| @ -413,13 +413,14 @@ configurations.all { | ||||
|     // Exclude Tomcat | ||||
|     exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     implementation project(':common') | ||||
| 
 | ||||
|     //tmp for security bumps | ||||
|     implementation 'ch.qos.logback:logback-core:1.5.18' | ||||
|     implementation 'ch.qos.logback:logback-classic:1.5.18' | ||||
| 
 | ||||
| 
 | ||||
|     // Exclude vulnerable BouncyCastle version used in tableau | ||||
|     configurations.all { | ||||
|         exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on' | ||||
| @ -448,8 +449,6 @@ dependencies { | ||||
| 
 | ||||
| 
 | ||||
|     if (System.getenv("DOCKER_ENABLE_SECURITY") != "false") { | ||||
| 
 | ||||
| 	    implementation 'org.springframework.boot:spring-boot-starter-actuator' | ||||
| 	    implementation 'io.micrometer:micrometer-registry-prometheus' | ||||
| 
 | ||||
|         implementation "org.springframework.boot:spring-boot-starter-security:$springBootVersion" | ||||
| @ -545,7 +544,6 @@ dependencies { | ||||
| 
 | ||||
|   // Mockito (core) | ||||
|     testImplementation 'org.mockito:mockito-core:5.18.0' | ||||
| 
 | ||||
|     testRuntimeOnly 'org.mockito:mockito-inline:5.2.0' | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										196
									
								
								common/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								common/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,196 @@ | ||||
| ### Eclipse ### | ||||
| .metadata | ||||
| bin/ | ||||
| tmp/ | ||||
| *.tmp | ||||
| *.bak | ||||
| *.exe | ||||
| *.swp | ||||
| *~.nib | ||||
| local.properties | ||||
| .settings/ | ||||
| .loadpath | ||||
| .recommenders | ||||
| .classpath | ||||
| .project | ||||
| version.properties | ||||
| 
 | ||||
| #### Stirling-PDF Files ### | ||||
| pipeline/watchedFolders/ | ||||
| pipeline/finishedFolders/ | ||||
| customFiles/ | ||||
| configs/ | ||||
| watchedFolders/ | ||||
| clientWebUI/ | ||||
| !cucumber/ | ||||
| !cucumber/exampleFiles/ | ||||
| !cucumber/exampleFiles/example_html.zip | ||||
| exampleYmlFiles/stirling/ | ||||
| /testing/file_snapshots | ||||
| SwaggerDoc.json | ||||
| 
 | ||||
| # Gradle | ||||
| .gradle | ||||
| .lock | ||||
| 
 | ||||
| # External tool builders | ||||
| .externalToolBuilders/ | ||||
| 
 | ||||
| # Locally stored "Eclipse launch configurations" | ||||
| *.launch | ||||
| 
 | ||||
| # PyDev specific (Python IDE for Eclipse) | ||||
| *.pydevproject | ||||
| 
 | ||||
| # CDT-specific (C/C++ Development Tooling) | ||||
| .cproject | ||||
| 
 | ||||
| # CDT- autotools | ||||
| .autotools | ||||
| 
 | ||||
| # Java annotation processor (APT) | ||||
| .factorypath | ||||
| 
 | ||||
| # PDT-specific (PHP Development Tools) | ||||
| .buildpath | ||||
| 
 | ||||
| # sbteclipse plugin | ||||
| .target | ||||
| 
 | ||||
| # Tern plugin | ||||
| .tern-project | ||||
| 
 | ||||
| # TeXlipse plugin | ||||
| .texlipse | ||||
| 
 | ||||
| # STS (Spring Tool Suite) | ||||
| .springBeans | ||||
| 
 | ||||
| # Code Recommenders | ||||
| .recommenders/ | ||||
| 
 | ||||
| # Annotation Processing | ||||
| .apt_generated/ | ||||
| .apt_generated_test/ | ||||
| 
 | ||||
| # Scala IDE specific (Scala & Java development for Eclipse) | ||||
| .cache-main | ||||
| .scala_dependencies | ||||
| .worksheet | ||||
| 
 | ||||
| # Uncomment this line if you wish to ignore the project description file. | ||||
| # Typically, this file would be tracked if it contains build/dependency configurations: | ||||
| #.project | ||||
| 
 | ||||
| ### Eclipse Patch ### | ||||
| # Spring Boot Tooling | ||||
| .sts4-cache/ | ||||
| 
 | ||||
| ### Git ### | ||||
| # Created by git for backups. To disable backups in Git: | ||||
| # $ git config --global mergetool.keepBackup false | ||||
| *.orig | ||||
| 
 | ||||
| # Created by git when using merge tools for conflicts | ||||
| *.BACKUP.* | ||||
| *.BASE.* | ||||
| *.LOCAL.* | ||||
| *.REMOTE.* | ||||
| *_BACKUP_*.txt | ||||
| *_BASE_*.txt | ||||
| *_LOCAL_*.txt | ||||
| *_REMOTE_*.txt | ||||
| 
 | ||||
| ### Java ### | ||||
| # Compiled class file | ||||
| *.class | ||||
| 
 | ||||
| # Log file | ||||
| *.log | ||||
| 
 | ||||
| # BlueJ files | ||||
| *.ctxt | ||||
| 
 | ||||
| # Mobile Tools for Java (J2ME) | ||||
| .mtj.tmp/ | ||||
| 
 | ||||
| # Package Files # | ||||
| *.jar | ||||
| *.war | ||||
| *.nar | ||||
| *.ear | ||||
| *.zip | ||||
| *.tar.gz | ||||
| *.rar | ||||
| *.db | ||||
| /build | ||||
| 
 | ||||
| # Byte-compiled / optimized / DLL files | ||||
| __pycache__/ | ||||
| *.py[cod] | ||||
| *.pyo | ||||
| 
 | ||||
| # Virtual environments | ||||
| .env* | ||||
| .venv* | ||||
| env*/ | ||||
| venv*/ | ||||
| ENV/ | ||||
| env.bak/ | ||||
| venv.bak/ | ||||
| 
 | ||||
| # VS Code | ||||
| /.vscode/**/* | ||||
| !/.vscode/settings.json | ||||
| !/.vscode/extensions.json | ||||
| 
 | ||||
| # IntelliJ IDEA | ||||
| .idea/ | ||||
| *.iml | ||||
| out/ | ||||
| 
 | ||||
| # Ignore Mac DS_Store files | ||||
| .DS_Store | ||||
| **/.DS_Store | ||||
| 
 | ||||
| # cucumber | ||||
| /cucumber/reports/** | ||||
| 
 | ||||
| # Certs and Security Files | ||||
| *.p12 | ||||
| *.pk8 | ||||
| *.pem | ||||
| *.crt | ||||
| *.cer | ||||
| *.cert | ||||
| *.der | ||||
| *.key | ||||
| *.csr | ||||
| *.kdbx | ||||
| *.jks | ||||
| *.asc | ||||
| 
 | ||||
| # SSH Keys | ||||
| *.pub | ||||
| *.priv | ||||
| id_rsa | ||||
| id_rsa.pub | ||||
| id_ecdsa | ||||
| id_ecdsa.pub | ||||
| id_ed25519 | ||||
| id_ed25519.pub | ||||
| .ssh/ | ||||
| *ssh | ||||
| 
 | ||||
| # cache | ||||
| .cache | ||||
| .ruff_cache | ||||
| .mypy_cache | ||||
| .pytest_cache | ||||
| .ipynb_checkpoints | ||||
| 
 | ||||
| **/jcef-bundle/ | ||||
| 
 | ||||
| # node_modules | ||||
| node_modules/ | ||||
| *.mjs | ||||
							
								
								
									
										52
									
								
								common/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								common/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | ||||
| plugins { | ||||
|     id 'java-library' | ||||
|     id 'io.spring.dependency-management' version '1.1.7' | ||||
| } | ||||
| 
 | ||||
| group = 'stirling.software' | ||||
| version = '0.46.2' | ||||
| 
 | ||||
| ext { | ||||
|     lombokVersion = "1.18.38" | ||||
| } | ||||
| 
 | ||||
| java { | ||||
|     sourceCompatibility = JavaVersion.VERSION_17 | ||||
| } | ||||
| 
 | ||||
| repositories { | ||||
|     mavenCentral() | ||||
| } | ||||
| 
 | ||||
| configurations.all { | ||||
|     exclude group: 'commons-logging', module: 'commons-logging' | ||||
|     exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat" | ||||
| } | ||||
| 
 | ||||
| dependencyManagement { | ||||
|     imports { | ||||
|         mavenBom 'org.springframework.boot:spring-boot-dependencies:3.4.5' | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| dependencies { | ||||
|     implementation 'org.springframework.boot:spring-boot-starter-web' | ||||
|     implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' | ||||
|     implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20240325.1' | ||||
|     implementation 'com.fathzer:javaluator:3.0.6' | ||||
|     implementation 'com.posthog.java:posthog:1.2.0' | ||||
|     implementation 'io.github.pixee:java-security-toolkit:1.2.1' | ||||
|     implementation 'org.apache.commons:commons-lang3:3.17.0' | ||||
|     implementation 'com.drewnoakes:metadata-extractor:2.19.0' // Image metadata extractor | ||||
|     implementation 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8' | ||||
|     implementation "org.apache.pdfbox:pdfbox:$pdfboxVersion" | ||||
|     implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' | ||||
|     implementation 'org.snakeyaml:snakeyaml-engine:2.9' | ||||
|     implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6" | ||||
| 
 | ||||
|     compileOnly "org.projectlombok:lombok:$lombokVersion" | ||||
|     annotationProcessor "org.projectlombok:lombok:$lombokVersion" | ||||
| 
 | ||||
|     testImplementation "org.springframework.boot:spring-boot-starter-test" | ||||
|     testRuntimeOnly 'org.mockito:mockito-inline:5.2.0' | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| @ -8,7 +8,9 @@ import java.util.List; | ||||
| import java.util.Locale; | ||||
| import java.util.Properties; | ||||
| import java.util.function.Predicate; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| @ -21,21 +23,29 @@ import org.springframework.core.io.ClassPathResource; | ||||
| import org.springframework.core.io.Resource; | ||||
| import org.springframework.core.io.ResourceLoader; | ||||
| import org.thymeleaf.spring6.SpringTemplateEngine; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| 
 | ||||
| @Configuration | ||||
| @Lazy | ||||
| @Slf4j | ||||
| @Configuration | ||||
| @RequiredArgsConstructor | ||||
| public class AppConfig { | ||||
| 
 | ||||
|     private final Environment env; | ||||
| 
 | ||||
|     private final ApplicationProperties applicationProperties; | ||||
| 
 | ||||
|     private final Environment env; | ||||
|     @Getter | ||||
|     @Value("${baseUrl:http://localhost}") | ||||
|     private String baseUrl; | ||||
| 
 | ||||
|     @Getter | ||||
|     @Value("${server.servlet.context-path:/}") | ||||
|     private String contextPath; | ||||
| 
 | ||||
|     @Getter | ||||
|     @Value("${server.port:8080}") | ||||
|     private String serverPort; | ||||
| 
 | ||||
|     @Bean | ||||
|     @ConditionalOnProperty(name = "system.customHTMLFiles", havingValue = "true") | ||||
| @ -198,6 +208,31 @@ public class AppConfig { | ||||
|         return applicationProperties.getAutomaticallyGenerated().getUUID(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ApplicationProperties.Security security() { | ||||
|         return applicationProperties.getSecurity(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ApplicationProperties.Security.OAUTH2 oAuth2() { | ||||
|         return applicationProperties.getSecurity().getOauth2(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ApplicationProperties.Premium premium() { | ||||
|         return applicationProperties.getPremium(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ApplicationProperties.System system() { | ||||
|         return applicationProperties.getSystem(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public ApplicationProperties.Datasource datasource() { | ||||
|         return applicationProperties.getSystem().getDatasource(); | ||||
|     } | ||||
| 
 | ||||
|     @Bean(name = "disablePixel") | ||||
|     public boolean disablePixel() { | ||||
|         return Boolean.getBoolean(env.getProperty("DISABLE_PIXEL")); | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.IOException; | ||||
| @ -13,6 +13,8 @@ import java.util.List; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.util.YamlHelper; | ||||
| 
 | ||||
| /** | ||||
|  * A naive, line-based approach to merging "settings.yml" with "settings.yml.template" while | ||||
|  * preserving exact whitespace, blank lines, and inline comments -- but we only rewrite the file if | ||||
| @ -76,7 +78,7 @@ public class ConfigInitializer { | ||||
|         Path customSettingsPath = Paths.get(InstallationPathConfig.getCustomSettingsPath()); | ||||
|         if (Files.notExists(customSettingsPath)) { | ||||
|             Files.createFile(customSettingsPath); | ||||
|             log.info("Created custom_settings file: {}", customSettingsPath.toString()); | ||||
|             log.info("Created custom_settings file: {}", customSettingsPath); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| @ -10,10 +10,9 @@ import org.thymeleaf.IEngineConfiguration; | ||||
| import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver; | ||||
| import org.thymeleaf.templateresource.FileTemplateResource; | ||||
| import org.thymeleaf.templateresource.ITemplateResource; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.InputStreamTemplateResource; | ||||
| import stirling.software.common.model.InputStreamTemplateResource; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateResolver { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.nio.file.Paths; | ||||
| @ -48,25 +48,22 @@ public class InstallationPathConfig { | ||||
|             String os = System.getProperty("os.name").toLowerCase(); | ||||
|             if (os.contains("win")) { | ||||
|                 return Paths.get( | ||||
|                                         System.getenv("APPDATA"), // parent path | ||||
|                                         "Stirling-PDF") | ||||
|                                 .toString() | ||||
|                         + File.separator; | ||||
|                     System.getenv("APPDATA"), // parent path | ||||
|                     "Stirling-PDF") | ||||
|                     + File.separator; | ||||
|             } else if (os.contains("mac")) { | ||||
|                 return Paths.get( | ||||
|                                         System.getProperty("user.home"), | ||||
|                                         "Library", | ||||
|                                         "Application Support", | ||||
|                                         "Stirling-PDF") | ||||
|                                 .toString() | ||||
|                         + File.separator; | ||||
|                     System.getProperty("user.home"), | ||||
|                     "Library", | ||||
|                     "Application Support", | ||||
|                     "Stirling-PDF") | ||||
|                     + File.separator; | ||||
|             } else { | ||||
|                 return Paths.get( | ||||
|                                         System.getProperty("user.home"), // parent path | ||||
|                                         ".config", | ||||
|                                         "Stirling-PDF") | ||||
|                                 .toString() | ||||
|                         + File.separator; | ||||
|                     System.getProperty("user.home"), // parent path | ||||
|                     ".config", | ||||
|                     "Stirling-PDF") | ||||
|                     + File.separator; | ||||
|             } | ||||
|         } | ||||
|         return "." + File.separator; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| @ -9,9 +9,9 @@ import org.springframework.context.annotation.Configuration; | ||||
| import lombok.Getter; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Operations; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Pipeline; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.CustomPaths.Operations; | ||||
| import stirling.software.common.model.ApplicationProperties.CustomPaths.Pipeline; | ||||
| 
 | ||||
| @Slf4j | ||||
| @Configuration | ||||
| @ -1,8 +1,6 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.Properties; | ||||
| 
 | ||||
| import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; | ||||
| import org.springframework.core.env.PropertiesPropertySource; | ||||
| import org.springframework.core.env.PropertySource; | ||||
| @ -12,8 +10,7 @@ import org.springframework.core.io.support.PropertySourceFactory; | ||||
| public class YamlPropertySourceFactory implements PropertySourceFactory { | ||||
| 
 | ||||
|     @Override | ||||
|     public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) | ||||
|             throws IOException { | ||||
|     public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) { | ||||
|         YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); | ||||
|         factory.setResources(encodedResource.getResource()); | ||||
|         Properties properties = factory.getObject(); | ||||
| @ -0,0 +1,7 @@ | ||||
| package stirling.software.common.configuration.interfaces; | ||||
| 
 | ||||
| public interface ShowAdminInterface { | ||||
|     default boolean getShowUpdateOnlyAdmins() { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,4 @@ | ||||
| package stirling.software.SPDF.model; | ||||
| 
 | ||||
| import static stirling.software.SPDF.utils.validation.Validator.*; | ||||
| package stirling.software.common.model; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| @ -14,10 +12,13 @@ import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.Getter; | ||||
| import lombok.Setter; | ||||
| import lombok.ToString; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.boot.context.properties.ConfigurationProperties; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.core.Ordered; | ||||
| import org.springframework.core.annotation.Order; | ||||
| import org.springframework.core.env.ConfigurableEnvironment; | ||||
| @ -26,54 +27,23 @@ import org.springframework.core.io.ClassPathResource; | ||||
| import org.springframework.core.io.FileSystemResource; | ||||
| import org.springframework.core.io.Resource; | ||||
| import org.springframework.core.io.support.EncodedResource; | ||||
| import org.springframework.stereotype.Component; | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| import stirling.software.common.configuration.YamlPropertySourceFactory; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
| import stirling.software.common.model.oauth2.GitHubProvider; | ||||
| import stirling.software.common.model.oauth2.GoogleProvider; | ||||
| import stirling.software.common.model.oauth2.KeycloakProvider; | ||||
| import stirling.software.common.model.oauth2.Provider; | ||||
| import stirling.software.common.util.ValidationUtils; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.Getter; | ||||
| import lombok.Setter; | ||||
| import lombok.ToString; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.config.InstallationPathConfig; | ||||
| import stirling.software.SPDF.config.YamlPropertySourceFactory; | ||||
| import stirling.software.SPDF.model.exception.UnsupportedProviderException; | ||||
| import stirling.software.SPDF.model.provider.GitHubProvider; | ||||
| import stirling.software.SPDF.model.provider.GoogleProvider; | ||||
| import stirling.software.SPDF.model.provider.KeycloakProvider; | ||||
| import stirling.software.SPDF.model.provider.Provider; | ||||
| 
 | ||||
| @Configuration | ||||
| @ConfigurationProperties(prefix = "") | ||||
| @Data | ||||
| @Order(Ordered.HIGHEST_PRECEDENCE) | ||||
| @Slf4j | ||||
| @Component | ||||
| @Order(Ordered.HIGHEST_PRECEDENCE) | ||||
| @ConfigurationProperties(prefix = "") | ||||
| public class ApplicationProperties { | ||||
| 
 | ||||
|     @Bean | ||||
|     public PropertySource<?> dynamicYamlPropertySource(ConfigurableEnvironment environment) | ||||
|             throws IOException { | ||||
|         String configPath = InstallationPathConfig.getSettingsPath(); | ||||
|         log.debug("Attempting to load settings from: " + configPath); | ||||
| 
 | ||||
|         File file = new File(configPath); | ||||
|         if (!file.exists()) { | ||||
|             log.error("Warning: Settings file does not exist at: " + configPath); | ||||
|         } | ||||
| 
 | ||||
|         Resource resource = new FileSystemResource(configPath); | ||||
|         if (!resource.exists()) { | ||||
|             throw new FileNotFoundException("Settings file not found at: " + configPath); | ||||
|         } | ||||
| 
 | ||||
|         EncodedResource encodedResource = new EncodedResource(resource); | ||||
|         PropertySource<?> propertySource = | ||||
|                 new YamlPropertySourceFactory().createPropertySource(null, encodedResource); | ||||
|         environment.getPropertySources().addFirst(propertySource); | ||||
| 
 | ||||
|         log.debug("Loaded properties: " + propertySource.getSource()); | ||||
| 
 | ||||
|         return propertySource; | ||||
|     } | ||||
| 
 | ||||
|     private Legal legal = new Legal(); | ||||
|     private Security security = new Security(); | ||||
|     private System system = new System(); | ||||
| @ -89,6 +59,32 @@ public class ApplicationProperties { | ||||
|     private AutoPipeline autoPipeline = new AutoPipeline(); | ||||
|     private ProcessExecutor processExecutor = new ProcessExecutor(); | ||||
| 
 | ||||
|     @Bean | ||||
|     public PropertySource<?> dynamicYamlPropertySource(ConfigurableEnvironment environment) | ||||
|         throws IOException { | ||||
|         String configPath = InstallationPathConfig.getSettingsPath(); | ||||
|         log.debug("Attempting to load settings from: " + configPath); | ||||
| 
 | ||||
|         File file = new File(configPath); | ||||
|         if (!file.exists()) { | ||||
|             log.error("Warning: Settings file does not exist at: " + configPath); | ||||
|         } | ||||
| 
 | ||||
|         Resource resource = new FileSystemResource(configPath); | ||||
|         if (!resource.exists()) { | ||||
|             throw new FileNotFoundException("Settings file not found at: " + configPath); | ||||
|         } | ||||
| 
 | ||||
|         EncodedResource encodedResource = new EncodedResource(resource); | ||||
|         PropertySource<?> propertySource = | ||||
|             new YamlPropertySourceFactory().createPropertySource(null, encodedResource); | ||||
|         environment.getPropertySources().addFirst(propertySource); | ||||
| 
 | ||||
|         log.debug("Loaded properties: " + propertySource.getSource()); | ||||
| 
 | ||||
|         return propertySource; | ||||
|     } | ||||
| 
 | ||||
|     @Data | ||||
|     public static class AutoPipeline { | ||||
|         private String outputFolder; | ||||
| @ -248,11 +244,11 @@ public class ApplicationProperties { | ||||
|             } | ||||
| 
 | ||||
|             public boolean isSettingsValid() { | ||||
|                 return !isStringEmpty(this.getIssuer()) | ||||
|                         && !isStringEmpty(this.getClientId()) | ||||
|                         && !isStringEmpty(this.getClientSecret()) | ||||
|                         && !isCollectionEmpty(this.getScopes()) | ||||
|                         && !isStringEmpty(this.getUseAsUsername()); | ||||
|                 return !ValidationUtils.isStringEmpty(this.getIssuer()) | ||||
|                         && !ValidationUtils.isStringEmpty(this.getClientId()) | ||||
|                         && !ValidationUtils.isStringEmpty(this.getClientSecret()) | ||||
|                         && !ValidationUtils.isCollectionEmpty(this.getScopes()) | ||||
|                         && !ValidationUtils.isStringEmpty(this.getUseAsUsername()); | ||||
|             } | ||||
| 
 | ||||
|             @Data | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.model; | ||||
| 
 | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model; | ||||
| package stirling.software.common.model; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| @ -0,0 +1,19 @@ | ||||
| package stirling.software.common.model; | ||||
| 
 | ||||
| import java.util.Calendar; | ||||
| 
 | ||||
| import lombok.Builder; | ||||
| import lombok.Data; | ||||
| 
 | ||||
| @Data | ||||
| @Builder | ||||
| public class PdfMetadata { | ||||
|     private String author; | ||||
|     private String producer; | ||||
|     private String title; | ||||
|     private String creator; | ||||
|     private String subject; | ||||
|     private String keywords; | ||||
|     private Calendar creationDate; | ||||
|     private Calendar modificationDate; | ||||
| } | ||||
| @ -0,0 +1,19 @@ | ||||
| package stirling.software.common.model.api; | ||||
| 
 | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode | ||||
| public class GeneralFile { | ||||
| 
 | ||||
|     @Schema( | ||||
|             description = "The input file", | ||||
|             requiredMode = Schema.RequiredMode.REQUIRED, | ||||
|             format = "binary") | ||||
|     private MultipartFile fileInput; | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model.api; | ||||
| package stirling.software.common.model.api; | ||||
| 
 | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| @ -1,11 +1,10 @@ | ||||
| package stirling.software.SPDF.model.api.converters; | ||||
| package stirling.software.common.model.api.converters; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.PDFFile; | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model.api.misc; | ||||
| package stirling.software.common.model.api.misc; | ||||
| 
 | ||||
| public enum HighContrastColorCombination { | ||||
|     WHITE_TEXT_ON_BLACK, | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model.api.misc; | ||||
| package stirling.software.common.model.api.misc; | ||||
| 
 | ||||
| public enum ReplaceAndInvert { | ||||
|     HIGH_CONTRAST_COLOR, | ||||
| @ -0,0 +1,28 @@ | ||||
| package stirling.software.common.model.api.security; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode | ||||
| public class RedactionArea { | ||||
|     @Schema(description = "The left edge point of the area to be redacted.") | ||||
|     private Double x; | ||||
| 
 | ||||
|     @Schema(description = "The top edge point of the area to be redacted.") | ||||
|     private Double y; | ||||
| 
 | ||||
|     @Schema(description = "The height of the area to be redacted.") | ||||
|     private Double height; | ||||
| 
 | ||||
|     @Schema(description = "The width of the area to be redacted.") | ||||
|     private Double width; | ||||
| 
 | ||||
|     @Schema(description = "The page on which the area should be redacted.") | ||||
|     private Integer page; | ||||
| 
 | ||||
|     @Schema(description = "The color used to redact the specified area.") | ||||
|     private String color; | ||||
| } | ||||
| @ -0,0 +1,66 @@ | ||||
| package stirling.software.common.model.enumeration; | ||||
| 
 | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| @Getter | ||||
| @RequiredArgsConstructor | ||||
| public enum Role { | ||||
| 
 | ||||
|     // Unlimited access | ||||
|     ADMIN("ROLE_ADMIN", Integer.MAX_VALUE, Integer.MAX_VALUE, "adminUserSettings.admin"), | ||||
| 
 | ||||
|     // Unlimited access | ||||
|     USER("ROLE_USER", Integer.MAX_VALUE, Integer.MAX_VALUE, "adminUserSettings.user"), | ||||
| 
 | ||||
|     // 40 API calls Per Day, 40 web calls | ||||
|     LIMITED_API_USER("ROLE_LIMITED_API_USER", 40, 40, "adminUserSettings.apiUser"), | ||||
| 
 | ||||
|     // 20 API calls Per Day, 20 web calls | ||||
|     EXTRA_LIMITED_API_USER("ROLE_EXTRA_LIMITED_API_USER", 20, 20, "adminUserSettings.extraApiUser"), | ||||
| 
 | ||||
|     // 0 API calls per day and 20 web calls | ||||
|     WEB_ONLY_USER("ROLE_WEB_ONLY_USER", 0, 20, "adminUserSettings.webOnlyUser"), | ||||
| 
 | ||||
|     INTERNAL_API_USER( | ||||
|             "STIRLING-PDF-BACKEND-API-USER", | ||||
|             Integer.MAX_VALUE, | ||||
|             Integer.MAX_VALUE, | ||||
|             "adminUserSettings.internalApiUser"), | ||||
| 
 | ||||
|     DEMO_USER("ROLE_DEMO_USER", 100, 100, "adminUserSettings.demoUser"); | ||||
| 
 | ||||
|     private final String roleId; | ||||
|     private final int apiCallsPerDay; | ||||
|     private final int webCallsPerDay; | ||||
|     private final String roleName; | ||||
| 
 | ||||
|     public static String getRoleNameByRoleId(String roleId) { | ||||
|         // Using the fromString method to get the Role enum based on the roleId | ||||
|         Role role = fromString(roleId); | ||||
|         // Return the roleName of the found Role enum | ||||
|         return role.getRoleName(); | ||||
|     } | ||||
| 
 | ||||
|     // Method to retrieve all role IDs and role names | ||||
|     public static Map<String, String> getAllRoleDetails() { | ||||
|         // Using LinkedHashMap to preserve order | ||||
|         Map<String, String> roleDetails = new LinkedHashMap<>(); | ||||
|         for (Role role : Role.values()) { | ||||
|             roleDetails.put(role.getRoleId(), role.getRoleName()); | ||||
|         } | ||||
|         return roleDetails; | ||||
|     } | ||||
| 
 | ||||
|     public static Role fromString(String roleId) { | ||||
|         for (Role role : Role.values()) { | ||||
|             if (role.getRoleId().equalsIgnoreCase(roleId)) { | ||||
|                 return role; | ||||
|             } | ||||
|         } | ||||
|         throw new IllegalArgumentException("No Role defined for id: " + roleId); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model; | ||||
| package stirling.software.common.model.enumeration; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| 
 | ||||
| @ -0,0 +1,7 @@ | ||||
| package stirling.software.common.model.exception; | ||||
| 
 | ||||
| public class UnsupportedClaimException extends RuntimeException { | ||||
|     public UnsupportedClaimException(String message) { | ||||
|         super(message); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.model.exception; | ||||
| package stirling.software.common.model.exception; | ||||
| 
 | ||||
| public class UnsupportedProviderException extends Exception { | ||||
|     public UnsupportedProviderException(String message) { | ||||
| @ -1,11 +1,9 @@ | ||||
| package stirling.software.SPDF.model.provider; | ||||
| package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.UsernameAttribute; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
| public class GitHubProvider extends Provider { | ||||
| @ -1,11 +1,9 @@ | ||||
| package stirling.software.SPDF.model.provider; | ||||
| package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.UsernameAttribute; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
| public class GoogleProvider extends Provider { | ||||
| @ -1,11 +1,9 @@ | ||||
| package stirling.software.SPDF.model.provider; | ||||
| package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.UsernameAttribute; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
| public class KeycloakProvider extends Provider { | ||||
| @ -1,16 +1,13 @@ | ||||
| package stirling.software.SPDF.model.provider; | ||||
| 
 | ||||
| import static stirling.software.SPDF.model.UsernameAttribute.EMAIL; | ||||
| package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.UsernameAttribute; | ||||
| import stirling.software.SPDF.model.exception.UnsupportedUsernameAttribute; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| import stirling.software.common.model.exception.UnsupportedClaimException; | ||||
| import static stirling.software.common.model.enumeration.UsernameAttribute.EMAIL; | ||||
| 
 | ||||
| @Data | ||||
| @NoArgsConstructor | ||||
| @ -83,7 +80,7 @@ public class Provider { | ||||
|                 return usernameAttribute; | ||||
|             } | ||||
|             default -> | ||||
|                     throw new UnsupportedUsernameAttribute( | ||||
|                     throw new UnsupportedClaimException( | ||||
|                             String.format(EXCEPTION_MESSAGE, usernameAttribute, clientName)); | ||||
|         } | ||||
|     } | ||||
| @ -94,7 +91,7 @@ public class Provider { | ||||
|                 return usernameAttribute; | ||||
|             } | ||||
|             default -> | ||||
|                     throw new UnsupportedUsernameAttribute( | ||||
|                     throw new UnsupportedClaimException( | ||||
|                             String.format(EXCEPTION_MESSAGE, usernameAttribute, clientName)); | ||||
|         } | ||||
|     } | ||||
| @ -105,7 +102,7 @@ public class Provider { | ||||
|                 return usernameAttribute; | ||||
|             } | ||||
|             default -> | ||||
|                     throw new UnsupportedUsernameAttribute( | ||||
|                     throw new UnsupportedClaimException( | ||||
|                             String.format(EXCEPTION_MESSAGE, usernameAttribute, clientName)); | ||||
|         } | ||||
|     } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.service; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.File; | ||||
| @ -22,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.PDFFile; | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| 
 | ||||
| /** | ||||
|  * Adaptive PDF document factory that optimizes memory usage based on file size and available system | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.service; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import java.util.Calendar; | ||||
| 
 | ||||
| @ -7,9 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.model.PdfMetadata; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.PdfMetadata; | ||||
| 
 | ||||
| @Service | ||||
| public class PdfMetadataService { | ||||
| @ -1,12 +1,21 @@ | ||||
| package stirling.software.SPDF.service; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.lang.management.*; | ||||
| import java.lang.management.GarbageCollectorMXBean; | ||||
| import java.lang.management.ManagementFactory; | ||||
| import java.lang.management.MemoryMXBean; | ||||
| import java.lang.management.OperatingSystemMXBean; | ||||
| import java.lang.management.RuntimeMXBean; | ||||
| import java.lang.management.ThreadMXBean; | ||||
| import java.net.InetAddress; | ||||
| import java.net.NetworkInterface; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.*; | ||||
| import java.util.Enumeration; | ||||
| import java.util.HashMap; | ||||
| import java.util.Locale; | ||||
| import java.util.Map; | ||||
| import java.util.TimeZone; | ||||
| 
 | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| @ -16,8 +25,7 @@ import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import com.posthog.java.PostHog; | ||||
| 
 | ||||
| import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Service | ||||
| public class PostHogService { | ||||
| @ -200,7 +208,7 @@ public class PostHogService { | ||||
| 
 | ||||
|         // New environment variables | ||||
|         dockerMetrics.put("version_tag", System.getenv("VERSION_TAG")); | ||||
|         dockerMetrics.put("docker_enable_security", System.getenv("DOCKER_ENABLE_SECURITY")); | ||||
|         dockerMetrics.put("without_enhanced_features", System.getenv("WITHOUT_ENHANCED_FEATURES")); | ||||
|         dockerMetrics.put("fat_docker", System.getenv("FAT_DOCKER")); | ||||
| 
 | ||||
|         return dockerMetrics; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.controller.api.pipeline; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| public interface UserServiceInterface { | ||||
|     String getApiKeyForUser(String username); | ||||
| @ -1,10 +1,10 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| public class CheckProgramInstall { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import org.owasp.html.HtmlPolicyBuilder; | ||||
| import org.owasp.html.PolicyFactory; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.PrintWriter; | ||||
| import java.io.StringWriter; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static java.nio.file.StandardWatchEventKinds.*; | ||||
| 
 | ||||
| @ -17,8 +17,7 @@ import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.config.RuntimePathConfig; | ||||
| import stirling.software.common.configuration.RuntimePathConfig; | ||||
| 
 | ||||
| @Component | ||||
| @Slf4j | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| @ -16,8 +16,8 @@ import java.util.zip.ZipOutputStream; | ||||
| 
 | ||||
| import io.github.pixee.security.ZipSecurity; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; | ||||
| import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; | ||||
| import stirling.software.common.model.api.converters.HTMLToPdfRequest; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| public class FileToPdf { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| @ -27,8 +27,7 @@ import io.github.pixee.security.Urls; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.config.InstallationPathConfig; | ||||
| import stirling.software.SPDF.config.YamlHelper; | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class GeneralUtils { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.awt.geom.AffineTransform; | ||||
| import java.awt.image.*; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.File; | ||||
| @ -28,7 +28,7 @@ import io.github.pixee.security.Filenames; | ||||
| import lombok.NoArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| @Slf4j | ||||
| @NoArgsConstructor | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| import java.awt.image.BufferedImage; | ||||
| @ -34,8 +34,7 @@ import org.springframework.web.multipart.MultipartFile; | ||||
| import io.github.pixee.security.Filenames; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.service.CustomPDFDocumentFactory; | ||||
| import stirling.software.common.service.CustomPDFDocumentFactory; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class PdfUtils { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| @ -17,7 +17,7 @@ import io.github.pixee.security.BoundedLineReader; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class ProcessExecutor { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| @ -1,10 +1,10 @@ | ||||
| package stirling.software.SPDF.utils.validation; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| import stirling.software.common.model.oauth2.Provider; | ||||
| import static stirling.software.common.util.ValidationUtils.isCollectionEmpty; | ||||
| import static stirling.software.common.util.ValidationUtils.isStringEmpty; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.provider.Provider; | ||||
| 
 | ||||
| public class Validator { | ||||
| public class ProviderUtils { | ||||
| 
 | ||||
|     public static boolean validateProvider(Provider provider) { | ||||
|         if (provider == null) { | ||||
| @ -25,12 +25,4 @@ public class Validator { | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isStringEmpty(String input) { | ||||
|         return input == null || input.isBlank(); | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isCollectionEmpty(Collection<String> input) { | ||||
|         return input == null || input.isEmpty(); | ||||
|     } | ||||
| } | ||||
| @ -1,14 +1,12 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| public class RequestUriUtils { | ||||
| 
 | ||||
|     public static boolean isStaticResource(String requestURI) { | ||||
| 
 | ||||
|         return isStaticResource("", requestURI); | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isStaticResource(String contextPath, String requestURI) { | ||||
| 
 | ||||
|         return requestURI.startsWith(contextPath + "/css/") | ||||
|                 || requestURI.startsWith(contextPath + "/fonts/") | ||||
|                 || requestURI.startsWith(contextPath + "/js/") | ||||
| @ -1,9 +1,7 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| 
 | ||||
| import javax.swing.*; | ||||
| 
 | ||||
| public class UIScaling { | ||||
|     private static final double BASE_RESOLUTION_WIDTH = 1920.0; | ||||
|     private static final double BASE_RESOLUTION_HEIGHT = 1080.0; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.ServerSocket; | ||||
| @ -0,0 +1,14 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| public class ValidationUtils { | ||||
| 
 | ||||
|     public static boolean isStringEmpty(String input) { | ||||
|         return input == null || input.isBlank(); | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isCollectionEmpty(Collection<String> input) { | ||||
|         return input == null || input.isEmpty(); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.IOException; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.StringWriter; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| import java.io.ByteArrayInputStream; | ||||
| @ -23,9 +23,8 @@ import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class CustomColorReplaceStrategy extends ReplaceAndInvertColorStrategy { | ||||
| @ -1,7 +1,7 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| public class HighContrastColorReplaceDecider { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| import java.awt.image.BufferedImage; | ||||
| @ -18,8 +18,7 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; | ||||
| import org.apache.pdfbox.rendering.PDFRenderer; | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import java.awt.geom.Rectangle2D; | ||||
| import java.io.IOException; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| @ -8,8 +8,8 @@ import org.springframework.web.multipart.MultipartFile; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.PDFFile; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.propertyeditor; | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.ArrayList; | ||||
| @ -9,8 +9,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.security.RedactionArea; | ||||
| import stirling.software.common.model.api.security.RedactionArea; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class StringToArrayListPropertyEditor extends PropertyEditorSupport { | ||||
| @ -26,7 +25,8 @@ public class StringToArrayListPropertyEditor extends PropertyEditorSupport { | ||||
|         try { | ||||
|             objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); | ||||
|             TypeReference<ArrayList<RedactionArea>> typeRef = | ||||
|                     new TypeReference<ArrayList<RedactionArea>>() {}; | ||||
|                 new TypeReference<>() { | ||||
|                 }; | ||||
|             List<RedactionArea> list = objectMapper.readValue(text, typeRef); | ||||
|             setValue(list); | ||||
|         } catch (Exception e) { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.propertyeditor; | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.HashMap; | ||||
| @ -15,7 +15,7 @@ public class StringToMapPropertyEditor extends PropertyEditorSupport { | ||||
|     public void setAsText(String text) throws IllegalArgumentException { | ||||
|         try { | ||||
|             TypeReference<HashMap<String, String>> typeRef = | ||||
|                     new TypeReference<HashMap<String, String>>() {}; | ||||
|                 new TypeReference<>() {}; | ||||
|             Map<String, String> map = objectMapper.readValue(text, typeRef); | ||||
|             setValue(map); | ||||
|         } catch (Exception e) { | ||||
| @ -1,7 +1,8 @@ | ||||
| package stirling.software.SPDF.service; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| import static org.mockito.Mockito.*; | ||||
| import static stirling.software.common.service.SpyPDFDocumentFactory.*; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.nio.file.*; | ||||
| @ -19,8 +20,7 @@ import org.junit.jupiter.params.ParameterizedTest; | ||||
| import org.junit.jupiter.params.provider.CsvSource; | ||||
| import org.springframework.mock.web.MockMultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.PDFFile; | ||||
| import stirling.software.SPDF.service.SpyPDFDocumentFactory.StrategyType; | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| 
 | ||||
| @TestInstance(TestInstance.Lifecycle.PER_CLASS) | ||||
| @TestMethodOrder(MethodOrderer.OrderAnnotation.class) | ||||
| @ -46,7 +46,7 @@ class CustomPDFDocumentFactoryTest { | ||||
|     void testStrategy_FileInput(int sizeMB, StrategyType expected) throws IOException { | ||||
|         File file = writeTempFile(inflatePdf(basePdfBytes, sizeMB)); | ||||
|         try (PDDocument doc = factory.load(file)) { | ||||
|             assertEquals(expected, factory.lastStrategyUsed); | ||||
|             Assertions.assertEquals(expected, factory.lastStrategyUsed); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -55,7 +55,7 @@ class CustomPDFDocumentFactoryTest { | ||||
|     void testStrategy_ByteArray(int sizeMB, StrategyType expected) throws IOException { | ||||
|         byte[] inflated = inflatePdf(basePdfBytes, sizeMB); | ||||
|         try (PDDocument doc = factory.load(inflated)) { | ||||
|             assertEquals(expected, factory.lastStrategyUsed); | ||||
|             Assertions.assertEquals(expected, factory.lastStrategyUsed); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -64,7 +64,7 @@ class CustomPDFDocumentFactoryTest { | ||||
|     void testStrategy_InputStream(int sizeMB, StrategyType expected) throws IOException { | ||||
|         byte[] inflated = inflatePdf(basePdfBytes, sizeMB); | ||||
|         try (PDDocument doc = factory.load(new ByteArrayInputStream(inflated))) { | ||||
|             assertEquals(expected, factory.lastStrategyUsed); | ||||
|             Assertions.assertEquals(expected, factory.lastStrategyUsed); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -75,7 +75,7 @@ class CustomPDFDocumentFactoryTest { | ||||
|         MockMultipartFile multipart = | ||||
|                 new MockMultipartFile("file", "doc.pdf", "application/pdf", inflated); | ||||
|         try (PDDocument doc = factory.load(multipart)) { | ||||
|             assertEquals(expected, factory.lastStrategyUsed); | ||||
|             Assertions.assertEquals(expected, factory.lastStrategyUsed); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -88,7 +88,7 @@ class CustomPDFDocumentFactoryTest { | ||||
|         PDFFile pdfFile = new PDFFile(); | ||||
|         pdfFile.setFileInput(multipart); | ||||
|         try (PDDocument doc = factory.load(pdfFile)) { | ||||
|             assertEquals(expected, factory.lastStrategyUsed); | ||||
|             Assertions.assertEquals(expected, factory.lastStrategyUsed); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.service; | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import org.apache.pdfbox.io.RandomAccessStreamCache.StreamCacheCreateFunction; | ||||
| 
 | ||||
| @ -1,5 +1,15 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import org.junit.jupiter.api.AfterEach; | ||||
| import org.junit.jupiter.api.BeforeEach; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.mockito.MockedStatic; | ||||
| import org.mockito.Mockito; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| import static org.junit.jupiter.api.Assertions.assertNull; | ||||
| @ -10,19 +20,6 @@ import static org.mockito.Mockito.times; | ||||
| import static org.mockito.Mockito.verify; | ||||
| import static org.mockito.Mockito.when; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.junit.jupiter.api.AfterEach; | ||||
| import org.junit.jupiter.api.BeforeEach; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.mockito.MockedStatic; | ||||
| import org.mockito.Mockito; | ||||
| 
 | ||||
| import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| class CheckProgramInstallTest { | ||||
| 
 | ||||
|     private MockedStatic<ProcessExecutor> mockProcessExecutor; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| 
 | ||||
| @ -7,6 +7,8 @@ import java.time.LocalDateTime; | ||||
| import org.junit.jupiter.params.ParameterizedTest; | ||||
| import org.junit.jupiter.params.provider.CsvSource; | ||||
| 
 | ||||
| import stirling.software.common.model.FileInfo; | ||||
| 
 | ||||
| public class FileInfoTest { | ||||
| 
 | ||||
|     @ParameterizedTest(name = "{index}: fileSize={0}") | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| @ -19,8 +19,7 @@ import org.junit.jupiter.api.io.TempDir; | ||||
| import org.mockito.Mock; | ||||
| import org.mockito.Mockito; | ||||
| import org.mockito.junit.jupiter.MockitoExtension; | ||||
| 
 | ||||
| import stirling.software.SPDF.config.RuntimePathConfig; | ||||
| import stirling.software.common.configuration.RuntimePathConfig; | ||||
| 
 | ||||
| @ExtendWith(MockitoExtension.class) | ||||
| class FileMonitorTest { | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -8,7 +8,7 @@ import java.io.IOException; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; | ||||
| import stirling.software.common.model.api.converters.HTMLToPdfRequest; | ||||
| 
 | ||||
| public class FileToPdfTest { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.*; | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -30,7 +30,7 @@ import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import io.github.pixee.security.ZipSecurity; | ||||
| 
 | ||||
| import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| /** | ||||
|  * Tests for PDFToFile utility class. This includes both invalid content type cases and positive | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| @ -23,9 +23,9 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.mockito.Mockito; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.service.CustomPDFDocumentFactory; | ||||
| import stirling.software.SPDF.service.PdfMetadataService; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.service.CustomPDFDocumentFactory; | ||||
| import stirling.software.common.service.PdfMetadataService; | ||||
| 
 | ||||
| public class PdfUtilsTest { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| 
 | ||||
| @ -1,27 +1,22 @@ | ||||
| package stirling.software.SPDF.utils.validation; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| import static org.mockito.Mockito.mock; | ||||
| import static org.mockito.Mockito.when; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Assertions; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.junit.jupiter.api.extension.ExtendWith; | ||||
| import org.junit.jupiter.params.ParameterizedTest; | ||||
| import org.junit.jupiter.params.provider.Arguments; | ||||
| import org.junit.jupiter.params.provider.MethodSource; | ||||
| import org.mockito.junit.jupiter.MockitoExtension; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.UsernameAttribute; | ||||
| import stirling.software.SPDF.model.provider.GitHubProvider; | ||||
| import stirling.software.SPDF.model.provider.GoogleProvider; | ||||
| import stirling.software.SPDF.model.provider.Provider; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| import stirling.software.common.model.oauth2.GitHubProvider; | ||||
| import stirling.software.common.model.oauth2.GoogleProvider; | ||||
| import stirling.software.common.model.oauth2.Provider; | ||||
| import static org.mockito.Mockito.*; | ||||
| 
 | ||||
| @ExtendWith(MockitoExtension.class) | ||||
| class ValidatorTest { | ||||
| class ProviderUtilsTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void testSuccessfulValidation() { | ||||
| @ -31,13 +26,13 @@ class ValidatorTest { | ||||
|         when(provider.getClientSecret()).thenReturn("clientSecret"); | ||||
|         when(provider.getScopes()).thenReturn(List.of("read:user")); | ||||
| 
 | ||||
|         assertTrue(Validator.validateProvider(provider)); | ||||
|         Assertions.assertTrue(ProviderUtils.validateProvider(provider)); | ||||
|     } | ||||
| 
 | ||||
|     @ParameterizedTest | ||||
|     @MethodSource("providerParams") | ||||
|     void testUnsuccessfulValidation(Provider provider) { | ||||
|         assertFalse(Validator.validateProvider(provider)); | ||||
|         Assertions.assertFalse(ProviderUtils.validateProvider(provider)); | ||||
|     } | ||||
| 
 | ||||
|     public static Stream<Arguments> providerParams() { | ||||
| @ -0,0 +1,311 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.junit.jupiter.params.ParameterizedTest; | ||||
| import org.junit.jupiter.params.provider.ValueSource; | ||||
| 
 | ||||
| public class RequestUriUtilsTest { | ||||
| 
 | ||||
|     @Test | ||||
|     void testIsStaticResource() { | ||||
|         // Test static resources without context path | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/css/styles.css"), "CSS files should be static"); | ||||
|         assertTrue(RequestUriUtils.isStaticResource("/js/script.js"), "JS files should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/images/logo.png"), | ||||
|             "Image files should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/public/index.html"), | ||||
|             "Public files should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/pdfjs/pdf.worker.js"), | ||||
|             "PDF.js files should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/api/v1/info/status"), | ||||
|             "API status should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/some-path/icon.svg"), | ||||
|             "SVG files should be static"); | ||||
|         assertTrue(RequestUriUtils.isStaticResource("/login"), "Login page should be static"); | ||||
|         assertTrue(RequestUriUtils.isStaticResource("/error"), "Error page should be static"); | ||||
| 
 | ||||
|         // Test non-static resources | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource("/api/v1/users"), | ||||
|             "API users should not be static"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource("/api/v1/orders"), | ||||
|             "API orders should not be static"); | ||||
|         assertFalse(RequestUriUtils.isStaticResource("/"), "Root path should not be static"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource("/register"), | ||||
|             "Register page should not be static"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource("/api/v1/products"), | ||||
|             "API products should not be static"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void testIsStaticResourceWithContextPath() { | ||||
|         String contextPath = "/myapp"; | ||||
| 
 | ||||
|         // Test static resources with context path | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource(contextPath, contextPath + "/css/styles.css"), | ||||
|             "CSS with context path should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource(contextPath, contextPath + "/js/script.js"), | ||||
|             "JS with context path should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource(contextPath, contextPath + "/images/logo.png"), | ||||
|             "Images with context path should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource(contextPath, contextPath + "/login"), | ||||
|             "Login with context path should be static"); | ||||
| 
 | ||||
|         // Test non-static resources with context path | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource(contextPath, contextPath + "/api/v1/users"), | ||||
|             "API users with context path should not be static"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource(contextPath, "/"), | ||||
|             "Root path with context path should not be static"); | ||||
|     } | ||||
| 
 | ||||
|     @ParameterizedTest | ||||
|     @ValueSource( | ||||
|         strings = { | ||||
|             "robots.txt", | ||||
|             "/favicon.ico", | ||||
|             "/icon.svg", | ||||
|             "/image.png", | ||||
|             "/site.webmanifest", | ||||
|             "/app/logo.svg", | ||||
|             "/downloads/document.png", | ||||
|             "/assets/brand.ico", | ||||
|             "/any/path/with/image.svg", | ||||
|             "/deep/nested/folder/icon.png" | ||||
|         }) | ||||
|     void testIsStaticResourceWithFileExtensions(String path) { | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource(path), | ||||
|             "Files with specific extensions should be static regardless of path"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void testIsTrackableResource() { | ||||
|         // Test non-trackable resources (returns false) | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/js/script.js"), | ||||
|             "JS files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/v1/api-docs"), | ||||
|             "API docs should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("robots.txt"), | ||||
|             "robots.txt should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/images/logo.png"), | ||||
|             "Images should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/styles.css"), | ||||
|             "CSS files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/script.js.map"), | ||||
|             "Map files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/icon.svg"), | ||||
|             "SVG files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/popularity.txt"), | ||||
|             "Popularity file should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/script.js"), | ||||
|             "JS files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/swagger/index.html"), | ||||
|             "Swagger files should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/api/v1/info/status"), | ||||
|             "API info should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/site.webmanifest"), | ||||
|             "Webmanifest should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/fonts/font.woff"), | ||||
|             "Fonts should not be trackable"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/pdfjs/viewer.js"), | ||||
|             "PDF.js files should not be trackable"); | ||||
| 
 | ||||
|         // Test trackable resources (returns true) | ||||
|         assertTrue(RequestUriUtils.isTrackableResource("/login"), "Login page should be trackable"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource("/register"), | ||||
|             "Register page should be trackable"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource("/api/v1/users"), | ||||
|             "API users should be trackable"); | ||||
|         assertTrue(RequestUriUtils.isTrackableResource("/"), "Root path should be trackable"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource("/some-other-path"), | ||||
|             "Other paths should be trackable"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void testIsTrackableResourceWithContextPath() { | ||||
|         String contextPath = "/myapp"; | ||||
| 
 | ||||
|         // Test with context path | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/js/script.js"), | ||||
|             "JS files should not be trackable with context path"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/login"), | ||||
|             "Login page should be trackable with context path"); | ||||
| 
 | ||||
|         // Additional tests with context path | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/fonts/custom.woff"), | ||||
|             "Font files should not be trackable with context path"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/images/header.png"), | ||||
|             "Images should not be trackable with context path"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/swagger/ui.html"), | ||||
|             "Swagger UI should not be trackable with context path"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/account/profile"), | ||||
|             "Account page should be trackable with context path"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource(contextPath, "/pdf/view"), | ||||
|             "PDF view page should be trackable with context path"); | ||||
|     } | ||||
| 
 | ||||
|     @ParameterizedTest | ||||
|     @ValueSource( | ||||
|         strings = { | ||||
|             "/js/util.js", | ||||
|             "/v1/api-docs/swagger.json", | ||||
|             "/robots.txt", | ||||
|             "/images/header/logo.png", | ||||
|             "/styles/theme.css", | ||||
|             "/build/app.js.map", | ||||
|             "/assets/icon.svg", | ||||
|             "/data/popularity.txt", | ||||
|             "/bundle.js", | ||||
|             "/api/swagger-ui.html", | ||||
|             "/api/v1/info/health", | ||||
|             "/site.webmanifest", | ||||
|             "/fonts/roboto.woff", | ||||
|             "/pdfjs/viewer.js" | ||||
|         }) | ||||
|     void testNonTrackableResources(String path) { | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource(path), | ||||
|             "Resources matching patterns should not be trackable: " + path); | ||||
|     } | ||||
| 
 | ||||
|     @ParameterizedTest | ||||
|     @ValueSource( | ||||
|         strings = { | ||||
|             "/", | ||||
|             "/home", | ||||
|             "/login", | ||||
|             "/register", | ||||
|             "/pdf/merge", | ||||
|             "/pdf/split", | ||||
|             "/api/v1/users/1", | ||||
|             "/api/v1/documents/process", | ||||
|             "/settings", | ||||
|             "/account/profile", | ||||
|             "/dashboard", | ||||
|             "/help", | ||||
|             "/about" | ||||
|         }) | ||||
|     void testTrackableResources(String path) { | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isTrackableResource(path), | ||||
|             "App routes should be trackable: " + path); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void testEdgeCases() { | ||||
|         // Test with empty strings | ||||
|         assertFalse(RequestUriUtils.isStaticResource("", ""), "Empty path should not be static"); | ||||
|         assertTrue(RequestUriUtils.isTrackableResource("", ""), "Empty path should be trackable"); | ||||
| 
 | ||||
|         // Test with null-like behavior (would actually throw NPE in real code) | ||||
|         // These are not actual null tests but shows handling of odd cases | ||||
|         assertFalse(RequestUriUtils.isStaticResource("null"), "String 'null' should not be static"); | ||||
| 
 | ||||
|         // Test String "null" as a path | ||||
|         boolean isTrackable = RequestUriUtils.isTrackableResource("null"); | ||||
|         assertTrue(isTrackable, "String 'null' should be trackable"); | ||||
| 
 | ||||
|         // Mixed case extensions test - note that Java's endsWith() is case-sensitive | ||||
|         // We'll check actual behavior and document it rather than asserting | ||||
| 
 | ||||
|         // Always test the lowercase versions which should definitely work | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/logo.png"), "PNG (lowercase) should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/icon.svg"), "SVG (lowercase) should be static"); | ||||
| 
 | ||||
|         // Path with query parameters | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isStaticResource("/api/users?page=1"), | ||||
|             "Path with query params should respect base path"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/images/logo.png?v=123"), | ||||
|             "Static resource with query params should still be static"); | ||||
| 
 | ||||
|         // Paths with fragments | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/css/styles.css#section1"), | ||||
|             "CSS with fragment should be static"); | ||||
| 
 | ||||
|         // Multiple dots in filename | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/js/jquery.min.js"), | ||||
|             "JS with multiple dots should be static"); | ||||
| 
 | ||||
|         // Special characters in path | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/images/user's-photo.png"), | ||||
|             "Path with special chars should be handled correctly"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void testComplexPaths() { | ||||
|         // Test complex static resource paths | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/css/theme/dark/styles.css"), | ||||
|             "Nested CSS should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/fonts/open-sans/bold/font.woff"), | ||||
|             "Nested font should be static"); | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource("/js/vendor/jquery/3.5.1/jquery.min.js"), | ||||
|             "Versioned JS should be static"); | ||||
| 
 | ||||
|         // Test complex paths with context | ||||
|         String contextPath = "/app"; | ||||
|         assertTrue( | ||||
|             RequestUriUtils.isStaticResource( | ||||
|                 contextPath, contextPath + "/css/theme/dark/styles.css"), | ||||
|             "Nested CSS with context should be static"); | ||||
| 
 | ||||
|         // Test boundary cases for isTrackableResource | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/js-framework/components"), | ||||
|             "Path starting with js- should not be treated as JS resource"); | ||||
|         assertFalse( | ||||
|             RequestUriUtils.isTrackableResource("/fonts-selection"), | ||||
|             "Path starting with fonts- should not be treated as font resource"); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertFalse; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils; | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -11,8 +11,8 @@ import org.junit.jupiter.api.Test; | ||||
| import org.springframework.mock.web.MockMultipartFile; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| class CustomColorReplaceStrategyTest { | ||||
| 
 | ||||
| @ -1,12 +1,10 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertArrayEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNull; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| import static org.junit.jupiter.api.Assertions.assertArrayEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNull; | ||||
| 
 | ||||
| class HighContrastColorReplaceDeciderTest { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -26,8 +26,7 @@ import org.junit.jupiter.api.Test; | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.mock.web.MockMultipartFile; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| class InvertFullColorStrategyTest { | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.misc; | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -9,8 +9,7 @@ import org.junit.jupiter.api.Test; | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.mock.web.MockMultipartFile; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| class ReplaceAndInvertColorStrategyTest { | ||||
| 
 | ||||
| @ -1,17 +1,14 @@ | ||||
| package stirling.software.SPDF.utils.propertyeditor; | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import org.junit.jupiter.api.BeforeEach; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import stirling.software.common.model.api.security.RedactionArea; | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| import static org.junit.jupiter.api.Assertions.assertThrows; | ||||
| import static org.junit.jupiter.api.Assertions.assertTrue; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.junit.jupiter.api.BeforeEach; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.security.RedactionArea; | ||||
| 
 | ||||
| class StringToArrayListPropertyEditorTest { | ||||
| 
 | ||||
|     private StringToArrayListPropertyEditor editor; | ||||
| @ -1,4 +1,4 @@ | ||||
| package stirling.software.SPDF.utils.propertyeditor; | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import static org.junit.jupiter.api.Assertions.assertEquals; | ||||
| import static org.junit.jupiter.api.Assertions.assertNotNull; | ||||
| @ -3,3 +3,5 @@ plugins { | ||||
|     id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' | ||||
| } | ||||
| rootProject.name = 'Stirling-PDF' | ||||
| 
 | ||||
| include 'common' | ||||
|  | ||||
| @ -8,10 +8,10 @@ import org.springframework.core.annotation.Order; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.EE.KeygenLicenseVerifier.License; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.EnterpriseEdition; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.Premium; | ||||
| import stirling.software.SPDF.model.ApplicationProperties.Premium.ProFeatures.GoogleDrive; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.EnterpriseEdition; | ||||
| import stirling.software.common.model.ApplicationProperties.Premium; | ||||
| import stirling.software.common.model.ApplicationProperties.Premium.ProFeatures.GoogleDrive; | ||||
| 
 | ||||
| @Configuration | ||||
| @Order(Ordered.HIGHEST_PRECEDENCE) | ||||
|  | ||||
| @ -19,8 +19,8 @@ import com.posthog.java.shaded.org.json.JSONObject; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.utils.GeneralUtils; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.GeneralUtils; | ||||
| 
 | ||||
| @Service | ||||
| @Slf4j | ||||
|  | ||||
| @ -11,8 +11,8 @@ import org.springframework.stereotype.Component; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.EE.KeygenLicenseVerifier.License; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.utils.GeneralUtils; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.GeneralUtils; | ||||
| 
 | ||||
| @Component | ||||
| @Slf4j | ||||
|  | ||||
| @ -3,11 +3,11 @@ package stirling.software.SPDF.Factories; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.SPDF.utils.misc.CustomColorReplaceStrategy; | ||||
| import stirling.software.SPDF.utils.misc.InvertFullColorStrategy; | ||||
| import stirling.software.SPDF.utils.misc.ReplaceAndInvertColorStrategy; | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| import stirling.software.common.util.misc.CustomColorReplaceStrategy; | ||||
| import stirling.software.common.util.misc.InvertFullColorStrategy; | ||||
| import stirling.software.common.util.misc.ReplaceAndInvertColorStrategy; | ||||
| 
 | ||||
| @Component | ||||
| public class ReplaceAndInvertColorFactory { | ||||
|  | ||||
| @ -14,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; | ||||
| import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; | ||||
| import org.springframework.core.env.Environment; | ||||
| import org.springframework.scheduling.annotation.EnableScheduling; | ||||
| 
 | ||||
| @ -25,14 +27,19 @@ import jakarta.annotation.PreDestroy; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.UI.WebBrowser; | ||||
| import stirling.software.SPDF.config.ConfigInitializer; | ||||
| import stirling.software.SPDF.config.InstallationPathConfig; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.utils.UrlUtils; | ||||
| import stirling.software.common.configuration.ConfigInitializer; | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.UrlUtils; | ||||
| 
 | ||||
| @Slf4j | ||||
| @EnableScheduling | ||||
| @SpringBootApplication | ||||
| @SpringBootApplication( | ||||
|         scanBasePackages = {"stirling.software.common", "stirling.software.SPDF"}, | ||||
|         exclude = { | ||||
|             DataSourceAutoConfiguration.class, | ||||
|             DataSourceTransactionManagerAutoConfiguration.class | ||||
|         }) | ||||
| public class SPDFApplication { | ||||
| 
 | ||||
|     private static String serverPortStatic; | ||||
|  | ||||
| @ -43,8 +43,8 @@ import me.friwi.jcefmaven.MavenCefAppHandlerAdapter; | ||||
| import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; | ||||
| 
 | ||||
| import stirling.software.SPDF.UI.WebBrowser; | ||||
| import stirling.software.SPDF.config.InstallationPathConfig; | ||||
| import stirling.software.SPDF.utils.UIScaling; | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| import stirling.software.common.util.UIScaling; | ||||
| 
 | ||||
| @Component | ||||
| @Slf4j | ||||
|  | ||||
| @ -15,7 +15,7 @@ import io.github.pixee.security.BoundedLineReader; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.utils.UIScaling; | ||||
| import stirling.software.common.util.UIScaling; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class LoadingWindow extends JDialog { | ||||
|  | ||||
| @ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.context.annotation.Scope; | ||||
| 
 | ||||
| import stirling.software.SPDF.config.interfaces.ShowAdminInterface; | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Configuration | ||||
| class AppUpdateService { | ||||
|  | ||||
| @ -11,7 +11,7 @@ import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Service | ||||
| @Slf4j | ||||
|  | ||||
| @ -12,6 +12,8 @@ import jakarta.annotation.PostConstruct; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.RuntimePathConfig; | ||||
| 
 | ||||
| @Configuration | ||||
| @Slf4j | ||||
| public class ExternalAppDepConfig { | ||||
|  | ||||
| @ -17,8 +17,8 @@ import jakarta.annotation.PostConstruct; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.SPDF.model.ApplicationProperties; | ||||
| import stirling.software.SPDF.utils.GeneralUtils; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.GeneralUtils; | ||||
| 
 | ||||
| @Component | ||||
| @Slf4j | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user