conflict fix again

This commit is contained in:
Anthony Stirling 2025-10-12 21:13:01 +01:00
parent 45c438d66d
commit 884944527e
36 changed files with 74 additions and 139 deletions

View File

@ -45,11 +45,7 @@ jobs:
egress-policy: audit egress-policy: audit
- name: Checkout PR - name: Checkout PR
<<<<<<< HEAD
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
=======
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
>>>>>>> refs/remotes/origin/V2
- name: Setup GitHub App Bot - name: Setup GitHub App Bot
if: github.actor != 'dependabot[bot]' if: github.actor != 'dependabot[bot]'
@ -137,11 +133,7 @@ jobs:
egress-policy: audit egress-policy: audit
- name: Checkout PR - name: Checkout PR
<<<<<<< HEAD
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
=======
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
>>>>>>> refs/remotes/origin/V2
- name: Setup GitHub App Bot - name: Setup GitHub App Bot
if: github.actor != 'dependabot[bot]' if: github.actor != 'dependabot[bot]'
@ -153,11 +145,7 @@ jobs:
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Checkout PR - name: Checkout PR
<<<<<<< HEAD
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
=======
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
>>>>>>> refs/remotes/origin/V2
with: with:
ref: refs/pull/${{ needs.check-comment.outputs.pr_number }}/merge ref: refs/pull/${{ needs.check-comment.outputs.pr_number }}/merge
token: ${{ steps.setup-bot.outputs.token }} token: ${{ steps.setup-bot.outputs.token }}

View File

@ -303,18 +303,11 @@ public class ApplicationProperties {
@Data @Data
public static class Jwt { public static class Jwt {
<<<<<<< HEAD
private boolean enabled = true;
private boolean keyCleanup = true;
private int keyRetentionDays = 7;
private Boolean secureCookie;
=======
private boolean enableKeystore = true; private boolean enableKeystore = true;
private boolean enableKeyRotation = false; private boolean enableKeyRotation = false;
private boolean enableKeyCleanup = true; private boolean enableKeyCleanup = true;
private int keyRetentionDays = 7; private int keyRetentionDays = 7;
private boolean secureCookie; private boolean secureCookie;
>>>>>>> refs/remotes/origin/V2
} }
} }

View File

@ -4,8 +4,6 @@ package stirling.software.common.model;
* This class will be removed when frontend migration to React is complete * This class will be removed when frontend migration to React is complete
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter

View File

@ -46,10 +46,10 @@ class ApplicationPropertiesLogicTest {
assertEquals(expectedLibre, tfm.getLibreofficeDir()); assertEquals(expectedLibre, tfm.getLibreofficeDir());
tfm.setBaseTmpDir("/custom/base"); tfm.setBaseTmpDir("/custom/base");
assertEquals("/custom/base", normalize.apply(tfm.getBaseTmpDir())); assertEquals(normalize.apply("/custom/base"), normalize.apply(tfm.getBaseTmpDir()));
tfm.setLibreofficeDir("/opt/libre"); tfm.setLibreofficeDir("/opt/libre");
assertEquals("/opt/libre", normalize.apply(tfm.getLibreofficeDir())); assertEquals(normalize.apply("/opt/libre"), normalize.apply(tfm.getLibreofficeDir()));
} }
@Test @Test

View File

@ -1,15 +1,8 @@
package stirling.software.common.model; package stirling.software.common.model;
import static org.junit.jupiter.api.Assertions.*; /* Commented out - InputStreamTemplateResource class removed with Thymeleaf migration
* This test will be removed when frontend migration to React is complete
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
public class InputStreamTemplateResourceTest { public class InputStreamTemplateResourceTest {
@ -92,3 +85,4 @@ public class InputStreamTemplateResourceTest {
assertFalse(resource.exists()); assertFalse(resource.exists());
} }
} }
*/

View File

