From 0c0f61aa0d259b2db1351e9462600085048d328a Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:31:31 +0000 Subject: [PATCH 1/5] fix remmeber me (#2184) * fix remmeber me * remove uselss comment * Update translation files (#2185) Signed-off-by: GitHub Action Co-authored-by: GitHub Action --------- Signed-off-by: GitHub Action Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: GitHub Action --- .../SPDF/config/security/SecurityConfiguration.java | 10 +++++++--- .../SPDF/repository/JPATokenRepositoryImpl.java | 11 +++++++---- .../SPDF/repository/PersistentLoginRepository.java | 4 +++- src/main/resources/messages_cs_CZ.properties | 2 +- src/main/resources/messages_da_DK.properties | 2 +- src/main/resources/messages_pt_PT.properties | 4 ++-- src/main/resources/messages_ru_RU.properties | 2 +- src/main/resources/templates/login.html | 4 ++-- 8 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 8156e8d6a..1b7d37d61 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -156,10 +156,14 @@ public class SecurityConfiguration { http.rememberMe( rememberMeConfigurer -> rememberMeConfigurer // Use the configurator directly - .key("uniqueAndSecret") .tokenRepository(persistentTokenRepository()) - .tokenValiditySeconds(1209600) // 2 weeks - ); + .tokenValiditySeconds(14 * 24 * 60 * 60) // 14 days + .userDetailsService( + userDetailsService) // Your existing UserDetailsService + .useSecureCookie(true) // Enable secure cookie + .rememberMeParameter("remember-me") // Form parameter name + .rememberMeCookieName("remember-me") // Cookie name + .alwaysRemember(false)); http.authorizeHttpRequests( authz -> authz.requestMatchers( diff --git a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java b/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java index a901d3c38..7b2e58ffc 100644 --- a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java +++ b/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java @@ -5,6 +5,7 @@ import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; 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.SPDF.model.PersistentLogin; @@ -13,6 +14,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { @Autowired private PersistentLoginRepository persistentLoginRepository; @Override + @Transactional public void createNewToken(PersistentRememberMeToken token) { PersistentLogin newToken = new PersistentLogin(); newToken.setSeries(token.getSeries()); @@ -23,6 +25,7 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { } @Override + @Transactional public void updateToken(String series, String tokenValue, Date lastUsed) { PersistentLogin existingToken = persistentLoginRepository.findById(series).orElse(null); if (existingToken != null) { @@ -43,11 +46,11 @@ public class JPATokenRepositoryImpl implements PersistentTokenRepository { } @Override + @Transactional public void removeUserTokens(String username) { - for (PersistentLogin token : persistentLoginRepository.findAll()) { - if (token.getUsername().equals(username)) { - persistentLoginRepository.delete(token); - } + try { + persistentLoginRepository.deleteByUsername(username); + } catch (Exception e) { } } } diff --git a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java index 92d7bb81d..e8ef19ce2 100644 --- a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java +++ b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository; import stirling.software.SPDF.model.PersistentLogin; @Repository -public interface PersistentLoginRepository extends JpaRepository {} +public interface PersistentLoginRepository extends JpaRepository { + void deleteByUsername(String username); +} diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 12750f0bf..d82826744 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -527,7 +527,7 @@ replace-color.selectText.8=Zlutý text na černém pozadí replace-color.selectText.9=Zelený text na černém pozadí replace-color.selectText.10=Vyberte barvu textu replace-color.selectText.11=Vyberte barvu pozadí -replace-color.submit= Nahradit +replace-color.submit=Nahradit diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index ec6ea8388..48ad3a9bd 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -119,7 +119,7 @@ pipelineOptions.validateButton=Validér enterpriseEdition.button=Opgrader til Pro enterpriseEdition.warning=Denne funktion er kun tilgængelig for Pro-brugere. enterpriseEdition.yamlAdvert=Stirling PDF Pro understøtter YAML-konfigurationsfiler og andre SSO-funktioner. -enterpriseEdition.ssoAdvert= søger du flere funktioner til brugerstyring? Prøv Stirling PDF Pro +enterpriseEdition.ssoAdvert=søger du flere funktioner til brugerstyring? Prøv Stirling PDF Pro ################# diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index ac505f7e3..2bf6a5dd9 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -97,7 +97,7 @@ pipeline.configureButton=Configurar pipeline.defaultOption=Personalizar pipeline.submitButton=Submeter pipeline.help=Pipeline Help -pipeline.scanHelp= Ajuda ao Escaneamento de Pastas +pipeline.scanHelp=Ajuda ao Escaneamento de Pastas pipeline.deletePrompt=Tem a certeza que quer eliminar o pipeline? ###################### @@ -191,7 +191,7 @@ account.changePassword=Alterar a Senha account.confirmNewPassword=Confirmar Nova Senha account.signOut=Sair do Sistema account.yourApiKey=Sua Chave API -account.syncTitle= sincronizar definições do navegador com a conta +account.syncTitle=sincronizar definições do navegador com a conta account.settingsCompare=Comparação das Definições: account.property=Propriedade account.webBrowserSettings=Configurações do Navegador Web diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 637f231c9..2773d0668 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -359,7 +359,7 @@ PDFToHTML.tags=web content,browser friendly home.PDFToXML.title=PDF в XML home.PDFToXML.desc=Преобразование PDF в формат XML -PDFToXML.tags= extraksi data,структурированный контент,interop,преобразование,конвертация +PDFToXML.tags=extraksi data,структурированный контент,interop,преобразование,конвертация home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 9bc07c24d..56485aeaf 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -90,8 +90,8 @@
- - + +
From 404e31468ec98413f1906cc7ee3d49091638c693 Mon Sep 17 00:00:00 2001 From: ninjat Date: Wed, 6 Nov 2024 10:44:24 +1300 Subject: [PATCH 2/5] Added input sanitization to fix self-xss issue (#2189) --- src/main/resources/static/js/merge.js | 54 ++++++++++++++++++++------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/main/resources/static/js/merge.js b/src/main/resources/static/js/merge.js index 41d1fe1eb..2c9a39397 100644 --- a/src/main/resources/static/js/merge.js +++ b/src/main/resources/static/js/merge.js @@ -21,27 +21,55 @@ async function displayFiles(files) { for (let i = 0; i < files.length; i++) { const pageCount = await getPDFPageCount(files[i]); const pageLabel = pageCount === 1 ? pageTranslation : pagesTranslation; + + // Create list item const item = document.createElement("li"); item.className = "list-group-item"; - item.innerHTML = ` -
-
${files[i].name}
-
- ${pageCount} ${pageLabel} -
-
- - - -
-
- `; + + // Create filename div and set textContent to sanitize + const fileNameDiv = document.createElement("div"); + fileNameDiv.className = "filename"; + fileNameDiv.textContent = files[i].name; + + // Create page info div and set textContent to sanitize + const pageInfoDiv = document.createElement("div"); + pageInfoDiv.className = "page-info"; + const pageCountSpan = document.createElement("span"); + pageCountSpan.className = "page-count"; + pageCountSpan.textContent = `${pageCount} ${pageLabel}`; + pageInfoDiv.appendChild(pageCountSpan); + + // Create arrows div with buttons + const arrowsDiv = document.createElement("div"); + arrowsDiv.className = "arrows d-flex"; + + const moveUpButton = document.createElement("button"); + moveUpButton.className = "btn btn-secondary move-up"; + moveUpButton.innerHTML = ""; + + const moveDownButton = document.createElement("button"); + moveDownButton.className = "btn btn-secondary move-down"; + moveDownButton.innerHTML = ""; + + const removeButton = document.createElement("button"); + removeButton.className = "btn btn-danger remove-file"; + removeButton.innerHTML = "×"; + + arrowsDiv.append(moveUpButton, moveDownButton, removeButton); + + // Append elements to item and then to list + const itemContainer = document.createElement("div"); + itemContainer.className = "d-flex justify-content-between align-items-center w-100"; + itemContainer.append(fileNameDiv, pageInfoDiv, arrowsDiv); + + item.appendChild(itemContainer); list.appendChild(item); } attachMoveButtons(); } + async function getPDFPageCount(file) { const blobUrl = URL.createObjectURL(file); const pdf = await pdfjsLib.getDocument(blobUrl).promise; From 26ec0c5d77201c84b5206ee735f2c220ad3c123d Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 6 Nov 2024 07:26:26 +0800 Subject: [PATCH 3/5] Update and improve zh_TW Traditional Chinese locale (#2188) --- src/main/resources/messages_zh_TW.properties | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 98d729026..55a049ed8 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -79,8 +79,8 @@ info=資訊 pro=專業版 page=頁面 pages=頁面 -loading=Loading... -addToDoc=Add to Document +loading=載入中... +addToDoc=新增至文件 legal.privacy=隱私權政策 legal.terms=使用條款 @@ -140,7 +140,7 @@ navbar.darkmode=深色模式 navbar.language=語言 navbar.settings=設定 navbar.allTools=工具 -navbar.multiTool=多功能工具 +navbar.multiTool=複合工具 navbar.sections.organize=整理 navbar.sections.convertTo=轉換為 PDF navbar.sections.convertFrom=從 PDF 轉換 @@ -246,7 +246,7 @@ database.fileNullOrEmpty=檔案不得為空或空白 database.failedImportFile=匯入檔案失敗 session.expired=您的工作階段已過期。請重新整理頁面並再試一次。 -session.refreshPage=Refresh Page +session.refreshPage=重新整理頁面 ############# # HOME-PAGE # @@ -751,7 +751,7 @@ certSign.showSig=顯示簽章 certSign.reason=原因 certSign.location=位置 certSign.name=名稱 -certSign.showLogo=Show Logo +certSign.showLogo=顯示 Logo certSign.submit=簽章 PDF @@ -786,9 +786,9 @@ compare.highlightColor.2=標示顏色 2: compare.document.1=文件 1 compare.document.2=文件 2 compare.submit=比較 -compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced -compare.large.file.message=One or Both of the provided documents are too large to process -compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. +compare.complex.message=選擇的檔案大小太大(其中一個或兩者皆是),可能會影響比較的精確度 +compare.large.file.message=選擇的檔案大小超出系統限制(其中一個或兩者皆是),無法處理 +compare.no.text.message=選擇的 PDF 檔案未包含文字(其中一個或兩者皆是)。請選擇含有文字的 PDF 進行比較 #BookToPDF BookToPDF.title=電子書和漫畫轉 PDF @@ -805,17 +805,17 @@ PDFToBook.submit=轉換 #sign sign.title=簽章 -sign.header=簽章 PDF +sign.header=簽署 PDF sign.upload=上傳影像 sign.draw=繪製簽章 sign.text=文字輸入 sign.clear=清除 sign.add=新增 -sign.saved=Saved Signatures -sign.save=Save Signature -sign.personalSigs=Personal Signatures -sign.sharedSigs=Shared Signatures -sign.noSavedSigs=No saved signatures found +sign.saved=已儲存的簽章 +sign.save=儲存簽章 +sign.personalSigs=個人簽章 +sign.sharedSigs=共用簽章 +sign.noSavedSigs=尚未儲存任何簽章 #repair From c921b5d76ff0cc72a2b8e2a3004de22c0177cf64 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 23:28:15 +0000 Subject: [PATCH 4/5] :memo: Update README: Translation Progress Table (#2190) :memo: Sync README > Made via sync_files.yml Co-authored-by: github-actions[bot] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index af95826ec..d8164c136 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ Stirling-PDF currently supports 36 languages! | Spanish (Español) (es_ES) | ![99%](https://geps.dev/progress/99) | | Swedish (Svenska) (sv_SE) | ![98%](https://geps.dev/progress/98) | | Thai (ไทย) (th_TH) | ![97%](https://geps.dev/progress/97) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | +| Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | | Turkish (Türkçe) (tr_TR) | ![93%](https://geps.dev/progress/93) | | Ukrainian (Українська) (uk_UA) | ![81%](https://geps.dev/progress/81) | | Vietnamese (Tiếng Việt) (vi_VN) | ![89%](https://geps.dev/progress/89) | From 7eea7fb3cbc8d1f599558a77e2c1991d39d5b97b Mon Sep 17 00:00:00 2001 From: Rafael Encinas Date: Wed, 6 Nov 2024 17:43:57 -0700 Subject: [PATCH 5/5] [Feature] Set Executor Instances limits dynamically from properties (#2193) * Update 'ProcessExecutor.java' to use dynamic process limits from properties * Move limits location out of 'application.properties' * Rename 'SemaphoreLimit' to 'SessionLimit' and bundle with 'Timeout...' into one parent class --- .../SPDF/model/ApplicationProperties.java | 95 +++++++++++++++++ .../software/SPDF/utils/ProcessExecutor.java | 100 +++++++++++++++--- src/main/resources/application.properties | 2 +- src/main/resources/settings.yml.template | 19 ++++ 4 files changed, 199 insertions(+), 17 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 16397965a..83df30ae0 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -47,6 +47,7 @@ public class ApplicationProperties { private AutomaticallyGenerated automaticallyGenerated = new AutomaticallyGenerated(); private EnterpriseEdition enterpriseEdition = new EnterpriseEdition(); private AutoPipeline autoPipeline = new AutoPipeline(); + private ProcessExecutor processExecutor = new ProcessExecutor(); @Data public static class AutoPipeline { @@ -309,4 +310,98 @@ public class ApplicationProperties { } } } + + @Data + public static class ProcessExecutor { + private SessionLimit sessionLimit = new SessionLimit(); + private TimeoutMinutes timeoutMinutes = new TimeoutMinutes(); + + @Data + public static class SessionLimit { + private int libreOfficeSessionLimit; + private int pdfToHtmlSessionLimit; + private int ocrMyPdfSessionLimit; + private int pythonOpenCvSessionLimit; + private int ghostScriptSessionLimit; + private int weasyPrintSessionLimit; + private int installAppSessionLimit; + private int calibreSessionLimit; + + public int getLibreOfficeSessionLimit() { + return libreOfficeSessionLimit > 0 ? libreOfficeSessionLimit : 1; + } + + public int getPdfToHtmlSessionLimit() { + return pdfToHtmlSessionLimit > 0 ? pdfToHtmlSessionLimit : 1; + } + + public int getOcrMyPdfSessionLimit() { + return ocrMyPdfSessionLimit > 0 ? ocrMyPdfSessionLimit : 2; + } + + public int getPythonOpenCvSessionLimit() { + return pythonOpenCvSessionLimit > 0 ? pythonOpenCvSessionLimit : 8; + } + + public int getGhostScriptSessionLimit() { + return ghostScriptSessionLimit > 0 ? ghostScriptSessionLimit : 16; + } + + public int getWeasyPrintSessionLimit() { + return weasyPrintSessionLimit > 0 ? weasyPrintSessionLimit : 16; + } + + public int getInstallAppSessionLimit() { + return installAppSessionLimit > 0 ? installAppSessionLimit : 1; + } + + public int getCalibreSessionLimit() { + return calibreSessionLimit > 0 ? calibreSessionLimit : 1; + } + } + + @Data + public static class TimeoutMinutes { + private long libreOfficeTimeoutMinutes; + private long pdfToHtmlTimeoutMinutes; + private long ocrMyPdfTimeoutMinutes; + private long pythonOpenCvTimeoutMinutes; + private long ghostScriptTimeoutMinutes; + private long weasyPrintTimeoutMinutes; + private long installAppTimeoutMinutes; + private long calibreTimeoutMinutes; + + public long getLibreOfficeTimeoutMinutes() { + return libreOfficeTimeoutMinutes > 0 ? libreOfficeTimeoutMinutes : 30; + } + + public long getPdfToHtmlTimeoutMinutes() { + return pdfToHtmlTimeoutMinutes > 0 ? pdfToHtmlTimeoutMinutes : 20; + } + + public long getOcrMyPdfTimeoutMinutes() { + return ocrMyPdfTimeoutMinutes > 0 ? ocrMyPdfTimeoutMinutes : 30; + } + + public long getPythonOpenCvTimeoutMinutes() { + return pythonOpenCvTimeoutMinutes > 0 ? pythonOpenCvTimeoutMinutes : 30; + } + + public long getGhostScriptTimeoutMinutes() { + return ghostScriptTimeoutMinutes > 0 ? ghostScriptTimeoutMinutes : 30; + } + + public long getWeasyPrintTimeoutMinutes() { + return weasyPrintTimeoutMinutes > 0 ? weasyPrintTimeoutMinutes : 30; + } + + public long getInstallAppTimeoutMinutes() { + return installAppTimeoutMinutes > 0 ? installAppTimeoutMinutes : 60; + } + + public long getCalibreTimeoutMinutes() { + return calibreTimeoutMinutes > 0 ? calibreTimeoutMinutes : 30; + } + } + } } diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 5055c14c7..0947714fd 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -18,10 +18,14 @@ import org.slf4j.LoggerFactory; import io.github.pixee.security.BoundedLineReader; +import stirling.software.SPDF.model.ApplicationProperties; + public class ProcessExecutor { private static final Logger logger = LoggerFactory.getLogger(ProcessExecutor.class); + private static ApplicationProperties applicationProperties = new ApplicationProperties(); + public enum Processes { LIBRE_OFFICE, PDFTOHTML, @@ -45,26 +49,90 @@ public class ProcessExecutor { key -> { int semaphoreLimit = switch (key) { - case LIBRE_OFFICE -> 1; - case PDFTOHTML -> 1; - case OCR_MY_PDF -> 2; - case PYTHON_OPENCV -> 8; - case GHOSTSCRIPT -> 16; - case WEASYPRINT -> 16; - case INSTALL_APP -> 1; - case CALIBRE -> 1; + case LIBRE_OFFICE -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getLibreOfficeSessionLimit(); + case PDFTOHTML -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getPdfToHtmlSessionLimit(); + case OCR_MY_PDF -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getOcrMyPdfSessionLimit(); + case PYTHON_OPENCV -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getPythonOpenCvSessionLimit(); + case GHOSTSCRIPT -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getGhostScriptSessionLimit(); + case WEASYPRINT -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getWeasyPrintSessionLimit(); + case INSTALL_APP -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getInstallAppSessionLimit(); + case CALIBRE -> + applicationProperties + .getProcessExecutor() + .getSessionLimit() + .getCalibreSessionLimit(); }; long timeoutMinutes = switch (key) { - case LIBRE_OFFICE -> 30; - case PDFTOHTML -> 20; - case OCR_MY_PDF -> 30; - case PYTHON_OPENCV -> 30; - case GHOSTSCRIPT -> 30; - case WEASYPRINT -> 30; - case INSTALL_APP -> 60; - case CALIBRE -> 30; + case LIBRE_OFFICE -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getLibreOfficeTimeoutMinutes(); + case PDFTOHTML -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getPdfToHtmlTimeoutMinutes(); + case OCR_MY_PDF -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getOcrMyPdfTimeoutMinutes(); + case PYTHON_OPENCV -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getPythonOpenCvTimeoutMinutes(); + case GHOSTSCRIPT -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getGhostScriptTimeoutMinutes(); + case WEASYPRINT -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getWeasyPrintTimeoutMinutes(); + case INSTALL_APP -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getInstallAppTimeoutMinutes(); + case CALIBRE -> + applicationProperties + .getProcessExecutor() + .getTimeoutMinutes() + .getCalibreTimeoutMinutes(); }; return new ProcessExecutor(semaphoreLimit, liveUpdates, timeoutMinutes); }); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0f957c0a9..fdfb603c1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -50,4 +50,4 @@ springdoc.swagger-ui.url=/v1/api-docs posthog.api.key=phc_fiR65u5j6qmXTYL56MNrLZSWqLaDW74OrZH0Insd2xq -posthog.host=https://eu.i.posthog.com \ No newline at end of file +posthog.host=https://eu.i.posthog.com diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 84f628ba6..d9971d0c8 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -102,3 +102,22 @@ metrics: AutomaticallyGenerated: key: example UUID: example + +processExecutor: + sessionLimit: # Process executor instances limits + libreOfficeSessionLimit: 1 + pdfToHtmlSessionLimit: 1 + ocrMyPdfSessionLimit: 2 + pythonOpenCvSessionLimit: 8 + ghostScriptSessionLimit: 16 + weasyPrintSessionLimit: 16 + installAppSessionLimit: 1 + calibreSessionLimit: 1 + timeoutMinutes: # Process executor timeout in minutes + libreOfficetimeoutMinutes: 30 + pdfToHtmltimeoutMinutes: 20 + pythonOpenCvtimeoutMinutes: 30 + ghostScripttimeoutMinutes: 30 + weasyPrinttimeoutMinutes: 30 + installApptimeoutMinutes: 60 + calibretimeoutMinutes: 30