mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	chore: reformat Java codebase and centralize Spotless config (#3723)
# Description of Changes Please provide a summary of the changes, including: - Extracted the `googleJavaFormatVersion` into a centralized Gradle property for easier management across modules. - Added consistent `spotless` formatting configuration to `common`, `proprietary`, and `stirling-pdf` modules. - Applied automatic import ordering and removed unused imports in numerous Java files. - Reordered and grouped imports consistently, improving overall code readability. - Removed excessive blank lines and standardized spacing. - Ensured a uniform coding style throughout the codebase using Spotless and Google Java Format with AOSP style. --- ## 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) - [ ] 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) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] 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
							
								
									da2473c784
								
							
						
					
					
						commit
						fe47cac608
					
				| @ -27,6 +27,7 @@ ext { | ||||
|     springSecuritySamlVersion = "6.5.0" | ||||
|     openSamlVersion = "4.3.2" | ||||
|     commonmarkVersion = "0.24.0" | ||||
|     googleJavaFormatVersion = "1.27.0" | ||||
|     tempJrePath = null | ||||
| } | ||||
| 
 | ||||
| @ -475,7 +476,7 @@ spotless { | ||||
|         target project(':proprietary').sourceSets.main.allJava | ||||
|         target project(':stirling-pdf').sourceSets.main.allJava | ||||
| 
 | ||||
|         googleJavaFormat("1.27.0").aosp().reorderImports(false) | ||||
|         googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false) | ||||
| 
 | ||||
|         importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") | ||||
|         toggleOffOn() | ||||
|  | ||||
| @ -2,7 +2,12 @@ | ||||
| bootRun { | ||||
|     enabled = false | ||||
| } | ||||
| 
 | ||||
| spotless { | ||||
|     java { | ||||
|         target sourceSets.main.allJava | ||||
|         googleJavaFormat(googleJavaFormatVersion).aosp() | ||||
|     } | ||||
| } | ||||
| dependencies { | ||||
|     api 'org.springframework.boot:spring-boot-starter-web' | ||||
|     api 'org.springframework.boot:spring-boot-starter-thymeleaf' | ||||
|  | ||||
| @ -4,10 +4,8 @@ import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| 
 | ||||
| import org.apache.pdfbox.io.RandomAccessReadBufferedFile; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.pdfbox.io.RandomAccessReadBufferedFile; | ||||
| 
 | ||||
| /** A custom RandomAccessRead implementation that deletes the file when closed */ | ||||
| @Slf4j | ||||
|  | ||||
| @ -248,7 +248,6 @@ public class AppConfig { | ||||
|         return applicationProperties.getSystem().getDatasource(); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @Bean(name = "runningProOrHigher") | ||||
|     @Profile("default") | ||||
|     public boolean runningProOrHigher() { | ||||
| @ -273,7 +272,6 @@ public class AppConfig { | ||||
|         return "NORMAL"; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @Bean(name = "disablePixel") | ||||
|     public boolean disablePixel() { | ||||
|         return Boolean.parseBoolean(env.getProperty("DISABLE_PIXEL", "false")); | ||||
|  | ||||
| @ -10,9 +10,7 @@ import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| import java.nio.file.StandardCopyOption; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.util.YamlHelper; | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -3,16 +3,13 @@ package stirling.software.common.configuration; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.core.io.Resource; | ||||
| import org.springframework.core.io.ResourceLoader; | ||||
| import org.thymeleaf.IEngineConfiguration; | ||||
| import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver; | ||||
| import org.thymeleaf.templateresource.FileTemplateResource; | ||||
| import org.thymeleaf.templateresource.ITemplateResource; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.InputStreamTemplateResource; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -2,7 +2,6 @@ package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.nio.file.Paths; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,15 +1,12 @@ | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import com.posthog.java.PostHog; | ||||
| import jakarta.annotation.PreDestroy; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Value; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| 
 | ||||
| import com.posthog.java.PostHog; | ||||
| 
 | ||||
| import jakarta.annotation.PreDestroy; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| @Configuration | ||||
| @Slf4j | ||||
| public class PostHogConfig { | ||||
|  | ||||
| @ -1,10 +1,8 @@ | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import com.posthog.java.PostHogLogger; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| @Slf4j | ||||
| @Component | ||||
|  | ||||
| @ -2,13 +2,10 @@ package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| 
 | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.CustomPaths.Operations; | ||||
| import stirling.software.common.model.ApplicationProperties.CustomPaths.Pipeline; | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.common.configuration; | ||||
| 
 | ||||
| import java.util.Properties; | ||||
| 
 | ||||
| import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; | ||||
| import org.springframework.core.env.PropertiesPropertySource; | ||||
| import org.springframework.core.env.PropertySource; | ||||
|  | ||||
| @ -12,7 +12,11 @@ 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.core.Ordered; | ||||
| @ -24,13 +28,6 @@ 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 lombok.Data; | ||||
| import lombok.Getter; | ||||
| import lombok.Setter; | ||||
| import lombok.ToString; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| import stirling.software.common.configuration.YamlPropertySourceFactory; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
|  | ||||
| @ -5,7 +5,6 @@ import java.nio.file.Paths; | ||||
| import java.time.LocalDateTime; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| import java.util.Locale; | ||||
| 
 | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Data; | ||||
| 
 | ||||
|  | ||||
| @ -4,7 +4,6 @@ import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.Reader; | ||||
| 
 | ||||
| import org.thymeleaf.templateresource.ITemplateResource; | ||||
| 
 | ||||
| public class InputStreamTemplateResource implements ITemplateResource { | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.common.model; | ||||
| 
 | ||||
| import java.util.Calendar; | ||||
| 
 | ||||
| import lombok.Builder; | ||||
| import lombok.Data; | ||||
| 
 | ||||
|  | ||||
| @ -1,11 +1,9 @@ | ||||
| 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; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| @Data | ||||
| @EqualsAndHashCode | ||||
|  | ||||
| @ -1,12 +1,10 @@ | ||||
| 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; | ||||
| import lombok.NoArgsConstructor; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| @Data | ||||
| @NoArgsConstructor | ||||
|  | ||||
| @ -1,10 +1,8 @@ | ||||
| package stirling.software.common.model.api.converters; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| 
 | ||||
| @Data | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.common.model.api.security; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,6 @@ package stirling.software.common.model.enumeration; | ||||
| 
 | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
|  | ||||
| @ -2,9 +2,7 @@ package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
|  | ||||
| @ -2,9 +2,7 @@ package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
|  | ||||
| @ -2,9 +2,7 @@ package stirling.software.common.model.oauth2; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| 
 | ||||
| @NoArgsConstructor | ||||
|  | ||||
| @ -5,10 +5,8 @@ import static stirling.software.common.model.enumeration.UsernameAttribute.EMAIL | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
| import stirling.software.common.model.exception.UnsupportedClaimException; | ||||
| 
 | ||||
|  | ||||
| @ -8,7 +8,8 @@ import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.StandardCopyOption; | ||||
| import java.util.concurrent.atomic.AtomicLong; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.pdfbox.Loader; | ||||
| import org.apache.pdfbox.examples.util.DeletingRandomAccessFile; | ||||
| import org.apache.pdfbox.io.IOUtils; | ||||
| @ -18,10 +19,6 @@ import org.apache.pdfbox.io.ScratchFile; | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -1,12 +1,10 @@ | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import java.util.Calendar; | ||||
| 
 | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.PdfMetadata; | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package stirling.software.common.service; | ||||
| 
 | ||||
| import com.posthog.java.PostHog; | ||||
| import java.io.File; | ||||
| import java.lang.management.GarbageCollectorMXBean; | ||||
| import java.lang.management.ManagementFactory; | ||||
| @ -16,15 +17,11 @@ 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; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.core.env.Environment; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import com.posthog.java.PostHog; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Service | ||||
|  | ||||
| @ -3,7 +3,6 @@ package stirling.software.common.util; | ||||
| import java.io.IOException; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| public class CheckProgramInstall { | ||||
|  | ||||
| @ -19,7 +19,10 @@ import java.util.Map; | ||||
| import java.util.Properties; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.Getter; | ||||
| import lombok.experimental.UtilityClass; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.pdfbox.cos.COSDictionary; | ||||
| import org.apache.pdfbox.cos.COSName; | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| @ -35,11 +38,6 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; | ||||
| import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; | ||||
| import org.jetbrains.annotations.NotNull; | ||||
| import org.jetbrains.annotations.Nullable; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.Getter; | ||||
| import lombok.experimental.UtilityClass; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import stirling.software.common.model.api.converters.EmlToPdfRequest; | ||||
| 
 | ||||
| @Slf4j | ||||
| @ -49,7 +47,8 @@ public class EmlToPdf { | ||||
|     private static final class StyleConstants { | ||||
|         // Font and layout constants | ||||
|         static final int DEFAULT_FONT_SIZE = 12; | ||||
|         static final String DEFAULT_FONT_FAMILY = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif"; | ||||
|         static final String DEFAULT_FONT_FAMILY = | ||||
|                 "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif"; | ||||
|         static final float DEFAULT_LINE_HEIGHT = 1.4f; | ||||
|         static final String DEFAULT_ZOOM = "1.0"; | ||||
| 
 | ||||
| @ -76,7 +75,8 @@ public class EmlToPdf { | ||||
|     } | ||||
| 
 | ||||
|     private static final class MimeConstants { | ||||
|         static final Pattern MIME_ENCODED_PATTERN = Pattern.compile("=\\?([^?]+)\\?([BbQq])\\?([^?]*)\\?="); | ||||
|         static final Pattern MIME_ENCODED_PATTERN = | ||||
|                 Pattern.compile("=\\?([^?]+)\\?([BbQq])\\?([^?]*)\\?="); | ||||
|         static final String PAPERCLIP_EMOJI = "\uD83D\uDCCE"; // 📎 | ||||
|         static final String ATTACHMENT_ICON_PLACEHOLDER = "icon"; | ||||
| 
 | ||||
| @ -113,7 +113,8 @@ public class EmlToPdf { | ||||
|         return jakartaMailAvailable; | ||||
|     } | ||||
| 
 | ||||
|     public static String convertEmlToHtml(byte[] emlBytes, EmlToPdfRequest request) throws IOException { | ||||
|     public static String convertEmlToHtml(byte[] emlBytes, EmlToPdfRequest request) | ||||
|             throws IOException { | ||||
|         validateEmlInput(emlBytes); | ||||
| 
 | ||||
|         if (isJakartaMailAvailable()) { | ||||
| @ -147,11 +148,14 @@ public class EmlToPdf { | ||||
|             } | ||||
| 
 | ||||
|             // Convert HTML to PDF | ||||
|             byte[] pdfBytes = convertHtmlToPdf(weasyprintPath, request, htmlContent, disableSanitize); | ||||
|             byte[] pdfBytes = | ||||
|                     convertHtmlToPdf(weasyprintPath, request, htmlContent, disableSanitize); | ||||
| 
 | ||||
|             // Attach files if available and requested | ||||
|             if (shouldAttachFiles(emailContent, request)) { | ||||
|                 pdfBytes = attachFilesToPdf(pdfBytes, emailContent.getAttachments(), pdfDocumentFactory); | ||||
|                 pdfBytes = | ||||
|                         attachFilesToPdf( | ||||
|                                 pdfBytes, emailContent.getAttachments(), pdfDocumentFactory); | ||||
|             } | ||||
| 
 | ||||
|             return pdfBytes; | ||||
| @ -182,11 +186,15 @@ public class EmlToPdf { | ||||
|                 && !emailContent.getAttachments().isEmpty(); | ||||
|     } | ||||
| 
 | ||||
|     private static byte[] convertHtmlToPdf(String weasyprintPath, EmlToPdfRequest request, | ||||
|                                          String htmlContent, boolean disableSanitize) | ||||
|     private static byte[] convertHtmlToPdf( | ||||
|             String weasyprintPath, | ||||
|             EmlToPdfRequest request, | ||||
|             String htmlContent, | ||||
|             boolean disableSanitize) | ||||
|             throws IOException, InterruptedException { | ||||
| 
 | ||||
|         stirling.software.common.model.api.converters.HTMLToPdfRequest htmlRequest = createHtmlRequest(request); | ||||
|         stirling.software.common.model.api.converters.HTMLToPdfRequest htmlRequest = | ||||
|                 createHtmlRequest(request); | ||||
| 
 | ||||
|         try { | ||||
|             return FileToPdf.convertHtmlToPdf( | ||||
| @ -218,8 +226,7 @@ public class EmlToPdf { | ||||
|         return "attachment_" + filename.hashCode() + "_" + System.nanoTime(); | ||||
|     } | ||||
| 
 | ||||
|     private static String convertEmlToHtmlBasic( | ||||
|             byte[] emlBytes, EmlToPdfRequest request) { | ||||
|     private static String convertEmlToHtmlBasic(byte[] emlBytes, EmlToPdfRequest request) { | ||||
|         if (emlBytes == null || emlBytes.length == 0) { | ||||
|             throw new IllegalArgumentException("EML file is empty or null"); | ||||
|         } | ||||
| @ -335,7 +342,6 @@ public class EmlToPdf { | ||||
|             Object message = | ||||
|                     mimeMessageConstructor.newInstance(session, new ByteArrayInputStream(emlBytes)); | ||||
| 
 | ||||
| 
 | ||||
|             return extractEmailContentAdvanced(message, request); | ||||
| 
 | ||||
|         } catch (ReflectiveOperationException e) { | ||||
| @ -346,8 +352,7 @@ public class EmlToPdf { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static String convertEmlToHtmlAdvanced( | ||||
|             byte[] emlBytes, EmlToPdfRequest request) { | ||||
|     private static String convertEmlToHtmlAdvanced(byte[] emlBytes, EmlToPdfRequest request) { | ||||
|         EmailContent content = extractEmailContentAdvanced(emlBytes, request); | ||||
|         return generateEnhancedEmailHtml(content, request); | ||||
|     } | ||||
| @ -479,8 +484,12 @@ public class EmlToPdf { | ||||
|         // Create attachment info with paperclip emoji before filename | ||||
|         attachmentInfo | ||||
|                 .append("<div class=\"attachment-item\">") | ||||
|                 .append("<span class=\"attachment-icon\">").append(MimeConstants.ATTACHMENT_ICON_PLACEHOLDER).append("</span> ") | ||||
|                 .append("<span class=\"attachment-name\">").append(escapeHtml(filename)).append("</span>"); | ||||
|                 .append("<span class=\"attachment-icon\">") | ||||
|                 .append(MimeConstants.ATTACHMENT_ICON_PLACEHOLDER) | ||||
|                 .append("</span> ") | ||||
|                 .append("<span class=\"attachment-name\">") | ||||
|                 .append(escapeHtml(filename)) | ||||
|                 .append("</span>"); | ||||
| 
 | ||||
|         // Add content type and encoding info | ||||
|         if (!contentType.isEmpty() || !encoding.isEmpty()) { | ||||
| @ -503,14 +512,17 @@ public class EmlToPdf { | ||||
|             String content = new String(emlBytes, 0, checkLength, StandardCharsets.UTF_8); | ||||
|             String lowerContent = content.toLowerCase(); | ||||
| 
 | ||||
|             boolean hasFrom = lowerContent.contains("from:") || lowerContent.contains("return-path:"); | ||||
|             boolean hasFrom = | ||||
|                     lowerContent.contains("from:") || lowerContent.contains("return-path:"); | ||||
|             boolean hasSubject = lowerContent.contains("subject:"); | ||||
|             boolean hasMessageId = lowerContent.contains("message-id:"); | ||||
|             boolean hasDate = lowerContent.contains("date:"); | ||||
|             boolean hasTo = lowerContent.contains("to:") | ||||
|             boolean hasTo = | ||||
|                     lowerContent.contains("to:") | ||||
|                             || lowerContent.contains("cc:") | ||||
|                             || lowerContent.contains("bcc:"); | ||||
|             boolean hasMimeStructure = lowerContent.contains("multipart/") | ||||
|             boolean hasMimeStructure = | ||||
|                     lowerContent.contains("multipart/") | ||||
|                             || lowerContent.contains("text/plain") | ||||
|                             || lowerContent.contains("text/html") | ||||
|                             || lowerContent.contains("boundary="); | ||||
| @ -684,17 +696,19 @@ public class EmlToPdf { | ||||
|         html.append("  font-size: ").append(fontSize - 1).append("px;\n"); | ||||
|         html.append("}\n\n"); | ||||
| 
 | ||||
| 
 | ||||
|         html.append(".email-body {\n"); | ||||
|         html.append("  word-wrap: break-word;\n"); | ||||
|         html.append("}\n\n"); | ||||
| 
 | ||||
| 
 | ||||
|         html.append(".attachment-section {\n"); | ||||
|         html.append("  margin-top: 15px;\n"); | ||||
|         html.append("  padding: 10px;\n"); | ||||
|         html.append("  background-color: ").append(StyleConstants.ATTACHMENT_BACKGROUND_COLOR).append(";\n"); | ||||
|         html.append("  border: 1px solid ").append(StyleConstants.ATTACHMENT_BORDER_COLOR).append(";\n"); | ||||
|         html.append("  background-color: ") | ||||
|                 .append(StyleConstants.ATTACHMENT_BACKGROUND_COLOR) | ||||
|                 .append(";\n"); | ||||
|         html.append("  border: 1px solid ") | ||||
|                 .append(StyleConstants.ATTACHMENT_BORDER_COLOR) | ||||
|                 .append(";\n"); | ||||
|         html.append("  border-radius: 3px;\n"); | ||||
|         html.append("}\n\n"); | ||||
|         html.append(".attachment-section h3 {\n"); | ||||
| @ -746,7 +760,6 @@ public class EmlToPdf { | ||||
|         html.append("  margin-left: 8px;\n"); | ||||
|         html.append("}\n\n"); | ||||
| 
 | ||||
| 
 | ||||
|         // Basic image styling: ensure images are responsive but not overly constrained. | ||||
|         html.append("img {\n"); | ||||
|         html.append("  max-width: 100%;\n"); // Make images responsive to container width | ||||
| @ -801,7 +814,9 @@ public class EmlToPdf { | ||||
|             java.lang.reflect.Method getAllRecipients = messageClass.getMethod("getAllRecipients"); | ||||
|             Object[] recipients = (Object[]) getAllRecipients.invoke(message); | ||||
|             content.setTo( | ||||
|                     recipients != null && recipients.length > 0 ? safeMimeDecode(recipients[0].toString()) : ""); | ||||
|                     recipients != null && recipients.length > 0 | ||||
|                             ? safeMimeDecode(recipients[0].toString()) | ||||
|                             : ""); | ||||
| 
 | ||||
|             java.lang.reflect.Method getSentDate = messageClass.getMethod("getSentDate"); | ||||
|             content.setDate((Date) getSentDate.invoke(message)); | ||||
| @ -908,13 +923,14 @@ public class EmlToPdf { | ||||
|                                 try { | ||||
|                                     attachmentData = inputStream.readAllBytes(); | ||||
|                                 } catch (IOException e) { | ||||
|                                     log.warn("Failed to read InputStream attachment: {}", e.getMessage()); | ||||
|                                     log.warn( | ||||
|                                             "Failed to read InputStream attachment: {}", | ||||
|                                             e.getMessage()); | ||||
|                                 } | ||||
|                             } else if (attachmentContent instanceof byte[] byteArray) { | ||||
|                                 attachmentData = byteArray; | ||||
|                             } else if (attachmentContent instanceof String stringContent) { | ||||
|                                 attachmentData = | ||||
|                                         stringContent.getBytes(StandardCharsets.UTF_8); | ||||
|                                 attachmentData = stringContent.getBytes(StandardCharsets.UTF_8); | ||||
|                             } | ||||
| 
 | ||||
|                             if (attachmentData != null) { | ||||
| @ -974,7 +990,9 @@ public class EmlToPdf { | ||||
|         html.append("<div><strong>From:</strong> ") | ||||
|                 .append(escapeHtml(content.getFrom())) | ||||
|                 .append("</div>\n"); | ||||
|         html.append("<div><strong>To:</strong> ").append(escapeHtml(content.getTo())).append("</div>\n"); | ||||
|         html.append("<div><strong>To:</strong> ") | ||||
|                 .append(escapeHtml(content.getTo())) | ||||
|                 .append("</div>\n"); | ||||
| 
 | ||||
|         if (content.getDate() != null) { | ||||
|             html.append("<div><strong>Date:</strong> ") | ||||
| @ -1014,15 +1032,20 @@ public class EmlToPdf { | ||||
|                                     ? attachment.getEmbeddedFilename() | ||||
|                                     : attachment.getFilename()); | ||||
| 
 | ||||
|                     html.append("<div class=\"attachment-item\" id=\"").append(uniqueId).append("\">") | ||||
|                             .append("<span class=\"attachment-icon\">").append(MimeConstants.PAPERCLIP_EMOJI).append("</span> ") | ||||
|                     html.append("<div class=\"attachment-item\" id=\"") | ||||
|                             .append(uniqueId) | ||||
|                             .append("\">") | ||||
|                             .append("<span class=\"attachment-icon\">") | ||||
|                             .append(MimeConstants.PAPERCLIP_EMOJI) | ||||
|                             .append("</span> ") | ||||
|                             .append("<span class=\"attachment-name\">") | ||||
|                             .append(escapeHtml(safeMimeDecode(attachment.getFilename()))) | ||||
|                             .append("</span>"); | ||||
| 
 | ||||
|                     String sizeStr = formatFileSize(attachment.getSizeBytes()); | ||||
|                     html.append(" <span class=\"attachment-details\">(").append(sizeStr); | ||||
|                     if (attachment.getContentType() != null && !attachment.getContentType().isEmpty()) { | ||||
|                     if (attachment.getContentType() != null | ||||
|                             && !attachment.getContentType().isEmpty()) { | ||||
|                         html.append(", ").append(escapeHtml(attachment.getContentType())); | ||||
|                     } | ||||
|                     html.append(")</span></div>\n"); | ||||
| @ -1031,8 +1054,7 @@ public class EmlToPdf { | ||||
| 
 | ||||
|             if (request.isIncludeAttachments()) { | ||||
|                 html.append("<div class=\"attachment-info-note\">\n"); | ||||
|                 html.append( | ||||
|                         "<p><em>Attachments are embedded in the file.</em></p>\n"); | ||||
|                 html.append("<p><em>Attachments are embedded in the file.</em></p>\n"); | ||||
|                 html.append("</div>\n"); | ||||
|             } else { | ||||
|                 html.append("<div class=\"attachment-info-note\">\n"); | ||||
| @ -1050,7 +1072,10 @@ public class EmlToPdf { | ||||
|         return html.toString(); | ||||
|     } | ||||
| 
 | ||||
|     private static byte[] attachFilesToPdf(byte[] pdfBytes, List<EmailAttachment> attachments, stirling.software.common.service.CustomPDFDocumentFactory pdfDocumentFactory) | ||||
|     private static byte[] attachFilesToPdf( | ||||
|             byte[] pdfBytes, | ||||
|             List<EmailAttachment> attachments, | ||||
|             stirling.software.common.service.CustomPDFDocumentFactory pdfDocumentFactory) | ||||
|             throws IOException { | ||||
|         try (PDDocument document = pdfDocumentFactory.load(pdfBytes); | ||||
|                 ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { | ||||
| @ -1104,7 +1129,8 @@ public class EmlToPdf { | ||||
| 
 | ||||
|                     // Create embedded file | ||||
|                     PDEmbeddedFile embeddedFile = | ||||
|                             new PDEmbeddedFile(document, new ByteArrayInputStream(attachment.getData())); | ||||
|                             new PDEmbeddedFile( | ||||
|                                     document, new ByteArrayInputStream(attachment.getData())); | ||||
|                     embeddedFile.setSize(attachment.getData().length); | ||||
|                     embeddedFile.setCreationDate(new GregorianCalendar()); | ||||
|                     if (attachment.getContentType() != null) { | ||||
| @ -1150,11 +1176,13 @@ public class EmlToPdf { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static String getUniqueFilename(String filename, List<String> embeddedFiles, Map<String, PDComplexFileSpecification> efMap) { | ||||
|     private static String getUniqueFilename( | ||||
|             String filename, | ||||
|             List<String> embeddedFiles, | ||||
|             Map<String, PDComplexFileSpecification> efMap) { | ||||
|         String uniqueFilename = filename; | ||||
|         int counter = 1; | ||||
|         while (embeddedFiles.contains(uniqueFilename) | ||||
|                 || efMap.containsKey(uniqueFilename)) { | ||||
|         while (embeddedFiles.contains(uniqueFilename) || efMap.containsKey(uniqueFilename)) { | ||||
|             String extension = ""; | ||||
|             String baseName = filename; | ||||
|             int lastDot = filename.lastIndexOf('.'); | ||||
| @ -1230,7 +1258,8 @@ public class EmlToPdf { | ||||
|         fileAnnotation.setNoView(false); // Must be false to remain clickable | ||||
|         fileAnnotation.setPrinted(false); | ||||
| 
 | ||||
|         PDEmbeddedFilesNameTreeNode efTree = document.getDocumentCatalog().getNames().getEmbeddedFiles(); | ||||
|         PDEmbeddedFilesNameTreeNode efTree = | ||||
|                 document.getDocumentCatalog().getNames().getEmbeddedFiles(); | ||||
|         if (efTree != null) { | ||||
|             Map<String, PDComplexFileSpecification> efMap = efTree.getNames(); | ||||
|             if (efMap != null) { | ||||
| @ -1246,24 +1275,27 @@ public class EmlToPdf { | ||||
| 
 | ||||
|         page.getAnnotations().add(fileAnnotation); | ||||
| 
 | ||||
|         log.info("Added attachment annotation for '{}' on page {}", | ||||
|             attachment.getFilename(), document.getPages().indexOf(page) + 1); | ||||
|         log.info( | ||||
|                 "Added attachment annotation for '{}' on page {}", | ||||
|                 attachment.getFilename(), | ||||
|                 document.getPages().indexOf(page) + 1); | ||||
|     } | ||||
| 
 | ||||
|     private static @NotNull PDRectangle getPdRectangle(PDPage page, float x, float y) { | ||||
|         PDRectangle mediaBox = page.getMediaBox(); | ||||
|         float pdfY = mediaBox.getHeight() - y; | ||||
| 
 | ||||
|         float iconWidth = StyleConstants.ATTACHMENT_ICON_WIDTH;  // Keep original size for clickability | ||||
|         float iconHeight = StyleConstants.ATTACHMENT_ICON_HEIGHT; // Keep original size for clickability | ||||
|         float iconWidth = | ||||
|                 StyleConstants.ATTACHMENT_ICON_WIDTH; // Keep original size for clickability | ||||
|         float iconHeight = | ||||
|                 StyleConstants.ATTACHMENT_ICON_HEIGHT; // Keep original size for clickability | ||||
| 
 | ||||
|         // Keep the full-size rectangle so it remains clickable | ||||
|         return new PDRectangle( | ||||
|                 x + StyleConstants.ANNOTATION_X_OFFSET, | ||||
|                 pdfY - iconHeight + StyleConstants.ANNOTATION_Y_OFFSET, | ||||
|                 iconWidth, | ||||
|             iconHeight | ||||
|         ); | ||||
|                 iconHeight); | ||||
|     } | ||||
| 
 | ||||
|     private static String formatEmailDate(Date date) { | ||||
| @ -1293,23 +1325,27 @@ public class EmlToPdf { | ||||
|                 COSDictionary catalogDict = catalog.getCOSObject(); | ||||
| 
 | ||||
|                 // Set PageMode to UseAttachments - this is the standard PDF specification approach | ||||
|                 // PageMode values: UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, UseAttachments | ||||
|                 // PageMode values: UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, | ||||
|                 // UseAttachments | ||||
|                 catalogDict.setName(COSName.PAGE_MODE, "UseAttachments"); | ||||
| 
 | ||||
|                 // Also set viewer preferences for better attachment viewing experience | ||||
|                 COSDictionary viewerPrefs = (COSDictionary) catalogDict.getDictionaryObject(COSName.VIEWER_PREFERENCES); | ||||
|                 COSDictionary viewerPrefs = | ||||
|                         (COSDictionary) catalogDict.getDictionaryObject(COSName.VIEWER_PREFERENCES); | ||||
|                 if (viewerPrefs == null) { | ||||
|                     viewerPrefs = new COSDictionary(); | ||||
|                     catalogDict.setItem(COSName.VIEWER_PREFERENCES, viewerPrefs); | ||||
|                 } | ||||
| 
 | ||||
|                 // Set NonFullScreenPageMode to UseAttachments as fallback for viewers that support it | ||||
|                 // Set NonFullScreenPageMode to UseAttachments as fallback for viewers that support | ||||
|                 // it | ||||
|                 viewerPrefs.setName(COSName.getPDFName("NonFullScreenPageMode"), "UseAttachments"); | ||||
| 
 | ||||
|                 // Additional viewer preferences that may help with attachment display | ||||
|                 viewerPrefs.setBoolean(COSName.getPDFName("DisplayDocTitle"), true); | ||||
| 
 | ||||
|                 log.info("Set PDF PageMode to UseAttachments to automatically show attachments pane"); | ||||
|                 log.info( | ||||
|                         "Set PDF PageMode to UseAttachments to automatically show attachments pane"); | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             // Log warning but don't fail the entire operation for viewer preferences | ||||
| @ -1464,8 +1500,7 @@ public class EmlToPdf { | ||||
|         private float y; | ||||
|         private String character; | ||||
| 
 | ||||
|         public EmojiPosition() { | ||||
|         } | ||||
|         public EmojiPosition() {} | ||||
| 
 | ||||
|         public EmojiPosition(int pageIndex, float x, float y, String character) { | ||||
|             this.pageIndex = pageIndex; | ||||
| @ -1476,8 +1511,7 @@ public class EmlToPdf { | ||||
|     } | ||||
| 
 | ||||
|     public static class EmojiPositionFinder extends org.apache.pdfbox.text.PDFTextStripper { | ||||
|         @Getter | ||||
|         private final List<EmojiPosition> positions = new ArrayList<>(); | ||||
|         @Getter private final List<EmojiPosition> positions = new ArrayList<>(); | ||||
|         private int currentPageIndex; | ||||
|         private boolean sortByPosition; | ||||
|         private boolean isInAttachmentSection; | ||||
| @ -1503,7 +1537,9 @@ public class EmlToPdf { | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         protected void writeString(String string, List<org.apache.pdfbox.text.TextPosition> textPositions) throws IOException { | ||||
|         protected void writeString( | ||||
|                 String string, List<org.apache.pdfbox.text.TextPosition> textPositions) | ||||
|                 throws IOException { | ||||
|             // Check if we are entering or exiting the attachment section | ||||
|             String lowerString = string.toLowerCase(); | ||||
| 
 | ||||
| @ -1513,10 +1549,14 @@ public class EmlToPdf { | ||||
|                 attachmentSectionFound = true; | ||||
|             } | ||||
| 
 | ||||
|             // Look for attachment section end markers (common patterns that indicate end of attachments) | ||||
|             if (isInAttachmentSection && (lowerString.contains("</body>") || | ||||
|                                          lowerString.contains("</html>") || | ||||
|                                          (attachmentSectionFound && lowerString.trim().isEmpty() && string.length() > 50))) { | ||||
|             // Look for attachment section end markers (common patterns that indicate end of | ||||
|             // attachments) | ||||
|             if (isInAttachmentSection | ||||
|                     && (lowerString.contains("</body>") | ||||
|                             || lowerString.contains("</html>") | ||||
|                             || (attachmentSectionFound | ||||
|                                     && lowerString.trim().isEmpty() | ||||
|                                     && string.length() > 50))) { | ||||
|                 isInAttachmentSection = false; | ||||
|             } | ||||
| 
 | ||||
| @ -1527,17 +1567,17 @@ public class EmlToPdf { | ||||
| 
 | ||||
|                 for (int i = 0; i < string.length(); i++) { | ||||
|                     // Check if we have a complete paperclip emoji at this position | ||||
|                     if (i < string.length() - 1 && | ||||
|                         string.substring(i, i + 2).equals(paperclipEmoji) && | ||||
|                         i < textPositions.size()) { | ||||
|                     if (i < string.length() - 1 | ||||
|                             && string.substring(i, i + 2).equals(paperclipEmoji) | ||||
|                             && i < textPositions.size()) { | ||||
| 
 | ||||
|                         org.apache.pdfbox.text.TextPosition textPosition = textPositions.get(i); | ||||
|                         EmojiPosition position = new EmojiPosition( | ||||
|                         EmojiPosition position = | ||||
|                                 new EmojiPosition( | ||||
|                                         currentPageIndex, | ||||
|                                         textPosition.getXDirAdj(), | ||||
|                                         textPosition.getYDirAdj(), | ||||
|                             paperclipEmoji | ||||
|                         ); | ||||
|                                         paperclipEmoji); | ||||
|                         positions.add(position); | ||||
|                     } | ||||
|                 } | ||||
| @ -1554,7 +1594,6 @@ public class EmlToPdf { | ||||
|             return sortByPosition; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void reset() { | ||||
|             positions.clear(); | ||||
|             currentPageIndex = 0; | ||||
|  | ||||
| @ -2,7 +2,6 @@ package stirling.software.common.util; | ||||
| 
 | ||||
| import java.io.PrintWriter; | ||||
| import java.io.StringWriter; | ||||
| 
 | ||||
| import org.springframework.ui.Model; | ||||
| import org.springframework.web.servlet.ModelAndView; | ||||
| 
 | ||||
|  | ||||
| @ -11,13 +11,10 @@ import java.util.*; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.function.Predicate; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.RuntimePathConfig; | ||||
| 
 | ||||
| @Component | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import io.github.pixee.security.ZipSecurity; | ||||
| import java.io.*; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.nio.file.FileVisitResult; | ||||
| @ -13,9 +14,6 @@ import java.util.stream.Stream; | ||||
| import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipInputStream; | ||||
| import java.util.zip.ZipOutputStream; | ||||
| 
 | ||||
| import io.github.pixee.security.ZipSecurity; | ||||
| 
 | ||||
| import stirling.software.common.model.api.converters.HTMLToPdfRequest; | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import com.fathzer.soft.javaluator.DoubleEvaluator; | ||||
| import io.github.pixee.security.HostValidator; | ||||
| import io.github.pixee.security.Urls; | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| @ -14,19 +17,11 @@ import java.util.Arrays; | ||||
| import java.util.Enumeration; | ||||
| import java.util.List; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.core.io.Resource; | ||||
| import org.springframework.core.io.ResourceLoader; | ||||
| import org.springframework.core.io.support.ResourcePatternUtils; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import com.fathzer.soft.javaluator.DoubleEvaluator; | ||||
| 
 | ||||
| import io.github.pixee.security.HostValidator; | ||||
| import io.github.pixee.security.Urls; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,22 +1,18 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import java.awt.geom.AffineTransform; | ||||
| import java.awt.image.*; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.nio.ByteBuffer; | ||||
| 
 | ||||
| import javax.imageio.ImageIO; | ||||
| 
 | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import com.drew.imaging.ImageMetadataReader; | ||||
| import com.drew.imaging.ImageProcessingException; | ||||
| import com.drew.metadata.Metadata; | ||||
| import com.drew.metadata.MetadataException; | ||||
| import com.drew.metadata.exif.ExifSubIFDDirectory; | ||||
| 
 | ||||
| import java.awt.geom.AffineTransform; | ||||
| import java.awt.image.*; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.nio.ByteBuffer; | ||||
| import javax.imageio.ImageIO; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class ImageProcessingUtils { | ||||
|  | ||||
| @ -1,5 +1,8 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter; | ||||
| import com.vladsch.flexmark.util.data.MutableDataSet; | ||||
| import io.github.pixee.security.Filenames; | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| @ -12,22 +15,14 @@ import java.util.List; | ||||
| import java.util.Objects; | ||||
| import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipOutputStream; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter; | ||||
| import com.vladsch.flexmark.util.data.MutableDataSet; | ||||
| 
 | ||||
| import io.github.pixee.security.Filenames; | ||||
| 
 | ||||
| import lombok.NoArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.util.ProcessExecutor.ProcessExecutorResult; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import io.github.pixee.security.Filenames; | ||||
| import java.awt.*; | ||||
| import java.awt.image.BufferedImage; | ||||
| import java.awt.image.RenderedImage; | ||||
| @ -10,10 +11,9 @@ import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipOutputStream; | ||||
| 
 | ||||
| import javax.imageio.*; | ||||
| import javax.imageio.stream.ImageOutputStream; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.pdfbox.cos.COSName; | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.apache.pdfbox.pdmodel.PDPage; | ||||
| @ -30,11 +30,6 @@ import org.apache.pdfbox.rendering.ImageType; | ||||
| import org.apache.pdfbox.rendering.PDFRenderer; | ||||
| import org.apache.pdfbox.text.PDFTextStripper; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import io.github.pixee.security.Filenames; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.service.CustomPDFDocumentFactory; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import io.github.pixee.security.BoundedLineReader; | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| @ -12,11 +13,7 @@ import java.util.Map; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.Semaphore; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import io.github.pixee.security.BoundedLineReader; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,10 +1,9 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import java.io.IOException; | ||||
| import java.net.ServerSocket; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| public class UrlUtils { | ||||
| 
 | ||||
|     public static String getOrigin(HttpServletRequest request) { | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| package stirling.software.common.util; | ||||
| 
 | ||||
| import io.github.pixee.security.Filenames; | ||||
| import java.io.ByteArrayOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.net.URLEncoder; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| 
 | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.springframework.http.HttpHeaders; | ||||
| import org.springframework.http.HttpStatus; | ||||
| @ -12,8 +12,6 @@ import org.springframework.http.MediaType; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import io.github.pixee.security.Filenames; | ||||
| 
 | ||||
| public class WebResponseUtils { | ||||
| 
 | ||||
|     public static ResponseEntity<byte[]> boasToWebResponse( | ||||
|  | ||||
| @ -13,7 +13,7 @@ import java.util.List; | ||||
| import java.util.Optional; | ||||
| import java.util.Set; | ||||
| import java.util.function.Function; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.snakeyaml.engine.v2.api.Dump; | ||||
| import org.snakeyaml.engine.v2.api.DumpSettings; | ||||
| import org.snakeyaml.engine.v2.api.LoadSettings; | ||||
| @ -30,8 +30,6 @@ import org.snakeyaml.engine.v2.nodes.Tag; | ||||
| import org.snakeyaml.engine.v2.parser.ParserImpl; | ||||
| import org.snakeyaml.engine.v2.scanner.StreamReader; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class YamlHelper { | ||||
| 
 | ||||
|  | ||||
| @ -8,7 +8,7 @@ import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.apache.pdfbox.Loader; | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.apache.pdfbox.pdmodel.PDPage; | ||||
| @ -21,9 +21,6 @@ import org.apache.pdfbox.pdmodel.font.Standard14Fonts; | ||||
| import org.apache.pdfbox.text.TextPosition; | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.api.misc.HighContrastColorCombination; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
|  | ||||
| @ -7,9 +7,7 @@ import java.io.ByteArrayOutputStream; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| 
 | ||||
| import javax.imageio.ImageIO; | ||||
| 
 | ||||
| import org.apache.pdfbox.Loader; | ||||
| import org.apache.pdfbox.pdmodel.PDDocument; | ||||
| import org.apache.pdfbox.pdmodel.PDPage; | ||||
| @ -18,7 +16,6 @@ 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.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
| public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy { | ||||
|  | ||||
| @ -3,7 +3,6 @@ package stirling.software.common.util.misc; | ||||
| import java.awt.geom.Rectangle2D; | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.apache.pdfbox.pdmodel.PDPage; | ||||
| import org.apache.pdfbox.text.PDFTextStripperByArea; | ||||
| import org.apache.pdfbox.text.TextPosition; | ||||
|  | ||||
| @ -1,13 +1,10 @@ | ||||
| package stirling.software.common.util.misc; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import stirling.software.common.model.api.PDFFile; | ||||
| import stirling.software.common.model.api.misc.ReplaceAndInvert; | ||||
| 
 | ||||
|  | ||||
| @ -1,15 +1,12 @@ | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.fasterxml.jackson.core.type.TypeReference; | ||||
| import com.fasterxml.jackson.databind.DeserializationFeature; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| 
 | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.api.security.RedactionArea; | ||||
| 
 | ||||
| @Slf4j | ||||
|  | ||||
| @ -1,11 +1,10 @@ | ||||
| package stirling.software.common.util.propertyeditor; | ||||
| 
 | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import com.fasterxml.jackson.core.type.TypeReference; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import java.beans.PropertyEditorSupport; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| public class StringToMapPropertyEditor extends PropertyEditorSupport { | ||||
| 
 | ||||
|  | ||||
| @ -4,6 +4,12 @@ repositories { | ||||
| bootRun { | ||||
|     enabled = false | ||||
| } | ||||
| spotless { | ||||
|     java { | ||||
|         target sourceSets.main.allJava | ||||
|         googleJavaFormat(googleJavaFormatVersion).aosp() | ||||
|     } | ||||
| } | ||||
| dependencies { | ||||
|     implementation project(':common') | ||||
| 
 | ||||
|  | ||||
| @ -1,13 +1,10 @@ | ||||
| package stirling.software.proprietary.model; | ||||
| 
 | ||||
| import jakarta.persistence.*; | ||||
| import java.io.Serializable; | ||||
| import java.util.HashSet; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import jakarta.persistence.*; | ||||
| 
 | ||||
| import lombok.*; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.User; | ||||
| 
 | ||||
| @Entity | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| package stirling.software.proprietary.model.dto; | ||||
| 
 | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Data; | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
|  | ||||
| @ -1,8 +1,11 @@ | ||||
| package stirling.software.proprietary.security; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.security.authentication.BadCredentialsException; | ||||
| import org.springframework.security.authentication.DisabledException; | ||||
| import org.springframework.security.authentication.InternalAuthenticationServiceException; | ||||
| @ -10,13 +13,6 @@ import org.springframework.security.authentication.LockedException; | ||||
| import org.springframework.security.core.AuthenticationException; | ||||
| import org.springframework.security.core.userdetails.UsernameNotFoundException; | ||||
| import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.User; | ||||
| import stirling.software.proprietary.security.service.LoginAttemptService; | ||||
| import stirling.software.proprietary.security.service.UserService; | ||||
|  | ||||
| @ -1,18 +1,14 @@ | ||||
| package stirling.software.proprietary.security; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; | ||||
| import org.springframework.security.web.savedrequest.SavedRequest; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.servlet.http.HttpSession; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; | ||||
| import org.springframework.security.web.savedrequest.SavedRequest; | ||||
| import stirling.software.common.util.RequestUriUtils; | ||||
| import stirling.software.proprietary.security.service.LoginAttemptService; | ||||
| import stirling.software.proprietary.security.service.UserService; | ||||
|  | ||||
| @ -1,27 +1,22 @@ | ||||
| package stirling.software.proprietary.security; | ||||
| 
 | ||||
| import com.coveo.saml.SamlClient; | ||||
| import com.coveo.saml.SamlException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.security.cert.X509Certificate; | ||||
| import java.security.interfaces.RSAPrivateKey; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.core.io.Resource; | ||||
| import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; | ||||
| import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; | ||||
| import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; | ||||
| 
 | ||||
| import com.coveo.saml.SamlClient; | ||||
| import com.coveo.saml.SamlException; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.AppConfig; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
|  | ||||
| @ -1,17 +1,13 @@ | ||||
| package stirling.software.proprietary.security; | ||||
| 
 | ||||
| import jakarta.annotation.PostConstruct; | ||||
| import java.sql.SQLException; | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import jakarta.annotation.PostConstruct; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.springframework.stereotype.Component; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.enumeration.Role; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
|  | ||||
| @ -1,10 +1,8 @@ | ||||
| package stirling.software.proprietary.security; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.filter.IPRateLimitingFilter; | ||||
| 
 | ||||
| @Component | ||||
|  | ||||
| @ -2,6 +2,10 @@ package stirling.software.proprietary.security.config; | ||||
| 
 | ||||
| import static stirling.software.common.util.ProviderUtils.validateProvider; | ||||
| 
 | ||||
| import com.fasterxml.jackson.core.JsonProcessingException; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import java.time.Instant; | ||||
| import java.time.temporal.ChronoUnit; | ||||
| import java.util.Date; | ||||
| @ -10,7 +14,7 @@ import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.security.core.Authentication; | ||||
| @ -19,16 +23,6 @@ import org.springframework.security.oauth2.core.user.OAuth2User; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.ui.Model; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| 
 | ||||
| import com.fasterxml.jackson.core.JsonProcessingException; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
| @ -239,7 +233,8 @@ public class AccountWebController { | ||||
|                 } | ||||
| 
 | ||||
|                 // Also check if user is part of the Internal team | ||||
|                 if (user.getTeam() != null && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { | ||||
|                 if (user.getTeam() != null | ||||
|                         && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { | ||||
|                     shouldRemove = true; | ||||
|                 } | ||||
| 
 | ||||
| @ -351,9 +346,15 @@ public class AccountWebController { | ||||
|         model.addAttribute("disabledUsers", disabledUsers); | ||||
| 
 | ||||
|         // Get all teams but filter out the Internal team | ||||
|         List<Team> allTeams = teamRepository.findAll() | ||||
|                 .stream() | ||||
|                 .filter(team -> !team.getName().equals(stirling.software.proprietary.security.service.TeamService.INTERNAL_TEAM_NAME)) | ||||
|         List<Team> allTeams = | ||||
|                 teamRepository.findAll().stream() | ||||
|                         .filter( | ||||
|                                 team -> | ||||
|                                         !team.getName() | ||||
|                                                 .equals( | ||||
|                                                         stirling.software.proprietary.security | ||||
|                                                                 .service.TeamService | ||||
|                                                                 .INTERNAL_TEAM_NAME)) | ||||
|                         .toList(); | ||||
|         model.addAttribute("teams", allTeams); | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,8 @@ | ||||
| package stirling.software.proprietary.security.configuration; | ||||
| 
 | ||||
| import javax.sql.DataSource; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty; | ||||
| import org.springframework.boot.autoconfigure.domain.EntityScan; | ||||
| @ -11,10 +12,6 @@ import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.context.annotation.Primary; | ||||
| import org.springframework.data.jpa.repository.config.EnableJpaRepositories; | ||||
| 
 | ||||
| import lombok.Getter; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.InstallationPathConfig; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
|  | ||||
| @ -1,16 +1,13 @@ | ||||
| package stirling.software.proprietary.security.configuration; | ||||
| 
 | ||||
| import java.util.Properties; | ||||
| 
 | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.mail.javamail.JavaMailSender; | ||||
| import org.springframework.mail.javamail.JavaMailSenderImpl; | ||||
| 
 | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| package stirling.software.proprietary.security.configuration; | ||||
| 
 | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| @ -27,9 +27,6 @@ import org.springframework.security.web.csrf.CookieCsrfTokenRepository; | ||||
| import org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler; | ||||
| import org.springframework.security.web.savedrequest.NullRequestCache; | ||||
| import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.configuration.AppConfig; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.proprietary.security.CustomAuthenticationFailureHandler; | ||||
|  | ||||
| @ -8,7 +8,6 @@ import org.springframework.context.annotation.Primary; | ||||
| import org.springframework.context.annotation.Profile; | ||||
| import org.springframework.core.Ordered; | ||||
| import org.springframework.core.annotation.Order; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.EnterpriseEdition; | ||||
| import stirling.software.common.model.ApplicationProperties.Premium; | ||||
| @ -81,9 +80,9 @@ public class EEAppConfig { | ||||
| 
 | ||||
|         // Copy the license key if it's set in enterprise but not in premium | ||||
|         if (premium.getKey() == null | ||||
|                 || premium.getKey().equals("00000000-0000-0000-0000-000000000000")) { | ||||
|                 || "00000000-0000-0000-0000-000000000000".equals(premium.getKey())) { | ||||
|             if (enterpriseEdition.getKey() != null | ||||
|                     && !enterpriseEdition.getKey().equals("00000000-0000-0000-0000-000000000000")) { | ||||
|                     && !"00000000-0000-0000-0000-000000000000".equals(enterpriseEdition.getKey())) { | ||||
|                 premium.setKey(enterpriseEdition.getKey()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -1,24 +1,20 @@ | ||||
| package stirling.software.proprietary.security.configuration.ee; | ||||
| 
 | ||||
| import java.net.URI; | ||||
| import java.net.http.HttpClient; | ||||
| import java.net.http.HttpRequest; | ||||
| import java.net.http.HttpResponse; | ||||
| import java.util.Base64; | ||||
| 
 | ||||
| import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; | ||||
| import org.bouncycastle.crypto.signers.Ed25519Signer; | ||||
| import org.bouncycastle.util.encoders.Hex; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import com.fasterxml.jackson.databind.JsonNode; | ||||
| import com.fasterxml.jackson.databind.ObjectMapper; | ||||
| import com.posthog.java.shaded.org.json.JSONException; | ||||
| import com.posthog.java.shaded.org.json.JSONObject; | ||||
| 
 | ||||
| import java.net.URI; | ||||
| import java.net.http.HttpClient; | ||||
| import java.net.http.HttpRequest; | ||||
| import java.net.http.HttpResponse; | ||||
| import java.util.Base64; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; | ||||
| import org.bouncycastle.crypto.signers.Ed25519Signer; | ||||
| import org.bouncycastle.util.encoders.Hex; | ||||
| import org.springframework.stereotype.Service; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.GeneralUtils; | ||||
| 
 | ||||
|  | ||||
| @ -4,12 +4,9 @@ import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.util.GeneralUtils; | ||||
| import stirling.software.proprietary.security.configuration.ee.KeygenLicenseVerifier.License; | ||||
|  | ||||
| @ -1,12 +1,17 @@ | ||||
| package stirling.software.proprietary.security.controller.api; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.Hidden; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.net.URI; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.StandardCopyOption; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.eclipse.jetty.http.HttpStatus; | ||||
| import org.springframework.context.annotation.Conditional; | ||||
| import org.springframework.core.io.InputStreamResource; | ||||
| @ -18,15 +23,6 @@ import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import org.springframework.web.servlet.mvc.support.RedirectAttributes; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.Hidden; | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.Parameter; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.database.H2SQLCondition; | ||||
| import stirling.software.proprietary.security.service.DatabaseService; | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,11 @@ | ||||
| package stirling.software.proprietary.security.controller.api; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.mail.MessagingException; | ||||
| import jakarta.validation.Valid; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| @ -8,16 +14,6 @@ import org.springframework.web.bind.annotation.ModelAttribute; | ||||
| import org.springframework.web.bind.annotation.PostMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.Operation; | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import jakarta.mail.MessagingException; | ||||
| import jakarta.validation.Valid; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.api.Email; | ||||
| import stirling.software.proprietary.security.service.EmailService; | ||||
| 
 | ||||
|  | ||||
| @ -1,19 +1,14 @@ | ||||
| package stirling.software.proprietary.security.controller.api; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.transaction.Transactional; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.servlet.view.RedirectView; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import jakarta.transaction.Transactional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.model.Team; | ||||
| import stirling.software.proprietary.security.config.PremiumEndpoint; | ||||
| import stirling.software.proprietary.security.database.repository.UserRepository; | ||||
| @ -96,11 +91,12 @@ public class TeamController { | ||||
|     @PostMapping("/addUser") | ||||
|     @Transactional | ||||
|     public RedirectView addUserToTeam( | ||||
|             @RequestParam("teamId") Long teamId, | ||||
|             @RequestParam("userId") Long userId) { | ||||
|             @RequestParam("teamId") Long teamId, @RequestParam("userId") Long userId) { | ||||
| 
 | ||||
|         // Find the team | ||||
|         Team team = teamRepository.findById(teamId) | ||||
|         Team team = | ||||
|                 teamRepository | ||||
|                         .findById(teamId) | ||||
|                         .orElseThrow(() -> new RuntimeException("Team not found")); | ||||
| 
 | ||||
|         // Prevent adding users to the Internal team | ||||
| @ -109,11 +105,14 @@ public class TeamController { | ||||
|         } | ||||
| 
 | ||||
|         // Find the user | ||||
|         User user = userRepository.findById(userId) | ||||
|         User user = | ||||
|                 userRepository | ||||
|                         .findById(userId) | ||||
|                         .orElseThrow(() -> new RuntimeException("User not found")); | ||||
| 
 | ||||
|         // Check if user is in the Internal team - prevent moving them | ||||
|         if (user.getTeam() != null && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { | ||||
|         if (user.getTeam() != null | ||||
|                 && user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME)) { | ||||
|             return new RedirectView("/teams/" + teamId + "?error=cannotMoveInternalUsers"); | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -1,12 +1,17 @@ | ||||
| package stirling.software.proprietary.security.controller.api; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.transaction.Transactional; | ||||
| import java.io.IOException; | ||||
| import java.security.Principal; | ||||
| import java.sql.SQLException; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| @ -20,16 +25,6 @@ import org.springframework.ui.Model; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
| import org.springframework.web.servlet.mvc.support.RedirectAttributes; | ||||
| import org.springframework.web.servlet.view.RedirectView; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.transaction.Transactional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.enumeration.Role; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
| @ -57,6 +52,7 @@ public class UserController { | ||||
|     private final ApplicationProperties applicationProperties; | ||||
|     private final TeamRepository teamRepository; | ||||
|     private final UserRepository userRepository; | ||||
| 
 | ||||
|     @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") | ||||
|     @PostMapping("/register") | ||||
|     public String register(@ModelAttribute UsernameAndPass requestModel, Model model) | ||||
| @ -250,15 +246,18 @@ public class UserController { | ||||
|         // Use teamId if provided, otherwise use default team | ||||
|         Long effectiveTeamId = teamId; | ||||
|         if (effectiveTeamId == null) { | ||||
|             Team defaultTeam = teamRepository.findByName(TeamService.DEFAULT_TEAM_NAME).orElse(null); | ||||
|             Team defaultTeam = | ||||
|                     teamRepository.findByName(TeamService.DEFAULT_TEAM_NAME).orElse(null); | ||||
|             if (defaultTeam != null) { | ||||
|                 effectiveTeamId = defaultTeam.getId(); | ||||
|             } | ||||
|         } else { | ||||
|             // Check if the selected team is Internal - prevent assigning to it | ||||
|             Team selectedTeam = teamRepository.findById(effectiveTeamId).orElse(null); | ||||
|             if (selectedTeam != null && TeamService.INTERNAL_TEAM_NAME.equals(selectedTeam.getName())) { | ||||
|                 return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible", true); | ||||
|             if (selectedTeam != null | ||||
|                     && TeamService.INTERNAL_TEAM_NAME.equals(selectedTeam.getName())) { | ||||
|                 return new RedirectView( | ||||
|                         "/adminSettings?messageType=internalTeamNotAccessible", true); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -316,12 +315,15 @@ public class UserController { | ||||
|             if (team != null) { | ||||
|                 // Prevent assigning to Internal team | ||||
|                 if (TeamService.INTERNAL_TEAM_NAME.equals(team.getName())) { | ||||
|                     return new RedirectView("/adminSettings?messageType=internalTeamNotAccessible", true); | ||||
|                     return new RedirectView( | ||||
|                             "/adminSettings?messageType=internalTeamNotAccessible", true); | ||||
|                 } | ||||
| 
 | ||||
|                 // Prevent moving users from Internal team | ||||
|                 if (user.getTeam() != null && TeamService.INTERNAL_TEAM_NAME.equals(user.getTeam().getName())) { | ||||
|                     return new RedirectView("/adminSettings?messageType=cannotMoveInternalUsers", true); | ||||
|                 if (user.getTeam() != null | ||||
|                         && TeamService.INTERNAL_TEAM_NAME.equals(user.getTeam().getName())) { | ||||
|                     return new RedirectView( | ||||
|                             "/adminSettings?messageType=cannotMoveInternalUsers", true); | ||||
|                 } | ||||
| 
 | ||||
|                 user.setTeam(team); | ||||
|  | ||||
| @ -1,19 +1,14 @@ | ||||
| package stirling.software.proprietary.security.controller.web; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.ui.Model; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.FileInfo; | ||||
| import stirling.software.proprietary.security.service.DatabaseService; | ||||
| 
 | ||||
|  | ||||
| @ -4,17 +4,14 @@ import java.util.Date; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.security.access.prepost.PreAuthorize; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.ui.Model; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.model.Team; | ||||
| import stirling.software.proprietary.model.dto.TeamWithUserCountDTO; | ||||
| import stirling.software.proprietary.security.database.repository.SessionRepository; | ||||
| @ -40,7 +37,8 @@ public class TeamWebController { | ||||
|         List<TeamWithUserCountDTO> allTeamsWithCounts = teamRepository.findAllTeamsWithUserCount(); | ||||
| 
 | ||||
|         // Filter out the Internal team | ||||
|         List<TeamWithUserCountDTO> teamsWithCounts = allTeamsWithCounts.stream() | ||||
|         List<TeamWithUserCountDTO> teamsWithCounts = | ||||
|                 allTeamsWithCounts.stream() | ||||
|                         .filter(team -> !team.getName().equals(TeamService.INTERNAL_TEAM_NAME)) | ||||
|                         .toList(); | ||||
| 
 | ||||
| @ -66,7 +64,9 @@ public class TeamWebController { | ||||
|     @PreAuthorize("hasRole('ROLE_ADMIN')") | ||||
|     public String viewTeamDetails(@PathVariable("id") Long id, Model model) { | ||||
|         // Get the team | ||||
|         Team team = teamRepository.findById(id) | ||||
|         Team team = | ||||
|                 teamRepository | ||||
|                         .findById(id) | ||||
|                         .orElseThrow(() -> new RuntimeException("Team not found")); | ||||
| 
 | ||||
|         // Prevent access to Internal team | ||||
| @ -80,9 +80,18 @@ public class TeamWebController { | ||||
|         // Get all users not in this team for the Add User to Team dropdown | ||||
|         // Exclude users that are in the Internal team | ||||
|         List<User> allUsers = userRepository.findAllWithTeam(); | ||||
|         List<User> availableUsers = allUsers.stream() | ||||
|                 .filter(user -> (user.getTeam() == null || !user.getTeam().getId().equals(id)) && | ||||
|                                (user.getTeam() == null || !user.getTeam().getName().equals(TeamService.INTERNAL_TEAM_NAME))) | ||||
|         List<User> availableUsers = | ||||
|                 allUsers.stream() | ||||
|                         .filter( | ||||
|                                 user -> | ||||
|                                         (user.getTeam() == null | ||||
|                                                         || !user.getTeam().getId().equals(id)) | ||||
|                                                 && (user.getTeam() == null | ||||
|                                                         || !user.getTeam() | ||||
|                                                                 .getName() | ||||
|                                                                 .equals( | ||||
|                                                                         TeamService | ||||
|                                                                                 .INTERNAL_TEAM_NAME))) | ||||
|                         .toList(); | ||||
| 
 | ||||
|         // Get the latest session for each user in the team | ||||
|  | ||||
| @ -1,13 +1,10 @@ | ||||
| package stirling.software.proprietary.security.database; | ||||
| 
 | ||||
| import java.sql.SQLException; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.context.annotation.Conditional; | ||||
| import org.springframework.scheduling.annotation.Scheduled; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
| import stirling.software.proprietary.security.service.DatabaseServiceInterface; | ||||
| 
 | ||||
|  | ||||
| @ -1,10 +1,8 @@ | ||||
| package stirling.software.proprietary.security.database.repository; | ||||
| 
 | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| import org.springframework.stereotype.Repository; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.Authority; | ||||
| 
 | ||||
| @Repository | ||||
|  | ||||
| @ -1,11 +1,9 @@ | ||||
| package stirling.software.proprietary.security.database.repository; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken; | ||||
| import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; | ||||
| import org.springframework.transaction.annotation.Transactional; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.PersistentLogin; | ||||
| 
 | ||||
| public class JPATokenRepositoryImpl implements PersistentTokenRepository { | ||||
|  | ||||
| @ -2,7 +2,6 @@ package stirling.software.proprietary.security.database.repository; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| import org.springframework.stereotype.Repository; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.PersistentLogin; | ||||
| 
 | ||||
| @Repository | ||||
|  | ||||
| @ -1,16 +1,13 @@ | ||||
| package stirling.software.proprietary.security.database.repository; | ||||
| 
 | ||||
| import jakarta.transaction.Transactional; | ||||
| import java.util.Date; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| import org.springframework.data.jpa.repository.Modifying; | ||||
| import org.springframework.data.jpa.repository.Query; | ||||
| import org.springframework.data.repository.query.Param; | ||||
| import org.springframework.stereotype.Repository; | ||||
| 
 | ||||
| import jakarta.transaction.Transactional; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.SessionEntity; | ||||
| 
 | ||||
| @Repository | ||||
|  | ||||
| @ -2,12 +2,10 @@ package stirling.software.proprietary.security.database.repository; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| import org.springframework.data.jpa.repository.Query; | ||||
| import org.springframework.data.repository.query.Param; | ||||
| import org.springframework.stereotype.Repository; | ||||
| 
 | ||||
| import stirling.software.proprietary.model.Team; | ||||
| import stirling.software.proprietary.security.model.User; | ||||
| 
 | ||||
| @ -30,7 +28,8 @@ public interface UserRepository extends JpaRepository<User, Long> { | ||||
|     @Query(value = "SELECT u FROM User u LEFT JOIN FETCH u.team") | ||||
|     List<User> findAllWithTeam(); | ||||
| 
 | ||||
|     @Query("SELECT u FROM User u JOIN FETCH u.authorities JOIN FETCH u.team WHERE u.team.id = :teamId") | ||||
|     @Query( | ||||
|             "SELECT u FROM User u JOIN FETCH u.authorities JOIN FETCH u.team WHERE u.team.id = :teamId") | ||||
|     List<User> findAllByTeamId(@Param("teamId") Long teamId); | ||||
| 
 | ||||
|     long countByTeam(Team team); | ||||
|  | ||||
| @ -1,16 +1,14 @@ | ||||
| package stirling.software.proprietary.security.filter; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| @Component | ||||
| public class EnterpriseEndpointFilter extends OncePerRequestFilter { | ||||
|  | ||||
| @ -1,24 +1,20 @@ | ||||
| package stirling.software.proprietary.security.filter; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.core.context.SecurityContextHolder; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.servlet.http.HttpSession; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| import java.util.Optional; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.core.context.SecurityContextHolder; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| import stirling.software.common.util.RequestUriUtils; | ||||
| import stirling.software.proprietary.security.model.User; | ||||
| import stirling.software.proprietary.security.service.UserService; | ||||
|  | ||||
| @ -1,18 +1,15 @@ | ||||
| package stirling.software.proprietary.security.filter; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| 
 | ||||
| import jakarta.servlet.Filter; | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.ServletRequest; | ||||
| import jakarta.servlet.ServletResponse; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.util.RequestUriUtils; | ||||
| 
 | ||||
| @RequiredArgsConstructor | ||||
|  | ||||
| @ -1,9 +1,13 @@ | ||||
| package stirling.software.proprietary.security.filter; | ||||
| 
 | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.http.HttpStatus; | ||||
| @ -16,14 +20,6 @@ import org.springframework.security.core.userdetails.UserDetails; | ||||
| import org.springframework.security.oauth2.core.user.OAuth2User; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.SAML2; | ||||
|  | ||||
| @ -1,10 +1,17 @@ | ||||
| package stirling.software.proprietary.security.filter; | ||||
| 
 | ||||
| import io.github.bucket4j.Bandwidth; | ||||
| import io.github.bucket4j.Bucket; | ||||
| import io.github.bucket4j.ConsumptionProbe; | ||||
| import io.github.pixee.security.Newlines; | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.time.Duration; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Qualifier; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.security.core.Authentication; | ||||
| @ -13,17 +20,6 @@ import org.springframework.security.core.context.SecurityContextHolder; | ||||
| import org.springframework.security.core.userdetails.UserDetails; | ||||
| import org.springframework.stereotype.Component; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import io.github.bucket4j.Bandwidth; | ||||
| import io.github.bucket4j.Bucket; | ||||
| import io.github.bucket4j.ConsumptionProbe; | ||||
| import io.github.pixee.security.Newlines; | ||||
| 
 | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.Role; | ||||
| 
 | ||||
| @Component | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.proprietary.security.model; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| import org.springframework.security.authentication.AbstractAuthenticationToken; | ||||
| import org.springframework.security.core.GrantedAuthority; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,5 @@ | ||||
| package stirling.software.proprietary.security.model; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| 
 | ||||
| import jakarta.persistence.Column; | ||||
| import jakarta.persistence.Entity; | ||||
| import jakarta.persistence.GeneratedValue; | ||||
| @ -10,7 +8,7 @@ import jakarta.persistence.Id; | ||||
| import jakarta.persistence.JoinColumn; | ||||
| import jakarta.persistence.ManyToOne; | ||||
| import jakarta.persistence.Table; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| import lombok.Getter; | ||||
| import lombok.Setter; | ||||
| 
 | ||||
|  | ||||
| @ -1,12 +1,10 @@ | ||||
| package stirling.software.proprietary.security.model; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import jakarta.persistence.Column; | ||||
| import jakarta.persistence.Entity; | ||||
| import jakarta.persistence.Id; | ||||
| import jakarta.persistence.Table; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| import lombok.Data; | ||||
| 
 | ||||
| @Entity | ||||
|  | ||||
| @ -1,12 +1,10 @@ | ||||
| package stirling.software.proprietary.security.model; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import jakarta.persistence.Entity; | ||||
| import jakarta.persistence.Id; | ||||
| import jakarta.persistence.Table; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| import java.util.Date; | ||||
| import lombok.Data; | ||||
| 
 | ||||
| @Entity | ||||
|  | ||||
| @ -1,20 +1,17 @@ | ||||
| package stirling.software.proprietary.security.model; | ||||
| 
 | ||||
| import jakarta.persistence.*; | ||||
| import java.io.Serializable; | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| import jakarta.persistence.*; | ||||
| 
 | ||||
| import lombok.EqualsAndHashCode; | ||||
| import lombok.Getter; | ||||
| import lombok.NoArgsConstructor; | ||||
| import lombok.Setter; | ||||
| import lombok.ToString; | ||||
| 
 | ||||
| import stirling.software.common.model.enumeration.Role; | ||||
| import stirling.software.proprietary.model.Team; | ||||
| 
 | ||||
|  | ||||
| @ -1,13 +1,10 @@ | ||||
| package stirling.software.proprietary.security.model.api; | ||||
| 
 | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| import lombok.NoArgsConstructor; | ||||
| 
 | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import stirling.software.common.model.api.GeneralFile; | ||||
| 
 | ||||
| @Data | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.proprietary.security.model.api.user; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.proprietary.security.model.api.user; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.proprietary.security.model.api.user; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| package stirling.software.proprietary.security.model.api.user; | ||||
| 
 | ||||
| import io.swagger.v3.oas.annotations.media.Schema; | ||||
| 
 | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,10 @@ | ||||
| package stirling.software.proprietary.security.oauth2; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.security.authentication.BadCredentialsException; | ||||
| import org.springframework.security.authentication.DisabledException; | ||||
| import org.springframework.security.authentication.LockedException; | ||||
| @ -10,12 +13,6 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; | ||||
| import org.springframework.security.oauth2.core.OAuth2Error; | ||||
| import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| @Slf4j | ||||
| public class CustomOAuth2AuthenticationFailureHandler | ||||
|         extends SimpleUrlAuthenticationFailureHandler { | ||||
|  | ||||
| @ -1,22 +1,18 @@ | ||||
| package stirling.software.proprietary.security.oauth2; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.servlet.http.HttpSession; | ||||
| import java.io.IOException; | ||||
| import java.sql.SQLException; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.security.authentication.LockedException; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.core.userdetails.UserDetails; | ||||
| import org.springframework.security.oauth2.core.user.OAuth2User; | ||||
| import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; | ||||
| import org.springframework.security.web.savedrequest.SavedRequest; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.servlet.http.HttpSession; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
|  | ||||
| @ -9,7 +9,7 @@ import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| @ -23,9 +23,6 @@ import org.springframework.security.oauth2.client.registration.ClientRegistratio | ||||
| import org.springframework.security.oauth2.client.registration.ClientRegistrations; | ||||
| import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; | ||||
| import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2.Client; | ||||
|  | ||||
| @ -2,12 +2,9 @@ package stirling.software.proprietary.security.repository; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| import org.springframework.data.jpa.repository.Query; | ||||
| import org.springframework.data.repository.query.Param; | ||||
| import org.springframework.stereotype.Repository; | ||||
| 
 | ||||
| import stirling.software.proprietary.model.Team; | ||||
| import stirling.software.proprietary.model.dto.TeamWithUserCountDTO; | ||||
| 
 | ||||
| @ -15,8 +12,9 @@ import stirling.software.proprietary.model.dto.TeamWithUserCountDTO; | ||||
| public interface TeamRepository extends JpaRepository<Team, Long> { | ||||
|     Optional<Team> findByName(String name); | ||||
| 
 | ||||
|     @Query("SELECT new stirling.software.proprietary.model.dto.TeamWithUserCountDTO(t.id, t.name, COUNT(u)) " + | ||||
|            "FROM Team t LEFT JOIN t.users u GROUP BY t.id, t.name") | ||||
|     @Query( | ||||
|             "SELECT new stirling.software.proprietary.model.dto.TeamWithUserCountDTO(t.id, t.name, COUNT(u)) " | ||||
|                     + "FROM Team t LEFT JOIN t.users u GROUP BY t.id, t.name") | ||||
|     List<TeamWithUserCountDTO> findAllTeamsWithUserCount(); | ||||
| 
 | ||||
|     boolean existsByNameIgnoreCase(String name); | ||||
|  | ||||
| @ -6,7 +6,6 @@ import java.nio.charset.StandardCharsets; | ||||
| import java.security.cert.CertificateFactory; | ||||
| import java.security.cert.X509Certificate; | ||||
| import java.security.interfaces.RSAPrivateKey; | ||||
| 
 | ||||
| import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; | ||||
| import org.bouncycastle.openssl.PEMKeyPair; | ||||
| import org.bouncycastle.openssl.PEMParser; | ||||
|  | ||||
| @ -3,7 +3,6 @@ package stirling.software.proprietary.security.saml2; | ||||
| import java.io.Serializable; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| package stirling.software.proprietary.security.saml2; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.security.authentication.ProviderNotFoundException; | ||||
| import org.springframework.security.core.AuthenticationException; | ||||
| @ -9,11 +11,6 @@ import org.springframework.security.saml2.core.Saml2Error; | ||||
| import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationException; | ||||
| import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| @Slf4j | ||||
| @ConditionalOnProperty(name = "security.saml2.enabled", havingValue = "true") | ||||
| public class CustomSaml2AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { | ||||
|  | ||||
| @ -1,21 +1,17 @@ | ||||
| package stirling.software.proprietary.security.saml2; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.sql.SQLException; | ||||
| 
 | ||||
| import org.springframework.security.authentication.LockedException; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; | ||||
| import org.springframework.security.web.savedrequest.SavedRequest; | ||||
| 
 | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import jakarta.servlet.http.HttpSession; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.sql.SQLException; | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import org.springframework.security.authentication.LockedException; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; | ||||
| import org.springframework.security.web.savedrequest.SavedRequest; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.SAML2; | ||||
| import stirling.software.common.model.exception.UnsupportedProviderException; | ||||
|  | ||||
| @ -5,7 +5,8 @@ import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.opensaml.core.xml.XMLObject; | ||||
| import org.opensaml.saml.saml2.core.Assertion; | ||||
| import org.opensaml.saml.saml2.core.Attribute; | ||||
| @ -16,10 +17,6 @@ import org.springframework.core.convert.converter.Converter; | ||||
| import org.springframework.security.core.authority.SimpleGrantedAuthority; | ||||
| import org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.ResponseToken; | ||||
| import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.proprietary.security.model.User; | ||||
| import stirling.software.proprietary.security.service.UserService; | ||||
| 
 | ||||
|  | ||||
| @ -1,9 +1,11 @@ | ||||
| package stirling.software.proprietary.security.saml2; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import java.security.cert.X509Certificate; | ||||
| import java.util.Collections; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.opensaml.saml.saml2.core.AuthnRequest; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| @ -18,12 +20,6 @@ import org.springframework.security.saml2.provider.service.registration.RelyingP | ||||
| import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding; | ||||
| import org.springframework.security.saml2.provider.service.web.HttpSessionSaml2AuthenticationRequestRepository; | ||||
| import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; | ||||
| 
 | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.SAML2; | ||||
| 
 | ||||
|  | ||||
| @ -1,13 +1,10 @@ | ||||
| package stirling.software.proprietary.security.service; | ||||
| 
 | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import org.springframework.security.core.Authentication; | ||||
| import org.springframework.security.core.context.SecurityContextHolder; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import lombok.RequiredArgsConstructor; | ||||
| 
 | ||||
| import stirling.software.common.configuration.interfaces.ShowAdminInterface; | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.proprietary.security.database.repository.UserRepository; | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| package stirling.software.proprietary.security.service; | ||||
| 
 | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.security.authentication.LockedException; | ||||
| import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest; | ||||
| import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; | ||||
| @ -10,9 +10,6 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException; | ||||
| import org.springframework.security.oauth2.core.OAuth2Error; | ||||
| import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; | ||||
| import org.springframework.security.oauth2.core.oidc.user.OidcUser; | ||||
| 
 | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| 
 | ||||
| import stirling.software.common.model.ApplicationProperties; | ||||
| import stirling.software.common.model.ApplicationProperties.Security.OAUTH2; | ||||
| import stirling.software.common.model.enumeration.UsernameAttribute; | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user