@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.common.configuration.AppConfig; import stirling.software.common.configuration.AppConfig;
import stirling.software.common.configuration.ConfigInitializer; import stirling.software.common.configuration.ConfigInitializer;
import stirling.software.common.configuration.InstallationPathConfig; import stirling.software.common.configuration.InstallationPathConfig;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.util.UrlUtils; import stirling.software.common.util.UrlUtils;
@Slf4j @Slf4j

View File

@ -56,7 +56,9 @@ public class AnalysisController {
} }
} }
@AutoJobPostMapping(value = "/document-properties", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/document-properties",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@JsonDataResponse @JsonDataResponse
@Operation( @Operation(
summary = "Get PDF document properties", summary = "Get PDF document properties",

View File

@ -13,6 +13,7 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.Matrix;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -38,7 +39,9 @@ public class BookletImpositionController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(value = "/booklet-imposition", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/booklet-imposition",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation( @Operation(
summary = "Create a booklet with proper page imposition", summary = "Create a booklet with proper page imposition",
description = description =

View File

@ -14,11 +14,9 @@ import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlin
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
@ -48,7 +46,9 @@ public class EditTableOfContentsController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
@AutoJobPostMapping(value = "/extract-bookmarks", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/extract-bookmarks",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@JsonDataResponse @JsonDataResponse
@Operation( @Operation(
summary = "Extract PDF Bookmarks", summary = "Extract PDF Bookmarks",
@ -157,7 +157,9 @@ public class EditTableOfContentsController {
return bookmark; return bookmark;
} }
@AutoJobPostMapping(value = "/edit-table-of-contents", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/edit-table-of-contents",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@StandardPdfResponse @StandardPdfResponse
@Operation( @Operation(
summary = "Edit Table of Contents", summary = "Edit Table of Contents",

View File

@ -2,14 +2,7 @@ package stirling.software.SPDF.controller.api;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
<<<<<<< HEAD
import java.io.InputStream; import java.io.InputStream;
=======
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
>>>>>>> refs/remotes/origin/V2
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
@ -26,23 +19,13 @@ import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlin
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
<<<<<<< HEAD
import org.apache.xmpbox.XMPMetadata; import org.apache.xmpbox.XMPMetadata;
import org.apache.xmpbox.schema.XMPBasicSchema; import org.apache.xmpbox.schema.XMPBasicSchema;
import org.apache.xmpbox.xml.DomXmpParser; import org.apache.xmpbox.xml.DomXmpParser;
=======
import org.springframework.http.HttpStatus;
>>>>>>> refs/remotes/origin/V2
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
<<<<<<< HEAD
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
=======
>>>>>>> refs/remotes/origin/V2
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;

View File

@ -37,7 +37,9 @@ public class MultiPageLayoutController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(value = "/multi-page-layout", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/multi-page-layout",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@StandardPdfResponse @StandardPdfResponse
@Operation( @Operation(
summary = "Merge multiple pages of a PDF document into a single page", summary = "Merge multiple pages of a PDF document into a single page",

View File

@ -114,7 +114,9 @@ public class SplitPdfByChaptersController {
return bookmarks; return bookmarks;
} }
@AutoJobPostMapping(value = "/split-pdf-by-chapters", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/split-pdf-by-chapters",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@MultiFileResponse @MultiFileResponse
@Operation( @Operation(
summary = "Split PDFs by Chapters", summary = "Split PDFs by Chapters",

View File

@ -46,7 +46,9 @@ public class SplitPdfBySectionsController {
private final TempFileManager tempFileManager; private final TempFileManager tempFileManager;
private final PDFService pdfService; private final PDFService pdfService;
@AutoJobPostMapping(value = "/split-pdf-by-sections", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/split-pdf-by-sections",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@MultiFileResponse @MultiFileResponse
@Operation( @Operation(
summary = "Split PDF pages into smaller sections", summary = "Split PDF pages into smaller sections",

View File

@ -38,7 +38,9 @@ public class SplitPdfBySizeController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
private final TempFileManager tempFileManager; private final TempFileManager tempFileManager;
@AutoJobPostMapping(value = "/split-by-size-or-count", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @AutoJobPostMapping(
value = "/split-by-size-or-count",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@MultiFileResponse @MultiFileResponse
@Operation( @Operation(
summary = "Auto split PDF pages into separate documents based on size or count", summary = "Auto split PDF pages into separate documents based on size or count",

View File

@ -32,7 +32,9 @@ public class ToSinglePageController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf-to-single-page") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/pdf-to-single-page")
@StandardPdfResponse @StandardPdfResponse
@Operation( @Operation(
summary = "Convert a multi-page PDF into a single long page PDF", summary = "Convert a multi-page PDF into a single long page PDF",

View File

@ -30,12 +30,12 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.EndpointConfiguration; import stirling.software.SPDF.config.EndpointConfiguration;
import stirling.software.SPDF.config.swagger.MultiFileResponse;
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
import stirling.software.SPDF.model.api.converters.ConvertCbrToPdfRequest; import stirling.software.SPDF.model.api.converters.ConvertCbrToPdfRequest;
import stirling.software.SPDF.model.api.converters.ConvertCbzToPdfRequest; import stirling.software.SPDF.model.api.converters.ConvertCbzToPdfRequest;
import stirling.software.SPDF.model.api.converters.ConvertPdfToCbrRequest; import stirling.software.SPDF.model.api.converters.ConvertPdfToCbrRequest;
import stirling.software.SPDF.model.api.converters.ConvertPdfToCbzRequest; import stirling.software.SPDF.model.api.converters.ConvertPdfToCbzRequest;
import stirling.software.SPDF.config.swagger.MultiFileResponse;
import stirling.software.SPDF.config.swagger.StandardPdfResponse;
import stirling.software.SPDF.model.api.converters.ConvertToImageRequest; import stirling.software.SPDF.model.api.converters.ConvertToImageRequest;
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest; import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
@ -71,7 +71,6 @@ public class ConvertImgPDFController {
return endpointConfiguration.isGroupEnabled("Ghostscript"); return endpointConfiguration.isGroupEnabled("Ghostscript");
} }
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/img") @AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/img")
@MultiFileResponse @MultiFileResponse
@Operation( @Operation(

View File

@ -23,12 +23,9 @@ import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
<<<<<<< HEAD
import stirling.software.SPDF.config.EndpointConfiguration; import stirling.software.SPDF.config.EndpointConfiguration;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.ConvertApi; import stirling.software.common.annotations.api.ConvertApi;
>>>>>>> refs/remotes/origin/V2
import stirling.software.common.configuration.RuntimePathConfig; import stirling.software.common.configuration.RuntimePathConfig;
import stirling.software.common.model.api.GeneralFile; import stirling.software.common.model.api.GeneralFile;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;

View File

@ -7,22 +7,19 @@ import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
<<<<<<< HEAD
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
=======
import stirling.software.SPDF.config.swagger.HtmlConversionResponse; import stirling.software.SPDF.config.swagger.HtmlConversionResponse;
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.ConvertApi; import stirling.software.common.annotations.api.ConvertApi;
>>>>>>> refs/remotes/origin/V2
import stirling.software.common.model.api.PDFFile; import stirling.software.common.model.api.PDFFile;
import stirling.software.common.util.PDFToFile; import stirling.software.common.util.PDFToFile;
import stirling.software.common.util.TempFileManager; import stirling.software.common.util.TempFileManager;
@ConvertApi @ConvertApi
@RequiredArgsConstructor
public class ConvertPDFToHtml { public class ConvertPDFToHtml {
private final TempFileManager tempFileManager; private final TempFileManager tempFileManager;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/html") @AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/html")

View File

@ -12,9 +12,6 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; 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 org.springframework.web.servlet.support.ServletUriComponentsBuilder; import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriComponentsBuilder;

View File

@ -35,7 +35,9 @@ public class FilterController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-contains-text") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/filter-contains-text")
@FilterResponse @FilterResponse
@Operation( @Operation(
summary = "Checks if a PDF contains set text, returns true if does", summary = "Checks if a PDF contains set text, returns true if does",
@ -56,7 +58,9 @@ public class FilterController {
} }
// TODO // TODO
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-contains-image") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/filter-contains-image")
@FilterResponse @FilterResponse
@Operation( @Operation(
summary = "Checks if a PDF contains an image", summary = "Checks if a PDF contains an image",
@ -73,7 +77,9 @@ public class FilterController {
return null; return null;
} }
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-count") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/filter-page-count")
@FilterResponse @FilterResponse
@Operation( @Operation(
summary = "Checks if a PDF is greater, less or equal to a setPageCount", summary = "Checks if a PDF is greater, less or equal to a setPageCount",
@ -169,7 +175,9 @@ public class FilterController {
return null; return null;
} }
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/filter-page-rotation") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/filter-page-rotation")
@FilterResponse @FilterResponse
@Operation( @Operation(
summary = "Checks if a PDF is of a certain rotation", summary = "Checks if a PDF is of a certain rotation",

View File

@ -31,10 +31,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.swagger.MultiFileResponse; import stirling.software.SPDF.config.swagger.MultiFileResponse;
import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest; import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider; import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.ExceptionUtils; import stirling.software.common.util.ExceptionUtils;

View File

@ -26,12 +26,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest; import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest;
<<<<<<< HEAD
import stirling.software.common.model.ApplicationProperties;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
>>>>>>> refs/remotes/origin/V2 import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider; import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.ExceptionUtils; import stirling.software.common.util.ExceptionUtils;

View File

@ -29,12 +29,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.swagger.MultiFileResponse; import stirling.software.SPDF.config.swagger.MultiFileResponse;
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider; import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.CheckProgramInstall; import stirling.software.common.util.CheckProgramInstall;
@ -53,7 +50,9 @@ public class ExtractImageScansController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/extract-image-scans") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/extract-image-scans")
@MultiFileResponse @MultiFileResponse
@Operation( @Operation(
summary = "Extract image scans from an input file", summary = "Extract image scans from an input file",

View File

@ -24,12 +24,9 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.swagger.StandardPdfResponse; import stirling.software.SPDF.config.swagger.StandardPdfResponse;
import stirling.software.SPDF.model.api.misc.FlattenRequest; import stirling.software.SPDF.model.api.misc.FlattenRequest;
<<<<<<< HEAD
import stirling.software.common.model.ApplicationProperties;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
>>>>>>> refs/remotes/origin/V2 import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider; import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.ExceptionUtils; import stirling.software.common.util.ExceptionUtils;

View File

@ -13,13 +13,10 @@ import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest; import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest;
import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService; import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService;
<<<<<<< HEAD
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
>>>>>>> refs/remotes/origin/V2 import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils;
@MiscApi @MiscApi
@RequiredArgsConstructor @RequiredArgsConstructor
@ -27,7 +24,9 @@ public class ReplaceAndInvertColorController {
private final ReplaceAndInvertColorService replaceAndInvertColorService; private final ReplaceAndInvertColorService replaceAndInvertColorService;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/replace-invert-pdf") @AutoJobPostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
value = "/replace-invert-pdf")
@Operation( @Operation(
summary = "Replace-Invert Color PDF", summary = "Replace-Invert Color PDF",
description = description =

View File

@ -29,12 +29,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.misc.ScannerEffectRequest; import stirling.software.SPDF.model.api.misc.ScannerEffectRequest;
<<<<<<< HEAD
import stirling.software.common.model.ApplicationProperties;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.MiscApi; import stirling.software.common.annotations.api.MiscApi;
>>>>>>> refs/remotes/origin/V2 import stirling.software.common.model.ApplicationProperties;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.ApplicationContextProvider; import stirling.software.common.util.ApplicationContextProvider;
import stirling.software.common.util.ExceptionUtils; import stirling.software.common.util.ExceptionUtils;

View File

@ -59,7 +59,6 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;

View File

@ -54,14 +54,11 @@ import stirling.software.SPDF.model.PDFText;
import stirling.software.SPDF.model.api.security.ManualRedactPdfRequest; import stirling.software.SPDF.model.api.security.ManualRedactPdfRequest;
import stirling.software.SPDF.model.api.security.RedactPdfRequest; import stirling.software.SPDF.model.api.security.RedactPdfRequest;
import stirling.software.SPDF.pdf.TextFinder; import stirling.software.SPDF.pdf.TextFinder;
<<<<<<< HEAD
import stirling.software.SPDF.utils.text.TextEncodingHelper; import stirling.software.SPDF.utils.text.TextEncodingHelper;
import stirling.software.SPDF.utils.text.TextFinderUtils; import stirling.software.SPDF.utils.text.TextFinderUtils;
import stirling.software.SPDF.utils.text.WidthCalculator; import stirling.software.SPDF.utils.text.WidthCalculator;
=======
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
import stirling.software.common.annotations.api.SecurityApi; import stirling.software.common.annotations.api.SecurityApi;
>>>>>>> refs/remotes/origin/V2
import stirling.software.common.model.api.security.RedactionArea; import stirling.software.common.model.api.security.RedactionArea;
import stirling.software.common.service.CustomPDFDocumentFactory; import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.GeneralUtils;

View File

@ -43,7 +43,6 @@ import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.GeneralUtils; import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils; import stirling.software.common.util.WebResponseUtils;
@Slf4j @Slf4j
@SecurityApi @SecurityApi
@RequiredArgsConstructor @RequiredArgsConstructor
@ -51,7 +50,6 @@ public class SanitizeController {
private final CustomPDFDocumentFactory pdfDocumentFactory; private final CustomPDFDocumentFactory pdfDocumentFactory;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/sanitize-pdf") @AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/sanitize-pdf")
@StandardPdfResponse @StandardPdfResponse
@Operation( @Operation(

View File

@ -1,16 +1,8 @@
package stirling.software.SPDF.controller.web; package stirling.software.SPDF.controller.web;
<<<<<<< HEAD
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
=======
>>>>>>> refs/remotes/origin/V2
import org.springframework.ui.Model; import org.springframework.ui.Model;
<<<<<<< HEAD
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ResponseStatusException;
=======
>>>>>>> refs/remotes/origin/V2
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
@ -33,7 +25,6 @@ public class ConverterWebController {
return "convert/img-to-pdf"; return "convert/img-to-pdf";
} }
@Deprecated @Deprecated
// @GetMapping("/cbz-to-pdf") // @GetMapping("/cbz-to-pdf")
@Hidden @Hidden

View File

@ -3,20 +3,15 @@ package stirling.software.SPDF.model.api.converters;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
<<<<<<< HEAD
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
=======
import stirling.software.SPDF.config.swagger.MarkdownConversionResponse; import stirling.software.SPDF.config.swagger.MarkdownConversionResponse;
import stirling.software.common.annotations.AutoJobPostMapping; import stirling.software.common.annotations.AutoJobPostMapping;
>>>>>>> refs/remotes/origin/V2 import stirling.software.common.annotations.api.ConvertApi;
import stirling.software.common.model.api.PDFFile; import stirling.software.common.model.api.PDFFile;
import stirling.software.common.util.PDFToFile; import stirling.software.common.util.PDFToFile;
import stirling.software.common.util.TempFileManager; import stirling.software.common.util.TempFileManager;
@ -27,7 +22,6 @@ public class ConvertPDFToMarkdown {
private final TempFileManager tempFileManager; private final TempFileManager tempFileManager;
@AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/markdown") @AutoJobPostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, value = "/pdf/markdown")
@MarkdownConversionResponse @MarkdownConversionResponse
@Operation( @Operation(

View File

@ -212,19 +212,19 @@ public class ProprietaryUIDataController {
if (latestSession.isPresent()) { if (latestSession.isPresent()) {
SessionEntity sessionEntity = latestSession.get(); SessionEntity sessionEntity = latestSession.get();
Date lastAccessedTime = sessionEntity.getLastRequest(); Instant lastAccessedTime =
Optional.ofNullable(sessionEntity.getLastRequest())
.orElse(Instant.EPOCH);
Instant now = Instant.now(); Instant now = Instant.now();
Instant expirationTime = Instant expirationTime =
lastAccessedTime lastAccessedTime.plus(maxInactiveInterval, ChronoUnit.SECONDS);
.toInstant()
.plus(maxInactiveInterval, ChronoUnit.SECONDS);
if (now.isAfter(expirationTime)) { if (now.isAfter(expirationTime)) {
sessionPersistentRegistry.expireSession(sessionEntity.getSessionId()); sessionPersistentRegistry.expireSession(sessionEntity.getSessionId());
} else { } else {
hasActiveSession = !sessionEntity.isExpired(); hasActiveSession = !sessionEntity.isExpired();
} }
lastRequest = sessionEntity.getLastRequest(); lastRequest = Date.from(lastAccessedTime);
} else { } else {
lastRequest = new Date(0); lastRequest = new Date(0);
} }

View File

@ -60,14 +60,14 @@ public class InitialSecuritySetup {
ApplicationProperties.Security.Jwt jwtProperties = ApplicationProperties.Security.Jwt jwtProperties =
applicationProperties.getSecurity().getJwt(); applicationProperties.getSecurity().getJwt();
boolean jwtEnabled = jwtProperties.isEnabled(); boolean jwtEnabled = jwtProperties.isEnableKeystore();
if (!v2Enabled || !jwtEnabled) { if (!v2Enabled || !jwtEnabled) {
log.debug( log.debug(
"V2 enabled: {}, JWT enabled: {} - disabling all JWT features", "V2 enabled: {}, JWT enabled: {} - disabling all JWT features",
v2Enabled, v2Enabled,
jwtEnabled); jwtEnabled);
jwtProperties.setKeyCleanup(false); jwtProperties.setEnableKeyCleanup(false);
} }
} }

View File

@ -10,11 +10,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
<<<<<<< HEAD
import org.springframework.security.access.prepost.PreAuthorize;
=======
import org.springframework.beans.factory.annotation.Qualifier;
>>>>>>> refs/remotes/origin/V2
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.oauth2.core.user.OAuth2User;
@ -203,7 +198,7 @@ public class AccountWebController {
return "login"; return "login";
} }
//@EnterpriseEndpoint // @EnterpriseEndpoint
// @PreAuthorize("hasRole('ROLE_ADMIN')") // @PreAuthorize("hasRole('ROLE_ADMIN')")
// @GetMapping("/usage") // @GetMapping("/usage")

View File

@ -4,8 +4,8 @@ import java.io.Serializable;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue; import jakarta.persistence.GeneratedValue;

View File

@ -38,7 +38,8 @@ public class CustomUserDetailsService implements UserDetailsService {
"Your account has been locked due to too many failed login attempts."); "Your account has been locked due to too many failed login attempts.");
} }
// TODO: Remove for SaaS - Handle legacy users without authenticationType (from versions < 1.3.0) // TODO: Remove for SaaS - Handle legacy users without authenticationType (from versions <
// 1.3.0)
String authTypeStr = user.getAuthenticationType(); String authTypeStr = user.getAuthenticationType();
if (authTypeStr == null || authTypeStr.isEmpty()) { if (authTypeStr == null || authTypeStr.isEmpty()) {
// Migrate legacy users by detecting authentication type based on password presence // Migrate legacy users by detecting authentication type based on password presence