From 44687b281a882e30fc8916e1f2c2bf5d4d73f681 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Thu, 10 Oct 2024 14:08:57 +0200 Subject: [PATCH 01/43] Add x-sechub-dast header #3507 - add x-sechub-dast header containing jobUUID - add cleanup after scan - update mocked test cases --- .../sechub/zapwrapper/scan/ZapScanner.java | 32 +++++++++++++++++++ .../zapwrapper/scan/ZapScannerTest.java | 8 +++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java index 1284a9feea..7a7c9f2f8c 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java @@ -45,6 +45,8 @@ public class ZapScanner implements ZapScan { private static final Logger LOG = LoggerFactory.getLogger(ZapScanner.class); static final int CHECK_SCAN_STATUS_TIME_IN_MILLISECONDS = 5000; + public static final String X_SECHUB_DAST_HEADER_NAME = "x-sechub-dast"; + ClientApiFacade clientApiFacade; ZapScanContext scanContext; @@ -94,6 +96,7 @@ public void scan() throws ZapWrapperRuntimeException { deactivateRules(scanContext.getFullRuleset(), scanContext.getDeactivatedRuleReferences()); setupAdditonalProxyConfiguration(scanContext.getProxyInformation()); String zapContextId = createContext(); + addXSecHubDASTHeader(); addReplacerRulesForHeaders(); /* ZAP setup with access to target */ @@ -417,6 +420,10 @@ void cleanUp() { clientApiFacade.createNewSession("Cleaned after scan", "true"); LOG.info("New and empty session inside Zap created."); + // Remove x-sechub-dast header + LOG.info("Remove '{}' replacer rule.", X_SECHUB_DAST_HEADER_NAME); + clientApiFacade.removeReplacerRule(X_SECHUB_DAST_HEADER_NAME); + // Replacer rules are persistent even after restarting ZAP // This means we need to cleanUp after every scan. LOG.info("Start cleaning up replacer rules."); @@ -833,6 +840,31 @@ private String urlEncodeUTF8(String stringToEncode) { } } + private void addXSecHubDASTHeader() throws ClientApiException { + // description specifies the rule name, which will be set later in this method + String description = X_SECHUB_DAST_HEADER_NAME; + + String enabled = "true"; + // "REQ_HEADER" means the header entry will be added to the requests if not + // existing or replaced if already existing + String matchtype = "REQ_HEADER"; + String matchregex = "false"; + + // matchstring and replacement will be set to the header name and header value + String matchstring = X_SECHUB_DAST_HEADER_NAME; + String replacement = "SecHub DAST job: %s".formatted(scanContext.getContextName()); + + // setting initiators to null means all initiators (ZAP components), + // this means spider, active scan, etc will send this rule for their requests. + String initiators = null; + // default URL is null which means the header would be send on any request to + // any URL + String url = null; + + LOG.info("Add '{}' replacer rule.", X_SECHUB_DAST_HEADER_NAME); + clientApiFacade.addReplacerRule(description, enabled, matchtype, matchregex, matchstring, replacement, initiators, url); + } + record UserInformation(String userName, String zapuserId) { } } diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java index 1b3d4b6302..fed2f112b9 100644 --- a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java @@ -641,7 +641,7 @@ void cleanup_after_scan() throws ClientApiException { scannerToTest.cleanUp(); /* test */ - verify(clientApiFacade, never()).removeReplacerRule(any()); + verify(clientApiFacade, times(1)).removeReplacerRule(ZapScanner.X_SECHUB_DAST_HEADER_NAME); } @ParameterizedTest @@ -659,7 +659,8 @@ void cleanup_after_scan_without_onylForUrls_headers_set_cleans_up_all_replacer_r /* test */ int times = sechubWebScanConfig.getHeaders().get().size(); - verify(clientApiFacade, times(times)).removeReplacerRule(any()); + verify(clientApiFacade, times(1)).removeReplacerRule(ZapScanner.X_SECHUB_DAST_HEADER_NAME); + verify(clientApiFacade, times(times + 1)).removeReplacerRule(any()); } @ParameterizedTest @@ -683,7 +684,8 @@ void cleanup_after_scan_with_onylForUrls_headers_set_cleans_up_all_replacer_rule times += header.getOnlyForUrls().get().size() - 1; } } - verify(clientApiFacade, times(times)).removeReplacerRule(any()); + verify(clientApiFacade, times(1)).removeReplacerRule(ZapScanner.X_SECHUB_DAST_HEADER_NAME); + verify(clientApiFacade, times(times + 1)).removeReplacerRule(any()); } @Test From a5da57788ce2bb9ce85ff57e588c8385496b9306 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Mon, 14 Oct 2024 10:52:40 +0200 Subject: [PATCH 02/43] Add more information to user messages on scanned URLs #3511 - add more information on scanned URLs to user messages - make necessary change to unit tests - minor logging fixes --- .../helper/ZapProductMessageHelper.java | 19 ++++++++--- .../internal/scan/ClientApiFacade.java | 34 +++++++++++++------ .../sechub/zapwrapper/scan/ZapScanner.java | 7 ++-- .../zapwrapper/scan/ZapScannerTest.java | 20 +++++------ 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java index 00d6da2d4f..cb5c379713 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java @@ -3,9 +3,11 @@ import java.io.IOException; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.zaproxy.clientapi.core.ApiResponse; import com.mercedesbenz.sechub.commons.TextFileWriter; import com.mercedesbenz.sechub.commons.model.SecHubMessage; @@ -58,14 +60,23 @@ public void writeProductError(ZapWrapperRuntimeException zapWrapperRuntimeExcept } } - public void writeUserMessagesWithScannedURLs(List urls) { - for (String url : urls) { + public void writeUserMessagesWithDetectedURLs(List> results) { + // The map looks like this: {processed=true, statusReason=OK, method=GET, + // reasonNotProcessed=, messageId=6, url=http://example.com, statusCode=200} + for (Map result : results) { + String url = result.get("url").toString(); // robots.txt and sitemap.xml always appear inside the sites tree even if they // are not available. Because of this it is skipped here. if (url.contains("robots.txt") || url.contains("sitemap.xml")) { continue; } - writeSingleProductMessage(new SecHubMessage(SecHubMessageType.INFO, "Detect url to scan: " + url)); + String statusCode = result.get("statusCode").toString(); + String statusReason = result.get("statusReason").toString(); + String method = result.get("method").toString(); + + String message = "URL: '%s' returned status code: '%s/%s' on detection phase for request method: '%s'".formatted(url, statusCode, statusReason, + method); + writeSingleProductMessage(new SecHubMessage(SecHubMessageType.INFO, message)); } } @@ -81,7 +92,7 @@ private void writeProductErrorForExitCode(ZapWrapperExitCode exitCode) throws IO break; case API_DEFINITION_CONFIG_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, - "Only a single API file can be provided. Please use a single file for the API definition inside the filesystem->files section of the SecHub configuration.")); + "Please files instead of folders for the API definition inside the filesystem->files section of the SecHub configuration.")); break; case TARGET_URL_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java index ee506736a0..a32bb83a40 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java @@ -2,14 +2,16 @@ package com.mercedesbenz.sechub.zapwrapper.internal.scan; import java.net.URL; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.zaproxy.clientapi.core.ApiResponse; import org.zaproxy.clientapi.core.ApiResponseElement; import org.zaproxy.clientapi.core.ApiResponseList; +import org.zaproxy.clientapi.core.ApiResponseSet; import org.zaproxy.clientapi.core.ClientApi; import org.zaproxy.clientapi.core.ClientApiException; @@ -370,18 +372,30 @@ public ApiResponse stopSpiderScan(String scanId) throws ClientApiException { } /** - * Get a list of all URLs detected by the spider scan. + * For the given scanId read all the spider results and add them to a list. Each + * entry of the list consists of a Map with the form: {processed=true, + * statusReason=OK, method=GET, reasonNotProcessed=, messageId=6, + * url=http://example.com, statusCode=200} * - * @return api response of ZAP - * @throws ClientApiException when anything goes wrong communicating with ZAP + * @param scanId + * @param zapProductMessageHelper + * @throws ClientApiException */ - public List getAllSpiderUrls() throws ClientApiException { - List results = ((ApiResponseList) clientApi.spider.allUrls()).getItems(); - List urls = new ArrayList<>(); - for (ApiResponse response : results) { - urls.add(response.toString()); + public List> getFullSpiderResults(String scanId) throws ClientApiException { + List> fullResults = new LinkedList<>(); + + ApiResponseList results = (ApiResponseList) clientApi.spider.fullResults(scanId); + for (ApiResponse apiResponse : results.getItems()) { + ApiResponseList elementList = (ApiResponseList) apiResponse; + + for (ApiResponse apiResponse2 : elementList.getItems()) { + if (apiResponse2 instanceof ApiResponseSet) { + ApiResponseSet set = (ApiResponseSet) apiResponse2; + fullResults.add(set.getValuesMap()); + } + } } - return urls; + return fullResults; } /** diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java index 7a7c9f2f8c..9daecaaa7c 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java @@ -250,7 +250,10 @@ void addIncludedAndExcludedUrlsToContext() throws ClientApiException { String followRedirects = "false"; for (String url : scanContext.getZapURLsIncludeSet()) { clientApiFacade.addIncludeUrlPatternToContext(scanContext.getContextName(), url); - clientApiFacade.accessUrlViaZap(url, followRedirects); + // cannot try to access wildcarded URLs + if (!url.contains(".*")) { + clientApiFacade.accessUrlViaZap(url, followRedirects); + } } LOG.info("For scan {}: Adding exclude parts.", scanContext.getContextName()); @@ -631,7 +634,7 @@ void waitForSpiderResults(String scanId) throws ClientApiException { /* stop spider - otherwise running in background */ clientApiFacade.stopSpiderScan(scanId); - scanContext.getZapProductMessageHelper().writeUserMessagesWithScannedURLs(clientApiFacade.getAllSpiderUrls()); + scanContext.getZapProductMessageHelper().writeUserMessagesWithDetectedURLs(clientApiFacade.getFullSpiderResults(scanId)); LOG.info("For scan {}: Spider completed.", scanContext.getContextName()); remainingScanTime = remainingScanTime - (systemUtil.getCurrentTimeInMilliseconds() - startTime); } diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java index fed2f112b9..7232b3380d 100644 --- a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java @@ -85,7 +85,7 @@ void beforeEach() { doNothing().when(helper).writeProductError(any()); doNothing().when(helper).writeProductMessages(any()); doNothing().when(helper).writeSingleProductMessage(any()); - doNothing().when(helper).writeUserMessagesWithScannedURLs(any()); + doNothing().when(helper).writeUserMessagesWithDetectedURLs(any()); doNothing().when(systemUtil).waitForMilliseconds(ZapScanner.CHECK_SCAN_STATUS_TIME_IN_MILLISECONDS); when(systemUtil.getCurrentTimeInMilliseconds()).thenCallRealMethod(); @@ -343,7 +343,7 @@ void set_includes_and_excludes_api_facade_is_called_once_for_each_include_and_on /* test */ verify(clientApiFacade, times(includes.size())).addIncludeUrlPatternToContext(any(), any()); - verify(clientApiFacade, times(includes.size())).accessUrlViaZap(any(), any()); + verify(clientApiFacade, times(2)).accessUrlViaZap(any(), any()); verify(clientApiFacade, times(excludes.size())).addExcludeUrlPatternToContext(any(), any()); } @@ -770,11 +770,11 @@ void wait_for_spider_scan_ended_results_in_expected_calls() throws ClientApiExce when(scanContext.isActiveScanEnabled()).thenReturn(true); ZapProductMessageHelper messageHelper = mock(ZapProductMessageHelper.class); when(scanContext.getZapProductMessageHelper()).thenReturn(messageHelper); - doNothing().when(messageHelper).writeUserMessagesWithScannedURLs(any()); + doNothing().when(messageHelper).writeUserMessagesWithDetectedURLs(any()); when(clientApiFacade.stopSpiderScan(scanId)).thenReturn(null); when(clientApiFacade.getSpiderStatusForScan(scanId)).thenReturn(42); - when(clientApiFacade.getAllSpiderUrls()).thenReturn(null); + when(clientApiFacade.getFullSpiderResults(scanId)).thenReturn(null); /* execute */ scannerToTest.waitForSpiderResults(scanId); @@ -783,10 +783,10 @@ void wait_for_spider_scan_ended_results_in_expected_calls() throws ClientApiExce verify(scanContext, times(1)).getMaxScanDurationInMilliSeconds(); verify(scanContext, times(1)).isActiveScanEnabled(); verify(scanContext, times(1)).getZapProductMessageHelper(); - verify(messageHelper, times(1)).writeUserMessagesWithScannedURLs(any()); + verify(messageHelper, times(1)).writeUserMessagesWithDetectedURLs(any()); verify(clientApiFacade, atLeast(1)).getSpiderStatusForScan(scanId); verify(clientApiFacade, times(1)).stopSpiderScan(scanId); - verify(clientApiFacade, times(1)).getAllSpiderUrls(); + verify(clientApiFacade, times(1)).getFullSpiderResults(scanId); } @Test @@ -909,11 +909,11 @@ void run_spider_scan_ended_results_in_expected_calls() throws ClientApiException when(scanContext.isActiveScanEnabled()).thenReturn(true); ZapProductMessageHelper messageHelper = mock(ZapProductMessageHelper.class); when(scanContext.getZapProductMessageHelper()).thenReturn(messageHelper); - doNothing().when(messageHelper).writeUserMessagesWithScannedURLs(any()); + doNothing().when(messageHelper).writeUserMessagesWithDetectedURLs(any()); when(clientApiFacade.stopSpiderScan(scanId)).thenReturn(null); when(clientApiFacade.getSpiderStatusForScan(scanId)).thenReturn(42); - when(clientApiFacade.getAllSpiderUrls()).thenReturn(null); + when(clientApiFacade.getFullSpiderResults(scanId)).thenReturn(null); when(clientApiFacade.startSpiderScan(any(), any(), any(), any(), any())).thenReturn(scanId); /* execute */ @@ -923,10 +923,10 @@ void run_spider_scan_ended_results_in_expected_calls() throws ClientApiException verify(scanContext, times(1)).getMaxScanDurationInMilliSeconds(); verify(scanContext, times(1)).isActiveScanEnabled(); verify(scanContext, times(1)).getZapProductMessageHelper(); - verify(messageHelper, times(1)).writeUserMessagesWithScannedURLs(any()); + verify(messageHelper, times(1)).writeUserMessagesWithDetectedURLs(any()); verify(clientApiFacade, atLeast(1)).getSpiderStatusForScan(scanId); verify(clientApiFacade, times(1)).stopSpiderScan(scanId); - verify(clientApiFacade, times(1)).getAllSpiderUrls(); + verify(clientApiFacade, times(1)).getFullSpiderResults(scanId); verify(clientApiFacade, times(1)).startSpiderScan(any(), any(), any(), any(), any()); } From dc4a889b3685af247cdf1b6b2cd53cca99c9c874 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Mon, 14 Oct 2024 15:09:56 +0200 Subject: [PATCH 03/43] Fix failing test #3512 --- .../sechub/zapwrapper/helper/ZapProductMessageHelper.java | 2 +- .../sechub/zapwrapper/helper/ZapProductMessageHelperTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java index cb5c379713..b8d6c113f5 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java @@ -92,7 +92,7 @@ private void writeProductErrorForExitCode(ZapWrapperExitCode exitCode) throws IO break; case API_DEFINITION_CONFIG_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, - "Please files instead of folders for the API definition inside the filesystem->files section of the SecHub configuration.")); + "Please use files instead of folders for the API definition with the filesystem->files section of the SecHub configuration.")); break; case TARGET_URL_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java index bc7a9e5387..76d60bc27a 100644 --- a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java @@ -115,8 +115,7 @@ private void verifyMessageFileContent(File file, ZapWrapperExitCode exitCode) th errorMessage); break; case API_DEFINITION_CONFIG_INVALID: - assertEquals( - "Only a single API file can be provided. Please use a single file for the API definition inside the filesystem->files section of the SecHub configuration.", + assertEquals("Please use files instead of folders for the API definition with the filesystem->files section of the SecHub configuration.", messageContent, errorMessage); break; case TARGET_URL_INVALID: From 3659cb3038290a842094ccc04583ccfba818c104 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Mon, 14 Oct 2024 15:28:11 +0200 Subject: [PATCH 04/43] Refactoring #3512 --- .../zapwrapper/internal/scan/ClientApiFacade.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java index a32bb83a40..f405adcc9c 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java @@ -385,13 +385,13 @@ public List> getFullSpiderResults(String scanId) throws List> fullResults = new LinkedList<>(); ApiResponseList results = (ApiResponseList) clientApi.spider.fullResults(scanId); - for (ApiResponse apiResponse : results.getItems()) { - ApiResponseList elementList = (ApiResponseList) apiResponse; + for (ApiResponse resultItem : results.getItems()) { + ApiResponseList elementList = (ApiResponseList) resultItem; - for (ApiResponse apiResponse2 : elementList.getItems()) { - if (apiResponse2 instanceof ApiResponseSet) { - ApiResponseSet set = (ApiResponseSet) apiResponse2; - fullResults.add(set.getValuesMap()); + for (ApiResponse elementListItem : elementList.getItems()) { + if (elementListItem instanceof ApiResponseSet) { + ApiResponseSet apiResponseSet = (ApiResponseSet) elementListItem; + fullResults.add(apiResponseSet.getValuesMap()); } } } From f3e35a71d4f60fa07f121a4b88a8587058cc8d29 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Tue, 15 Oct 2024 08:13:42 +0200 Subject: [PATCH 05/43] Add comment to clarify behaviour #3512 --- .../sechub/zapwrapper/internal/scan/ClientApiFacade.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java index f405adcc9c..403e78c591 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java @@ -389,6 +389,10 @@ public List> getFullSpiderResults(String scanId) throws ApiResponseList elementList = (ApiResponseList) resultItem; for (ApiResponse elementListItem : elementList.getItems()) { + // It seems like an ApiResponseSet is present if the URL was in scope. + // Otherwise, e.g. in case of third party services links like cloudflare or + // anything else that the crawler detects, elementListItem is of type + // ApiResponseElement, which does not contain a values map. if (elementListItem instanceof ApiResponseSet) { ApiResponseSet apiResponseSet = (ApiResponseSet) elementListItem; fullResults.add(apiResponseSet.getValuesMap()); From cdb5c2548c6fab6c003e84df286cb1f9887101b7 Mon Sep 17 00:00:00 2001 From: Hamid <94196804+hamidonos@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:56:26 +0200 Subject: [PATCH 06/43] Sanitize GitHub action shell cmd to prevent cmd injection #3509 (#3510) * remove github action scan folder after index-js is built #3499 * save the github action index.js as sechub-scan.cjs * save the github action index.js as sechub-scan.cjs * prevent command injection in sechub-cli.ts * add doc to shell-cmd-sanitizer.ts * use whitelist in github action to prevent command injection * revert action.yml changes temporarily * pr clean up * pr clean up * use child_process execFileSync to pass commands to go client in array * pass process.env to execFileSync in GitHub Action * pass process.env to execFileSync in GitHub Action * update versions used in 01-start.sh github action * protect against shell arguments that are commands in github actions * replace potentially dangerous shell command injection code * use commandExists npm library to check if shell argument is a malicious command * use commandExists npm library to check if shell argument is a malicious command * use commandExists npm library to check if shell argument is a malicious command * fix integration tests * revert info logs to debug * revert info logs to debug --- .../__test__/configuration-builder.test.ts | 1 - .../scan/__test__/integrationtest/01-start.sh | 2 +- .../__test__/integrationtest/start_pds.sh | 3 +- .../integrationtest/start_sechub_server.sh | 4 +- .../scan/__test__/sechub-cli.test.ts | 132 +- .../scan/__test__/shell-arg-sanitizer.test.ts | 84 + github-actions/scan/action.yml | 2 +- github-actions/scan/package-lock.json | 1847 ++++++++--------- github-actions/scan/package.json | 2 + .../scan/src/configuration-builder.ts | 6 +- github-actions/scan/src/post-scan.ts | 27 +- github-actions/scan/src/sechub-cli.ts | 87 +- .../scan/src/shell-arg-sanitizer.ts | 54 + 13 files changed, 1209 insertions(+), 1042 deletions(-) create mode 100644 github-actions/scan/__test__/shell-arg-sanitizer.test.ts create mode 100644 github-actions/scan/src/shell-arg-sanitizer.ts diff --git a/github-actions/scan/__test__/configuration-builder.test.ts b/github-actions/scan/__test__/configuration-builder.test.ts index a61b2aa44c..2787db9307 100644 --- a/github-actions/scan/__test__/configuration-builder.test.ts +++ b/github-actions/scan/__test__/configuration-builder.test.ts @@ -6,7 +6,6 @@ import { SecHubConfigurationModelBuilderData } from '../src/configuration-builde jest.mock('@actions/core'); - function dumpModel(model: SecHubConfigurationModel){ const json = JSON.stringify(model, null, 2); // pretty printed output diff --git a/github-actions/scan/__test__/integrationtest/01-start.sh b/github-actions/scan/__test__/integrationtest/01-start.sh index eabeee56eb..e3541bee84 100755 --- a/github-actions/scan/__test__/integrationtest/01-start.sh +++ b/github-actions/scan/__test__/integrationtest/01-start.sh @@ -19,7 +19,7 @@ set -e # Example: # ``` # cd $gitRoot/github-actions/scan -# ./01-start.sh 1.7.0 8443 1.4.0 8444 +# ./01-start.sh 2.2.0 8443 2.0.0 8444 # ``` # SERVER_VERSION=$1 diff --git a/github-actions/scan/__test__/integrationtest/start_pds.sh b/github-actions/scan/__test__/integrationtest/start_pds.sh index bb81852f16..e0605736b0 100755 --- a/github-actions/scan/__test__/integrationtest/start_pds.sh +++ b/github-actions/scan/__test__/integrationtest/start_pds.sh @@ -40,6 +40,8 @@ fi SCRIPT_DIR="$(dirname -- "$0")" +export PDS_STORAGE_SHAREDVOLUME_UPLOAD_DIR=$SHARED_VOLUME + echo "Start PDS at localhost:${SERVER_PORT}, executable at: ${PATH_TO_EXECUTABLE}" # `curl -s --insecure https://localhost:${this.serverPort}/api/anonymous/check/alive`; java \ @@ -48,6 +50,5 @@ java \ -Dpds.config.heartbeat.verbose.logging.enabled=false \ -Dserver.ssl.key-store="${PATH_TO_CERTIFICATE}" \ -Dserver.port="${SERVER_PORT}" \ - -Dpds.storage.sharedvolume.upload.dir="$SHARED_VOLUME" \ -Dpds.config.file="$PDS_CONFIG_FILE" \ -jar "${PATH_TO_EXECUTABLE}">>"${PATH_TO_LOGFILE}" & diff --git a/github-actions/scan/__test__/integrationtest/start_sechub_server.sh b/github-actions/scan/__test__/integrationtest/start_sechub_server.sh index 578e8e8d56..cc9c334284 100755 --- a/github-actions/scan/__test__/integrationtest/start_sechub_server.sh +++ b/github-actions/scan/__test__/integrationtest/start_sechub_server.sh @@ -32,9 +32,10 @@ if [ "$SHARED_VOLUME" = "" ]; then exit 1 fi - SCRIPT_DIR="$(dirname -- "$0")" +export SECHUB_STORAGE_SHAREDVOLUME_UPLOAD_DIR=$SHARED_VOLUME + echo "Start SecHub server at localhost:${SERVER_PORT}, executable at: ${PATH_TO_EXECUTABLE}" # `curl -s --insecure https://localhost:${this.serverPort}/api/anonymous/check/alive`; java \ @@ -44,5 +45,4 @@ java \ -Dsechub.server.debug=true \ -Dserver.port="${SERVER_PORT}" \ -Dsechub.integrationtest.ignore.missing.serverproject=true \ - -Dsechub.storage.sharedvolume.upload.dir="$SHARED_VOLUME" \ -jar "${PATH_TO_EXECUTABLE}">>"${PATH_TO_LOGFILE}" & diff --git a/github-actions/scan/__test__/sechub-cli.test.ts b/github-actions/scan/__test__/sechub-cli.test.ts index b344962df2..ef63c4e496 100644 --- a/github-actions/scan/__test__/sechub-cli.test.ts +++ b/github-actions/scan/__test__/sechub-cli.test.ts @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT -import * as cli from '../src/sechub-cli'; -import { scan } from '../src/sechub-cli'; -import * as shell from 'shelljs'; +import {extractJobUUID, getReport, scan} from '../src/sechub-cli'; +import {execFileSync} from 'child_process'; +import {sanitize} from "../src/shell-arg-sanitizer"; jest.mock('@actions/core'); @@ -18,21 +18,44 @@ const output = ` other `; -jest.mock('shelljs', () => ({ - exec: jest.fn(() => ({ - code: 0, - stdout: output, - stderr: '' - })) +jest.mock('child_process', () => ({ + execFileSync: jest.fn(() => output) })); +jest.mock('../src/shell-arg-sanitizer'); + beforeEach(() => { jest.clearAllMocks(); }); -describe('sechub-cli', function() { +describe('scan', function() { - it('scan - return correct job id', function () { + it('sanitizes shell arguments', () => { + /* prepare */ + const context: any = { + clientExecutablePath: '/path/to/sechub-cli', + configFileLocation: '/path/to/config.json', + workspaceFolder: '/path/to/workspace', + inputData: { + addScmHistory: 'false' + } + }; + (sanitize as jest.Mock).mockImplementation((arg) => { + return arg; + }); + + /* execute */ + scan(context); + + /* test */ + expect(sanitize).toBeCalledTimes(4); + expect(sanitize).toBeCalledWith('/path/to/sechub-cli'); + expect(sanitize).toBeCalledWith('/path/to/config.json'); + expect(sanitize).toBeCalledWith('/path/to/workspace'); + expect(sanitize).toBeCalledWith(''); + }); + + it('return correct job id', function () { /* prepare */ const context: any = { clientExecutablePath: '/path/to/sechub-cli', @@ -51,7 +74,7 @@ describe('sechub-cli', function() { expect(context.jobUUID).toEqual('6880e518-88db-406a-bc67-851933e7e5b7'); }); - it('scan - with addScmHistory flag true - executes SecHub client with -addScmHistory', function () { + it('with addScmHistory flag true - executes SecHub client with -addScmHistory', function () { /* prepare */ const context: any = { clientExecutablePath: '/path/to/sechub-cli', @@ -66,11 +89,25 @@ describe('sechub-cli', function() { scan(context); /* test */ - expect(shell.exec).toBeCalledTimes(1); - expect(shell.exec).toBeCalledWith('/path/to/sechub-cli -configfile /path/to/config.json -output /path/to/workspace -addScmHistory scan'); + expect(execFileSync).toBeCalledTimes(1); + expect(execFileSync) + .toBeCalledWith( + '/path/to/sechub-cli', ['-configfile', '/path/to/config.json', '-output', '/path/to/workspace', '-addScmHistory', 'scan'], + { + env: { + SECHUB_SERVER: process.env.SECHUB_SERVER, + SECHUB_USERID: process.env.SECHUB_USERID, + SECHUB_APITOKEN: process.env.SECHUB_APITOKEN, + SECHUB_PROJECT: process.env.SECHUB_PROJECT, + SECHUB_DEBUG: process.env.SECHUB_DEBUG, + SECHUB_TRUSTALL: process.env.SECHUB_TRUSTALL, + }, + encoding: 'utf-8' + } + ); }); - it('scan - with addScmHistory flag false - executes SecHub client without -addScmHistory', function () { + it('with addScmHistory flag false - executes SecHub client without -addScmHistory', function () { /* prepare */ const context: any = { clientExecutablePath: '/path/to/sechub-cli', @@ -85,11 +122,29 @@ describe('sechub-cli', function() { scan(context); /* test */ - expect(shell.exec).toBeCalledTimes(1); - expect(shell.exec).toBeCalledWith('/path/to/sechub-cli -configfile /path/to/config.json -output /path/to/workspace scan'); + expect(execFileSync).toBeCalledTimes(1); + expect(execFileSync) + .toBeCalledWith( + '/path/to/sechub-cli', ['-configfile', '/path/to/config.json', '-output', '/path/to/workspace', '', 'scan'], + { + env: { + SECHUB_SERVER: process.env.SECHUB_SERVER, + SECHUB_USERID: process.env.SECHUB_USERID, + SECHUB_APITOKEN: process.env.SECHUB_APITOKEN, + SECHUB_PROJECT: process.env.SECHUB_PROJECT, + SECHUB_DEBUG: process.env.SECHUB_DEBUG, + SECHUB_TRUSTALL: process.env.SECHUB_TRUSTALL, + }, + encoding: 'utf-8' + } + ); }); - it('extractJobUUID - returns job uuid from sechub client output snippet', function () { +}); + +describe('extractJobUUID', function () { + + it('returns job uuid from sechub client output snippet', function () { const output = ` WARNING: Configured to trust all - means unknown service certificate is accepted. Don't use this in production! @@ -104,28 +159,28 @@ describe('sechub-cli', function() { `; /* execute */ - const jobUUID= cli.extractJobUUID(output); + const jobUUID= extractJobUUID(output); /* test */ expect(jobUUID).toEqual('6880e518-88db-406a-bc67-851933e7e5b7'); }); - - it('extractJobUUID - returns job uuid from string with "job: xxxx"', function () { - + + it('returns job uuid from string with "job: xxxx"', function () { + const output = ` The uuid for job:1234 can be extracted `; /* execute */ - const jobUUID= cli.extractJobUUID(output); + const jobUUID= extractJobUUID(output); /* test */ expect(jobUUID).toEqual('1234'); }); - it('extractJobUUID - returns empty string when no job id is available', function () { - + it('returns empty string when no job id is available', function () { + const output = ` WARNING: Configured to trust all - means unknown service certificate is accepted. Don't use this in production! 2024-03-08 13:58:18 (+01:00) Zipping folder: __test__/integrationtest/test-sources (/home/xyzgithub-actions/scan/__test__/integrationtest/test-sources) @@ -135,9 +190,34 @@ describe('sechub-cli', function() { `; /* execute */ - const jobUUID= cli.extractJobUUID(output); + const jobUUID= extractJobUUID(output); /* test */ expect(jobUUID).toEqual(''); }); +}); + +describe('getReport', function () { + + it('sanitizes shell arguments', () => { + /* prepare */ + const context: any = { + clientExecutablePath: '/path/to/sechub-cli', + projectName: 'project-name', + }; + (sanitize as jest.Mock).mockImplementation((arg) => { + return arg; + }); + + /* execute */ + getReport('job-uuid', 'json', context); + + /* test */ + expect(sanitize).toBeCalledTimes(4); + expect(sanitize).toBeCalledWith('/path/to/sechub-cli'); + expect(sanitize).toBeCalledWith('job-uuid'); + expect(sanitize).toBeCalledWith('project-name'); + expect(sanitize).toBeCalledWith('json'); + }); + }); \ No newline at end of file diff --git a/github-actions/scan/__test__/shell-arg-sanitizer.test.ts b/github-actions/scan/__test__/shell-arg-sanitizer.test.ts new file mode 100644 index 0000000000..f03ed1a19d --- /dev/null +++ b/github-actions/scan/__test__/shell-arg-sanitizer.test.ts @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT + +import * as shellArgSanitizer from '../src/shell-arg-sanitizer'; + +describe('sanitize', () => { + test.each([ + ['rm -rf /; echo hacked'], // Command chaining + ['echo $(whoami)'], // Command substitution + ['cat /etc/passwd | grep root'], // Piping + ['touch /tmp/test && ls /tmp'], // Logical AND + ['echo hello > /tmp/test'], // Redirection + ['`reboot`'], // Backticks + ['$(reboot)'], // Subshell + ['; reboot'], // Semicolon + ['| reboot'], // Pipe + ['& reboot'], // Background process + ['> /dev/null'], // Redirection to null + ['< /dev/null'], // Input redirection + ['|| reboot'], // Logical OR + ['&& reboot'], // Logical AND + ['$(< /etc/passwd)'], // Command substitution with input redirection + ['$(cat /etc/passwd)'], // Command substitution with cat + ['$(echo hello > /tmp/test)'], // Command substitution with redirection + ['$(touch /tmp/test && ls /tmp)'], // Command substitution with logical AND + ['$(cat /etc/passwd | grep root)'], // Command substitution with pipe + ['$(rm -rf /; echo hacked)'], + ['kill'], + ['sleep'], + ['shutdown'], + ['reboot'], + ['halt'], + ['ps'], + ['top'], + ['killall'], + ['pkill'], + ['pgrep'], + ['chown'], + ['chmod'], + ['chgrp'], + ['passwd'], + ['su'], + ['sudo'], + ['chsh'], + ['chfn'], + ['chroot'] + ])( + '%s throws CommandInjectionError', + (arg) => { + /* test */ + expect(() => shellArgSanitizer.sanitize(arg)).toThrow(/Command injection detected in shell argument:/); + } + ); + + test.each([ + ['/path/to/sechub-cli'], + ['-configfile'], + ['/path/to/config.json'], + ['-output'], + ['/path/to/workspace'], + ['-addScmHistory'], + ['scan'], + ['-jobUUID'], + ['-project'], + ['--reportformat'], + ['json'], + ['getReport'] + ])( + 'does not throw CommandInjectionError for safe shell argument: %s', + (arg) => { + /* test */ + expect(() => shellArgSanitizer.sanitize(arg)).not.toThrow(); + }); + + it('removes whitespaces', function () { + /* prepare */ + const arg = ' /path/to/sechub-cli '; + + /* execute */ + const sanitized = shellArgSanitizer.sanitize(arg); + + /* test */ + expect(sanitized).toEqual('/path/to/sechub-cli'); + }); +}); \ No newline at end of file diff --git a/github-actions/scan/action.yml b/github-actions/scan/action.yml index 353418b1fa..37066fd6cb 100644 --- a/github-actions/scan/action.yml +++ b/github-actions/scan/action.yml @@ -105,7 +105,7 @@ runs: git clone --no-checkout --branch=${{ inputs.branch }} https://github.com/mercedes-benz/sechub.git cd sechub git config core.sparseCheckout true - + echo "github-actions/scan/" >> .git/info/sparse-checkout git checkout diff --git a/github-actions/scan/package-lock.json b/github-actions/scan/package-lock.json index e34eb9a57c..b7f6f8d7c8 100644 --- a/github-actions/scan/package-lock.json +++ b/github-actions/scan/package-lock.json @@ -1,12 +1,12 @@ { "name": "sechub-scan-action", - "version": "2.1.1", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sechub-scan-action", - "version": "2.1.1", + "version": "2.2.0", "license": "MIT", "dependencies": { "@actions/artifact": "^1.1.0", @@ -14,6 +14,7 @@ "@types/fs-extra": "^11.0.4", "axios": "^1.7.4", "cheerio": "^1.0.0-rc.12", + "command-exists": "^1.2.9", "extract-zip": "^2.0.1", "fs-extra": "^11.2.0", "shelljs": "^0.8.5" @@ -26,6 +27,7 @@ "@vercel/ncc": "^0.36.1", "axios-mock-adapter": "^1.22.0", "eslint": "^8.35.0", + "jest": "^29.7.0", "prettier": "2.8.4", "ts-jest": "^29.0.5", "typescript": "^4.9.5" @@ -64,7 +66,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -74,121 +75,51 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -198,72 +129,61 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "peer": true - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -271,170 +191,123 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -445,6 +318,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -457,6 +331,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -471,6 +346,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -479,13 +355,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -495,6 +373,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -504,6 +383,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -512,11 +392,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -529,7 +412,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -542,7 +424,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -555,7 +436,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -568,7 +448,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -581,7 +460,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -590,13 +468,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -610,7 +488,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -623,7 +500,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -636,7 +512,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -649,7 +524,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -662,7 +536,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -675,7 +548,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -688,7 +560,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -700,13 +571,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -716,35 +587,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -757,20 +625,20 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -782,7 +650,7 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.2.0", @@ -878,7 +746,6 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -895,7 +762,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -905,7 +771,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -919,7 +784,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -933,7 +797,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -946,7 +809,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -962,7 +824,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -975,7 +836,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -985,23 +845,22 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1009,38 +868,38 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1057,94 +916,95 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1152,13 +1012,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1176,26 +1036,44 @@ } } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1204,14 +1082,14 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1220,15 +1098,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1236,23 +1114,23 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1263,12 +1141,13 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1284,7 +1163,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, - "peer": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1298,17 +1176,16 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, - "peer": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1317,18 +1194,17 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -1367,37 +1243,38 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", - "dev": true + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1407,34 +1284,34 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/fs-extra": { @@ -1457,11 +1334,11 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1525,13 +1402,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.1.tgz", "integrity": "sha512-U2TWca8AeHSmbpi314QBESRk7oPjSZjDsR+c+H4ECC1l+kFgpZf8Ydhv3SJpPy51VyZHHqxlb6mTTqYNNRVAIw==" }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true, - "peer": true - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -1817,7 +1687,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -1833,7 +1703,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "peer": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1870,7 +1740,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1923,16 +1793,16 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -1949,7 +1819,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -1962,11 +1831,11 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -1982,7 +1851,6 @@ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "peer": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -2002,13 +1870,13 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -2050,9 +1918,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -2062,14 +1930,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "peer": true, + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2095,7 +1967,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } @@ -2113,7 +1985,7 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", @@ -2129,15 +2001,14 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "peer": true, "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001465", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001465.tgz", - "integrity": "sha512-HvjgL3MYAJjceTDCcjRnQGjwUz/5qec9n7JPOzUursUoOTIsYCSDOb1l7RsnZE8mjbxG78zVRCKfrBXyvChBag==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "dev": true, "funding": [ { @@ -2147,9 +2018,13 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "peer": true + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", @@ -2172,7 +2047,7 @@ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -2229,18 +2104,18 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2255,18 +2130,18 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", @@ -2297,6 +2172,12 @@ "node": ">= 0.8" } }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2306,8 +2187,29 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, - "peer": true + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2366,11 +2268,19 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, - "peer": true + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-is": { "version": "0.1.4", @@ -2379,11 +2289,11 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2401,16 +2311,17 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -2491,18 +2402,18 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.328", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz", - "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==", + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", "dev": true, - "peer": true + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -2515,7 +2426,7 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2541,17 +2452,17 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2718,7 +2629,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2787,51 +2697,27 @@ "node": ">=0.10.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "peer": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2930,7 +2816,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } @@ -3053,16 +2939,16 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -3077,7 +2963,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "peer": true, "engines": { "node": ">=6.9.0" } @@ -3087,7 +2972,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "peer": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3097,24 +2982,10 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "peer": true, "engines": { "node": ">=8.0.0" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3217,7 +3088,7 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -3237,16 +3108,6 @@ "entities": "^4.4.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -3273,11 +3134,11 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -3319,6 +3180,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3328,7 +3190,7 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/is-buffer": { "version": "2.0.5", @@ -3378,7 +3240,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3388,7 +3250,7 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3423,19 +3285,6 @@ "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3447,7 +3296,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -3457,7 +3305,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "peer": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -3474,24 +3321,23 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "peer": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -3499,7 +3345,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -3510,11 +3356,11 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -3524,16 +3370,16 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -3551,43 +3397,127 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3597,23 +3527,22 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -3632,32 +3561,32 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3678,26 +3607,27 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -3706,65 +3636,66 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3776,47 +3707,49 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3825,15 +3758,15 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3844,7 +3777,7 @@ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -3858,28 +3791,28 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3889,45 +3822,45 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3936,32 +3869,32 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3970,47 +3903,45 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -4022,18 +3953,18 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4044,7 +3975,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4053,19 +3984,19 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -4073,14 +4004,14 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4093,7 +4024,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4118,7 +4049,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -4133,16 +4065,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, - "peer": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -4150,7 +4082,7 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -4192,7 +4124,7 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4202,7 +4134,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4225,7 +4157,7 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", @@ -4259,37 +4191,27 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4301,7 +4223,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } @@ -4311,7 +4233,7 @@ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", @@ -4359,7 +4281,7 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4397,38 +4319,25 @@ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -4453,7 +4362,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4516,7 +4425,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -4538,7 +4446,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -4621,11 +4529,11 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, - "peer": true + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4644,7 +4552,6 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, - "peer": true, "engines": { "node": ">= 6" } @@ -4654,7 +4561,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -4667,7 +4574,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4681,7 +4588,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -4694,7 +4601,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -4710,7 +4617,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -4743,12 +4650,13 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -4773,7 +4681,7 @@ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -4806,9 +4714,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -4820,7 +4728,7 @@ "url": "https://opencollective.com/fast-check" } ], - "peer": true + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -4876,7 +4784,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4902,7 +4810,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -4915,7 +4823,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4930,11 +4838,11 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -5044,6 +4952,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -5060,15 +4969,14 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, - "peer": true + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", @@ -5084,7 +4992,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5094,7 +5002,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5104,8 +5012,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true + "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", @@ -5133,7 +5040,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -5147,7 +5054,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5174,21 +5081,11 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5229,7 +5126,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "peer": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -5269,14 +5165,13 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, - "peer": true + "license": "BSD-3-Clause" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "peer": true, "engines": { "node": ">=4" } @@ -5382,7 +5277,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5421,9 +5316,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -5433,15 +5328,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "peer": true, + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -5465,33 +5364,26 @@ } }, "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "peer": true - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "peer": true, + "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } @@ -5525,7 +5417,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5548,7 +5440,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -5562,7 +5453,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "peer": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -5572,14 +5463,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "peer": true + "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", diff --git a/github-actions/scan/package.json b/github-actions/scan/package.json index af993705cc..a2b1b52947 100644 --- a/github-actions/scan/package.json +++ b/github-actions/scan/package.json @@ -21,6 +21,7 @@ "@types/fs-extra": "^11.0.4", "axios": "^1.7.4", "cheerio": "^1.0.0-rc.12", + "command-exists": "^1.2.9", "extract-zip": "^2.0.1", "fs-extra": "^11.2.0", "shelljs": "^0.8.5" @@ -33,6 +34,7 @@ "@vercel/ncc": "^0.36.1", "axios-mock-adapter": "^1.22.0", "eslint": "^8.35.0", + "jest": "^29.7.0", "prettier": "2.8.4", "ts-jest": "^29.0.5", "typescript": "^4.9.5" diff --git a/github-actions/scan/src/configuration-builder.ts b/github-actions/scan/src/configuration-builder.ts index fb57e6146a..ccdc051cff 100644 --- a/github-actions/scan/src/configuration-builder.ts +++ b/github-actions/scan/src/configuration-builder.ts @@ -7,9 +7,9 @@ import * as cm from './configuration-model'; /** * Creates the sechub.json configuration file with the given user input values. - * - * @param includeFolders Which folders should be included - * @param excludeFolders Which folders should be excluded + * + * @param secHubJsonFilePath The path where the sechub.json file should be created + * @param data The value to build the json from */ export function createSecHubConfigJsonFile(secHubJsonFilePath: string, data: SecHubConfigurationModelBuilderData) { core.info('Config-Path was not found. Config will be created at ' + secHubJsonFilePath); diff --git a/github-actions/scan/src/post-scan.ts b/github-actions/scan/src/post-scan.ts index 34a72d83ad..e7ffa5fca6 100644 --- a/github-actions/scan/src/post-scan.ts +++ b/github-actions/scan/src/post-scan.ts @@ -3,12 +3,15 @@ import * as artifact from '@actions/artifact'; import * as core from '@actions/core'; import * as fs from 'fs'; -import * as shell from 'shelljs'; import { getWorkspaceDir } from './fs-helper'; import { LaunchContext } from './launcher'; import { logExitCode } from './exitcode'; import { getReport } from './sechub-cli'; import { getFieldFromJson } from './json-helper'; +import { execFileSync } from "child_process"; +import { sanitize } from "./shell-arg-sanitizer"; + +const NEW_LINE_SEPARATOR = '\n'; /** * Collect all necessary report data, downloads additional report formats (e.g. 'html') if necessary @@ -88,10 +91,19 @@ export async function uploadArtifact(context: LaunchContext, name: string, files const artifactName = name; const options = { continueOnError: true }; - const rootDirectory = context.workspaceFolder; + const rootDirectory = sanitize(context.workspaceFolder); core.debug('rootDirectory: ' + rootDirectory); if (core.isDebug()) { - shell.exec(`ls ${rootDirectory}`); + const filesInWorkspace = execFileSync('ls', + [rootDirectory], + { + encoding: 'utf-8' + } + ).split(NEW_LINE_SEPARATOR); + + for (const fileName of filesInWorkspace) { + core.debug(fileName); + } } core.debug('files: ' + files); @@ -110,8 +122,13 @@ export async function uploadArtifact(context: LaunchContext, name: string, files * @returns {string} - The JSON report file name or an empty string if not found. */ function resolveReportNameForScanJob(context: LaunchContext): string { - const workspaceDir = getWorkspaceDir(); - const filesInWorkspace = shell.ls(workspaceDir); + const workspaceDir = sanitize(getWorkspaceDir()); + const filesInWorkspace = execFileSync('ls', + [workspaceDir], + { + encoding: 'utf-8' + } + ).split(NEW_LINE_SEPARATOR); if (!context.jobUUID) { core.error('Illegal state: No job uuid resolved - not allowed at this point'); diff --git a/github-actions/scan/src/sechub-cli.ts b/github-actions/scan/src/sechub-cli.ts index 16ca0c9b6f..72ae08484f 100644 --- a/github-actions/scan/src/sechub-cli.ts +++ b/github-actions/scan/src/sechub-cli.ts @@ -1,32 +1,51 @@ // SPDX-License-Identifier: MIT -import * as shell from 'shelljs'; import { LaunchContext } from './launcher'; import * as core from '@actions/core'; +import {execFileSync} from 'child_process'; +import {sanitize} from "./shell-arg-sanitizer"; + /** * Executes the scan method of the SecHub CLI. Sets the client exitcode inside context. * @param context launch context */ export function scan(context: LaunchContext) { - const addScmHistory = context.inputData.addScmHistory === 'true' ? '-addScmHistory' : ''; - let shellCommand = `${context.clientExecutablePath} -configfile ${context.configFileLocation} -output ${context.workspaceFolder} ${addScmHistory} scan`; - // remove duplicate whitespaces caused by optional arguments - shellCommand = shellCommand.replace(/\s+/g, ' '); - core.debug(`scan shell command: ${shellCommand}`); - const shellString = shell.exec(shellCommand); + const clientExecutablePath = sanitize(context.clientExecutablePath); + const configFileArgValue = sanitize(context.configFileLocation ? context.configFileLocation : ''); + const outputArgValue = sanitize(context.workspaceFolder); + const addScmHistoryArg = sanitize(context.inputData.addScmHistory === 'true' ? '-addScmHistory' : ''); - core.debug(`scan exit code: ${shellString.code}`); - context.lastClientExitCode= shellString.code; - - if (context.lastClientExitCode!=0){ - core.error(shellString.stderr); + try { + const output = execFileSync(clientExecutablePath, + ['-configfile', configFileArgValue, '-output', outputArgValue, addScmHistoryArg, 'scan'], + { + env: { + SECHUB_SERVER: process.env.SECHUB_SERVER, + SECHUB_USERID: process.env.SECHUB_USERID, + SECHUB_APITOKEN: process.env.SECHUB_APITOKEN, + SECHUB_PROJECT: process.env.SECHUB_PROJECT, + SECHUB_DEBUG: process.env.SECHUB_DEBUG, + SECHUB_TRUSTALL: process.env.SECHUB_TRUSTALL, + }, + encoding: 'utf-8' + } + ); + + core.info('Scan executed successfully'); + context.lastClientExitCode = 0; + context.jobUUID=extractJobUUID(output); + } catch (error: any) { + core.error(`Error executing scan command: ${error.message}`); + core.error(`Standard error: ${error.stderr}`); + context.lastClientExitCode= error.status; + context.jobUUID=extractJobUUID(error.stdout); } - context.jobUUID=extractJobUUID(shellString.stdout); } export function extractJobUUID(output: string): string{ const jobPrefix='job:'; + core.debug(`Extracting job uuid from scan output: ${output}`); const index1 =output.indexOf(jobPrefix); @@ -36,7 +55,7 @@ export function extractJobUUID(output: string): string{ const extracted=output.substring(index1+jobPrefix.length,index2); const jobUUID = extracted.trim(); - core.debug(`extractJobUUID: ${jobUUID}`); + core.debug(`Extracted job uuid from scan output: ${jobUUID}`); return jobUUID; } @@ -48,16 +67,36 @@ export function extractJobUUID(output: string): string{ /** * Executes the getReport method of the SecHub CLI. Sets the client exitcode inside context. * @param jobUUID job UUID for which the report should be downloaded - * @param format format in which the report should be downloaded + * @param reportFormat format in which the report should be downloaded * @param context launch context */ -export function getReport(jobUUID: string, format: string, context: LaunchContext) { - const shellCommand = `${context.clientExecutablePath} -jobUUID ${jobUUID} -project ${context.projectName} --reportformat ${format} getReport`; - core.debug(`getReport shell command: ${shellCommand}`); - - const shellString = shell.exec(shellCommand); - - core.debug(`get report exit code: ${shellString.code}`); - context.lastClientExitCode= shellString.code; -} +export function getReport(jobUUID: string, reportFormat: string, context: LaunchContext) { + const clientExecutablePath = sanitize(context.clientExecutablePath); + const jobUUIDArgValue = sanitize(jobUUID); + const projectArgValue = sanitize(context.projectName); + const reportFormatArgValue = sanitize(reportFormat); + try { + execFileSync(clientExecutablePath, + ['-jobUUID', jobUUIDArgValue, '-project', projectArgValue, '--reportformat', reportFormatArgValue, 'getReport'], + { + env: { + SECHUB_SERVER: process.env.SECHUB_SERVER, + SECHUB_USERID: process.env.SECHUB_USERID, + SECHUB_APITOKEN: process.env.SECHUB_APITOKEN, + SECHUB_PROJECT: process.env.SECHUB_PROJECT, + SECHUB_DEBUG: process.env.SECHUB_DEBUG, + SECHUB_TRUSTALL: process.env.SECHUB_TRUSTALL, + }, + encoding: 'utf-8' + } + ); + + core.debug('Get report executed successfully'); + context.lastClientExitCode = 0; + } catch (error: any) { + core.error(`Error executing getReport command: ${error.message}`); + core.error(`Standard error: ${error.stderr}`); + context.lastClientExitCode= error.status; + } +} \ No newline at end of file diff --git a/github-actions/scan/src/shell-arg-sanitizer.ts b/github-actions/scan/src/shell-arg-sanitizer.ts new file mode 100644 index 0000000000..76de8ece1c --- /dev/null +++ b/github-actions/scan/src/shell-arg-sanitizer.ts @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MIT + +import * as core from '@actions/core'; +const commandExistsSync = require('command-exists').sync + +const SHELL_ARGUMENT_CHARACTER_WHITELIST = /^[a-zA-Z0-9._\-\/ ]+$/; +const FULL_WORD = /^[a-zA-Z]+$/; + +/** + * Sanitizes a shell arg to prevent command injection attacks. + * + * This function performs the following steps: + * 1. Removes duplicate whitespaces. + * 2. Checks if the arg contains any characters that are not in the character whitelist. + * 3. Checks if the arg is an executable shell command. + * 3. Throws a `CommandInjectionError` if any of the above checks are true. + * + * @param {string} arg - The shell argument to be sanitized. + * @returns {string} - The sanitized shell command. + * @throws {CommandInjectionError} - If command injection characters are detected in the shell command. + */ +export function sanitize(arg: string): string { + if (!arg) { + return arg; + } + + /* + remove all whitespaces + a single argument should not have any whitespaces so this should never cause any issues + */ + arg = arg.replace(/\s+/g, '') + + if (!SHELL_ARGUMENT_CHARACTER_WHITELIST.test(arg)) { + core.error(`Argument has invalid characters: ${arg}`); + throw new CommandInjectionError(`Command injection detected in shell argument: ${arg}`); + } + + if (FULL_WORD.test(arg) && commandExistsSync(arg)) { + core.error(`Argument is a command: ${arg}`); + throw new CommandInjectionError(`Command injection detected in shell argument: ${arg}`); + } + + return arg; +} + +export class CommandInjectionError extends Error { + readonly code: number; + + constructor(msg: string) { + super(msg); + this.name = "CommandInjectionError"; + this.code = 666; + } +} From ed68afc78b2e41a401b2542945ac6c655cfaec93 Mon Sep 17 00:00:00 2001 From: Sven Dolderer Date: Thu, 17 Oct 2024 16:10:16 +0200 Subject: [PATCH 07/43] implemented signal handling #3470 - also updated Alpine version - and fixed a typo --- .../workflows/release-client-server-pds.yml | 2 +- .github/workflows/release-webui.yml | 2 +- .../scripts/container/postgres/Dockerfile | 2 +- .../tern/tests/alpine/Alpine.dockerfile | 2 +- sechub-solution/10-create-image-alpine.sh | 2 +- .../docker-compose_sechub-alpine.yaml | 2 +- sechub-solution/docker/run.sh | 100 ++++++++++++------ .../sechub-server/templates/deployment.yaml | 2 +- 8 files changed, 72 insertions(+), 42 deletions(-) diff --git a/.github/workflows/release-client-server-pds.yml b/.github/workflows/release-client-server-pds.yml index acae6700bc..609aa31b22 100644 --- a/.github/workflows/release-client-server-pds.yml +++ b/.github/workflows/release-client-server-pds.yml @@ -33,7 +33,7 @@ permissions: pull-requests: write env: - ACTIONS_BASE_IMAGE_ALPINE: alpine:3.17 + ACTIONS_BASE_IMAGE_ALPINE: alpine:3.20 ACTIONS_BASE_IMAGE_DEBIAN: debian:12-slim ACTIONS_SECHUB_REGISTRY: ghcr.io/mercedes-benz/sechub ACTIONS_HELM_REGISTRY: "oci://ghcr.io/mercedes-benz/sechub/helm-charts" diff --git a/.github/workflows/release-webui.yml b/.github/workflows/release-webui.yml index 7a15af7acc..164e04ffb0 100644 --- a/.github/workflows/release-webui.yml +++ b/.github/workflows/release-webui.yml @@ -21,7 +21,7 @@ permissions: pull-requests: write env: - ACTIONS_BASE_IMAGE_ALPINE: alpine:3.17 + ACTIONS_BASE_IMAGE_ALPINE: alpine:3.20 ACTIONS_BASE_IMAGE_DEBIAN: debian:12-slim ACTIONS_SECHUB_REGISTRY: ghcr.io/mercedes-benz/sechub ACTIONS_HELM_REGISTRY: "oci://ghcr.io/mercedes-benz/sechub/helm-charts" diff --git a/sechub-developertools/scripts/container/postgres/Dockerfile b/sechub-developertools/scripts/container/postgres/Dockerfile index 274c2148da..b252678ced 100644 --- a/sechub-developertools/scripts/container/postgres/Dockerfile +++ b/sechub-developertools/scripts/container/postgres/Dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: MIT -FROM alpine:3.14 +FROM alpine:3.20 ARG DATABASE_FOLDER=/database ENV PGDATA="$DATABASE_FOLDER/data" diff --git a/sechub-pds-solutions/tern/tests/alpine/Alpine.dockerfile b/sechub-pds-solutions/tern/tests/alpine/Alpine.dockerfile index 4da19a65f4..bac52e0057 100644 --- a/sechub-pds-solutions/tern/tests/alpine/Alpine.dockerfile +++ b/sechub-pds-solutions/tern/tests/alpine/Alpine.dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: MIT -FROM alpine:3.18 +FROM alpine:3.20 ENV DATA="/data" diff --git a/sechub-solution/10-create-image-alpine.sh b/sechub-solution/10-create-image-alpine.sh index 82a559a548..ee5abbd88e 100755 --- a/sechub-solution/10-create-image-alpine.sh +++ b/sechub-solution/10-create-image-alpine.sh @@ -16,7 +16,7 @@ usage: $0 [ with tag . Required: -- ; An Alpine based image. Example: alpine:3.17 +- ; An Alpine based image. Example: alpine:3.20 Optional: - parameter (mandatory for build type "download") See https://github.com/mercedes-benz/sechub/releases diff --git a/sechub-solution/docker-compose_sechub-alpine.yaml b/sechub-solution/docker-compose_sechub-alpine.yaml index f3d002d16a..cfb9272544 100644 --- a/sechub-solution/docker-compose_sechub-alpine.yaml +++ b/sechub-solution/docker-compose_sechub-alpine.yaml @@ -5,7 +5,7 @@ services: sechub: build: args: - - BASE_IMAGE=alpine:3.17 + - BASE_IMAGE=alpine:3.20 - BUILD_TYPE=${BUILD_TYPE} - JAVA_DISTRIBUTION=${JAVA_DISTRIBUTION} - JAVA_VERSION=${JAVA_VERSION} diff --git a/sechub-solution/docker/run.sh b/sechub-solution/docker/run.sh index 2200964d29..45ba85231c 100755 --- a/sechub-solution/docker/run.sh +++ b/sechub-solution/docker/run.sh @@ -3,12 +3,27 @@ SLEEP_TIME_IN_WAIT_LOOP="2h" +########################### +# Trap and process signals +trap trigger_shutdown INT QUIT TERM + +trigger_shutdown() +{ + if [ -n "$PID_JAVA_SERVER" ] ; then + echo "`basename $0`: Caught shutdown signal! Sending SIGTERM to Java server process $PID_JAVA_SERVER" + kill -TERM "$PID_JAVA_SERVER" + # Wait until Java server process has ended + wait "$PID_JAVA_SERVER" + fi + exit +} +########################### + check_variable() { value="$1" name="$2" - if [ -z "$value" ] - then + if [ -z "$value" ] ; then echo "Mandatory environment variable $name not set." exit 1 fi @@ -28,6 +43,13 @@ wait_loop() { done } +keep_container_alive_or_exit() { + if [ "$KEEP_CONTAINER_ALIVE_AFTER_CRASH" = "true" ] ; then + echo "[ERROR] SecHub server crashed, but keeping the container alive." + wait_loop + fi +} + init_scheduler_settings() { if [ -z "$SECHUB_CONFIG_TRIGGER_NEXTJOB_DELAY" ] ; then export SECHUB_CONFIG_TRIGGER_NEXTJOB_DELAY="10000" @@ -37,7 +59,26 @@ init_scheduler_settings() { export SECHUB_CONFIG_TRIGGER_NEXTJOB_INITIALDELAY=$(( $SECHUB_CONFIG_TRIGGER_NEXTJOB_DELAY / 10 * $(shuf -i 0-10 -n 1) )) } -localserver() { +init_s3_settings() { + # Set storage variables for Java Spring app: + check_variable "$S3_ENDPOINT" "S3_ENDPOINT" + export SECHUB_STORAGE_S3_ENDPOINT="$S3_ENDPOINT" + check_variable "$S3_BUCKETNAME" "S3_BUCKETNAME" + export SECHUB_STORAGE_S3_BUCKETNAME="$S3_BUCKETNAME" + check_variable "$S3_ACCESSKEY" "S3_ACCESSKEY" + export SECHUB_STORAGE_S3_ACCESSKEY="$S3_ACCESSKEY" + check_variable "$S3_SECRETKEY" "S3_SECRETKEY" + export SECHUB_STORAGE_S3_SECRETKEY="$S3_SECRETKEY" + + cat - < Date: Thu, 17 Oct 2024 16:31:33 +0200 Subject: [PATCH 08/43] PR Review improvement #3512 - added explanations to unspecific parts - replaced user messageds with logging - correctly ordered scanners - improved user messages --- .../helper/ZapProductMessageHelper.java | 24 +------- .../internal/scan/ClientApiFacade.java | 59 +++++++++++++++---- .../sechub/zapwrapper/scan/ZapScanner.java | 27 +++++---- .../helper/ZapProductMessageHelperTest.java | 3 +- .../zapwrapper/scan/ZapScannerTest.java | 22 +++---- 5 files changed, 78 insertions(+), 57 deletions(-) diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java index b8d6c113f5..93141c11b9 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelper.java @@ -3,11 +3,9 @@ import java.io.IOException; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.zaproxy.clientapi.core.ApiResponse; import com.mercedesbenz.sechub.commons.TextFileWriter; import com.mercedesbenz.sechub.commons.model.SecHubMessage; @@ -60,26 +58,6 @@ public void writeProductError(ZapWrapperRuntimeException zapWrapperRuntimeExcept } } - public void writeUserMessagesWithDetectedURLs(List> results) { - // The map looks like this: {processed=true, statusReason=OK, method=GET, - // reasonNotProcessed=, messageId=6, url=http://example.com, statusCode=200} - for (Map result : results) { - String url = result.get("url").toString(); - // robots.txt and sitemap.xml always appear inside the sites tree even if they - // are not available. Because of this it is skipped here. - if (url.contains("robots.txt") || url.contains("sitemap.xml")) { - continue; - } - String statusCode = result.get("statusCode").toString(); - String statusReason = result.get("statusReason").toString(); - String method = result.get("method").toString(); - - String message = "URL: '%s' returned status code: '%s/%s' on detection phase for request method: '%s'".formatted(url, statusCode, statusReason, - method); - writeSingleProductMessage(new SecHubMessage(SecHubMessageType.INFO, message)); - } - } - private void writeProductErrorForExitCode(ZapWrapperExitCode exitCode) throws IOException { if (exitCode == null) { return; @@ -92,7 +70,7 @@ private void writeProductErrorForExitCode(ZapWrapperExitCode exitCode) throws IO break; case API_DEFINITION_CONFIG_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, - "Please use files instead of folders for the API definition with the filesystem->files section of the SecHub configuration.")); + "Please check your webscan api section inside the sechub configuration file. Only use supported api types and use filesystem->files instead of filesystem->folders for the API definition files.")); break; case TARGET_URL_INVALID: productMessageSupport.writeMessage(new SecHubMessage(SecHubMessageType.ERROR, diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java index 403e78c591..161faa9766 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/internal/scan/ClientApiFacade.java @@ -2,8 +2,7 @@ package com.mercedesbenz.sechub.zapwrapper.internal.scan; import java.net.URL; -import java.util.LinkedList; -import java.util.List; +import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; @@ -17,6 +16,11 @@ public class ClientApiFacade { + private static final String URL_KEY = "url"; + private static final String STATUS_CODE_KEY = "statusCode"; + private static final String STATUS_REASON_KEY = "statusReason"; + private static final String METHOD_KEY = "method"; + private static final Logger LOG = LoggerFactory.getLogger(ClientApiFacade.class); private ClientApi clientApi; @@ -372,18 +376,15 @@ public ApiResponse stopSpiderScan(String scanId) throws ClientApiException { } /** - * For the given scanId read all the spider results and add them to a list. Each - * entry of the list consists of a Map with the form: {processed=true, - * statusReason=OK, method=GET, reasonNotProcessed=, messageId=6, - * url=http://example.com, statusCode=200} + * Logs all spider results with additional meta data and counts the amount of + * spider results logged. * * @param scanId - * @param zapProductMessageHelper + * @return the amount of spider results logged * @throws ClientApiException */ - public List> getFullSpiderResults(String scanId) throws ClientApiException { - List> fullResults = new LinkedList<>(); - + public long logFullSpiderResults(String scanId) throws ClientApiException { + int numberOfSpiderResults = 0; ApiResponseList results = (ApiResponseList) clientApi.spider.fullResults(scanId); for (ApiResponse resultItem : results.getItems()) { ApiResponseList elementList = (ApiResponseList) resultItem; @@ -395,11 +396,23 @@ public List> getFullSpiderResults(String scanId) throws // ApiResponseElement, which does not contain a values map. if (elementListItem instanceof ApiResponseSet) { ApiResponseSet apiResponseSet = (ApiResponseSet) elementListItem; - fullResults.add(apiResponseSet.getValuesMap()); + Map result = createSafeMap(apiResponseSet.getValuesMap()); + String url = result.get(URL_KEY); + // robots.txt and sitemap.xml always appear inside the sites tree even if they + // are not available. Because of this it is skipped here. + if (url.contains("robots.txt") || url.contains("sitemap.xml")) { + continue; + } + String statusCode = result.get(STATUS_CODE_KEY); + String statusReason = result.get(STATUS_REASON_KEY); + String method = result.get(METHOD_KEY); + + LOG.info("URL: '{}' returned status code: '{}/{}' on detection phase for request method: '{}'", url, statusCode, statusReason, method); + numberOfSpiderResults++; } } } - return fullResults; + return numberOfSpiderResults; } /** @@ -654,4 +667,26 @@ public ApiResponse setForcedUserModeEnabled(boolean enabled) throws ClientApiExc private String getIdOfApiResponseElement(ApiResponseElement apiResponseElement) { return apiResponseElement.getValue(); } + + private Map createSafeMap(Map valuesMap) { + ApiResponse url = valuesMap.get(URL_KEY); + ApiResponse statusCode = valuesMap.get(STATUS_CODE_KEY); + ApiResponse statusReason = valuesMap.get(STATUS_REASON_KEY); + ApiResponse method = valuesMap.get(METHOD_KEY); + + Map safeMap = new HashMap<>(); + String safeUrl = url != null ? url.toString() : ""; + safeMap.put(URL_KEY, safeUrl); + + String safeStatusCode = statusCode != null ? statusCode.toString() : ""; + safeMap.put(STATUS_CODE_KEY, safeStatusCode); + + String safeStatusReason = statusReason != null ? statusReason.toString() : ""; + safeMap.put(STATUS_REASON_KEY, safeStatusReason); + + String safeMethod = method != null ? method.toString() : ""; + safeMap.put(METHOD_KEY, safeMethod); + + return safeMap; + } } diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java index 9daecaaa7c..237a6a31d7 100644 --- a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScanner.java @@ -250,8 +250,11 @@ void addIncludedAndExcludedUrlsToContext() throws ClientApiException { String followRedirects = "false"; for (String url : scanContext.getZapURLsIncludeSet()) { clientApiFacade.addIncludeUrlPatternToContext(scanContext.getContextName(), url); - // cannot try to access wildcarded URLs - if (!url.contains(".*")) { + // Cannot not perform initial connection check to included URL with wildcards + if (url.contains(".*")) { + LOG.info("For scan {}: Cannot not perform initial connection check to included URL: {} because it contains wildcards.", + scanContext.getContextName(), url); + } else { clientApiFacade.accessUrlViaZap(url, followRedirects); } } @@ -324,20 +327,20 @@ void importClientCertificate() throws ClientApiException { void executeScan(String zapContextId) throws ClientApiException { UserInformation userInfo = configureLoginInsideZapContext(zapContextId); if (userInfo != null) { + runSpiderAsUser(zapContextId, userInfo.zapuserId); + passiveScan(); if (scanContext.isAjaxSpiderEnabled()) { runAjaxSpiderAsUser(userInfo.userName); } - runSpiderAsUser(zapContextId, userInfo.zapuserId); - passiveScan(); if (scanContext.isActiveScanEnabled()) { runActiveScanAsUser(zapContextId, userInfo.zapuserId); } } else { + runSpider(); + passiveScan(); if (scanContext.isAjaxSpiderEnabled()) { runAjaxSpider(); } - runSpider(); - passiveScan(); if (scanContext.isActiveScanEnabled()) { runActiveScan(); } @@ -423,15 +426,15 @@ void cleanUp() { clientApiFacade.createNewSession("Cleaned after scan", "true"); LOG.info("New and empty session inside Zap created."); - // Remove x-sechub-dast header - LOG.info("Remove '{}' replacer rule.", X_SECHUB_DAST_HEADER_NAME); - clientApiFacade.removeReplacerRule(X_SECHUB_DAST_HEADER_NAME); - // Replacer rules are persistent even after restarting ZAP // This means we need to cleanUp after every scan. LOG.info("Start cleaning up replacer rules."); cleanUpReplacerRules(); + // Remove x-sechub-dast header replacer rule + LOG.info("Remove '{}' replacer rule.", X_SECHUB_DAST_HEADER_NAME); + clientApiFacade.removeReplacerRule(X_SECHUB_DAST_HEADER_NAME); + // disable client certificate here, the imported client certificate will be // removed on ZAP shutdown automatically anyway LOG.info("Disable client certificate if one was used for the scan."); @@ -634,7 +637,9 @@ void waitForSpiderResults(String scanId) throws ClientApiException { /* stop spider - otherwise running in background */ clientApiFacade.stopSpiderScan(scanId); - scanContext.getZapProductMessageHelper().writeUserMessagesWithDetectedURLs(clientApiFacade.getFullSpiderResults(scanId)); + long numberOfSpiderResults = clientApiFacade.logFullSpiderResults(scanId); + scanContext.getZapProductMessageHelper() + .writeSingleProductMessage(new SecHubMessage(SecHubMessageType.INFO, "Scanned %s URLs during the scan.".formatted(numberOfSpiderResults))); LOG.info("For scan {}: Spider completed.", scanContext.getContextName()); remainingScanTime = remainingScanTime - (systemUtil.getCurrentTimeInMilliseconds() - startTime); } diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java index 76d60bc27a..20243b3769 100644 --- a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/helper/ZapProductMessageHelperTest.java @@ -115,7 +115,8 @@ private void verifyMessageFileContent(File file, ZapWrapperExitCode exitCode) th errorMessage); break; case API_DEFINITION_CONFIG_INVALID: - assertEquals("Please use files instead of folders for the API definition with the filesystem->files section of the SecHub configuration.", + assertEquals( + "Please check your webscan api section inside the sechub configuration file. Only use supported api types and use filesystem->files instead of filesystem->folders for the API definition files.", messageContent, errorMessage); break; case TARGET_URL_INVALID: diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java index 7232b3380d..4463161471 100644 --- a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/scan/ZapScannerTest.java @@ -85,7 +85,6 @@ void beforeEach() { doNothing().when(helper).writeProductError(any()); doNothing().when(helper).writeProductMessages(any()); doNothing().when(helper).writeSingleProductMessage(any()); - doNothing().when(helper).writeUserMessagesWithDetectedURLs(any()); doNothing().when(systemUtil).waitForMilliseconds(ZapScanner.CHECK_SCAN_STATUS_TIME_IN_MILLISECONDS); when(systemUtil.getCurrentTimeInMilliseconds()).thenCallRealMethod(); @@ -338,12 +337,19 @@ void set_includes_and_excludes_api_facade_is_called_once_for_each_include_and_on when(clientApiFacade.accessUrlViaZap(any(), any())).thenReturn(response); when(clientApiFacade.addExcludeUrlPatternToContext(any(), any())).thenReturn(response); + /* @formatter:off */ + int includesWithoutWildcards = (int) includes.stream() + .filter(s -> !s.contains(".*")) + .count(); + /* @formatter:on */ + /* execute */ scannerToTest.addIncludedAndExcludedUrlsToContext(); /* test */ verify(clientApiFacade, times(includes.size())).addIncludeUrlPatternToContext(any(), any()); - verify(clientApiFacade, times(2)).accessUrlViaZap(any(), any()); + // make sure this method is only called for includes without wildcards + verify(clientApiFacade, times(includesWithoutWildcards)).accessUrlViaZap(any(), any()); verify(clientApiFacade, times(excludes.size())).addExcludeUrlPatternToContext(any(), any()); } @@ -770,11 +776,10 @@ void wait_for_spider_scan_ended_results_in_expected_calls() throws ClientApiExce when(scanContext.isActiveScanEnabled()).thenReturn(true); ZapProductMessageHelper messageHelper = mock(ZapProductMessageHelper.class); when(scanContext.getZapProductMessageHelper()).thenReturn(messageHelper); - doNothing().when(messageHelper).writeUserMessagesWithDetectedURLs(any()); when(clientApiFacade.stopSpiderScan(scanId)).thenReturn(null); when(clientApiFacade.getSpiderStatusForScan(scanId)).thenReturn(42); - when(clientApiFacade.getFullSpiderResults(scanId)).thenReturn(null); + when(clientApiFacade.logFullSpiderResults(scanId)).thenReturn(0L); /* execute */ scannerToTest.waitForSpiderResults(scanId); @@ -783,10 +788,9 @@ void wait_for_spider_scan_ended_results_in_expected_calls() throws ClientApiExce verify(scanContext, times(1)).getMaxScanDurationInMilliSeconds(); verify(scanContext, times(1)).isActiveScanEnabled(); verify(scanContext, times(1)).getZapProductMessageHelper(); - verify(messageHelper, times(1)).writeUserMessagesWithDetectedURLs(any()); verify(clientApiFacade, atLeast(1)).getSpiderStatusForScan(scanId); verify(clientApiFacade, times(1)).stopSpiderScan(scanId); - verify(clientApiFacade, times(1)).getFullSpiderResults(scanId); + verify(clientApiFacade, times(1)).logFullSpiderResults(scanId); } @Test @@ -909,11 +913,10 @@ void run_spider_scan_ended_results_in_expected_calls() throws ClientApiException when(scanContext.isActiveScanEnabled()).thenReturn(true); ZapProductMessageHelper messageHelper = mock(ZapProductMessageHelper.class); when(scanContext.getZapProductMessageHelper()).thenReturn(messageHelper); - doNothing().when(messageHelper).writeUserMessagesWithDetectedURLs(any()); when(clientApiFacade.stopSpiderScan(scanId)).thenReturn(null); when(clientApiFacade.getSpiderStatusForScan(scanId)).thenReturn(42); - when(clientApiFacade.getFullSpiderResults(scanId)).thenReturn(null); + when(clientApiFacade.logFullSpiderResults(scanId)).thenReturn(0L); when(clientApiFacade.startSpiderScan(any(), any(), any(), any(), any())).thenReturn(scanId); /* execute */ @@ -923,10 +926,9 @@ void run_spider_scan_ended_results_in_expected_calls() throws ClientApiException verify(scanContext, times(1)).getMaxScanDurationInMilliSeconds(); verify(scanContext, times(1)).isActiveScanEnabled(); verify(scanContext, times(1)).getZapProductMessageHelper(); - verify(messageHelper, times(1)).writeUserMessagesWithDetectedURLs(any()); verify(clientApiFacade, atLeast(1)).getSpiderStatusForScan(scanId); verify(clientApiFacade, times(1)).stopSpiderScan(scanId); - verify(clientApiFacade, times(1)).getFullSpiderResults(scanId); + verify(clientApiFacade, times(1)).logFullSpiderResults(scanId); verify(clientApiFacade, times(1)).startSpiderScan(any(), any(), any(), any(), any()); } From f495209608f000d6e152e0257053ac5f5c7c1799 Mon Sep 17 00:00:00 2001 From: Jan Winz Date: Thu, 17 Oct 2024 09:31:07 +0200 Subject: [PATCH 09/43] Implement TOTP generation #3526 - add TOTPGenerator with unit tests - add TOTPGeneratorTest with test data from RFC-6238 - add dependencies to handle different encodings --- gradle/libraries.gradle | 4 + sechub-wrapper-owasp-zap/build.gradle | 1 + .../sechub/zapwrapper/util/TOTPGenerator.java | 96 +++++++++++++++++ .../zapwrapper/util/TOTPGeneratorTest.java | 101 ++++++++++++++++++ 4 files changed, 202 insertions(+) create mode 100644 sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGenerator.java create mode 100644 sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGeneratorTest.java diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 512a61349f..1957a7b3e8 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -55,6 +55,8 @@ ext { apache_commons_fileupload2_jakarta: "2.0.0-M1", apache_commons_compress: "1.25.0", apache_commons_lang3: "3.14.0", + + commons_codec: "1.17.1", /* testing */ junit4: "4.13.2", @@ -157,6 +159,8 @@ ext { apache_commons_compress: "org.apache.commons:commons-compress:${libraryVersion.apache_commons_compress}", apache_commons_lang3: "org.apache.commons:commons-lang3:${libraryVersion.apache_commons_lang3}", + + commons_codec: "commons-codec:commons-codec:${libraryVersion.commons_codec}", // JDK 10 build problems handling // https://stackoverflow.com/questions/43574426/how-to-resolve-java-langnoclassdeffounderror-javax-xml-bind-jaxbexception-in-j diff --git a/sechub-wrapper-owasp-zap/build.gradle b/sechub-wrapper-owasp-zap/build.gradle index 1eeddd6ec5..c3f6a80f6f 100644 --- a/sechub-wrapper-owasp-zap/build.gradle +++ b/sechub-wrapper-owasp-zap/build.gradle @@ -13,6 +13,7 @@ dependencies { implementation library.owaspzap_client_api implementation library.jcommander + implementation library.commons_codec implementation spring_boot_dependency.slf4j_api implementation spring_boot_dependency.logback_classic diff --git a/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGenerator.java b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGenerator.java new file mode 100644 index 0000000000..13c6126aff --- /dev/null +++ b/sechub-wrapper-owasp-zap/src/main/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGenerator.java @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: MIT +package com.mercedesbenz.sechub.zapwrapper.util; + +import java.nio.ByteBuffer; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import com.mercedesbenz.sechub.commons.model.login.TOTPHashAlgorithm; + +/** + * https://datatracker.ietf.org/doc/html/rfc6238 + */ +public class TOTPGenerator { + + private static final int BASE = 10; + + private static final int ONE_SECOND_IN_MILLISECONDS = 1000; + + private static final int DEFAULT_TOTP_LENGTH = 6; + private static final int DEFAULT_TOKEN_VALIDITY_TIME_IN_SECONDS = 30; + + private String hashAlgorithmName; + private int totpLength; + private int tokenValidityTimeInSeconds; + private long digitsTruncate; + + public TOTPGenerator() { + this(DEFAULT_TOTP_LENGTH, TOTPHashAlgorithm.HMAC_SHA1, DEFAULT_TOKEN_VALIDITY_TIME_IN_SECONDS); + } + + public TOTPGenerator(int totpLength, TOTPHashAlgorithm hashAlgorithm, int tokenValidityTimeInSeconds) { + this.totpLength = totpLength; + this.hashAlgorithmName = hashAlgorithm.getName(); + this.tokenValidityTimeInSeconds = tokenValidityTimeInSeconds; + + this.digitsTruncate = (long) Math.pow(BASE, this.totpLength); + } + + /** + * This method generates a TOTP from the seed (must be raw bytes no encoding) + * and the current time stamp in milliseconds. Make sure encoded seeds like hex, + * base32 or base64 are decoded before passing them to this method. + * + * @param seed + * @param currentTimeMillis + * @return + */ + public String generateTOTP(byte[] seed, long currentTimeMillis) { + if (seed == null) { + throw new IllegalArgumentException("The specified seed must not be null!"); + } + + byte[] hash = computeHash(seed, currentTimeMillis); + + int offset = hash[hash.length - 1] & 0xf; + /* @formatter:off */ + long binary = ((hash[offset] & 0x7f) << 24) + | ((hash[offset + 1] & 0xff) << 16) + | ((hash[offset + 2] & 0xff) << 8) + | (hash[offset + 3] & 0xff); + /* @formatter:on */ + + long otp = binary % digitsTruncate; + // add prepended zeros if the otp does not match the wanted length + return String.format("%0" + totpLength + "d", otp); + } + + private byte[] computeHash(byte[] seed, long currentTimeMillis) { + try { + Mac mac = Mac.getInstance(hashAlgorithmName); + mac.init(new SecretKeySpec(seed, hashAlgorithmName)); + byte[] timeBytes = computeTimeBytes(currentTimeMillis, tokenValidityTimeInSeconds); + byte[] hash = mac.doFinal(timeBytes); + return hash; + } catch (NoSuchAlgorithmException e) { + throw new IllegalArgumentException("The specified hash algorithm is unknown!", e); + } catch (InvalidKeyException e) { + throw new IllegalArgumentException("The specified seed was invalid!", e); + } + } + + private byte[] computeTimeBytes(long currentTimeMillis, int tokenValidityTimeInSeconds) { + Long timeStep = (currentTimeMillis / ONE_SECOND_IN_MILLISECONDS) / tokenValidityTimeInSeconds; + + /* @formatter:off */ + byte[] timeBytes = ByteBuffer.allocate(Long.BYTES) + .putLong(timeStep) + .array(); + /* @formatter:on */ + return timeBytes; + } + +} diff --git a/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGeneratorTest.java b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGeneratorTest.java new file mode 100644 index 0000000000..77c07b31f4 --- /dev/null +++ b/sechub-wrapper-owasp-zap/src/test/java/com/mercedesbenz/sechub/zapwrapper/util/TOTPGeneratorTest.java @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: MIT +package com.mercedesbenz.sechub.zapwrapper.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.stream.Stream; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Base32; +import org.apache.commons.codec.binary.Hex; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; +import org.junit.jupiter.params.provider.ArgumentsSource; + +import com.mercedesbenz.sechub.commons.model.login.TOTPHashAlgorithm; + +class TOTPGeneratorTest { + + @Test + void secret_key_being_null_throws_exception() { + /* prepare */ + TOTPGenerator totpGenerator = new TOTPGenerator(); + + /* execute + test */ + assertThrows(IllegalArgumentException.class, () -> totpGenerator.generateTOTP(null, 1000L)); + } + + @Test + void generate_the_excpected_otp_with_default_config() throws DecoderException { + /* prepare */ + String seed = "NFQDO2DXCNAHULZU"; + byte[] seedBytes = new Base32().decode(seed); + long timeMillis = 1724650799055L; + String expectedToken = "950308"; + + TOTPGenerator totpGenerator = new TOTPGenerator(); + + /* execute */ + String generatedToken = totpGenerator.generateTOTP(seedBytes, timeMillis); + + /* test */ + assertEquals(expectedToken, generatedToken); + } + + @ParameterizedTest + @ArgumentsSource(RFC6238TOTPArgumentsProvider.class) + void rfc_6238_test_data_generate_the_excpected_otp(String seed, long timeInMillis, TOTPHashAlgorithm algorithm, int totpLength, + int totpValidityTimeInSeconds, String expectedToken) throws DecoderException { + /* prepare */ + byte[] seedBytes = Hex.decodeHex(seed); + + TOTPGenerator totpGenerator = new TOTPGenerator(totpLength, algorithm, totpValidityTimeInSeconds); + + /* execute */ + String generatedToken = totpGenerator.generateTOTP(seedBytes, timeInMillis); + + /* test */ + assertEquals(expectedToken, generatedToken); + } + + /** + * Test data from: https://datatracker.ietf.org/doc/html/rfc6238#appendix-B + */ + private static class RFC6238TOTPArgumentsProvider implements ArgumentsProvider { + private static final String SHA1_SEED = "3132333435363738393031323334353637383930"; + private static final String SHA256_SEED = "3132333435363738393031323334353637383930313233343536373839303132"; + private static final String SHA512_SEED = "31323334353637383930313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334"; + + @Override + public Stream provideArguments(ExtensionContext extensionContext) { + /* @formatter:off */ + return Stream.of( + Arguments.of(SHA1_SEED, 59000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "94287082"), + Arguments.of(SHA1_SEED, 1111111109000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "07081804"), + Arguments.of(SHA1_SEED, 1111111111000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "14050471"), + Arguments.of(SHA1_SEED, 1234567890000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "89005924"), + Arguments.of(SHA1_SEED, 2000000000000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "69279037"), + Arguments.of(SHA1_SEED, 20000000000000L, TOTPHashAlgorithm.HMAC_SHA1, 8, 30, "65353130"), + + Arguments.of(SHA256_SEED, 59000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "46119246"), + Arguments.of(SHA256_SEED, 1111111109000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "68084774"), + Arguments.of(SHA256_SEED, 1111111111000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "67062674"), + Arguments.of(SHA256_SEED, 1234567890000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "91819424"), + Arguments.of(SHA256_SEED, 2000000000000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "90698825"), + Arguments.of(SHA256_SEED, 20000000000000L, TOTPHashAlgorithm.HMAC_SHA256, 8, 30, "77737706"), + + Arguments.of(SHA512_SEED, 59000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "90693936"), + Arguments.of(SHA512_SEED, 1111111109000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "25091201"), + Arguments.of(SHA512_SEED, 1111111111000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "99943326"), + Arguments.of(SHA512_SEED, 1234567890000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "93441116"), + Arguments.of(SHA512_SEED, 2000000000000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "38618901"), + Arguments.of(SHA512_SEED, 20000000000000L, TOTPHashAlgorithm.HMAC_SHA512, 8, 30, "47863826") + ); + /* @formatter:on */ + } + } +} From 1fdf712b5d1fa4ab65fa3da6e689e7ef57d7f9d3 Mon Sep 17 00:00:00 2001 From: Laura Date: Fri, 18 Oct 2024 09:17:26 +0200 Subject: [PATCH 10/43] Renamed module sechub-webui to sechub-web-server #3489 (#3502) - renamed spring module - renamed docker solution --- ...lease-webui.yml => release-web-server.yml} | 116 +++++++++--------- buildSrc/src/main/groovy/VersionData.groovy | 8 +- gradle/build-versioning.gradle | 22 ++-- gradle/projects.gradle | 10 +- sechub-api-java/README.adoc | 2 +- sechub-developertools/build.gradle | 2 +- sechub-developertools/scripts/sdc.sh | 2 +- .../01-start-single-docker-compose.sh | 4 +- ...rt-single-sechub-network-docker-compose.sh | 4 +- .../10-create-image.sh | 16 +-- .../20-push-image.sh | 0 sechub-web-server-solution/README.adoc | 5 + .../docker-compose_web_server.yaml | 12 +- ...r-compose_web_server_external-network.yaml | 12 +- .../docker/.gitignore | 0 .../docker/Web-Server-Debian.dockerfile | 66 +++++----- .../docker/clone.sh | 0 .../docker/run.sh | 36 +++--- .../env | 4 +- .../env-web-server | 9 +- .../helm/.gitignore | 0 .../helm/sechub-web-server}/.helmignore | 0 .../helm/sechub-web-server}/Chart.yaml | 4 +- .../helm/sechub-web-server}/LICENSE | 0 .../helm/sechub-web-server/README.md | 4 + .../templates/deployment.yaml | 68 +++++----- .../templates/networkpolicy.yaml | 0 .../sechub-web-server}/templates/service.yaml | 0 .../helm/sechub-web-server}/values.yaml | 16 +-- .../.gitignore | 0 .../README.adoc | 10 +- {sechub-webui => sechub-web-server}/README.md | 10 +- .../build.gradle | 6 +- .../dev-base.sh | 0 .../dev-create_localhost_certificate.sh | 0 .../dev-ensure_localhost_certificate.sh | 0 .../webserver}/ApplicationProfiles.java | 2 +- .../sechub/webserver}/RequestConstants.java | 2 +- .../webserver/SecHubWebServerApplication.java | 6 +- .../credentials/NewApiTokenController.java | 8 +- .../credentials/NewApiTokenService.java | 4 +- .../RequestParamLocaleContextResolver.java | 2 +- .../webserver}/page/HomeController.java | 4 +- .../page/LoginClassicController.java | 6 +- .../page/LoginOAuth2Controller.java | 8 +- .../webserver}/sechubaccess/ClientCaller.java | 2 +- .../sechubaccess/ErrorCallback.java | 2 +- .../sechubaccess/SecHubAccessService.java | 12 +- .../sechubaccess/SecHubClientExecutor.java | 2 +- ...entIdAndSecretOAuth2AccessTokenClient.java | 2 +- .../webserver}/security/JwtResponse.java | 2 +- .../LoginAuthenticationSuccessHandler.java | 4 +- .../webserver}/security/OAuth2Properties.java | 2 +- .../security/OAuth2PropertiesConfig.java | 4 +- .../security/SecurityConfiguration.java | 6 +- .../security/UserInputSanitizer.java | 2 +- .../user/UserDetailInformationService.java | 2 +- .../webserver}/user/UserInfoService.java | 2 +- .../application-classic-auth-enabled.yml | 2 +- .../application-integrationtest-data.yml | 2 +- .../src/main/resources/application-local.yml | 0 .../application-ssl-cert-provided.yml | 2 +- .../application-ssl-cert-required.yml | 8 +- .../src/main/resources/application.yml | 25 ++++ .../certificates-untracked/.gitignore | 0 .../certificates-untracked/README.md | 0 .../main/resources/i18n/messages.properties | 0 .../resources/i18n/messages_de.properties | 0 .../src/main/resources/static/css/main.css | 0 .../src/main/resources/static/sechub-logo.svg | 0 .../resources/templates/fragments/banner.html | 0 .../resources/templates/fragments/footer.html | 0 .../resources/templates/fragments/header.html | 0 .../resources/templates/fragments/navbar.html | 0 .../src/main/resources/templates/home.html | 0 .../resources/templates/login-classic.html | 0 .../resources/templates/login-oauth2.html | 0 .../resources/templates/new-apitoken.html | 0 .../webserver}/YamlPropertyLoaderFactory.java | 2 +- .../webserver}/page/HomeControllerTest.java | 6 +- .../page/LoginClassicControllerTest.java | 6 +- .../page/LoginOAuth2ControllerTest.java | 6 +- ...dAndSecretOAuth2AccessTokenClientTest.java | 2 +- .../webserver}/security/JwtResponseTest.java | 2 +- .../security/OAuth2PropertiesTest.java | 4 +- .../security/SecurityTestConfiguration.java | 2 +- .../src/test/resources/application-test.yml | 0 .../src/test/resources/jwt-response.json | 0 sechub-webui-solution/README.adoc | 5 - sechub-webui-solution/docker/copy/README.adoc | 4 - .../helm/sechub-webui/README.md | 4 - .../src/main/resources/application.yml | 26 ---- settings.gradle | 6 +- 93 files changed, 322 insertions(+), 326 deletions(-) rename .github/workflows/{release-webui.yml => release-web-server.yml} (63%) rename {sechub-webui-solution => sechub-web-server-solution}/01-start-single-docker-compose.sh (80%) rename {sechub-webui-solution => sechub-web-server-solution}/05-start-single-sechub-network-docker-compose.sh (72%) rename {sechub-webui-solution => sechub-web-server-solution}/10-create-image.sh (74%) rename {sechub-webui-solution => sechub-web-server-solution}/20-push-image.sh (100%) create mode 100644 sechub-web-server-solution/README.adoc rename sechub-webui-solution/docker-compose_webui.yaml => sechub-web-server-solution/docker-compose_web_server.yaml (65%) rename sechub-webui-solution/docker-compose_webui_external-network.yaml => sechub-web-server-solution/docker-compose_web_server_external-network.yaml (66%) rename {sechub-webui-solution => sechub-web-server-solution}/docker/.gitignore (100%) rename sechub-webui-solution/docker/WebUI-Debian.dockerfile => sechub-web-server-solution/docker/Web-Server-Debian.dockerfile (65%) rename {sechub-webui-solution => sechub-web-server-solution}/docker/clone.sh (100%) rename {sechub-webui-solution => sechub-web-server-solution}/docker/run.sh (65%) rename {sechub-webui-solution => sechub-web-server-solution}/env (92%) rename sechub-webui-solution/env-webui => sechub-web-server-solution/env-web-server (63%) rename {sechub-webui-solution => sechub-web-server-solution}/helm/.gitignore (100%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/.helmignore (100%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/Chart.yaml (81%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/LICENSE (100%) create mode 100644 sechub-web-server-solution/helm/sechub-web-server/README.md rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/templates/deployment.yaml (74%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/templates/networkpolicy.yaml (100%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/templates/service.yaml (100%) rename {sechub-webui-solution/helm/sechub-webui => sechub-web-server-solution/helm/sechub-web-server}/values.yaml (90%) rename {sechub-webui => sechub-web-server}/.gitignore (100%) rename {sechub-webui => sechub-web-server}/README.adoc (78%) rename {sechub-webui => sechub-web-server}/README.md (88%) rename {sechub-webui => sechub-web-server}/build.gradle (94%) rename {sechub-webui => sechub-web-server}/dev-base.sh (100%) rename {sechub-webui => sechub-web-server}/dev-create_localhost_certificate.sh (100%) rename {sechub-webui => sechub-web-server}/dev-ensure_localhost_certificate.sh (100%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/ApplicationProfiles.java (94%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/RequestConstants.java (93%) rename sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/SecHubWebUiApplication.java => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/SecHubWebServerApplication.java (59%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/credentials/NewApiTokenController.java (81%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/credentials/NewApiTokenService.java (90%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/i18n/RequestParamLocaleContextResolver.java (96%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/page/HomeController.java (86%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/page/LoginClassicController.java (70%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/page/LoginOAuth2Controller.java (75%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/sechubaccess/ClientCaller.java (76%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/sechubaccess/ErrorCallback.java (68%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/sechubaccess/SecHubAccessService.java (90%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/sechubaccess/SecHubClientExecutor.java (98%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java (99%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/JwtResponse.java (98%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/LoginAuthenticationSuccessHandler.java (91%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/OAuth2Properties.java (98%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/OAuth2PropertiesConfig.java (87%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/SecurityConfiguration.java (97%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/security/UserInputSanitizer.java (84%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/user/UserDetailInformationService.java (93%) rename {sechub-webui/src/main/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver}/user/UserInfoService.java (95%) rename {sechub-webui => sechub-web-server}/src/main/resources/application-classic-auth-enabled.yml (96%) rename {sechub-webui => sechub-web-server}/src/main/resources/application-integrationtest-data.yml (94%) rename {sechub-webui => sechub-web-server}/src/main/resources/application-local.yml (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/application-ssl-cert-provided.yml (97%) rename {sechub-webui => sechub-web-server}/src/main/resources/application-ssl-cert-required.yml (56%) create mode 100644 sechub-web-server/src/main/resources/application.yml rename {sechub-webui => sechub-web-server}/src/main/resources/certificates-untracked/.gitignore (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/certificates-untracked/README.md (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/i18n/messages.properties (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/i18n/messages_de.properties (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/static/css/main.css (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/static/sechub-logo.svg (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/fragments/banner.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/fragments/footer.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/fragments/header.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/fragments/navbar.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/home.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/login-classic.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/login-oauth2.html (100%) rename {sechub-webui => sechub-web-server}/src/main/resources/templates/new-apitoken.html (100%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/YamlPropertyLoaderFactory.java (96%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/page/HomeControllerTest.java (89%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/page/LoginClassicControllerTest.java (89%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/page/LoginOAuth2ControllerTest.java (89%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java (99%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/security/JwtResponseTest.java (98%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/security/OAuth2PropertiesTest.java (97%) rename {sechub-webui/src/test/java/com/mercedesbenz/sechub/webui => sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver}/security/SecurityTestConfiguration.java (84%) rename {sechub-webui => sechub-web-server}/src/test/resources/application-test.yml (100%) rename {sechub-webui => sechub-web-server}/src/test/resources/jwt-response.json (100%) delete mode 100644 sechub-webui-solution/README.adoc delete mode 100644 sechub-webui-solution/docker/copy/README.adoc delete mode 100644 sechub-webui-solution/helm/sechub-webui/README.md delete mode 100644 sechub-webui/src/main/resources/application.yml diff --git a/.github/workflows/release-webui.yml b/.github/workflows/release-web-server.yml similarity index 63% rename from .github/workflows/release-webui.yml rename to .github/workflows/release-web-server.yml index 164e04ffb0..d08bb1a5de 100644 --- a/.github/workflows/release-webui.yml +++ b/.github/workflows/release-web-server.yml @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT -name: Release WebUI +name: Release Web Server on: workflow_dispatch: @@ -7,11 +7,11 @@ on: actor-email: description: Insert your email address here. It will be used in the generated pull requests required: true - webui-version: - description: WebUI Version (e.g. 0.1.0) + web-server-version: + description: Web Server Version (e.g. 0.1.0) required: true - webui-milestone-number: - description: WebUI Milestone number (e.g. 70) + web-server-milestone-number: + description: Web Server Milestone number (e.g. 70) required: true permissions: @@ -28,20 +28,20 @@ env: jobs: release-version: - name: Create WebUI release + name: Create Web Server release runs-on: ubuntu-latest steps: - name: "Show Inputs" run: | echo "actor-email: '${{ inputs.actor-email }}'" - echo "WebUI '${{ inputs.webui-version }}' - Milestone '${{ inputs.webui-milestone-number }}'" + echo "Web Server '${{ inputs.web-server-version }}' - Milestone '${{ inputs.web-server-milestone-number }}'" # Check inputs: - - name: "Verify Input for WebUI release" - if: (inputs.webui-version == '') || (inputs.webui-milestone-number == '') + - name: "Verify Input for Web Server release" + if: (inputs.web-server-version == '') || (inputs.web-server-milestone-number == '') run: | - echo "For WebUI release, webui-version and webui-milestone-number must be provided!" + echo "For Web Server release, web-server-version and web-server-milestone-number must be provided!" exit 1 - name: Checkout master @@ -51,8 +51,8 @@ jobs: # Create temporary local tag, so we build for this tag... # The final tag on git server side will be done automatically by the release when the draft is saved as "real" release - - name: "Temporary tag server version: v${{ inputs.webui-version }}-webui" - run: git tag v${{ inputs.webui-version }}-webui + - name: "Temporary tag server version: v${{ inputs.web-server-version }}-web-server" + run: git tag v${{ inputs.web-server-version }}-web-server # ---------------------- # Setup + Caching @@ -96,11 +96,11 @@ jobs: branch: release-spdx-headers branch-suffix: short-commit-hash delete-branch: true - title: '0 - Before webui release: Add missing SPDX license headers [auto-generated]' + title: '0 - Before web-server release: Add missing SPDX license headers [auto-generated]' body: | - Auto-generated by Github Actions webui release job. + Auto-generated by Github Actions web-server release job. - -> Please review and merge **before** publishing the webui release. + -> Please review and merge **before** publishing the web-server release. - name: Print PR infos if: steps.apply-headers.outputs.commits != '' @@ -109,10 +109,10 @@ jobs: echo "Pull Request URL - ${{ steps.pr_spdx_headers.outputs.pull-request-url }}" # ---------------------- - # Build SecHub WebUI + # Build SecHub Web Server # ---------------------- - - name: Build WebUI jar files - run: ./gradlew ensureLocalhostCertificate :sechub-api-java:build :sechub-webui:build -Dsechub.build.stage=api-necessary --console=plain + - name: Build Web Server jar files + run: ./gradlew ensureLocalhostCertificate :sechub-api-java:build :sechub-web-server:build -Dsechub.build.stage=api-necessary --console=plain # To identifiy parts not in git history - name: Collect GIT status @@ -133,12 +133,12 @@ jobs: path: build/reports/git-status.txt retention-days: 14 - - name: Archive WebUI artifacts + - name: Archive Web Server artifacts if: always() uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 with: - name: sechub-webui - path: sechub-webui/build/libs + name: sechub-web-server + path: sechub-web-server/build/libs retention-days: 14 # ----------------------------------------- @@ -149,83 +149,83 @@ jobs: git status ./gradlew assertReleaseable - - name: Create WebUI release - id: create_webui_release + - name: Create Web Server release + id: create_web-server_release uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: v${{ inputs.webui-version }}-webui + tag_name: v${{ inputs.web-server-version }}-web-server commitish: master - release_name: WebUI Version ${{ inputs.webui-version }} + release_name: web-server Version ${{ inputs.web-server-version }} body: | Changes in this Release - - Some minor changes on WebUI implementation + - Some minor changes on Web Server implementation - For more details please look at [Milestone ${{inputs.webui-milestone-number}}]( https://github.com/mercedes-benz/sechub/milestone/${{inputs.webui-milestone-number}}?closed=1) + For more details please look at [Milestone ${{inputs.web-server-milestone-number}}]( https://github.com/mercedes-benz/sechub/milestone/${{inputs.web-server-milestone-number}}?closed=1) draft: true prerelease: false - - name: Create sha256 checksum file for WebUI jar + - name: Create sha256 checksum file for Web Server jar run: | - cd sechub-webui/build/libs - sha256sum sechub-webui-${{ inputs.webui-version }}.jar > sechub-webui-${{ inputs.webui-version }}.jar.sha256sum + cd sechub-web-server/build/libs + sha256sum sechub-web-server-${{ inputs.web-server-version }}.jar > sechub-web-server-${{ inputs.web-server-version }}.jar.sha256sum - - name: Upload WebUI release asset sechub-webui-${{ inputs.webui-version }}.jar + - name: Upload Web Server release asset sechub-web-server-${{ inputs.web-server-version }}.jar uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ steps.create_webui_release.outputs.upload_url }} - asset_path: sechub-webui/build/libs/sechub-webui-${{ inputs.webui-version }}.jar - asset_name: sechub-webui-${{ inputs.webui-version }}.jar + upload_url: ${{ steps.create_web-server_release.outputs.upload_url }} + asset_path: sechub-web-server/build/libs/sechub-web-server-${{ inputs.web-server-version }}.jar + asset_name: sechub-web-server-${{ inputs.web-server-version }}.jar asset_content_type: application/zip - - name: Upload WebUI release asset sechub-webui-${{ inputs.webui-version }}.jar.sha256sum + - name: Upload Web Server release asset sechub-web-server-${{ inputs.web-server-version }}.jar.sha256sum uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - upload_url: ${{ steps.create_webui_release.outputs.upload_url }} - asset_path: sechub-webui/build/libs/sechub-webui-${{ inputs.webui-version }}.jar.sha256sum - asset_name: sechub-webui-${{ inputs.webui-version }}.jar.sha256sum + upload_url: ${{ steps.create_web-server_release.outputs.upload_url }} + asset_path: sechub-web-server/build/libs/sechub-web-server-${{ inputs.web-server-version }}.jar.sha256sum + asset_name: sechub-web-server-${{ inputs.web-server-version }}.jar.sha256sum asset_content_type: text/plain # ----------------------------------------- # Create release issue # ----------------------------------------- - - name: Create SecHub WebUI ${{ inputs.webui-version }} release issue + - name: Create SecHub Web Server ${{ inputs.web-server-version }} release issue uses: dacbd/create-issue-action@main with: token: ${{ github.token }} - title: Release SecHub WebUI ${{ inputs.webui-version }} + title: Release SecHub Web Server ${{ inputs.web-server-version }} body: | - See [Milestone ${{inputs.webui-milestone-number}}]( https://github.com/mercedes-benz/sechub/milestone/${{inputs.webui-milestone-number}}?closed=1) for details. + See [Milestone ${{inputs.web-server-milestone-number}}]( https://github.com/mercedes-benz/sechub/milestone/${{inputs.web-server-milestone-number}}?closed=1) for details. Please close this issue after the release. - milestone: ${{ inputs.webui-milestone-number }} + milestone: ${{ inputs.web-server-milestone-number }} - # Build SecHub WebUI container image + push to ghcr - - name: Build sechub-webui ${{ inputs.webui-version }} container image + push to ghcr + # Build SecHub Web Server container image + push to ghcr + - name: Build sechub-web-server ${{ inputs.web-server-version }} container image + push to ghcr run: | - WEBUI_VERSION="${{ inputs.webui-version }}" - DOCKER_REGISTRY="$ACTIONS_SECHUB_REGISTRY/sechub-webui" - VERSION_TAG="${WEBUI_VERSION}" - cp sechub-webui/build/libs/sechub-webui-${WEBUI_VERSION}.jar sechub-webui-solution/docker/copy/ - cd sechub-webui-solution + WEB_SERVER_VERSION="${{ inputs.web-server-version }}" + DOCKER_REGISTRY="$ACTIONS_SECHUB_REGISTRY/sechub-web-server" + VERSION_TAG="${WEB_SERVER_VERSION}" + cp sechub-web-server/build/libs/sechub-web-server-${WEB_SERVER_VERSION}.jar sechub-web-server-solution/docker/copy/ + cd sechub-web-server-solution echo "# Building image $DOCKER_REGISTRY:$VERSION_TAG" echo " from $ACTIONS_BASE_IMAGE_DEBIAN" - ./10-create-image.sh "$DOCKER_REGISTRY" "$VERSION_TAG" "$WEBUI_VERSION" "$ACTIONS_BASE_IMAGE_DEBIAN" copy + ./10-create-image.sh "$DOCKER_REGISTRY" "$VERSION_TAG" "WEB_SERVER_VERSION" "$ACTIONS_BASE_IMAGE_DEBIAN" copy echo "# Pushing image $DOCKER_REGISTRY:$VERSION_TAG (latest)" ./20-push-image.sh "$DOCKER_REGISTRY" "$VERSION_TAG" yes - - name: Build sechub-webui Helm chart + push to ghcr + - name: Build sechub-web-server Helm chart + push to ghcr shell: bash run: | - cd sechub-webui-solution/helm - echo "# Building Helm chart for SecHub WebUI" - helm package sechub-webui - helm push sechub-webui-*.tgz $ACTIONS_HELM_REGISTRY + cd sechub-web-server-solution/helm + echo "# Building Helm chart for SecHub Web Server" + helm package sechub-web-server + helm push sechub-web-server-*.tgz $ACTIONS_HELM_REGISTRY # ----------------------------------------- # Create a pull request for merging back `master` into `develop` @@ -239,10 +239,10 @@ jobs: source_branch: "master" destination_branch: "develop" pr_allow_empty: true # should allow an empty PR, but seems not to work - pr_title: '2 - After webui release: Merge master back into develop [auto-generated]' + pr_title: '2 - After web-server release: Merge master back into develop [auto-generated]' pr_body: | - After SecHub WebUI release - - WebUI '${{ inputs.webui-version }}' + After SecHub Web Server release + - Web Server '${{ inputs.web-server-version }}' Merge master branch back into develop diff --git a/buildSrc/src/main/groovy/VersionData.groovy b/buildSrc/src/main/groovy/VersionData.groovy index 84dcb85027..70c468b040 100644 --- a/buildSrc/src/main/groovy/VersionData.groovy +++ b/buildSrc/src/main/groovy/VersionData.groovy @@ -6,7 +6,7 @@ class VersionData{ private static final String ID_PDS = "pds"; private static final String ID_PDS_TOOLS = "pds-tools" private static final String ID_SERVER = "server" - private static final String ID_WEBUI = "webui" + private static final String ID_WEB_SERVER = "web server" private static final String ID_WRAPPER_CHECKMARX = "checkmarx wrapper" private static final String ID_WRAPPER_OWASPZAP = "owasp-zap wrapper" private static final String ID_WRAPPER_PREPARE= "prepare wrapper" @@ -28,7 +28,7 @@ class VersionData{ initialize(ID_PDS, "PDS") initialize(ID_PDS_TOOLS,"PDS-Tools") initialize(ID_SERVER, "Server") - initialize(ID_WEBUI, "WebUI") + initialize(ID_WEB_SERVER, "Web Server") initialize(ID_WRAPPER_CHECKMARX, "Checkmarx Wrapper") initialize(ID_WRAPPER_OWASPZAP, "OWASP-ZAP Wrapper") initialize(ID_WRAPPER_PREPARE, "Prepare Wrapper") @@ -117,8 +117,8 @@ class VersionData{ return map.get(ID_SERVER).getShortVersionForDocs() } - public String getWebuiVersion(){ - return map.get(ID_WEBUI).getShortVersion() + public String getWebServerVersion(){ + return map.get(ID_WEB_SERVER).getShortVersion() } public String getXrayWrapperVersion(){ diff --git a/gradle/build-versioning.gradle b/gradle/build-versioning.gradle index 4a027c178e..c065072e9a 100644 --- a/gradle/build-versioning.gradle +++ b/gradle/build-versioning.gradle @@ -49,7 +49,7 @@ def buildVersionFiles(){ def pdsVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-pds") } def pdsToolsVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-pds-tools") } def serverVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-server") } - def webuiVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-webui") } + def webServerVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-web-server") } def checkmarxWrapperVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-checkmarx-wrapper") } def owaspzapWrapperVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-owaspzap-wrapper") } def prepareWrapperVersionCommitTag = versionCommitTags.find{ it.name.endsWith("-prepare-wrapper") } @@ -261,26 +261,26 @@ def buildVersionFiles(){ // ------------------------ - // - WebUI + // - Web Server // ------------------------ - // Get latest tagged webui version - def latestWebUITagCmd = [ + // Get latest tagged web server version + def latestWebServerTagCmd = [ 'sh', '-c', - 'git tag -l --sort=-creatordate | grep -e \'^v.*-webui$\' | head -1' + 'git tag -l --sort=-creatordate | grep -e \'^v.*-web-server$\' | head -1' ] - def latestWebUITag = latestWebUITagCmd.execute().text.trim() - def latestWebUIVersion = latestWebUITag - 'v' - latestWebUIVersion = latestWebUIVersion - "-webui" + def latestWebServerTag = latestWebServerTagCmd.execute().text.trim() + def latestWebServerVersion = latestWebServerTag - 'v' + latestWebServerVersion = latestWebServerVersion - "-web-server" - def webuiVersionInfo = versionData.defineVersion("WebUI",buildVersionString(webuiVersionCommitTag, hasChanged, buildNumber),latestWebUIVersion) + def webServerVersionInfo = versionData.defineVersion("Web Server",buildVersionString(webServerVersionCommitTag, hasChanged, buildNumber),latestWebServerVersion) def stop = new Date() println(clientVersionInfo.describe()) println(serverVersionInfo.describe()) - println(webuiVersionInfo.describe()) + println(webServerVersionInfo.describe()) println(pdsVersionInfo.describe()) println(pdsToolsVersionInfo.describe()) println(librariesVersionInfo.describe()) @@ -337,7 +337,7 @@ def buildVersionString(commitTag, boolean hasChanged, buildNumber){ calcversion = calcversion - "-pds-tools" calcversion = calcversion - "-pds" calcversion = calcversion - "-server" - calcversion = calcversion - "-webui" + calcversion = calcversion - "-web-server" calcversion = calcversion - "-checkmarx-wrapper" calcversion = calcversion - "-owaspzap-wrapper" calcversion = calcversion - "-prepare-wrapper" diff --git a/gradle/projects.gradle b/gradle/projects.gradle index 353eca6063..e9b2688422 100644 --- a/gradle/projects.gradle +++ b/gradle/projects.gradle @@ -102,12 +102,12 @@ projectType = [ project(':sechub-pds'), project(':sechub-wrapper-checkmarx'), project(':sechub-wrapper-prepare'), - project(':sechub-webui'), + project(':sechub-web-server'), project(':sechub-wrapper-secretvalidation'), ], - springBootWebUIProjects:[ - project('sechub-webui') + springBootWebApplicationProjects:[ + project('sechub-web-server') ], /* documentation projects */ @@ -125,7 +125,7 @@ projectType = [ project(':sechub-solution'), project(':sechub-solutions-shared'), project(':sechub-wrapper-xray'), - project(':sechub-webui-solution'), + project(':sechub-web-server-solution'), ], asciiDoctorProjects: [ @@ -153,7 +153,7 @@ projectType.springBootProjects.addAll(projectType.springBootSecHubServerProjects projectType.springBootProjects.addAll(projectType.springBootPDSProjects) projectType.springBootProjects.addAll(projectType.springBootAdapterProjects) projectType.springBootProjects.addAll(projectType.springDocProjects) -projectType.springBootProjects.addAll(projectType.springBootWebUIProjects) +projectType.springBootProjects.addAll(projectType.springBootWebApplicationProjects) projectType.javaProjects.addAll(projectType.springBootProjects) diff --git a/sechub-api-java/README.adoc b/sechub-api-java/README.adoc index 2119e7b6d7..d388ff96c5 100644 --- a/sechub-api-java/README.adoc +++ b/sechub-api-java/README.adoc @@ -4,7 +4,7 @@ The goal of the API is to: - have an easy to use library which can be used in SecHub plugins (Eclipse, IntelliJ), - our WebUI and also by users which want to use a Java library to interact directly with the REST API instead of using the SecHub command line client (`sechub-cli`) + our Web Server and also by users which want to use a Java library to interact directly with the REST API instead of using the SecHub command line client (`sechub-cli`) command line client (`sechub-cli`) - have less effort when it comes to changes - detect OpenAPI file generation problems diff --git a/sechub-developertools/build.gradle b/sechub-developertools/build.gradle index 787b032dee..fbba4299a1 100644 --- a/sechub-developertools/build.gradle +++ b/sechub-developertools/build.gradle @@ -62,7 +62,7 @@ task buildDeveloperAdminUI(type: Jar, dependsOn: build) { task importEclipseProjectsNeedingOpenApiFile(type: Exec){ workingDir "$rootDir" - commandLine './gradlew', ':sechub-systemtest:cleanEclipse',':sechub-systemtest:eclipse', ':sechub-webui:cleanEclipse',':sechub-webui:eclipse', ':sechub-api-java:cleanEclipse',':sechub-api-java:eclipse', ':sechub-pds-tools:cleanEclipse',':sechub-pds-tools:eclipse',':sechub-examples:example-sechub-api-java:cleanEclipse',':sechub-examples:example-sechub-api-java:eclipse','-Dsechub.build.stage=all' + commandLine './gradlew', ':sechub-systemtest:cleanEclipse',':sechub-systemtest:eclipse', ':sechub-web-server:cleanEclipse',':sechub-web-server:eclipse', ':sechub-api-java:cleanEclipse',':sechub-api-java:eclipse', ':sechub-pds-tools:cleanEclipse',':sechub-pds-tools:eclipse',':sechub-examples:example-sechub-api-java:cleanEclipse',':sechub-examples:example-sechub-api-java:eclipse','-Dsechub.build.stage=all' } diff --git a/sechub-developertools/scripts/sdc.sh b/sechub-developertools/scripts/sdc.sh index 6c18695ca5..fdbfe820a2 100755 --- a/sechub-developertools/scripts/sdc.sh +++ b/sechub-developertools/scripts/sdc.sh @@ -356,7 +356,7 @@ if [[ "$FULL_BUILD" = "YES" ]]; then ./gradlew ensureLocalhostCertificate build generateOpenapi buildDeveloperAdminUI -x :sechub-cli:build step "Generate and build Java projects related to SecHub Java API" - ./gradlew :sechub-api-java:build :sechub-systemtest:build :sechub-pds-tools:buildPDSToolsCLI :sechub-webui:build -Dsechub.build.stage=api-necessary + ./gradlew :sechub-api-java:build :sechub-systemtest:build :sechub-pds-tools:buildPDSToolsCLI :sechub-web-server:build -Dsechub.build.stage=api-necessary step "Integration test" eval "${CMD_EXEC_ALL_INTEGRATIONTESTS}" diff --git a/sechub-webui-solution/01-start-single-docker-compose.sh b/sechub-web-server-solution/01-start-single-docker-compose.sh similarity index 80% rename from sechub-webui-solution/01-start-single-docker-compose.sh rename to sechub-web-server-solution/01-start-single-docker-compose.sh index b524c9df28..bbd2fdcbef 100755 --- a/sechub-webui-solution/01-start-single-docker-compose.sh +++ b/sechub-web-server-solution/01-start-single-docker-compose.sh @@ -7,7 +7,7 @@ source "../sechub-solutions-shared/scripts/9999-env-file-helper.sh" # Only variables from .env can be used in the Docker-Compose file # all other variables are only available in the container setup_environment_file ".env" "env" -setup_environment_file ".env-webui" "env-webui" +setup_environment_file ".env-web-server" "env-web-server" # Use Docker BuildKit # nesessary for switching between build stages @@ -18,4 +18,4 @@ echo "Copying install-java scripts into the docker directory" cp --recursive --force ../sechub-solutions-shared/install-java/ docker/ echo "Starting single container." -docker compose --file docker-compose_webui.yaml up --build --remove-orphans +docker compose --file docker-compose_web_server.yaml up --build --remove-orphans diff --git a/sechub-webui-solution/05-start-single-sechub-network-docker-compose.sh b/sechub-web-server-solution/05-start-single-sechub-network-docker-compose.sh similarity index 72% rename from sechub-webui-solution/05-start-single-sechub-network-docker-compose.sh rename to sechub-web-server-solution/05-start-single-sechub-network-docker-compose.sh index 44309e1924..bf2e6986bd 100755 --- a/sechub-webui-solution/05-start-single-sechub-network-docker-compose.sh +++ b/sechub-web-server-solution/05-start-single-sechub-network-docker-compose.sh @@ -7,11 +7,11 @@ source "../sechub-solutions-shared/scripts/9999-env-file-helper.sh" # Only variables from .env can be used in the Docker-Compose file # all other variables are only available in the container setup_environment_file ".env" "env" -setup_environment_file ".env-webui" "env-webui" +setup_environment_file ".env-web-server" "env-web-server" # Use Docker BuildKit export BUILDKIT_PROGRESS=plain export DOCKER_BUILDKIT=1 echo "Starting single container." -docker compose --file docker-compose_webui_external-network.yaml up --build --remove-orphans +docker compose --file docker-compose_web_server_external-network.yaml up --build --remove-orphans diff --git a/sechub-webui-solution/10-create-image.sh b/sechub-web-server-solution/10-create-image.sh similarity index 74% rename from sechub-webui-solution/10-create-image.sh rename to sechub-web-server-solution/10-create-image.sh index 430b02fadf..fedf55c60a 100755 --- a/sechub-webui-solution/10-create-image.sh +++ b/sechub-web-server-solution/10-create-image.sh @@ -3,7 +3,7 @@ REGISTRY="$1" VERSION="$2" -WEBUI_VERSION="$3" +WEB_SERVER_VERSION="$3" BASE_IMAGE="$4" # optional BUILD_TYPE="$5" # optional DEFAULT_BASE_IMAGE="debian:12-slim" @@ -14,9 +14,9 @@ cd `dirname $0` usage() { cat - < [ ] +usage: $0 [ ] -Builds a docker image of SecHub WebUI for +Builds a docker image of SecHub Web Server for with tag . Optional environment variables or options: @@ -36,8 +36,8 @@ if [[ -z "$VERSION" ]] ; then FAILED=true fi -if [[ -z "$WEBUI_VERSION" ]] ; then - echo "Please provide a SecHub WebUI release version as 3rd parameter." +if [[ -z "$WEB_SERVER_VERSION" ]] ; then + echo "Please provide a SecHub Web Server release version as 3rd parameter." FAILED=true fi @@ -60,8 +60,8 @@ echo ">> Base image: $BASE_IMAGE" BUILD_ARGS+=" --build-arg BUILD_TYPE=$BUILD_TYPE" echo ">> Build type: $BUILD_TYPE" -BUILD_ARGS+=" --build-arg WEBUI_VERSION=$WEBUI_VERSION" -echo ">> SecHub WebUI release version: $WEBUI_VERSION" +BUILD_ARGS+=" --build-arg WEB_SERVER_VERSION=$WEB_SERVER_VERSION" +echo ">> SecHub Web Server release version: $WEB_SERVER_VERSION" echo "Copying install-java scripts into the docker directory" cp --recursive --force ../sechub-solutions-shared/install-java/ docker/ @@ -73,5 +73,5 @@ export DOCKER_BUILDKIT=1 docker build --pull --no-cache $BUILD_ARGS \ --tag "$REGISTRY:$VERSION" \ - --file docker/WebUI-Debian.dockerfile docker/ + --file docker/Web-Server-Debian.dockerfile docker/ docker tag "$REGISTRY:$VERSION" "$REGISTRY:latest" diff --git a/sechub-webui-solution/20-push-image.sh b/sechub-web-server-solution/20-push-image.sh similarity index 100% rename from sechub-webui-solution/20-push-image.sh rename to sechub-web-server-solution/20-push-image.sh diff --git a/sechub-web-server-solution/README.adoc b/sechub-web-server-solution/README.adoc new file mode 100644 index 0000000000..1a5ee5bd29 --- /dev/null +++ b/sechub-web-server-solution/README.adoc @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT + +== Web Server Image + +The files to create the Web Server container image. diff --git a/sechub-webui-solution/docker-compose_webui.yaml b/sechub-web-server-solution/docker-compose_web_server.yaml similarity index 65% rename from sechub-webui-solution/docker-compose_webui.yaml rename to sechub-web-server-solution/docker-compose_web_server.yaml index bc2e4f579f..5c656505f3 100644 --- a/sechub-webui-solution/docker-compose_webui.yaml +++ b/sechub-web-server-solution/docker-compose_web_server.yaml @@ -2,23 +2,23 @@ version: "3" services: - webui: + web-server: build: args: - BASE_IMAGE=${BASE_IMAGE} - BUILD_TYPE=${BUILD_TYPE} - - WEBUI_VERSION=${WEBUI_VERSION} + - WEB_SERVER_VERSION=${WEB_SERVER_VERSION} - JAVA_VERSION=${JAVA_VERSION} - TAG=${TAG} - BRANCH=${BRANCH} context: docker/ - dockerfile: WebUI-Debian.dockerfile - container_name: webui + dockerfile: Web-Server-Debian.dockerfile + container_name: web-server env_file: - .env - - .env-webui + - .env-web-server ports: - - "${HOST_NAME}:${WEBUI_PORT}:4443" + - "${HOST_NAME}:${WEB_SERVER_PORT}:4443" - "${HOST_NAME}:${JAVA_DEBUG_PORT}:15025" networks: - "internal" diff --git a/sechub-webui-solution/docker-compose_webui_external-network.yaml b/sechub-web-server-solution/docker-compose_web_server_external-network.yaml similarity index 66% rename from sechub-webui-solution/docker-compose_webui_external-network.yaml rename to sechub-web-server-solution/docker-compose_web_server_external-network.yaml index 441f3cea75..5ff79ebf02 100644 --- a/sechub-webui-solution/docker-compose_webui_external-network.yaml +++ b/sechub-web-server-solution/docker-compose_web_server_external-network.yaml @@ -2,23 +2,23 @@ version: "3" services: - webui: + web-server: build: args: - BASE_IMAGE=${BASE_IMAGE} - BUILD_TYPE=${BUILD_TYPE} - - WEBUI_VERSION=${WEBUI_VERSION} + - WEB_SERVER_VERSION=${WEB_SERVER_VERSION} - JAVA_VERSION=${JAVA_VERSION} - TAG=${TAG} - BRANCH=${BRANCH} context: docker/ - dockerfile: WebUI-Debian.dockerfile - container_name: webui + dockerfile: Web-Server-Debian.dockerfile + container_name: web-server env_file: - .env - - .env-webui + - .env-web-server ports: - - "${HOST_NAME}:${WEBUI_PORT}:4443" + - "${HOST_NAME}:${WEB_SERVER_PORT}:4443" - "${HOST_NAME}:${JAVA_DEBUG_PORT}:15025" networks: - "sechub" diff --git a/sechub-webui-solution/docker/.gitignore b/sechub-web-server-solution/docker/.gitignore similarity index 100% rename from sechub-webui-solution/docker/.gitignore rename to sechub-web-server-solution/docker/.gitignore diff --git a/sechub-webui-solution/docker/WebUI-Debian.dockerfile b/sechub-web-server-solution/docker/Web-Server-Debian.dockerfile similarity index 65% rename from sechub-webui-solution/docker/WebUI-Debian.dockerfile rename to sechub-web-server-solution/docker/Web-Server-Debian.dockerfile index 6ad4b6ad41..3d34c068f6 100644 --- a/sechub-webui-solution/docker/WebUI-Debian.dockerfile +++ b/sechub-web-server-solution/docker/Web-Server-Debian.dockerfile @@ -8,7 +8,7 @@ ARG BASE_IMAGE # Build args -ARG WEBUI_VERSION +ARG WEB_SERVER_VERSION ARG BUILD_TYPE # possible values: temurin, openj9, openjdk @@ -17,7 +17,7 @@ ARG JAVA_DISTRIBUTION="temurin" ARG JAVA_VERSION="17" # Artifact folder -ARG WEBUI_ARTIFACT_FOLDER="/artifacts" +ARG WEB_SERVER_ARTIFACT_FOLDER="/artifacts" #------------------- # Builder Build @@ -30,14 +30,14 @@ ARG JAVA_DISTRIBUTION ARG JAVA_VERSION ARG TAG ARG BRANCH -ARG WEBUI_ARTIFACT_FOLDER +ARG WEB_SERVER_ARTIFACT_FOLDER ARG BUILD_FOLDER="/build" ARG GIT_URL="https://github.com/mercedes-benz/sechub.git" ENV DOWNLOAD_FOLDER="/downloads" -RUN mkdir --parent "$WEBUI_ARTIFACT_FOLDER" "$DOWNLOAD_FOLDER" +RUN mkdir --parent "$WEB_SERVER_ARTIFACT_FOLDER" "$DOWNLOAD_FOLDER" RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ @@ -54,15 +54,15 @@ RUN cd "$DOWNLOAD_FOLDER/install-java/" && \ # Copy clone script COPY --chmod=755 clone.sh "$BUILD_FOLDER/clone.sh" -# Clone SecHub repo and build SecHub WebUI jar file +# Clone SecHub repo and build sechub-web-server jar file RUN mkdir --parent "$BUILD_FOLDER" && \ cd "$BUILD_FOLDER" && \ ./clone.sh "$GIT_URL" "$BRANCH" "$TAG" && \ cd "sechub" && \ - ./gradlew ensureLocalhostCertificate :sechub-api-java:build :sechub-webui:build -Dsechub.build.stage=api-necessary --console=plain && \ - cd sechub-webui/build/libs/ && \ + ./gradlew ensureLocalhostCertificate :sechub-api-java:build :sechub-web-server:build -Dsechub.build.stage=api-necessary --console=plain && \ + cd sechub-web-server/build/libs/ && \ rm -f *-javadoc.jar *-plain.jar *-sources.jar && \ - cp sechub-webui-*.jar --target-directory "$WEBUI_ARTIFACT_FOLDER" + cp sechub-web-server-*.jar --target-directory "$WEB_SERVER_ARTIFACT_FOLDER" #------------------- # Builder Download @@ -70,21 +70,21 @@ RUN mkdir --parent "$BUILD_FOLDER" && \ FROM ${BASE_IMAGE} AS builder-download -ARG WEBUI_ARTIFACT_FOLDER -ARG WEBUI_VERSION +ARG WEB_SERVER_ARTIFACT_FOLDER +ARG WEB_SERVER_VERSION -RUN mkdir --parent "$WEBUI_ARTIFACT_FOLDER" +RUN mkdir --parent "$WEB_SERVER_ARTIFACT_FOLDER" RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ apt-get install --assume-yes wget && \ apt-get clean -# Download the SecHub WebUI jar file -RUN cd "$WEBUI_ARTIFACT_FOLDER" && \ - wget --no-verbose "https://github.com/mercedes-benz/sechub/releases/download/v$WEBUI_VERSION-webui/sechub-webui-$WEBUI_VERSION.jar.sha256sum" && \ - wget --no-verbose "https://github.com/mercedes-benz/sechub/releases/download/v$WEBUI_VERSION-webui/sechub-webui-$WEBUI_VERSION.jar" && \ - sha256sum --check "sechub-webui-$WEBUI_VERSION.jar.sha256sum" +# Download the SecHub web-server jar file +RUN cd "$WEB_SERVER_ARTIFACT_FOLDER" && \ + wget --no-verbose "https://github.com/mercedes-benz/sechub/releases/download/v$WEB_SERVER_VERSION-web-server/sechub-web-server-$WEB_SERVER_VERSION.jar.sha256sum" && \ + wget --no-verbose "https://github.com/mercedes-benz/sechub/releases/download/v$WEB_SERVER_VERSION-web-server/sechub-web-server-$WEB_SERVER_VERSION.jar" && \ + sha256sum --check "sechub-web-server-$WEB_SERVER_VERSION.jar.sha256sum" #------------------- # Builder Copy Jar @@ -92,12 +92,12 @@ RUN cd "$WEBUI_ARTIFACT_FOLDER" && \ FROM ${BASE_IMAGE} AS builder-copy -ARG WEBUI_ARTIFACT_FOLDER -ARG WEBUI_VERSION +ARG WEB_SERVER_ARTIFACT_FOLDER +ARG WEB_SERVER_VERSION -RUN mkdir --parent "$WEBUI_ARTIFACT_FOLDER" +RUN mkdir --parent "$WEB_SERVER_ARTIFACT_FOLDER" -COPY copy/sechub-webui-*.jar "$WEBUI_ARTIFACT_FOLDER" +COPY copy/sechub-web-server-*.jar "$WEB_SERVER_ARTIFACT_FOLDER" #------------------- # Builder @@ -107,31 +107,31 @@ FROM builder-${BUILD_TYPE} as builder RUN echo "build stage" #------------------- -# WebUI Server Image +# Web Server Image #------------------- -FROM ${BASE_IMAGE} AS webui +FROM ${BASE_IMAGE} AS web-server # Annotations according to the Open Containers Image Spec: # https://github.com/opencontainers/image-spec/blob/main/annotations.md # Required by GitHub to link repository and image LABEL org.opencontainers.image.source="https://github.com/mercedes-benz/sechub" -LABEL org.opencontainers.image.title="SecHub WebUI Image" -LABEL org.opencontainers.image.description="The SecHub WebUI image" +LABEL org.opencontainers.image.title="SecHub Web Server Image" +LABEL org.opencontainers.image.description="The SecHub Web Server image" LABEL maintainer="SecHub FOSS Team" -ARG WEBUI_ARTIFACT_FOLDER +ARG WEB_SERVER_ARTIFACT_FOLDER ARG JAVA_DISTRIBUTION ARG JAVA_VERSION -ARG WEBUI_VERSION +ARG WEB_SERVER_VERSION # env vars in container -ENV USER="webui" +ENV USER="web-server" ENV UID="4242" ENV GID="${UID}" -ENV WEBUI_VERSION="${WEBUI_VERSION}" -ENV WEBUI_FOLDER="/sechub-webui" +ENV WEB_SERVER_VERSION="${WEB_SERVER_VERSION}" +ENV WEB_SERVER_FOLDER="/sechub-web-server" # non-root user # using fixed group and user ids @@ -139,9 +139,9 @@ RUN groupadd --gid "$GID" "$USER" && \ useradd --uid "$UID" --gid "$GID" --no-log-init --create-home "$USER" # Create folders -RUN mkdir --parents "$WEBUI_FOLDER" +RUN mkdir --parents "$WEB_SERVER_FOLDER" -COPY --from=builder "$WEBUI_ARTIFACT_FOLDER" "$WEBUI_FOLDER" +COPY --from=builder "$WEB_SERVER_ARTIFACT_FOLDER" "$WEB_SERVER_FOLDER" RUN export DEBIAN_FRONTEND=noninteractive && \ apt-get update && \ @@ -160,10 +160,10 @@ COPY run.sh /run.sh RUN chmod +x /run.sh # Set permissions -RUN chown --recursive "$USER:$USER" "$WEBUI_FOLDER" +RUN chown --recursive "$USER:$USER" "$WEB_SERVER_FOLDER" # Set workspace -WORKDIR "$WEBUI_FOLDER" +WORKDIR "$WEB_SERVER_FOLDER" # Switch from root to non-root user USER "$USER" diff --git a/sechub-webui-solution/docker/clone.sh b/sechub-web-server-solution/docker/clone.sh similarity index 100% rename from sechub-webui-solution/docker/clone.sh rename to sechub-web-server-solution/docker/clone.sh diff --git a/sechub-webui-solution/docker/run.sh b/sechub-web-server-solution/docker/run.sh similarity index 65% rename from sechub-webui-solution/docker/run.sh rename to sechub-web-server-solution/docker/run.sh index 5b6c2471c3..d62e718c67 100755 --- a/sechub-webui-solution/docker/run.sh +++ b/sechub-web-server-solution/docker/run.sh @@ -30,13 +30,13 @@ wait_loop() { } setup_ssl() { - if [ -n "${SECHUB_WEBUI_SSL_KEYSTORE_ALIAS}" -a "${SECHUB_WEBUI_SSL_KEYSTORE_ALIAS}" != "undefined" ] ; then + if [ -n "${SECHUB_WEB_SERVER_SSL_KEYSTORE_ALIAS}" -a "${SECHUB_WEB_SERVER_SSL_KEYSTORE_ALIAS}" != "undefined" ] ; then # Create symlink to .p12 keystore file - ln -s "$WEBUI_FOLDER/secrets/secret-ssl/keystore_file" ${SECHUB_WEBUI_SSL_KEYSTORE_LOCATION} + ln -s "$WEB_SERVER_FOLDER/secrets/secret-ssl/keystore_file" ${SECHUB_WEB_SERVER_SSL_KEYSTORE_LOCATION} cat - < +# SecHub Web Server + +This Helm chart enables one to deploy the [SecHub Web Server](https://github.com/mercedes-benz/sechub) into a Kubernetes environment. diff --git a/sechub-webui-solution/helm/sechub-webui/templates/deployment.yaml b/sechub-web-server-solution/helm/sechub-web-server/templates/deployment.yaml similarity index 74% rename from sechub-webui-solution/helm/sechub-webui/templates/deployment.yaml rename to sechub-web-server-solution/helm/sechub-web-server/templates/deployment.yaml index 09b395642b..c487b60eb2 100644 --- a/sechub-webui-solution/helm/sechub-webui/templates/deployment.yaml +++ b/sechub-web-server-solution/helm/sechub-web-server/templates/deployment.yaml @@ -28,10 +28,10 @@ spec: runAsGroup: 4242 # gid of the application group. (should be same as in the Dockerfile) fsGroup: 4242 # This gid has write access to the mounted volumes. volumes: -{{- if ne .Values.webui.ssl.keystoreAlias "undefined" }} - - name: secret-webui-ssl-volume +{{- if ne .Values.web-server.ssl.keystoreAlias "undefined" }} + - name: secret-web-server-ssl-volume secret: - secretName: secret-webui-ssl + secretName: secret-web-server-ssl {{- end }} {{- if .Values.go_mmproxy.enabled }} initContainers: @@ -65,10 +65,10 @@ spec: - "-l" # listen - "0.0.0.0:8080" # on port 8080 - "-4" # tcp v4 - - "127.0.0.1:4443" # forward to SecHub WebUI container (localhost port 4443) + - "127.0.0.1:4443" # forward to SecHub Web Server container (localhost port 4443) {{- end }} - # SecHub webui container - - name: sechub-webui + # SecHub web-server container + - name: sechub-web-server image: {{ .Values.image }} resources: # min container memory @@ -78,13 +78,13 @@ spec: limits: memory: "{{ .Values.resources.limits.memory }}" ports: - - name: sechub-webui + - name: sechub-web-server containerPort: 4443 # startupProbe: # httpGet: # scheme: HTTPS # path: /api/anonymous/check/alive - # port: sechub-webui + # port: sechub-web-server # failureThreshold: 24 # periodSeconds: 5 # successThreshold: 1 @@ -94,23 +94,23 @@ spec: # httpGet: # scheme: HTTPS # path: /api/anonymous/check/alive - # port: sechub-webui + # port: sechub-web-server # failureThreshold: 3 # periodSeconds: 10 # successThreshold: 1 # timeoutSeconds: 3 volumeMounts: -{{- if ne .Values.webui.ssl.keystoreAlias "undefined" }} - - mountPath: /sechub-webui/secrets/secret-ssl - name: secret-webui-ssl-volume +{{- if ne .Values.web-server.ssl.keystoreAlias "undefined" }} + - mountPath: /sechub-web-server/secrets/secret-ssl + name: secret-web-server-ssl-volume {{- end }} env: # Server start mode - - name: WEBUI_START_MODE - value: "{{ .Values.webui.startMode }}" + - name: WEB_SERVER_START_MODE + value: "{{ .Values.web-server.startMode }}" # Spring profiles definition - name: SPRING_PROFILES_ACTIVE - value: "{{ .Values.webui.spring.profiles }}" + value: "{{ .Values.web-server.spring.profiles }}" {{- if .Values.env }} # ------------------------------------------------------------------------# # Scope: Additional environment variables for the SecHub web-ui container @@ -123,17 +123,17 @@ spec: - name: DEPLOYMENT_COMMENT value: "{{ .Values.deploymentComment }}" {{- end }} -{{- if .Values.webui.loggingType }} +{{- if .Values.web-server.loggingType }} - name: LOGGING_TYPE - value: "{{ .Values.webui.loggingType }}" + value: "{{ .Values.web-server.loggingType }}" {{- end }} # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + Connection to SecHub server # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - name: SECHUB_SERVER_URL - value: "{{ .Values.webui.sechubConnection.url }}" - - name: WEBUI_SECHUB_TRUST_ALL_CERTIFICATES -{{- if .Values.webui.sechubConnection.trustAllCertificates }} + value: "{{ .Values.web-server.sechubConnection.url }}" + - name: WEB_SERVER_SECHUB_TRUST_ALL_CERTIFICATES +{{- if .Values.web-server.sechubConnection.trustAllCertificates }} value: "true" {{- else }} value: "false" @@ -141,34 +141,34 @@ spec: - name: SECHUB_USERID valueFrom: secretKeyRef: - name: secret-webui-connect + name: secret-web-server-connect key: sechub_userid - name: SECHUB_APITOKEN valueFrom: secretKeyRef: - name: secret-webui-connect + name: secret-web-server-connect key: sechub_apitoken # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + SSL certificate # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - name: SECHUB_WEBUI_SSL_KEYSTORE_TYPE + - name: SECHUB_WEB_SERVER_SSL_KEYSTORE_TYPE value: "PKCS12" - - name: SECHUB_WEBUI_SSL_KEYSTORE_LOCATION - value: "/sechub-webui/{{ .Values.webui.ssl.keystoreAlias }}.p12" - - name: SECHUB_WEBUI_SSL_KEYSTORE_ALIAS - value: "{{ .Values.webui.ssl.keystoreAlias }}" - - name: SECHUB_WEBUI_SSL_KEYSTORE_PASSWORD + - name: SECHUB_WEB_SERVER_SSL_KEYSTORE_LOCATION + value: "/sechub-web-server/{{ .Values.web-server.ssl.keystoreAlias }}.p12" + - name: SECHUB_WEB_SERVER_SSL_KEYSTORE_ALIAS + value: "{{ .Values.web-server.ssl.keystoreAlias }}" + - name: SECHUB_WEB_SERVER_SSL_KEYSTORE_PASSWORD valueFrom: secretKeyRef: - name: secret-webui-ssl + name: secret-web-server-ssl key: keystore_password -{{- if .Values.webui.spring.embeddedTomcat.logging.enabled }} +{{- if .Values.web-server.spring.embeddedTomcat.logging.enabled }} # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + Scope: embedded Tomcat # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Logging to stdout: - name: SERVER_TOMCAT_ACCESSLOG_ENABLED - value: "{{ .Values.webui.spring.embeddedTomcat.logging.enabled }}" + value: "{{ .Values.web-server.spring.embeddedTomcat.logging.enabled }}" - name: SERVER_TOMCAT_ACCESSLOG_DIRECTORY value: "/dev" - name: SERVER_TOMCAT_ACCESSLOG_PREFIX @@ -180,15 +180,15 @@ spec: - name: SERVER_TOMCAT_ACCESSLOG_FILE_DATE_FORMAT value: "" - name: SERVER_TOMCAT_ACCESSLOG_PATTERN - value: "{{ .Values.webui.spring.embeddedTomcat.logging.accessLogFormat }}" + value: "{{ .Values.web-server.spring.embeddedTomcat.logging.accessLogFormat }}" {{- end }} # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + Scope: development # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - name: JAVA_ENABLE_DEBUG - value: "{{ .Values.webui.development.javaDebug | toString }}" + value: "{{ .Values.web-server.development.javaDebug | toString }}" - name: KEEP_CONTAINER_ALIVE_AFTER_CRASH - value: "{{ .Values.webui.development.keepContainerAliveAfterApplicationCrash | toString }}" + value: "{{ .Values.web-server.development.keepContainerAliveAfterApplicationCrash | toString }}" # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # + end of environment variables section # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/sechub-webui-solution/helm/sechub-webui/templates/networkpolicy.yaml b/sechub-web-server-solution/helm/sechub-web-server/templates/networkpolicy.yaml similarity index 100% rename from sechub-webui-solution/helm/sechub-webui/templates/networkpolicy.yaml rename to sechub-web-server-solution/helm/sechub-web-server/templates/networkpolicy.yaml diff --git a/sechub-webui-solution/helm/sechub-webui/templates/service.yaml b/sechub-web-server-solution/helm/sechub-web-server/templates/service.yaml similarity index 100% rename from sechub-webui-solution/helm/sechub-webui/templates/service.yaml rename to sechub-web-server-solution/helm/sechub-web-server/templates/service.yaml diff --git a/sechub-webui-solution/helm/sechub-webui/values.yaml b/sechub-web-server-solution/helm/sechub-web-server/values.yaml similarity index 90% rename from sechub-webui-solution/helm/sechub-webui/values.yaml rename to sechub-web-server-solution/helm/sechub-web-server/values.yaml index 14976550d7..3ef134de95 100644 --- a/sechub-webui-solution/helm/sechub-webui/values.yaml +++ b/sechub-web-server-solution/helm/sechub-web-server/values.yaml @@ -2,9 +2,9 @@ # This is a sample values file containing the defaults. -name: sechub-webui +name: sechub-web-server -image: "ghcr.io/mercedes-benz/sechub/sechub-webui:latest" +image: "ghcr.io/mercedes-benz/sechub/sechub-web-server:latest" # Optional: If your image is in a private registry, you can specify pull secrets defined in k8s # Docs: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ # Example: @@ -23,7 +23,7 @@ resources: # Maximum container memory size memory: 1Gi -webui: +web-server: # Possible values: server, development startMode: server sechubConnection: @@ -31,8 +31,8 @@ webui: url: "https://sechub-server:8443/" # trustAllCertificates - 'true' if server is deployed in the same k8s cluster trustAllCertificates: false - # Put the SecHub user id in k8s secret secret-webui-connect:sechub_userid - # Put the SecHub apitoken in k8s secret secret-webui-connect:sechub_apitoken + # Put the SecHub user id in k8s secret secret-web-server-connect:sechub_userid + # Put the SecHub apitoken in k8s secret secret-web-server-connect:sechub_apitoken logging: type: enabled: false @@ -51,7 +51,7 @@ webui: keystoreAlias: "undefined" # Alias in .p12 keystore. # - On `undefined`, a self-signed certificate will be used. - # - otherwise, k8s secret `secret-webui-ssl` must be defined containing + # - otherwise, k8s secret `secret-web-server-ssl` must be defined containing # - `keystore_file` (containing the ssl certificate chain) # Inside the .p12 keystore, an alias with this name is expected # pointing to the ssl certificate to use @@ -71,7 +71,7 @@ service: loadbalancer: ip: "" port: - name: webui-https + name: web-server-https number: 443 # optional: Add annotations (goes to metadata.annotations) # Can contain multiple lines. Example: @@ -101,7 +101,7 @@ service: # - name: SECHUB_EXAMPLE_VAR2 # valueFrom: # secretKeyRef: -# name: secret-webui-example +# name: secret-web-server-example # key: password go_mmproxy: diff --git a/sechub-webui/.gitignore b/sechub-web-server/.gitignore similarity index 100% rename from sechub-webui/.gitignore rename to sechub-web-server/.gitignore diff --git a/sechub-webui/README.adoc b/sechub-web-server/README.adoc similarity index 78% rename from sechub-webui/README.adoc rename to sechub-web-server/README.adoc index 05132f218a..d5b9abe2df 100644 --- a/sechub-webui/README.adoc +++ b/sechub-web-server/README.adoc @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT -= WebUI += Web Server -WARNING: Don't use this early WebUI in production. +WARNING: Don't use this early Web Server in production. == Development @@ -10,7 +10,7 @@ Activate the Spring Boot Dev Profile by starting the application using the JVM argument: ---- --Dspring.profiles.active=webui_dev +-Dspring.profiles.active=web-server_dev ---- The started application will @@ -24,7 +24,7 @@ The started application will ==== Integration test with running SecHub server ---- --Dspring.profiles.active=webui_integrationtest +-Dspring.profiles.active=web-server_integrationtest ---- The started application will @@ -38,4 +38,4 @@ The started application will - Password: password === Access -The WebUI is accessible at: https://localhost:4443/ +The Web Server is accessible at: https://localhost:4443/ diff --git a/sechub-webui/README.md b/sechub-web-server/README.md similarity index 88% rename from sechub-webui/README.md rename to sechub-web-server/README.md index 2b93db1c55..7efad5bcf3 100644 --- a/sechub-webui/README.md +++ b/sechub-web-server/README.md @@ -1,18 +1,18 @@ -# SecHub WebUI +# SecHub Web Server ## Overview -SecHub WebUI is a web-based user interface for managing and interacting with the SecHub application. +SecHub Web Server is a web-based user interface for managing and interacting with the SecHub application. ## Profiles -To start the application locally use the `webui_local` profile. +To start the application locally use the `web-server_local` profile. This will include the following profiles: -- `ssl-cert-provided`: a default ssl certificate will be used by the WebUI server +- `ssl-cert-provided`: a default ssl certificate will be used by the Web Server server - `classic-auth-enabled`: enable classic login (for now with preconfigured credentials) at `/login/classic`) - `local`: includes any local configurations matching `application-local.${USER}.yml` @@ -25,7 +25,7 @@ This will enable configurations suitable for local development and testing. To run the application in OAuth2 mode, include the `oauth2-enabled` profile. -Note: The `webui_prod` profile includes the `oauth2-enabled` profile. +Note: The `web-server_prod` profile includes the `oauth2-enabled` profile. Make sure that you either provide a valid `application-oauth2-enabled.yml` file in the `src/main/resources` directory or set the required environment variables. diff --git a/sechub-webui/build.gradle b/sechub-web-server/build.gradle similarity index 94% rename from sechub-webui/build.gradle rename to sechub-web-server/build.gradle index b1dd59cd74..0b7c27e227 100644 --- a/sechub-webui/build.gradle +++ b/sechub-web-server/build.gradle @@ -51,7 +51,7 @@ task ensureLocalhostCertificate(type: Exec) { apply plugin: 'maven-publish' -version = versionData.getWebuiVersion() +version = versionData.getWebServerVersion() publishing { publications { @@ -60,8 +60,8 @@ publishing { from components.java pom { - name = 'SecHub WebUI' - description = 'SecHub WebUI as a Spring Boot Jar. Ready to use.' + name = 'SecHub Web Server' + description = 'SecHub Web Server as a Spring Boot Jar. Ready to use.' scm { url = 'https://github.com/mercedes-benz/sechub' diff --git a/sechub-webui/dev-base.sh b/sechub-web-server/dev-base.sh similarity index 100% rename from sechub-webui/dev-base.sh rename to sechub-web-server/dev-base.sh diff --git a/sechub-webui/dev-create_localhost_certificate.sh b/sechub-web-server/dev-create_localhost_certificate.sh similarity index 100% rename from sechub-webui/dev-create_localhost_certificate.sh rename to sechub-web-server/dev-create_localhost_certificate.sh diff --git a/sechub-webui/dev-ensure_localhost_certificate.sh b/sechub-web-server/dev-ensure_localhost_certificate.sh similarity index 100% rename from sechub-webui/dev-ensure_localhost_certificate.sh rename to sechub-web-server/dev-ensure_localhost_certificate.sh diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/ApplicationProfiles.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/ApplicationProfiles.java similarity index 94% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/ApplicationProfiles.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/ApplicationProfiles.java index 6892e9bd95..cf9efdad86 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/ApplicationProfiles.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/ApplicationProfiles.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui; +package com.mercedesbenz.sechub.webserver; public final class ApplicationProfiles { diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/RequestConstants.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/RequestConstants.java similarity index 93% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/RequestConstants.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/RequestConstants.java index 189879c726..efd0da732d 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/RequestConstants.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/RequestConstants.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui; +package com.mercedesbenz.sechub.webserver; public final class RequestConstants { diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/SecHubWebUiApplication.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/SecHubWebServerApplication.java similarity index 59% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/SecHubWebUiApplication.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/SecHubWebServerApplication.java index a932b30f51..dbdcc6a5bb 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/SecHubWebUiApplication.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/SecHubWebServerApplication.java @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui; +package com.mercedesbenz.sechub.webserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SecHubWebUiApplication { +public class SecHubWebServerApplication { public static void main(String[] args) { - SpringApplication.run(SecHubWebUiApplication.class, args); + SpringApplication.run(SecHubWebServerApplication.class, args); } } diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenController.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenController.java similarity index 81% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenController.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenController.java index 094accdf3b..ef07f6f25e 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenController.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenController.java @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.credentials; +package com.mercedesbenz.sechub.webserver.credentials; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import com.mercedesbenz.sechub.webui.RequestConstants; -import com.mercedesbenz.sechub.webui.sechubaccess.SecHubAccessService; -import com.mercedesbenz.sechub.webui.user.UserInfoService; +import com.mercedesbenz.sechub.webserver.RequestConstants; +import com.mercedesbenz.sechub.webserver.sechubaccess.SecHubAccessService; +import com.mercedesbenz.sechub.webserver.user.UserInfoService; @Controller class NewApiTokenController { diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenService.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenService.java similarity index 90% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenService.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenService.java index f55e7d8237..56a5fdb01f 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/credentials/NewApiTokenService.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/credentials/NewApiTokenService.java @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.credentials; +package com.mercedesbenz.sechub.webserver.credentials; import org.springframework.stereotype.Service; -import com.mercedesbenz.sechub.webui.sechubaccess.SecHubAccessService; +import com.mercedesbenz.sechub.webserver.sechubaccess.SecHubAccessService; @Service class NewApiTokenService { diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/i18n/RequestParamLocaleContextResolver.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/i18n/RequestParamLocaleContextResolver.java similarity index 96% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/i18n/RequestParamLocaleContextResolver.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/i18n/RequestParamLocaleContextResolver.java index e5f5a99ceb..963b9abdd7 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/i18n/RequestParamLocaleContextResolver.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/i18n/RequestParamLocaleContextResolver.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.i18n; +package com.mercedesbenz.sechub.webserver.i18n; import java.util.List; import java.util.Locale; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/HomeController.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/HomeController.java similarity index 86% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/HomeController.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/HomeController.java index be7ae014af..d99daff5a6 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/HomeController.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/HomeController.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.oauth2.core.oidc.user.OidcUser; @@ -7,7 +7,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import com.mercedesbenz.sechub.webui.RequestConstants; +import com.mercedesbenz.sechub.webserver.RequestConstants; @Controller class HomeController { diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginClassicController.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginClassicController.java similarity index 70% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginClassicController.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginClassicController.java index fea71e1a85..fa14916c1e 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginClassicController.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginClassicController.java @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import com.mercedesbenz.sechub.webui.ApplicationProfiles; -import com.mercedesbenz.sechub.webui.RequestConstants; +import com.mercedesbenz.sechub.webserver.ApplicationProfiles; +import com.mercedesbenz.sechub.webserver.RequestConstants; @Controller @Profile(ApplicationProfiles.CLASSIC_AUTH_ENABLED) diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2Controller.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2Controller.java similarity index 75% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2Controller.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2Controller.java index cf867330b6..99898f6b28 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2Controller.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2Controller.java @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import com.mercedesbenz.sechub.webui.ApplicationProfiles; -import com.mercedesbenz.sechub.webui.RequestConstants; -import com.mercedesbenz.sechub.webui.security.OAuth2Properties; +import com.mercedesbenz.sechub.webserver.ApplicationProfiles; +import com.mercedesbenz.sechub.webserver.RequestConstants; +import com.mercedesbenz.sechub.webserver.security.OAuth2Properties; @Controller @Profile(ApplicationProfiles.OAUTH2_ENABLED) diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ClientCaller.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ClientCaller.java similarity index 76% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ClientCaller.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ClientCaller.java index 251d58ec6a..d6ee6757e9 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ClientCaller.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ClientCaller.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.sechubaccess; +package com.mercedesbenz.sechub.webserver.sechubaccess; import com.mercedesbenz.sechub.api.SecHubClient; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ErrorCallback.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ErrorCallback.java similarity index 68% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ErrorCallback.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ErrorCallback.java index 65c83c92af..325b2da327 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/ErrorCallback.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/ErrorCallback.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.sechubaccess; +package com.mercedesbenz.sechub.webserver.sechubaccess; public interface ErrorCallback { T handleExceptionAndReturnFallback(Exception e); diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubAccessService.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubAccessService.java similarity index 90% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubAccessService.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubAccessService.java index c25d3ff76a..bbea377b14 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubAccessService.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubAccessService.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.sechubaccess; +package com.mercedesbenz.sechub.webserver.sechubaccess; import java.net.URI; @@ -30,19 +30,19 @@ public class SecHubAccessService { static final Logger LOG = LoggerFactory.getLogger(SecHubAccessService.class); - @Value("${webui.sechub.server-url}") + @Value("${web-server.sechub.server-url}") private String secHubServerUrl; - @Value("${webui.sechub.trust-all-certificates:false}") + @Value("${web-server.sechub.trust-all-certificates:false}") private boolean trustAllCertificates; - @Value("${webui.client.mocked:false}") + @Value("${web-server.client.mocked:false}") private boolean useMockedClient; - @Value("${webui.sechub.userid}") + @Value("${web-server.sechub.userid}") private String userId; - @Value("${webui.sechub.apitoken}") + @Value("${web-server.sechub.apitoken}") private String apiToken; private SecHubClient client; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubClientExecutor.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubClientExecutor.java similarity index 98% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubClientExecutor.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubClientExecutor.java index cb8a5bc0df..b9851abd78 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/sechubaccess/SecHubClientExecutor.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/sechubaccess/SecHubClientExecutor.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.sechubaccess; +package com.mercedesbenz.sechub.webserver.sechubaccess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java similarity index 99% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java index b2f7c62c73..a052d9eaeb 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClient.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import java.util.Base64; import java.util.Map; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/JwtResponse.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/JwtResponse.java similarity index 98% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/JwtResponse.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/JwtResponse.java index a1fa53996a..97f5c1e1f6 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/JwtResponse.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/JwtResponse.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import static java.util.Objects.requireNonNull; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/LoginAuthenticationSuccessHandler.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/LoginAuthenticationSuccessHandler.java similarity index 91% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/LoginAuthenticationSuccessHandler.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/LoginAuthenticationSuccessHandler.java index 449939cda4..f583112b7a 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/LoginAuthenticationSuccessHandler.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/LoginAuthenticationSuccessHandler.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import java.io.IOException; @@ -8,7 +8,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import com.mercedesbenz.sechub.webui.RequestConstants; +import com.mercedesbenz.sechub.webserver.RequestConstants; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2Properties.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2Properties.java similarity index 98% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2Properties.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2Properties.java index c0da7ff877..d6cadee9dd 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2Properties.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2Properties.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import static java.util.Objects.requireNonNull; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesConfig.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesConfig.java similarity index 87% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesConfig.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesConfig.java index db08b4f4c9..10c966f282 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesConfig.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesConfig.java @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import com.mercedesbenz.sechub.webui.ApplicationProfiles; +import com.mercedesbenz.sechub.webserver.ApplicationProfiles; /** * The diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/SecurityConfiguration.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/SecurityConfiguration.java similarity index 97% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/SecurityConfiguration.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/SecurityConfiguration.java index c93f87ee45..98fe4bb98f 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/SecurityConfiguration.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/SecurityConfiguration.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; @@ -20,8 +20,8 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.web.client.RestTemplate; -import com.mercedesbenz.sechub.webui.ApplicationProfiles; -import com.mercedesbenz.sechub.webui.RequestConstants; +import com.mercedesbenz.sechub.webserver.ApplicationProfiles; +import com.mercedesbenz.sechub.webserver.RequestConstants; @Configuration @EnableWebSecurity diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/UserInputSanitizer.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/UserInputSanitizer.java similarity index 84% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/UserInputSanitizer.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/UserInputSanitizer.java index e0f586c6f9..9b1ae63732 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/security/UserInputSanitizer.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/security/UserInputSanitizer.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import org.springframework.stereotype.Component; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserDetailInformationService.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserDetailInformationService.java similarity index 93% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserDetailInformationService.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserDetailInformationService.java index 42afd54caf..bbfe5b294f 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserDetailInformationService.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserDetailInformationService.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.user; +package com.mercedesbenz.sechub.webserver.user; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; diff --git a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserInfoService.java b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserInfoService.java similarity index 95% rename from sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserInfoService.java rename to sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserInfoService.java index 12318d36e0..2eee4f48e6 100644 --- a/sechub-webui/src/main/java/com/mercedesbenz/sechub/webui/user/UserInfoService.java +++ b/sechub-web-server/src/main/java/com/mercedesbenz/sechub/webserver/user/UserInfoService.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.user; +package com.mercedesbenz.sechub.webserver.user; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; diff --git a/sechub-webui/src/main/resources/application-classic-auth-enabled.yml b/sechub-web-server/src/main/resources/application-classic-auth-enabled.yml similarity index 96% rename from sechub-webui/src/main/resources/application-classic-auth-enabled.yml rename to sechub-web-server/src/main/resources/application-classic-auth-enabled.yml index 17f9fa4da8..bb475be945 100644 --- a/sechub-webui/src/main/resources/application-classic-auth-enabled.yml +++ b/sechub-web-server/src/main/resources/application-classic-auth-enabled.yml @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT -webui: +web-server: client: mocked: true sechub: diff --git a/sechub-webui/src/main/resources/application-integrationtest-data.yml b/sechub-web-server/src/main/resources/application-integrationtest-data.yml similarity index 94% rename from sechub-webui/src/main/resources/application-integrationtest-data.yml rename to sechub-web-server/src/main/resources/application-integrationtest-data.yml index 17669f05b0..6d3e83fa71 100644 --- a/sechub-webui/src/main/resources/application-integrationtest-data.yml +++ b/sechub-web-server/src/main/resources/application-integrationtest-data.yml @@ -1,5 +1,5 @@ # SPDX-License-Identifier: MIT -webui: +web-server: sechub: ## Setup integration test sechub user (currently admin, later other role) userid: int-test_superadmin diff --git a/sechub-webui/src/main/resources/application-local.yml b/sechub-web-server/src/main/resources/application-local.yml similarity index 100% rename from sechub-webui/src/main/resources/application-local.yml rename to sechub-web-server/src/main/resources/application-local.yml diff --git a/sechub-webui/src/main/resources/application-ssl-cert-provided.yml b/sechub-web-server/src/main/resources/application-ssl-cert-provided.yml similarity index 97% rename from sechub-webui/src/main/resources/application-ssl-cert-provided.yml rename to sechub-web-server/src/main/resources/application-ssl-cert-provided.yml index 958242c602..45a7810b64 100644 --- a/sechub-webui/src/main/resources/application-ssl-cert-provided.yml +++ b/sechub-web-server/src/main/resources/application-ssl-cert-provided.yml @@ -10,7 +10,7 @@ server: key-store-password: '123456' key-alias: 'tomcat' -webui: +web-server: sechub: server-url: "https://localhost:8443" trust-all-certificates: true diff --git a/sechub-webui/src/main/resources/application-ssl-cert-required.yml b/sechub-web-server/src/main/resources/application-ssl-cert-required.yml similarity index 56% rename from sechub-webui/src/main/resources/application-ssl-cert-required.yml rename to sechub-web-server/src/main/resources/application-ssl-cert-required.yml index a0ce3c19ef..f9c736423f 100644 --- a/sechub-webui/src/main/resources/application-ssl-cert-required.yml +++ b/sechub-web-server/src/main/resources/application-ssl-cert-required.yml @@ -4,10 +4,10 @@ server: ssl: keyStoreType: - ${SECHUB_WEBUI_SSL_KEYSTORE_TYPE} + ${SECHUB_WEB_SERVER_SSL_KEYSTORE_TYPE} key-store: - ${SECHUB_WEBUI_SSL_KEYSTORE_LOCATION} + ${SECHUB_WEB_SERVER_SSL_KEYSTORE_LOCATION} key-store-password: - ${SECHUB_WEBUI_SSL_KEYSTORE_PASSWORD} + ${SECHUB_WEB_SERVER_SSL_KEYSTORE_PASSWORD} key-alias: - ${SECHUB_WEBUI_SSL_KEYSTORE_ALIAS} + ${SECHUB_WEB_SERVER_SSL_KEYSTORE_ALIAS} diff --git a/sechub-web-server/src/main/resources/application.yml b/sechub-web-server/src/main/resources/application.yml new file mode 100644 index 0000000000..8d289f3365 --- /dev/null +++ b/sechub-web-server/src/main/resources/application.yml @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: MIT + +# Main settings +server: + port: + 4443 + ssl: + enabled: true # always enabled + protocol: TLS + enabled-protocols: TLSv1.2,TLSv1.3 + +spring: + messages: + basename: "i18n/messages" + profiles: + group: + web-server_prod: "ssl-cert-required,oauth2-enabled" + web-server_int: "ssl-cert-required,oauth2-enabled,classic-auth-enabled" + web-server_dev: "ssl-cert-provided,classic-auth-enabled" + web-server_local: "ssl-cert-provided,classic-auth-enabled,local" + web-server_test: "test" + web-server_integrationtest: "ssl-cert-provided,integrationtest-data" + web: + resources: + static-locations: classpath:/static diff --git a/sechub-webui/src/main/resources/certificates-untracked/.gitignore b/sechub-web-server/src/main/resources/certificates-untracked/.gitignore similarity index 100% rename from sechub-webui/src/main/resources/certificates-untracked/.gitignore rename to sechub-web-server/src/main/resources/certificates-untracked/.gitignore diff --git a/sechub-webui/src/main/resources/certificates-untracked/README.md b/sechub-web-server/src/main/resources/certificates-untracked/README.md similarity index 100% rename from sechub-webui/src/main/resources/certificates-untracked/README.md rename to sechub-web-server/src/main/resources/certificates-untracked/README.md diff --git a/sechub-webui/src/main/resources/i18n/messages.properties b/sechub-web-server/src/main/resources/i18n/messages.properties similarity index 100% rename from sechub-webui/src/main/resources/i18n/messages.properties rename to sechub-web-server/src/main/resources/i18n/messages.properties diff --git a/sechub-webui/src/main/resources/i18n/messages_de.properties b/sechub-web-server/src/main/resources/i18n/messages_de.properties similarity index 100% rename from sechub-webui/src/main/resources/i18n/messages_de.properties rename to sechub-web-server/src/main/resources/i18n/messages_de.properties diff --git a/sechub-webui/src/main/resources/static/css/main.css b/sechub-web-server/src/main/resources/static/css/main.css similarity index 100% rename from sechub-webui/src/main/resources/static/css/main.css rename to sechub-web-server/src/main/resources/static/css/main.css diff --git a/sechub-webui/src/main/resources/static/sechub-logo.svg b/sechub-web-server/src/main/resources/static/sechub-logo.svg similarity index 100% rename from sechub-webui/src/main/resources/static/sechub-logo.svg rename to sechub-web-server/src/main/resources/static/sechub-logo.svg diff --git a/sechub-webui/src/main/resources/templates/fragments/banner.html b/sechub-web-server/src/main/resources/templates/fragments/banner.html similarity index 100% rename from sechub-webui/src/main/resources/templates/fragments/banner.html rename to sechub-web-server/src/main/resources/templates/fragments/banner.html diff --git a/sechub-webui/src/main/resources/templates/fragments/footer.html b/sechub-web-server/src/main/resources/templates/fragments/footer.html similarity index 100% rename from sechub-webui/src/main/resources/templates/fragments/footer.html rename to sechub-web-server/src/main/resources/templates/fragments/footer.html diff --git a/sechub-webui/src/main/resources/templates/fragments/header.html b/sechub-web-server/src/main/resources/templates/fragments/header.html similarity index 100% rename from sechub-webui/src/main/resources/templates/fragments/header.html rename to sechub-web-server/src/main/resources/templates/fragments/header.html diff --git a/sechub-webui/src/main/resources/templates/fragments/navbar.html b/sechub-web-server/src/main/resources/templates/fragments/navbar.html similarity index 100% rename from sechub-webui/src/main/resources/templates/fragments/navbar.html rename to sechub-web-server/src/main/resources/templates/fragments/navbar.html diff --git a/sechub-webui/src/main/resources/templates/home.html b/sechub-web-server/src/main/resources/templates/home.html similarity index 100% rename from sechub-webui/src/main/resources/templates/home.html rename to sechub-web-server/src/main/resources/templates/home.html diff --git a/sechub-webui/src/main/resources/templates/login-classic.html b/sechub-web-server/src/main/resources/templates/login-classic.html similarity index 100% rename from sechub-webui/src/main/resources/templates/login-classic.html rename to sechub-web-server/src/main/resources/templates/login-classic.html diff --git a/sechub-webui/src/main/resources/templates/login-oauth2.html b/sechub-web-server/src/main/resources/templates/login-oauth2.html similarity index 100% rename from sechub-webui/src/main/resources/templates/login-oauth2.html rename to sechub-web-server/src/main/resources/templates/login-oauth2.html diff --git a/sechub-webui/src/main/resources/templates/new-apitoken.html b/sechub-web-server/src/main/resources/templates/new-apitoken.html similarity index 100% rename from sechub-webui/src/main/resources/templates/new-apitoken.html rename to sechub-web-server/src/main/resources/templates/new-apitoken.html diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/YamlPropertyLoaderFactory.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/YamlPropertyLoaderFactory.java similarity index 96% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/YamlPropertyLoaderFactory.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/YamlPropertyLoaderFactory.java index 2e2c576fe8..28bff1975c 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/YamlPropertyLoaderFactory.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/YamlPropertyLoaderFactory.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui; +package com.mercedesbenz.sechub.webserver; import java.io.IOException; import java.util.List; diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/HomeControllerTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/HomeControllerTest.java similarity index 89% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/HomeControllerTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/HomeControllerTest.java index b330d0d457..b0acec6da6 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/HomeControllerTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/HomeControllerTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -13,8 +13,8 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; -import com.mercedesbenz.sechub.webui.YamlPropertyLoaderFactory; -import com.mercedesbenz.sechub.webui.security.SecurityTestConfiguration; +import com.mercedesbenz.sechub.webserver.YamlPropertyLoaderFactory; +import com.mercedesbenz.sechub.webserver.security.SecurityTestConfiguration; @WebMvcTest(HomeController.class) @Import(SecurityTestConfiguration.class) diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginClassicControllerTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginClassicControllerTest.java similarity index 89% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginClassicControllerTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginClassicControllerTest.java index b916b5e4e9..968c873c8b 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginClassicControllerTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginClassicControllerTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -12,8 +12,8 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; -import com.mercedesbenz.sechub.webui.YamlPropertyLoaderFactory; -import com.mercedesbenz.sechub.webui.security.SecurityTestConfiguration; +import com.mercedesbenz.sechub.webserver.YamlPropertyLoaderFactory; +import com.mercedesbenz.sechub.webserver.security.SecurityTestConfiguration; @WebMvcTest({ LoginClassicController.class, LoginOAuth2Controller.class }) @Import(SecurityTestConfiguration.class) diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2ControllerTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2ControllerTest.java similarity index 89% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2ControllerTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2ControllerTest.java index 643e27a429..51f5ce3c83 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/page/LoginOAuth2ControllerTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/page/LoginOAuth2ControllerTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.page; +package com.mercedesbenz.sechub.webserver.page; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -12,8 +12,8 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.servlet.MockMvc; -import com.mercedesbenz.sechub.webui.YamlPropertyLoaderFactory; -import com.mercedesbenz.sechub.webui.security.SecurityTestConfiguration; +import com.mercedesbenz.sechub.webserver.YamlPropertyLoaderFactory; +import com.mercedesbenz.sechub.webserver.security.SecurityTestConfiguration; @WebMvcTest({ LoginOAuth2Controller.class, LoginClassicController.class }) @Import(SecurityTestConfiguration.class) diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java similarity index 99% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java index fd2e12094b..5b81a29eb0 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/Base64EncodedClientIdAndSecretOAuth2AccessTokenClientTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/JwtResponseTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/JwtResponseTest.java similarity index 98% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/JwtResponseTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/JwtResponseTest.java index 828baf7cc0..6017903e36 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/JwtResponseTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/JwtResponseTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesTest.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesTest.java similarity index 97% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesTest.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesTest.java index 1a748186ee..51268dd082 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/OAuth2PropertiesTest.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/OAuth2PropertiesTest.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -19,7 +19,7 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; -import com.mercedesbenz.sechub.webui.YamlPropertyLoaderFactory; +import com.mercedesbenz.sechub.webserver.YamlPropertyLoaderFactory; @SpringBootTest @ActiveProfiles("oauth2-enabled") diff --git a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/SecurityTestConfiguration.java b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/SecurityTestConfiguration.java similarity index 84% rename from sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/SecurityTestConfiguration.java rename to sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/SecurityTestConfiguration.java index 5306eaecd7..5310c3df69 100644 --- a/sechub-webui/src/test/java/com/mercedesbenz/sechub/webui/security/SecurityTestConfiguration.java +++ b/sechub-web-server/src/test/java/com/mercedesbenz/sechub/webserver/security/SecurityTestConfiguration.java @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -package com.mercedesbenz.sechub.webui.security; +package com.mercedesbenz.sechub.webserver.security; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Import; diff --git a/sechub-webui/src/test/resources/application-test.yml b/sechub-web-server/src/test/resources/application-test.yml similarity index 100% rename from sechub-webui/src/test/resources/application-test.yml rename to sechub-web-server/src/test/resources/application-test.yml diff --git a/sechub-webui/src/test/resources/jwt-response.json b/sechub-web-server/src/test/resources/jwt-response.json similarity index 100% rename from sechub-webui/src/test/resources/jwt-response.json rename to sechub-web-server/src/test/resources/jwt-response.json diff --git a/sechub-webui-solution/README.adoc b/sechub-webui-solution/README.adoc deleted file mode 100644 index 13964336fd..0000000000 --- a/sechub-webui-solution/README.adoc +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT - -== WebUI Image - -The files to create the WebUI container image. diff --git a/sechub-webui-solution/docker/copy/README.adoc b/sechub-webui-solution/docker/copy/README.adoc deleted file mode 100644 index e3f9aa7779..0000000000 --- a/sechub-webui-solution/docker/copy/README.adoc +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: MIT -. Place a single WEB UI Jar into this folder. -. Name it `sechub-webui-0.0.0.jar` -. Run `10-create-image.sh` to build the image diff --git a/sechub-webui-solution/helm/sechub-webui/README.md b/sechub-webui-solution/helm/sechub-webui/README.md deleted file mode 100644 index 8a1f4fc16f..0000000000 --- a/sechub-webui-solution/helm/sechub-webui/README.md +++ /dev/null @@ -1,4 +0,0 @@ - -# SecHub WebUI - -This Helm chart enables one to deploy the [SecHub WebUI](https://github.com/mercedes-benz/sechub) into a Kubernetes environment. diff --git a/sechub-webui/src/main/resources/application.yml b/sechub-webui/src/main/resources/application.yml deleted file mode 100644 index 8c588ae776..0000000000 --- a/sechub-webui/src/main/resources/application.yml +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: MIT - -# Main settings -server: - port: - 4443 - ssl: - enabled: true # always enabled - protocol: TLS - enabled-protocols: TLSv1.2,TLSv1.3 - - -spring: - messages: - basename: "i18n/messages" - profiles: - group: - webui_prod: "ssl-cert-required,oauth2-enabled" - webui_int: "ssl-cert-required,oauth2-enabled,classic-auth-enabled" - webui_dev: "ssl-cert-provided,classic-auth-enabled" - webui_local: "ssl-cert-provided,classic-auth-enabled,local" - webui_test: "test" - webui_integrationtest: "ssl-cert-provided,integrationtest-data" - web: - resources: - static-locations: classpath:/static diff --git a/settings.gradle b/settings.gradle index 53f9a806f8..73bc3c39de 100644 --- a/settings.gradle +++ b/settings.gradle @@ -110,9 +110,9 @@ include 'sechub-cli', // Examples (are below 'sechub-examples' folder) 'sechub-examples:example-sechub-api-java', -/* WebUI */ -'sechub-webui', -'sechub-webui-solution' +/* Web Server and UI */ +'sechub-web-server', +'sechub-web-server-solution' From 1de01dee63c64cc51920121d139cf57d4c1526c7 Mon Sep 17 00:00:00 2001 From: "sven-dmlr (via github-actions)" Date: Fri, 18 Oct 2024 10:25:08 +0000 Subject: [PATCH 11/43] SPDX headers added by SecHub release job @github-actions --- sechub-web-server/src/main/resources/application-local.yml | 1 + sechub-web-ui/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/sechub-web-server/src/main/resources/application-local.yml b/sechub-web-server/src/main/resources/application-local.yml index 4a0591d0a0..1c01922465 100644 --- a/sechub-web-server/src/main/resources/application-local.yml +++ b/sechub-web-server/src/main/resources/application-local.yml @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: MIT # Utility file to load user specific configuration for local development # Define a profile for your local system user by creating a file named application-local.${USER}.yml (if needed) # ${USER} is the value of your system username (e.g. application-local.JOHNDOE.yml) diff --git a/sechub-web-ui/README.md b/sechub-web-ui/README.md index 180fd55b34..509985efc3 100644 --- a/sechub-web-ui/README.md +++ b/sechub-web-ui/README.md @@ -1,3 +1,4 @@ + # Nuxt 3 Minimal Starter Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. From 1296ce8018a949edb5d0f1600d8aa3ad58aaf281 Mon Sep 17 00:00:00 2001 From: "sven-dmlr (via github-actions)" Date: Fri, 18 Oct 2024 10:41:39 +0000 Subject: [PATCH 12/43] docs update by SecHub release job @github-actions --- .../diagram_sechub_job_cancellation.svg | 2 +- .../diagram_sechub_job_restart_handling.svg | 1 + .../diagram_sechub_resume_suspended_jobs.svg | 1 + .../diagram_sechub_sigterm_handling.svg | 1 + .../images/diagram_target_architecture.svg | 2 +- ...dmin_disables_scheduler_job_processing.svg | 2 +- ...ing_auto_cleanup_configuration_changed.svg | 2 +- ...en_domain_messaging_binary_upload_done.svg | 2 +- ..._get_encryption_status_schedule_domain.svg | 2 +- ...ain_messaging_job_cancellation_running.svg | 2 +- .../gen_domain_messaging_job_created.svg | 2 +- .../images/gen_domain_messaging_job_done.svg | 2 +- ...omain_messaging_job_execution_starting.svg | 2 +- .../gen_domain_messaging_job_failed.svg | 2 +- ..._domain_messaging_job_restart_canceled.svg | 2 +- ...domain_messaging_job_restart_triggered.svg | 2 +- .../gen_domain_messaging_job_started.svg | 2 +- .../gen_domain_messaging_job_suspended.svg | 1 + ...essaging_mapping_configuration_changed.svg | 2 +- .../images/gen_domain_messaging_overview.svg | 2 +- ...roduct_executor_cancel_operations_done.svg | 2 +- ...messaging_project_access_level_changed.svg | 2 +- .../gen_domain_messaging_project_created.svg | 2 +- .../gen_domain_messaging_project_deleted.svg | 2 +- ...domain_messaging_project_owner_changed.svg | 2 +- ...in_messaging_project_whitelist_updated.svg | 2 +- ...ain_messaging_request_job_cancellation.svg | 2 +- ...n_domain_messaging_request_job_restart.svg | 2 +- ...ain_messaging_request_job_restart_hard.svg | 2 +- ...in_messaging_request_purge_job_results.svg | 2 +- ...quest_scheduler_disable_job_processing.svg | 2 +- ...equest_scheduler_enable_job_processing.svg | 2 +- ...messaging_request_scheduler_job_status.svg | 2 +- ...saging_request_scheduler_status_update.svg | 2 +- ...saging_request_user_role_recalculation.svg | 2 +- ...sult_encryption_status_schedule_domain.svg | 2 +- .../gen_domain_messaging_scan_suspended.svg | 1 + ...g_schedule_encryption_pool_initialized.svg | 2 +- ...ging_scheduler_job_processing_disabled.svg | 2 +- ...aging_scheduler_job_processing_enabled.svg | 2 +- ..._domain_messaging_scheduler_job_status.svg | 2 +- ...gen_domain_messaging_scheduler_started.svg | 2 +- ...main_messaging_scheduler_status_update.svg | 2 +- ...en_domain_messaging_source_upload_done.svg | 2 +- ...in_messaging_start_encryption_rotation.svg | 2 +- .../gen_domain_messaging_start_scan.svg | 2 +- ...domain_messaging_user_added_to_project.svg | 2 +- ...omain_messaging_user_api_token_changed.svg | 2 +- ...main_messaging_user_becomes_superadmin.svg | 2 +- .../gen_domain_messaging_user_created.svg | 2 +- .../gen_domain_messaging_user_deleted.svg | 2 +- ...n_messaging_user_email_address_changed.svg | 2 +- ...messaging_user_new_api_token_requested.svg | 2 +- ...in_messaging_user_no_longer_superadmin.svg | 2 +- ...in_messaging_user_removed_from_project.svg | 2 +- ...en_domain_messaging_user_roles_changed.svg | 2 +- ...domain_messaging_user_signup_requested.svg | 2 +- docs/latest/images/gen_springprofiles-dev.svg | 2 +- .../gen_springprofiles-integrationtest.svg | 2 +- .../latest/images/gen_springprofiles-prod.svg | 2 +- docs/latest/images/gen_springprofiles.svg | 2 +- docs/latest/sechub-architecture.html | 2351 +-- docs/latest/sechub-client.html | 140 +- .../sechub-developer-quickstart-guide.html | 6 +- docs/latest/sechub-getting-started.html | 6 +- docs/latest/sechub-operations.html | 56 +- .../sechub-product-delegation-server.html | 310 +- docs/latest/sechub-restapi.html | 713 +- docs/latest/sechub-techdoc.html | 13808 +++++++++------- docs/latest/sechub-tutorials.html | 6 +- docs/latest/server-download.html | 2 +- 71 files changed, 9362 insertions(+), 8153 deletions(-) create mode 100644 docs/latest/images/diagram_sechub_job_restart_handling.svg create mode 100644 docs/latest/images/diagram_sechub_resume_suspended_jobs.svg create mode 100644 docs/latest/images/diagram_sechub_sigterm_handling.svg create mode 100644 docs/latest/images/gen_domain_messaging_job_suspended.svg create mode 100644 docs/latest/images/gen_domain_messaging_scan_suspended.svg diff --git a/docs/latest/images/diagram_sechub_job_cancellation.svg b/docs/latest/images/diagram_sechub_job_cancellation.svg index 3d6dbc248c..9ec4afcc88 100644 --- a/docs/latest/images/diagram_sechub_job_cancellation.svg +++ b/docs/latest/images/diagram_sechub_job_cancellation.svg @@ -1 +1 @@ -Event Nr.Message IDWhat happens at this event ?A1START_SCANScan - runningB1REQUEST_SCHEDULER_JOB_STATUSScan - periodic inspection if scheduler job marked as cancel requestedC1REQUEST_JOB_CANCELLATIONCancel request startedD1CANCELLATION_RUNNINGCancel scan running/ ongoingE1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONEProduct execucutor cancel operations have finished (post processing donecom.mercedesbenz.sechub.domain.schedulecom.mercedesbenz.sechub.sharedkernelcom.mercedesbenz.sechub.domain.scancom.mercedesbenz.sechub.domain.administrationcom.mercedesbenz.sechub.domain.notification«Entity»ScheduleSecHubJobExecutionStateINITIALIZINGREADY_TO_STARTSTARTEDCANCEL_REQUESTEDCANCELEDENDEDExecutionResultNONEOKFAILEDSynchronSecHubJobExecutorSchedulerJobStatusRequestHandlerScheduleJobLauncherServiceSchedulerJobBatchTriggerServiceScheduleMessagehandlerhandleCancelJobRequested()SchedulerCancelJobServiceThe steps- D*are only triggered when the SecHub job hasthe execution result NONE.The execution state isnotinspected.DomainMessageServiceEventBus«Entity»ProductResultUUID uuidUUID secHubJobUUIDUUID productExecutorConfigUUIDString resultString messagesString metaDataLocalDateTime startedLocalDateTime endedSecHubExecutionContextmarkCancelRequested()ScanProgressMonitorProductExecutorList<ProductResult> execute(SecHubExecutionContext context, ProductExecutorContext executorContext)ScanServicestartScan()ScanJobExecutorScanJobExecutionRunnableScanJobCancellationRunnableAdapterAdapterExecutionResult start(C config, AdapterMetaDataCallback callback)boolean cancel(C config, AdapterMetaDataCallback callback)ProductExecutionStoreServiceexecuteProductsAndStoreResults(SecHubExecutionContext context)AbstractProductExecutionServiceAbstractProductExecutorCanceableProductExecutorboolean cancel(ProductExecutorData data)ScanJobRunnableDataProductExecutorDataSecHubExecutionHistorySecHubExecutionHistoryElementThe scan job executor is central point ofthe scan steep in scan domain.It does the start of the scan itself anddoes also periodically the inspect the schedulerjob status via event busExecutorThreadCancellationThreadJobAdministrationRestControllerJobAdministrationMessageHandlerJobCancelServiceNotificationMessageHandlerProcuctIs used to have eventcommunications between domainssends async REQUEST_JOB_CANCELLATION (C1)sends async CANCELLATION_RUNNING (D1)sends async CANCELLATION_RUNNING (D1)stores resultusescalls cancel servicebecause of C2marks as CANCEL_REQUESTED (C3)callssends async CANCELLATION_RUNNING (D1)sends async REQUEST_JOB_CANCELLATION (C1)receives "PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE" (E1) ASYNCHRONsends synch REQUEST_SCHEDULER_JOB_STATUS (B1)set SecHub job finally as CANCELEDcreatesusesstores resultsusescallsusesconfigures and usesusescreates + uses (A3)runsinterrupts ExecutorThreadwhen being canceled.This immediately interrupts all product calls hard.runscreatescancelsstartscreates if necessarystarts when necessarycreates contextcreatesmarks as cancel requestedso available in product executorscallsuses information aboutproduct executors and datasends "START_SCAN" (A1) SYNCHRONsends synchron REQUEST_SCHEDULER_JOB_STATUS (B1)and receives job statusrecevies "START_SCAN" (A2) SYNCHRON (returns result)communicationsends "PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE" (E1) ASYNCHRON \ No newline at end of file +Event Nr.Message IDWhat happens at this event ?A1START_SCANScan - runningB1REQUEST_SCHEDULER_JOB_STATUSScan - periodic inspection if scheduler job marked as cancel requestedC1REQUEST_JOB_CANCELLATIONCancel request startedD1CANCELLATION_RUNNINGCancel scan running/ ongoingE1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONEProduct execucutor cancel operations have finished (post processing donecom.mercedesbenz.sechub.domain.schedulecom.mercedesbenz.sechub.sharedkernelcom.mercedesbenz.sechub.domain.scancom.mercedesbenz.sechub.domain.administrationcom.mercedesbenz.sechub.domain.notification«Entity»ScheduleSecHubJobExecutionStateINITIALIZINGREADY_TO_STARTSTARTEDCANCEL_REQUESTEDCANCELEDENDEDExecutionResultNONEOKFAILEDSynchronSecHubJobExecutorSchedulerJobStatusRequestHandlerScheduleJobLauncherServiceSchedulerJobBatchTriggerServiceScheduleMessagehandlerhandleCancelJobRequested()SchedulerCancelJobServiceThe steps- D*are only triggered when the SecHub job hasthe execution result NONE.The execution state isnotinspected.DomainMessageServiceEventBus«Entity»ProductResultUUID uuidUUID secHubJobUUIDUUID productExecutorConfigUUIDString resultString messagesString metaDataLocalDateTime startedLocalDateTime endedSecHubExecutionContextmarkCancelRequested()ScanProgressMonitorProductExecutorList<ProductResult> execute(SecHubExecutionContext context, ProductExecutorContext executorContext)ScanServicestartScan()ScanJobExecutorScanJobExecutionRunnableScanJobCancellationRunnableAdapterAdapterExecutionResult start(C config, AdapterMetaDataCallback callback)boolean cancel(C config, AdapterMetaDataCallback callback)ProductExecutionStoreServiceexecuteProductsAndStoreResults(SecHubExecutionContext context)AbstractProductExecutionServiceAbstractProductExecutorCanceableProductExecutorboolean cancel(ProductExecutorData data)ScanJobRunnableDataProductExecutorDataSecHubExecutionHistorySecHubExecutionHistoryElementThe scan job executor is central point ofthe scan steep in scan domain.It does the start of the scan itself anddoes also periodically the inspect the schedulerjob status via event busExecutorThreadCancellationThreadJobAdministrationRestControllerJobAdministrationMessageHandlerJobCancelServiceNotificationMessageHandlerProcuctIs used to have eventcommunications between domainssends async REQUEST_JOB_CANCELLATION (C1)sends async CANCELLATION_RUNNING (D1)sends async CANCELLATION_RUNNING (D1)stores resultusescalls cancel servicebecause of C2marks as CANCEL_REQUESTED (C3)callssends async CANCELLATION_RUNNING (D1)sends async REQUEST_JOB_CANCELLATION (C1)receives "PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE" (E1) ASYNCHRONsends synch REQUEST_SCHEDULER_JOB_STATUS (B1)set SecHub job finally as CANCELEDcreatesusesstores resultsusescallsusesconfigures and usesusescreates + uses (A3)runsinterrupts ExecutorThreadwhen being canceled.This immediately interrupts all product calls hard.runscreatescancelsstartscreates if necessarystarts when necessarycreates contextcreatesmarks as cancel requestedso available in product executorscallsuses information aboutproduct executors and datasends "START_SCAN" (A1) SYNCHRONsends synchron REQUEST_SCHEDULER_JOB_STATUS (B1)and receives job statusrecevies "START_SCAN" (A2) SYNCHRON (returns result)communicationsends "PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE" (E1) ASYNCHRON \ No newline at end of file diff --git a/docs/latest/images/diagram_sechub_job_restart_handling.svg b/docs/latest/images/diagram_sechub_job_restart_handling.svg new file mode 100644 index 0000000000..c0674bcb1e --- /dev/null +++ b/docs/latest/images/diagram_sechub_job_restart_handling.svg @@ -0,0 +1 @@ +com.mercedesbenz.sechub.adaptercom.mercedesbenz.sechub.domain.scancom.mercedesbenz.sechub.domain.schedulecom.mercedesbenz.sechub.domain.administrationAdapterMetaDataCallbackAdapterMetaData getMetaDataOrNull()persist(AdapterMetaData data)AdapterMetaDatasetValue(String key, String value)String getValue(String key)AdapterAdapterExecutionResult start(C config, AdapterMetaDataCallback callback)PDSAdapterV1ScanServicestartScan()ScanJobExecutorProductResultUUID getSecHubJobUUID()UUID getProductExecutorConfigUUID()AbstractProductExecutionServicerunOnExecutorWithOneConfiguration()ProductExecutorexecute(SecHubExecutionContext context, P param)ProductExecutorCallbackProductResult getProductResult()ProductExecutorContextFactoryProductExecutorCallbackImplScanJobExecutionRunnableScheduleMessageHandlerhandleJobRestartRequested()SchedulerRestartJobServicerestartJob(UUID jobUUID, String ownerEmailAddress)markJobAsNewExecutedNow(ScheduleSecHubJob secHubJob)ScheduleJobLauncherServiceexecuteJob(ScheduleSecHubJob secHubJob)JobRestartRequestServicerestartJob(UUID sechubJobUUID)If meta data is available, the PDS adapter tries to fetchformer PDS job UUID from meta data of product result.If the PDS job uuid is null, a new PDS job is created, otherwise theexisting PDS job will be reused and the the current state handled.DomainMessageServicecreatescalls to create callback instance1manyprovidesloads former product result for same executor and sechub job uuidstores and readsusesuses to communicatecalls multiple implementations(1) REQEUST RESTART JOB (soft)(2) REQEUST RESTART JOB (soft)(3) START_SCAN (synchron)(4) START_SCAN (synchron) \ No newline at end of file diff --git a/docs/latest/images/diagram_sechub_resume_suspended_jobs.svg b/docs/latest/images/diagram_sechub_resume_suspended_jobs.svg new file mode 100644 index 0000000000..9a3b9b8861 --- /dev/null +++ b/docs/latest/images/diagram_sechub_resume_suspended_jobs.svg @@ -0,0 +1 @@ +com.mercedesbenz.sechub.domain.scheduleDBSchedulerJobBatchTriggerServicevoid triggerExecutionOfNextJob()SchedulerNextJobResolverUUID resolveNextJobUUID();ScheduleJobMarkerServiceScheduleResumeJobServicevoid resume(ScheduleSecHubJob sechubJob)ScheduleSecHubJobEventBusSpring boot containerRestart job handlingAt first job uuids ofsuspended jobs are resolved.If no suspended job shall be executed,the selected schedule strategy is usedto resolve the next job.REQUEST_JOB_RESTARTREQUEST_JOB_RESTARTwhen RESUMINGupdates execution state to RESUMINGwhen jobs was in state SUSPENDEDscheduled \ No newline at end of file diff --git a/docs/latest/images/diagram_sechub_sigterm_handling.svg b/docs/latest/images/diagram_sechub_sigterm_handling.svg new file mode 100644 index 0000000000..79b2b0f9f7 --- /dev/null +++ b/docs/latest/images/diagram_sechub_sigterm_handling.svg @@ -0,0 +1 @@ +com.mercedesbenz.sechub.domain.scancom.mercedesbenz.sechub.domain.scheduleDBScanProgressStateFetcherScanJobExecutorScanJobExecutionRunnableSynchronSecHubJobExecutorvoid suspend()SchedulerTerminationServicevoid terminate()boolean isTerminating()SchedulerJobBatchTriggerServicevoid triggerExecutionOfNextJob()SchedulerJobStatusRequestHandlerDomainMessageSynchronousResult returnStatus();ScheduleSecHubJobEventBusSpring boot containerOSBlocks execution of any new jobsinside the scheduler instance whenisTerminating() returns truepersists with execution state`SUSPENDED`SIGTERMPreDestroycalls terminate()REQUEST_SCHEDULER_JOB_STATUSREQUEST_SCHEDULER_JOB_STATUSsuspendsreads \ No newline at end of file diff --git a/docs/latest/images/diagram_target_architecture.svg b/docs/latest/images/diagram_target_architecture.svg index 4e8c59987b..26b144aedd 100644 --- a/docs/latest/images/diagram_target_architecture.svg +++ b/docs/latest/images/diagram_target_architecture.svg @@ -1 +1 @@ -ProductExecutorList<ProductResult> execute()ScanType getScanType()int getVersion()boolean isMultipleConfigurationAllowed()SerecoReportProductExecutorProductExecutorDataNetworkLocationProviderList<URI> getURIs();List<InetAddress> getInetAdresses();NetworkTargetProductServerDataProviderString getIdentifierWhenInternetTarget();String getIdentifierWhenIntranetTarget();String getBaseURLWhenInternetTarget();String getBaseURLWhenIntranetTarget();String getUsernameWhenInternetTarget();String getUsernameWhenIntranetTarget();String getPasswordWhenInternetTarget();String getPasswordWhenIntranetTarget();boolean hasUntrustedCertificateWhenIntranetTarget();boolean hasUntrustedCertificateWhenInternetTarget();NetworkTargetInfoNetworkTargetType getNetworkTargetType()Set<URI> getNetworkTargetURIs()Set<InetAddress> getNetworkTargetIPs()AbstractProductExecutorabstract void customize(ProductExecutorData data);abstract List<ProductResult> executeByAdapter(ProductExecutorData data)NetworkTargetResolverNetworkTarget resolveTarget(URI uri);NetworkTarget resolveTarget(InetAddress inetAdress);The base class for mostly all product executors (except for Sereco).The child classes must implmemnt the `customize` method andconfigure the product executor data object accordingly.It will handle automatically target specific partsfor scan types where it is necessary (WebScan, InfraScan).All other scan types (e.g. CodeScan) do notneed to setup specific product executor data(like NetworkLocationProvider).NetworkTargetgetURI()getInetAdress()NetworkTargetType getType()Represents a network targetto use for a dedicated network typeNetworkTargetTypeNetworkTargetRegistryNetworkTargetInfoFactoryNetworkTargetInfo createInfo()Represents (final) information about whichURIs /IPs are for a dedicated networktarget type (e.g. INTERNET).NetworkTargetProductServerDataSuppportString getIdentifier(NetworkTargetType target)boolean isAbletoScan(NetworkTargetType target)String getBaseURL(NetworkTargetType type)String getUserId(NetworkTargetType type)String getPassword(NetworkTargetType target)Data normally comes fromsechub configurationData normally comes from aninstall setupcreates + customizesusesuses data supportcreate+use (if necessary)create+use (if necessary)internally created + usedusesusescontains1nprovides \ No newline at end of file +ProductExecutorList<ProductResult> execute()ScanType getScanType()int getVersion()boolean isMultipleConfigurationAllowed()SerecoReportProductExecutorProductExecutorDataNetworkLocationProviderList<URI> getURIs();List<InetAddress> getInetAdresses();NetworkTargetProductServerDataProviderString getIdentifierWhenInternetTarget();String getIdentifierWhenIntranetTarget();String getBaseURLWhenInternetTarget();String getBaseURLWhenIntranetTarget();String getUsernameWhenInternetTarget();String getUsernameWhenIntranetTarget();String getPasswordWhenInternetTarget();String getPasswordWhenIntranetTarget();boolean hasUntrustedCertificateWhenIntranetTarget();boolean hasUntrustedCertificateWhenInternetTarget();NetworkTargetInfoNetworkTargetType getNetworkTargetType()Set<URI> getNetworkTargetURIs()Set<InetAddress> getNetworkTargetIPs()AbstractProductExecutorabstract void customize(ProductExecutorData data);abstract List<ProductResult> executeByAdapter(ProductExecutorData data)NetworkTargetResolverNetworkTarget resolveTarget(URI uri);NetworkTarget resolveTarget(InetAddress inetAdress);The base class for mostly all product executors (except for Sereco).The child classes must implmemnt the `customize` method andconfigure the product executor data object accordingly.It will handle automatically target specific partsfor scan types where it is necessary (WebScan, InfraScan).All other scan types (e.g. CodeScan) do notneed to setup specific product executor data(like NetworkLocationProvider).NetworkTargetgetURI()getInetAdress()NetworkTargetType getType()Represents a network targetto use for a dedicated network typeNetworkTargetTypeNetworkTargetRegistryNetworkTargetInfoFactoryNetworkTargetInfo createInfo()Represents (final) information about whichURIs /IPs are for a dedicated networktarget type (e.g. INTERNET).NetworkTargetProductServerDataSuppportString getIdentifier(NetworkTargetType target)boolean isAbletoScan(NetworkTargetType target)String getBaseURL(NetworkTargetType type)String getUserId(NetworkTargetType type)String getPassword(NetworkTargetType target)Data normally comes fromsechub configurationData normally comes from aninstall setupcreates + customizesusesuses data supportcreate+use (if necessary)create+use (if necessary)internally created + usedusesusescontains1nprovides \ No newline at end of file diff --git a/docs/latest/images/event_overview_uc_admin_disables_scheduler_job_processing.svg b/docs/latest/images/event_overview_uc_admin_disables_scheduler_job_processing.svg index 8da21b2f24..19a62e4915 100644 --- a/docs/latest/images/event_overview_uc_admin_disables_scheduler_job_processing.svg +++ b/docs/latest/images/event_overview_uc_admin_disables_scheduler_job_processing.svg @@ -1 +1 @@ -UC_ADMIN_DISABLES_SCHEDULER_JOB_PROCESSINGadministrationnotificationschedule0executedREQUEST_SCHEDULER_DISABLE_JOB_PROCESSING1SCHEDULER_JOB_PROCESSING_DISABLEDSCHEDULER_JOB_PROCESSING_DISABLED \ No newline at end of file +UC_ADMIN_DISABLES_SCHEDULER_JOB_PROCESSINGadministrationnotificationschedule0executedREQUEST_SCHEDULER_DISABLE_JOB_PROCESSING1SCHEDULER_JOB_PROCESSING_DISABLEDSCHEDULER_JOB_PROCESSING_DISABLED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_auto_cleanup_configuration_changed.svg b/docs/latest/images/gen_domain_messaging_auto_cleanup_configuration_changed.svg index 2d94dcea6c..114ec63ed1 100644 --- a/docs/latest/images/gen_domain_messaging_auto_cleanup_configuration_changed.svg +++ b/docs/latest/images/gen_domain_messaging_auto_cleanup_configuration_changed.svg @@ -1 +1 @@ -Communication detailsofmessage AUTO_CLEANUP_CONFIGURATION_CHANGEDscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerJobAdministrationMessageHandlerAdministrationConfigService1AUTO_CLEANUP_CONFIGURATION_CHANGED2AUTO_CLEANUP_CONFIGURATION_CHANGED3AUTO_CLEANUP_CONFIGURATION_CHANGED4AUTO_CLEANUP_CONFIGURATION_CHANGED \ No newline at end of file +Communication detailsofmessage AUTO_CLEANUP_CONFIGURATION_CHANGEDscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerAdministrationConfigServiceJobAdministrationMessageHandler1AUTO_CLEANUP_CONFIGURATION_CHANGED2AUTO_CLEANUP_CONFIGURATION_CHANGED3AUTO_CLEANUP_CONFIGURATION_CHANGED4AUTO_CLEANUP_CONFIGURATION_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_binary_upload_done.svg b/docs/latest/images/gen_domain_messaging_binary_upload_done.svg index 7cef3dbce9..3f9fcba7cb 100644 --- a/docs/latest/images/gen_domain_messaging_binary_upload_done.svg +++ b/docs/latest/images/gen_domain_messaging_binary_upload_done.svg @@ -1 +1 @@ -Communication detailsofmessage BINARY_UPLOAD_DONEstatisticscheduleEventBusStatisticMessageHandlerSchedulerBinariesUploadService1BINARY_UPLOAD_DONE2BINARY_UPLOAD_DONE \ No newline at end of file +Communication detailsofmessage BINARY_UPLOAD_DONEschedulestatisticEventBusSchedulerBinariesUploadServiceStatisticMessageHandler1BINARY_UPLOAD_DONE2BINARY_UPLOAD_DONE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_get_encryption_status_schedule_domain.svg b/docs/latest/images/gen_domain_messaging_get_encryption_status_schedule_domain.svg index 8bf4736415..e2de20b0fa 100644 --- a/docs/latest/images/gen_domain_messaging_get_encryption_status_schedule_domain.svg +++ b/docs/latest/images/gen_domain_messaging_get_encryption_status_schedule_domain.svg @@ -1 +1 @@ -Communication detailsofmessage GET_ENCRYPTION_STATUS_SCHEDULE_DOMAINscheduleadministrationEventBusScheduleEncryptionStatusServiceAdministrationEncryptionStatusService1GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN2GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN3RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAIN4 \ No newline at end of file +Communication detailsofmessage GET_ENCRYPTION_STATUS_SCHEDULE_DOMAINscheduleadministrationEventBusScheduleEncryptionStatusServiceAdministrationEncryptionStatusService1GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN2GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN3RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAIN4 \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_cancellation_running.svg b/docs/latest/images/gen_domain_messaging_job_cancellation_running.svg index 35720d0532..f9ba2542c8 100644 --- a/docs/latest/images/gen_domain_messaging_job_cancellation_running.svg +++ b/docs/latest/images/gen_domain_messaging_job_cancellation_running.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_CANCELLATION_RUNNINGnotificationscheduleadministrationEventBusNotificationMessageHandlerSchedulerCancelJobServiceJobAdministrationMessageHandler1JOB_CANCELLATION_RUNNING2JOB_CANCELLATION_RUNNING3JOB_CANCELLATION_RUNNING \ No newline at end of file +Communication detailsofmessage JOB_CANCELLATION_RUNNINGscheduleadministrationnotificationEventBusSchedulerCancelJobServiceJobAdministrationMessageHandlerNotificationMessageHandler1JOB_CANCELLATION_RUNNING2JOB_CANCELLATION_RUNNING3JOB_CANCELLATION_RUNNING \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_created.svg b/docs/latest/images/gen_domain_messaging_job_created.svg index 3338eb50df..e02bfe2156 100644 --- a/docs/latest/images/gen_domain_messaging_job_created.svg +++ b/docs/latest/images/gen_domain_messaging_job_created.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_CREATEDstatisticscheduleEventBusStatisticMessageHandlerSchedulerCreateJobService1JOB_CREATED2JOB_CREATED \ No newline at end of file +Communication detailsofmessage JOB_CREATEDschedulestatisticEventBusSchedulerCreateJobServiceStatisticMessageHandler1JOB_CREATED2JOB_CREATED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_done.svg b/docs/latest/images/gen_domain_messaging_job_done.svg index efe4b7a828..4b4ce18193 100644 --- a/docs/latest/images/gen_domain_messaging_job_done.svg +++ b/docs/latest/images/gen_domain_messaging_job_done.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_DONEstatisticscheduleadministrationEventBusStatisticMessageHandlerSynchronSecHubJobExecutorJobAdministrationMessageHandler1JOB_DONE2JOB_DONE3JOB_DONE \ No newline at end of file +Communication detailsofmessage JOB_DONEscheduleadministrationstatisticEventBusSynchronSecHubJobExecutorJobAdministrationMessageHandlerStatisticMessageHandler1JOB_DONE2JOB_DONE3JOB_DONE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_execution_starting.svg b/docs/latest/images/gen_domain_messaging_job_execution_starting.svg index 7d88fcb947..8ec60fbad7 100644 --- a/docs/latest/images/gen_domain_messaging_job_execution_starting.svg +++ b/docs/latest/images/gen_domain_messaging_job_execution_starting.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_EXECUTION_STARTINGstatisticscheduleEventBusStatisticMessageHandlerSynchronSecHubJobExecutor1JOB_EXECUTION_STARTING2JOB_EXECUTION_STARTING \ No newline at end of file +Communication detailsofmessage JOB_EXECUTION_STARTINGschedulestatisticEventBusSynchronSecHubJobExecutorStatisticMessageHandler1JOB_EXECUTION_STARTING2JOB_EXECUTION_STARTING \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_failed.svg b/docs/latest/images/gen_domain_messaging_job_failed.svg index b58fac8a91..a02e46af1b 100644 --- a/docs/latest/images/gen_domain_messaging_job_failed.svg +++ b/docs/latest/images/gen_domain_messaging_job_failed.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_FAILEDstatisticscheduleadministrationEventBusStatisticMessageHandlerSynchronSecHubJobExecutorJobAdministrationMessageHandler1JOB_FAILED2JOB_FAILED3JOB_FAILED \ No newline at end of file +Communication detailsofmessage JOB_FAILEDscheduleadministrationstatisticEventBusSynchronSecHubJobExecutorJobAdministrationMessageHandlerStatisticMessageHandler1JOB_FAILED2JOB_FAILED3JOB_FAILED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_restart_canceled.svg b/docs/latest/images/gen_domain_messaging_job_restart_canceled.svg index 0ceb87770d..7bd4a4f4f7 100644 --- a/docs/latest/images/gen_domain_messaging_job_restart_canceled.svg +++ b/docs/latest/images/gen_domain_messaging_job_restart_canceled.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_RESTART_CANCELEDnotificationscheduleEventBusNotificationMessageHandlerSchedulerRestartJobService1JOB_RESTART_CANCELED2JOB_RESTART_CANCELED \ No newline at end of file +Communication detailsofmessage JOB_RESTART_CANCELEDschedulenotificationEventBusSchedulerRestartJobServiceNotificationMessageHandler1JOB_RESTART_CANCELED2JOB_RESTART_CANCELED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_restart_triggered.svg b/docs/latest/images/gen_domain_messaging_job_restart_triggered.svg index 918cc3b7e0..0f6311d5c3 100644 --- a/docs/latest/images/gen_domain_messaging_job_restart_triggered.svg +++ b/docs/latest/images/gen_domain_messaging_job_restart_triggered.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_RESTART_TRIGGEREDnotificationscheduleEventBusNotificationMessageHandlerSchedulerRestartJobService1JOB_RESTART_TRIGGERED2JOB_RESTART_TRIGGERED \ No newline at end of file +Communication detailsofmessage JOB_RESTART_TRIGGEREDschedulenotificationEventBusSchedulerRestartJobServiceNotificationMessageHandler1JOB_RESTART_TRIGGERED2JOB_RESTART_TRIGGERED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_started.svg b/docs/latest/images/gen_domain_messaging_job_started.svg index ab312fce39..e8791bc951 100644 --- a/docs/latest/images/gen_domain_messaging_job_started.svg +++ b/docs/latest/images/gen_domain_messaging_job_started.svg @@ -1 +1 @@ -Communication detailsofmessage JOB_STARTEDscheduleadministrationEventBusScheduleJobLauncherServiceJobAdministrationMessageHandler1JOB_STARTED2JOB_STARTED \ No newline at end of file +Communication detailsofmessage JOB_STARTEDscheduleadministrationEventBusScheduleJobLauncherServiceJobAdministrationMessageHandler1JOB_STARTED2JOB_STARTED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_job_suspended.svg b/docs/latest/images/gen_domain_messaging_job_suspended.svg new file mode 100644 index 0000000000..6da99cd0e8 --- /dev/null +++ b/docs/latest/images/gen_domain_messaging_job_suspended.svg @@ -0,0 +1 @@ +Communication detailsofmessage JOB_SUSPENDEDscheduleadministrationEventBusSynchronSecHubJobExecutorJobAdministrationMessageHandler1JOB_SUSPENDED2JOB_SUSPENDED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_mapping_configuration_changed.svg b/docs/latest/images/gen_domain_messaging_mapping_configuration_changed.svg index 12c9d74e9f..e473f8fa8c 100644 --- a/docs/latest/images/gen_domain_messaging_mapping_configuration_changed.svg +++ b/docs/latest/images/gen_domain_messaging_mapping_configuration_changed.svg @@ -1 +1 @@ -Communication detailsofmessage MAPPING_CONFIGURATION_CHANGEDscanadministrationEventBusScanMessageHandlerUpdateMappingService1MAPPING_CONFIGURATION_CHANGED2MAPPING_CONFIGURATION_CHANGED \ No newline at end of file +Communication detailsofmessage MAPPING_CONFIGURATION_CHANGEDscanadministrationEventBusScanMessageHandlerUpdateMappingService1MAPPING_CONFIGURATION_CHANGED2MAPPING_CONFIGURATION_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_overview.svg b/docs/latest/images/gen_domain_messaging_overview.svg index 373f2d9f13..1fc73e0059 100644 --- a/docs/latest/images/gen_domain_messaging_overview.svg +++ b/docs/latest/images/gen_domain_messaging_overview.svg @@ -1 +1 @@ -Overviewof domainmessagingscanauthorizationnotificationstatisticscheduleadministrationEventBusscanauthorizationnotificationstatisticscheduleadministration1START_SCAN2START_SCANalt[failure]3UNSUPPORTED_OPERATION[success]4SCAN_DONE[failure]5SCAN_FAILED61USER_CREATED2USER_CREATED3USER_CREATED1USER_API_TOKEN_CHANGED2USER_API_TOKEN_CHANGED3USER_API_TOKEN_CHANGED4USER_API_TOKEN_CHANGED1USER_NEW_API_TOKEN_REQUESTED2USER_NEW_API_TOKEN_REQUESTED3USER_NEW_API_TOKEN_REQUESTED1USER_ADDED_TO_PROJECT2USER_ADDED_TO_PROJECT3USER_ADDED_TO_PROJECT1USER_REMOVED_FROM_PROJECT2USER_REMOVED_FROM_PROJECT3USER_REMOVED_FROM_PROJECT1USER_ROLES_CHANGED2USER_ROLES_CHANGED1USER_DELETED2USER_DELETED3USER_DELETED4USER_DELETED5USER_DELETED1PROJECT_CREATED2PROJECT_CREATED1PROJECT_DELETED2PROJECT_DELETED3PROJECT_DELETED4PROJECT_DELETED1PROJECT_WHITELIST_UPDATED2PROJECT_WHITELIST_UPDATED1JOB_CREATED2JOB_CREATED1JOB_STARTED2JOB_STARTED1JOB_EXECUTION_STARTING2JOB_EXECUTION_STARTING1JOB_DONE2JOB_DONE3JOB_DONE1USER_SIGNUP_REQUESTED2USER_SIGNUP_REQUESTED1JOB_FAILED2JOB_FAILED3JOB_FAILED1REQUEST_USER_ROLE_RECALCULATION2REQUEST_USER_ROLE_RECALCULATION3REQUEST_USER_ROLE_RECALCULATION4REQUEST_USER_ROLE_RECALCULATION5REQUEST_USER_ROLE_RECALCULATION6REQUEST_USER_ROLE_RECALCULATION7REQUEST_USER_ROLE_RECALCULATION8REQUEST_USER_ROLE_RECALCULATION9REQUEST_USER_ROLE_RECALCULATION1USER_BECOMES_SUPERADMIN2USER_BECOMES_SUPERADMIN1USER_NO_LONGER_SUPERADMIN2USER_NO_LONGER_SUPERADMIN1REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING2REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING1SCHEDULER_JOB_PROCESSING_ENABLED2SCHEDULER_JOB_PROCESSING_ENABLED3SCHEDULER_JOB_PROCESSING_ENABLED1SCHEDULER_JOB_PROCESSING_DISABLED2SCHEDULER_JOB_PROCESSING_DISABLED3SCHEDULER_JOB_PROCESSING_DISABLED1REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING2REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING1REQUEST_SCHEDULER_STATUS_UPDATE2REQUEST_SCHEDULER_STATUS_UPDATE1SCHEDULER_STATUS_UPDATE2SCHEDULER_STATUS_UPDATE1REQUEST_JOB_CANCELLATION2REQUEST_JOB_CANCELLATION1JOB_CANCELLATION_RUNNING2JOB_CANCELLATION_RUNNING3JOB_CANCELLATION_RUNNING1MAPPING_CONFIGURATION_CHANGED2MAPPING_CONFIGURATION_CHANGED1REQUEST_JOB_RESTART2REQUEST_JOB_RESTART1REQUEST_JOB_RESTART_HARD2REQUEST_JOB_RESTART_HARD1JOB_RESTART_TRIGGERED2JOB_RESTART_TRIGGERED1JOB_RESTART_CANCELED2JOB_RESTART_CANCELED1JOB_RESULTS_PURGED2JOB_RESULTS_PURGED1REQUEST_PURGE_JOB_RESULTS2REQUEST_PURGE_JOB_RESULTSalt[success]3JOB_RESULT_PURGE_DONE[failed]4JOB_RESULT_PURGE_FAILED51REQUEST_SCHEDULER_JOB_STATUS2REQUEST_SCHEDULER_JOB_STATUS3SCHEDULER_JOB_STATUS41SCHEDULER_STARTED2SCHEDULER_STARTED1PROJECT_OWNER_CHANGED2PROJECT_OWNER_CHANGED1PROJECT_ACCESS_LEVEL_CHANGED2PROJECT_ACCESS_LEVEL_CHANGED3PROJECT_ACCESS_LEVEL_CHANGED1USER_EMAIL_ADDRESS_CHANGED2USER_EMAIL_ADDRESS_CHANGED1AUTO_CLEANUP_CONFIGURATION_CHANGED2AUTO_CLEANUP_CONFIGURATION_CHANGED3AUTO_CLEANUP_CONFIGURATION_CHANGED4AUTO_CLEANUP_CONFIGURATION_CHANGED1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE2PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE1ANALYZE_SCAN_RESULTS_AVAILABLE2ANALYZE_SCAN_RESULTS_AVAILABLE1SOURCE_UPLOAD_DONE2SOURCE_UPLOAD_DONE1BINARY_UPLOAD_DONE2BINARY_UPLOAD_DONE1START_ENCRYPTION_ROTATION2START_ENCRYPTION_ROTATION1SCHEDULE_ENCRYPTION_POOL_INITIALIZED2SCHEDULE_ENCRYPTION_POOL_INITIALIZED1GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN2GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN3RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAIN4 \ No newline at end of file +Overviewof domainmessagingscanscheduleadministrationauthorizationnotificationstatisticEventBusscanscheduleadministrationauthorizationnotificationstatistic1START_SCAN2START_SCANalt[failure]3UNSUPPORTED_OPERATION[success]4SCAN_DONE[failure]5SCAN_FAILED[suspended]6SCAN_SUSPENDED71USER_CREATED2USER_CREATED3USER_CREATED1USER_API_TOKEN_CHANGED2USER_API_TOKEN_CHANGED3USER_API_TOKEN_CHANGED4USER_API_TOKEN_CHANGED1USER_NEW_API_TOKEN_REQUESTED2USER_NEW_API_TOKEN_REQUESTED3USER_NEW_API_TOKEN_REQUESTED1USER_ADDED_TO_PROJECT2USER_ADDED_TO_PROJECT3USER_ADDED_TO_PROJECT1USER_REMOVED_FROM_PROJECT2USER_REMOVED_FROM_PROJECT3USER_REMOVED_FROM_PROJECT1USER_ROLES_CHANGED2USER_ROLES_CHANGED1USER_DELETED2USER_DELETED3USER_DELETED4USER_DELETED5USER_DELETED1PROJECT_CREATED2PROJECT_CREATED1PROJECT_DELETED2PROJECT_DELETED3PROJECT_DELETED4PROJECT_DELETED1PROJECT_WHITELIST_UPDATED2PROJECT_WHITELIST_UPDATED1JOB_CREATED2JOB_CREATED1JOB_STARTED2JOB_STARTED1JOB_EXECUTION_STARTING2JOB_EXECUTION_STARTING1JOB_DONE2JOB_DONE3JOB_DONE1USER_SIGNUP_REQUESTED2USER_SIGNUP_REQUESTED1JOB_FAILED2JOB_FAILED3JOB_FAILED1JOB_SUSPENDED2JOB_SUSPENDED1REQUEST_USER_ROLE_RECALCULATION2REQUEST_USER_ROLE_RECALCULATION3REQUEST_USER_ROLE_RECALCULATION4REQUEST_USER_ROLE_RECALCULATION5REQUEST_USER_ROLE_RECALCULATION6REQUEST_USER_ROLE_RECALCULATION7REQUEST_USER_ROLE_RECALCULATION8REQUEST_USER_ROLE_RECALCULATION9REQUEST_USER_ROLE_RECALCULATION1USER_BECOMES_SUPERADMIN2USER_BECOMES_SUPERADMIN1USER_NO_LONGER_SUPERADMIN2USER_NO_LONGER_SUPERADMIN1REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING2REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING1SCHEDULER_JOB_PROCESSING_ENABLED2SCHEDULER_JOB_PROCESSING_ENABLED3SCHEDULER_JOB_PROCESSING_ENABLED1SCHEDULER_JOB_PROCESSING_DISABLED2SCHEDULER_JOB_PROCESSING_DISABLED3SCHEDULER_JOB_PROCESSING_DISABLED1REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING2REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING1REQUEST_SCHEDULER_STATUS_UPDATE2REQUEST_SCHEDULER_STATUS_UPDATE1SCHEDULER_STATUS_UPDATE2SCHEDULER_STATUS_UPDATE1REQUEST_JOB_CANCELLATION2REQUEST_JOB_CANCELLATION1JOB_CANCELLATION_RUNNING2JOB_CANCELLATION_RUNNING3JOB_CANCELLATION_RUNNING1MAPPING_CONFIGURATION_CHANGED2MAPPING_CONFIGURATION_CHANGED1REQUEST_JOB_RESTART2REQUEST_JOB_RESTART3REQUEST_JOB_RESTART1REQUEST_JOB_RESTART_HARD2REQUEST_JOB_RESTART_HARD1JOB_RESTART_TRIGGERED2JOB_RESTART_TRIGGERED1JOB_RESTART_CANCELED2JOB_RESTART_CANCELED1JOB_RESULTS_PURGED2JOB_RESULTS_PURGED1REQUEST_PURGE_JOB_RESULTS2REQUEST_PURGE_JOB_RESULTSalt[success]3JOB_RESULT_PURGE_DONE[failed]4JOB_RESULT_PURGE_FAILED51REQUEST_SCHEDULER_JOB_STATUS2REQUEST_SCHEDULER_JOB_STATUS3SCHEDULER_JOB_STATUS41SCHEDULER_STARTED2SCHEDULER_STARTED1PROJECT_OWNER_CHANGED2PROJECT_OWNER_CHANGED1PROJECT_ACCESS_LEVEL_CHANGED2PROJECT_ACCESS_LEVEL_CHANGED3PROJECT_ACCESS_LEVEL_CHANGED1USER_EMAIL_ADDRESS_CHANGED2USER_EMAIL_ADDRESS_CHANGED1AUTO_CLEANUP_CONFIGURATION_CHANGED2AUTO_CLEANUP_CONFIGURATION_CHANGED3AUTO_CLEANUP_CONFIGURATION_CHANGED4AUTO_CLEANUP_CONFIGURATION_CHANGED1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE2PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE1ANALYZE_SCAN_RESULTS_AVAILABLE2ANALYZE_SCAN_RESULTS_AVAILABLE1SOURCE_UPLOAD_DONE2SOURCE_UPLOAD_DONE1BINARY_UPLOAD_DONE2BINARY_UPLOAD_DONE1START_ENCRYPTION_ROTATION2START_ENCRYPTION_ROTATION1SCHEDULE_ENCRYPTION_POOL_INITIALIZED2SCHEDULE_ENCRYPTION_POOL_INITIALIZED1GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN2GET_ENCRYPTION_STATUS_SCHEDULE_DOMAIN3RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAIN4 \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_product_executor_cancel_operations_done.svg b/docs/latest/images/gen_domain_messaging_product_executor_cancel_operations_done.svg index d1c4b0ea05..8ddd4a37df 100644 --- a/docs/latest/images/gen_domain_messaging_product_executor_cancel_operations_done.svg +++ b/docs/latest/images/gen_domain_messaging_product_executor_cancel_operations_done.svg @@ -1 +1 @@ -Communication detailsofmessage PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONEscanscheduleEventBusScanJobCancellationRunnableScheduleMessageHandler1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE2PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE \ No newline at end of file +Communication detailsofmessage PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONEscanscheduleEventBusScanJobCancellationRunnableScheduleMessageHandler1PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE2PRODUCT_EXECUTOR_CANCEL_OPERATIONS_DONE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_project_access_level_changed.svg b/docs/latest/images/gen_domain_messaging_project_access_level_changed.svg index d5992fde5c..3d4ef66969 100644 --- a/docs/latest/images/gen_domain_messaging_project_access_level_changed.svg +++ b/docs/latest/images/gen_domain_messaging_project_access_level_changed.svg @@ -1 +1 @@ -Communication detailsofmessage PROJECT_ACCESS_LEVEL_CHANGEDscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectChangeAccessLevelService1PROJECT_ACCESS_LEVEL_CHANGED2PROJECT_ACCESS_LEVEL_CHANGED3PROJECT_ACCESS_LEVEL_CHANGED \ No newline at end of file +Communication detailsofmessage PROJECT_ACCESS_LEVEL_CHANGEDscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectChangeAccessLevelService1PROJECT_ACCESS_LEVEL_CHANGED2PROJECT_ACCESS_LEVEL_CHANGED3PROJECT_ACCESS_LEVEL_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_project_created.svg b/docs/latest/images/gen_domain_messaging_project_created.svg index 283ba377cc..652ea82fcc 100644 --- a/docs/latest/images/gen_domain_messaging_project_created.svg +++ b/docs/latest/images/gen_domain_messaging_project_created.svg @@ -1 +1 @@ -Communication detailsofmessage PROJECT_CREATEDscheduleadministrationEventBusScheduleMessageHandlerProjectCreationService1PROJECT_CREATED2PROJECT_CREATED \ No newline at end of file +Communication detailsofmessage PROJECT_CREATEDscheduleadministrationEventBusScheduleMessageHandlerProjectCreationService1PROJECT_CREATED2PROJECT_CREATED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_project_deleted.svg b/docs/latest/images/gen_domain_messaging_project_deleted.svg index e9bf159d32..43e7ac1e06 100644 --- a/docs/latest/images/gen_domain_messaging_project_deleted.svg +++ b/docs/latest/images/gen_domain_messaging_project_deleted.svg @@ -1 +1 @@ -Communication detailsofmessage PROJECT_DELETEDscannotificationscheduleadministrationEventBusScanMessageHandlerNotificationMessageHandlerScheduleMessageHandlerProjectDeleteService1PROJECT_DELETED2PROJECT_DELETED3PROJECT_DELETED4PROJECT_DELETED \ No newline at end of file +Communication detailsofmessage PROJECT_DELETEDscanscheduleadministrationnotificationEventBusScanMessageHandlerScheduleMessageHandlerProjectDeleteServiceNotificationMessageHandler1PROJECT_DELETED2PROJECT_DELETED3PROJECT_DELETED4PROJECT_DELETED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_project_owner_changed.svg b/docs/latest/images/gen_domain_messaging_project_owner_changed.svg index ace9eeb8e4..e8da647296 100644 --- a/docs/latest/images/gen_domain_messaging_project_owner_changed.svg +++ b/docs/latest/images/gen_domain_messaging_project_owner_changed.svg @@ -1 +1 @@ -Communication detailsofmessage PROJECT_OWNER_CHANGEDnotificationadministrationEventBusNotificationMessageHandlerProjectChangeOwnerService1PROJECT_OWNER_CHANGED2PROJECT_OWNER_CHANGED \ No newline at end of file +Communication detailsofmessage PROJECT_OWNER_CHANGEDadministrationnotificationEventBusProjectChangeOwnerServiceNotificationMessageHandler1PROJECT_OWNER_CHANGED2PROJECT_OWNER_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_project_whitelist_updated.svg b/docs/latest/images/gen_domain_messaging_project_whitelist_updated.svg index 9099c1408b..4edb4d92fb 100644 --- a/docs/latest/images/gen_domain_messaging_project_whitelist_updated.svg +++ b/docs/latest/images/gen_domain_messaging_project_whitelist_updated.svg @@ -1 +1 @@ -Communication detailsofmessage PROJECT_WHITELIST_UPDATEDscheduleadministrationEventBusScheduleMessageHandlerProjectUpdateWhitelistService1PROJECT_WHITELIST_UPDATED2PROJECT_WHITELIST_UPDATED \ No newline at end of file +Communication detailsofmessage PROJECT_WHITELIST_UPDATEDscheduleadministrationEventBusScheduleMessageHandlerProjectUpdateWhitelistService1PROJECT_WHITELIST_UPDATED2PROJECT_WHITELIST_UPDATED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_job_cancellation.svg b/docs/latest/images/gen_domain_messaging_request_job_cancellation.svg index ddbc8262e9..b1f831defc 100644 --- a/docs/latest/images/gen_domain_messaging_request_job_cancellation.svg +++ b/docs/latest/images/gen_domain_messaging_request_job_cancellation.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_JOB_CANCELLATIONscheduleadministrationEventBusScheduleMessageHandlerJobCancelService1REQUEST_JOB_CANCELLATION2REQUEST_JOB_CANCELLATION \ No newline at end of file +Communication detailsofmessage REQUEST_JOB_CANCELLATIONscheduleadministrationEventBusScheduleMessageHandlerJobCancelService1REQUEST_JOB_CANCELLATION2REQUEST_JOB_CANCELLATION \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_job_restart.svg b/docs/latest/images/gen_domain_messaging_request_job_restart.svg index 5c87daab51..3ad482f43c 100644 --- a/docs/latest/images/gen_domain_messaging_request_job_restart.svg +++ b/docs/latest/images/gen_domain_messaging_request_job_restart.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_JOB_RESTARTscheduleadministrationEventBusScheduleMessageHandlerJobRestartRequestService1REQUEST_JOB_RESTART2REQUEST_JOB_RESTART \ No newline at end of file +Communication detailsofmessage REQUEST_JOB_RESTARTscheduleadministrationEventBusScheduleResumeJobServiceScheduleMessageHandlerJobRestartRequestService1REQUEST_JOB_RESTART2REQUEST_JOB_RESTART3REQUEST_JOB_RESTART \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_job_restart_hard.svg b/docs/latest/images/gen_domain_messaging_request_job_restart_hard.svg index 1818a23446..258db2b2e9 100644 --- a/docs/latest/images/gen_domain_messaging_request_job_restart_hard.svg +++ b/docs/latest/images/gen_domain_messaging_request_job_restart_hard.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_JOB_RESTART_HARDscheduleadministrationEventBusScheduleMessageHandlerJobRestartRequestService1REQUEST_JOB_RESTART_HARD2REQUEST_JOB_RESTART_HARD \ No newline at end of file +Communication detailsofmessage REQUEST_JOB_RESTART_HARDscheduleadministrationEventBusScheduleMessageHandlerJobRestartRequestService1REQUEST_JOB_RESTART_HARD2REQUEST_JOB_RESTART_HARD \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_purge_job_results.svg b/docs/latest/images/gen_domain_messaging_request_purge_job_results.svg index 6ea5034f55..c85a528dcf 100644 --- a/docs/latest/images/gen_domain_messaging_request_purge_job_results.svg +++ b/docs/latest/images/gen_domain_messaging_request_purge_job_results.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_PURGE_JOB_RESULTSscanscheduleEventBusScanMessageHandlerSchedulerRestartJobService1REQUEST_PURGE_JOB_RESULTS2REQUEST_PURGE_JOB_RESULTSalt[success]3JOB_RESULT_PURGE_DONE[failed]4JOB_RESULT_PURGE_FAILED5 \ No newline at end of file +Communication detailsofmessage REQUEST_PURGE_JOB_RESULTSscanscheduleEventBusScanMessageHandlerSchedulerRestartJobService1REQUEST_PURGE_JOB_RESULTS2REQUEST_PURGE_JOB_RESULTSalt[success]3JOB_RESULT_PURGE_DONE[failed]4JOB_RESULT_PURGE_FAILED5 \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_scheduler_disable_job_processing.svg b/docs/latest/images/gen_domain_messaging_request_scheduler_disable_job_processing.svg index 1725f6bced..1326689dcf 100644 --- a/docs/latest/images/gen_domain_messaging_request_scheduler_disable_job_processing.svg +++ b/docs/latest/images/gen_domain_messaging_request_scheduler_disable_job_processing.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_SCHEDULER_DISABLE_JOB_PROCESSINGscheduleadministrationEventBusScheduleMessageHandlerSwitchSchedulerJobProcessingService1REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING2REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING \ No newline at end of file +Communication detailsofmessage REQUEST_SCHEDULER_DISABLE_JOB_PROCESSINGscheduleadministrationEventBusScheduleMessageHandlerSwitchSchedulerJobProcessingService1REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING2REQUEST_SCHEDULER_DISABLE_JOB_PROCESSING \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_scheduler_enable_job_processing.svg b/docs/latest/images/gen_domain_messaging_request_scheduler_enable_job_processing.svg index dc447cf5af..da9528c20b 100644 --- a/docs/latest/images/gen_domain_messaging_request_scheduler_enable_job_processing.svg +++ b/docs/latest/images/gen_domain_messaging_request_scheduler_enable_job_processing.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_SCHEDULER_ENABLE_JOB_PROCESSINGscheduleadministrationEventBusScheduleMessageHandlerSwitchSchedulerJobProcessingService1REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING2REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING \ No newline at end of file +Communication detailsofmessage REQUEST_SCHEDULER_ENABLE_JOB_PROCESSINGscheduleadministrationEventBusScheduleMessageHandlerSwitchSchedulerJobProcessingService1REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING2REQUEST_SCHEDULER_ENABLE_JOB_PROCESSING \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_scheduler_job_status.svg b/docs/latest/images/gen_domain_messaging_request_scheduler_job_status.svg index 2087e6c148..9ed030abdc 100644 --- a/docs/latest/images/gen_domain_messaging_request_scheduler_job_status.svg +++ b/docs/latest/images/gen_domain_messaging_request_scheduler_job_status.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_SCHEDULER_JOB_STATUSscanscheduleEventBusScanProgressMonitorSchedulerJobStatusRequestHandler1REQUEST_SCHEDULER_JOB_STATUS2REQUEST_SCHEDULER_JOB_STATUS3SCHEDULER_JOB_STATUS4 \ No newline at end of file +Communication detailsofmessage REQUEST_SCHEDULER_JOB_STATUSscanscheduleEventBusScanProgressStateFetcherSchedulerJobStatusRequestHandler1REQUEST_SCHEDULER_JOB_STATUS2REQUEST_SCHEDULER_JOB_STATUS3SCHEDULER_JOB_STATUS4 \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_scheduler_status_update.svg b/docs/latest/images/gen_domain_messaging_request_scheduler_status_update.svg index 38a99ffe06..ae3f51c868 100644 --- a/docs/latest/images/gen_domain_messaging_request_scheduler_status_update.svg +++ b/docs/latest/images/gen_domain_messaging_request_scheduler_status_update.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_SCHEDULER_STATUS_UPDATEscheduleadministrationEventBusScheduleMessageHandlerTriggerSchedulerStatusRefreshService1REQUEST_SCHEDULER_STATUS_UPDATE2REQUEST_SCHEDULER_STATUS_UPDATE \ No newline at end of file +Communication detailsofmessage REQUEST_SCHEDULER_STATUS_UPDATEscheduleadministrationEventBusScheduleMessageHandlerTriggerSchedulerStatusRefreshService1REQUEST_SCHEDULER_STATUS_UPDATE2REQUEST_SCHEDULER_STATUS_UPDATE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_request_user_role_recalculation.svg b/docs/latest/images/gen_domain_messaging_request_user_role_recalculation.svg index 32f6369bdd..9b9f70dfa2 100644 --- a/docs/latest/images/gen_domain_messaging_request_user_role_recalculation.svg +++ b/docs/latest/images/gen_domain_messaging_request_user_role_recalculation.svg @@ -1 +1 @@ -Communication detailsofmessage REQUEST_USER_ROLE_RECALCULATIONauthorizationadministrationEventBusAuthUserCreationServiceUserRoleAdministrationMessageHandlerProjectChangeOwnerServiceProjectCreationServiceProjectUnassignUserServiceProjectAssignUserServiceProjectDeleteServiceUserGrantSuperAdminRightsServiceUserRevokeSuperAdminRightsService1REQUEST_USER_ROLE_RECALCULATION2REQUEST_USER_ROLE_RECALCULATION3REQUEST_USER_ROLE_RECALCULATION4REQUEST_USER_ROLE_RECALCULATION5REQUEST_USER_ROLE_RECALCULATION6REQUEST_USER_ROLE_RECALCULATION7REQUEST_USER_ROLE_RECALCULATION8REQUEST_USER_ROLE_RECALCULATION9REQUEST_USER_ROLE_RECALCULATION \ No newline at end of file +Communication detailsofmessage REQUEST_USER_ROLE_RECALCULATIONadministrationauthorizationEventBusUserRevokeSuperAdminRightsServiceUserGrantSuperAdminRightsServiceProjectCreationServiceProjectChangeOwnerServiceProjectAssignUserServiceProjectUnassignUserServiceProjectDeleteServiceUserRoleAdministrationMessageHandlerAuthUserCreationService1REQUEST_USER_ROLE_RECALCULATION2REQUEST_USER_ROLE_RECALCULATION3REQUEST_USER_ROLE_RECALCULATION4REQUEST_USER_ROLE_RECALCULATION5REQUEST_USER_ROLE_RECALCULATION6REQUEST_USER_ROLE_RECALCULATION7REQUEST_USER_ROLE_RECALCULATION8REQUEST_USER_ROLE_RECALCULATION9REQUEST_USER_ROLE_RECALCULATION \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_result_encryption_status_schedule_domain.svg b/docs/latest/images/gen_domain_messaging_result_encryption_status_schedule_domain.svg index 4c2c3430b0..71c526b1b4 100644 --- a/docs/latest/images/gen_domain_messaging_result_encryption_status_schedule_domain.svg +++ b/docs/latest/images/gen_domain_messaging_result_encryption_status_schedule_domain.svg @@ -1 +1 @@ -Communication detailsofmessage RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAINscheduleEventBusScheduleEncryptionStatusService \ No newline at end of file +Communication detailsofmessage RESULT_ENCRYPTION_STATUS_SCHEDULE_DOMAINscheduleEventBusScheduleEncryptionStatusService \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scan_suspended.svg b/docs/latest/images/gen_domain_messaging_scan_suspended.svg new file mode 100644 index 0000000000..eefac714a5 --- /dev/null +++ b/docs/latest/images/gen_domain_messaging_scan_suspended.svg @@ -0,0 +1 @@ +Communication detailsofmessage SCAN_SUSPENDEDscanEventBusScanService \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_schedule_encryption_pool_initialized.svg b/docs/latest/images/gen_domain_messaging_schedule_encryption_pool_initialized.svg index a80377bcf9..760cda8f35 100644 --- a/docs/latest/images/gen_domain_messaging_schedule_encryption_pool_initialized.svg +++ b/docs/latest/images/gen_domain_messaging_schedule_encryption_pool_initialized.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULE_ENCRYPTION_POOL_INITIALIZEDscheduleEventBusScheduleMessageHandlerScheduleEncryptionService1SCHEDULE_ENCRYPTION_POOL_INITIALIZED2SCHEDULE_ENCRYPTION_POOL_INITIALIZED \ No newline at end of file +Communication detailsofmessage SCHEDULE_ENCRYPTION_POOL_INITIALIZEDscheduleEventBusScheduleEncryptionServiceScheduleMessageHandler1SCHEDULE_ENCRYPTION_POOL_INITIALIZED2SCHEDULE_ENCRYPTION_POOL_INITIALIZED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scheduler_job_processing_disabled.svg b/docs/latest/images/gen_domain_messaging_scheduler_job_processing_disabled.svg index 6db8070c73..76c833a186 100644 --- a/docs/latest/images/gen_domain_messaging_scheduler_job_processing_disabled.svg +++ b/docs/latest/images/gen_domain_messaging_scheduler_job_processing_disabled.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULER_JOB_PROCESSING_DISABLEDnotificationscheduleadministrationEventBusNotificationMessageHandlerSchedulerConfigServiceSchedulerAdministrationMessageHandler1SCHEDULER_JOB_PROCESSING_DISABLED2SCHEDULER_JOB_PROCESSING_DISABLED3SCHEDULER_JOB_PROCESSING_DISABLED \ No newline at end of file +Communication detailsofmessage SCHEDULER_JOB_PROCESSING_DISABLEDscheduleadministrationnotificationEventBusSchedulerConfigServiceSchedulerAdministrationMessageHandlerNotificationMessageHandler1SCHEDULER_JOB_PROCESSING_DISABLED2SCHEDULER_JOB_PROCESSING_DISABLED3SCHEDULER_JOB_PROCESSING_DISABLED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scheduler_job_processing_enabled.svg b/docs/latest/images/gen_domain_messaging_scheduler_job_processing_enabled.svg index b58e76d4a0..923bb9bc80 100644 --- a/docs/latest/images/gen_domain_messaging_scheduler_job_processing_enabled.svg +++ b/docs/latest/images/gen_domain_messaging_scheduler_job_processing_enabled.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULER_JOB_PROCESSING_ENABLEDnotificationscheduleadministrationEventBusNotificationMessageHandlerSchedulerConfigServiceSchedulerAdministrationMessageHandler1SCHEDULER_JOB_PROCESSING_ENABLED2SCHEDULER_JOB_PROCESSING_ENABLED3SCHEDULER_JOB_PROCESSING_ENABLED \ No newline at end of file +Communication detailsofmessage SCHEDULER_JOB_PROCESSING_ENABLEDscheduleadministrationnotificationEventBusSchedulerConfigServiceSchedulerAdministrationMessageHandlerNotificationMessageHandler1SCHEDULER_JOB_PROCESSING_ENABLED2SCHEDULER_JOB_PROCESSING_ENABLED3SCHEDULER_JOB_PROCESSING_ENABLED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scheduler_job_status.svg b/docs/latest/images/gen_domain_messaging_scheduler_job_status.svg index 8b38e1c31d..0f2627ab51 100644 --- a/docs/latest/images/gen_domain_messaging_scheduler_job_status.svg +++ b/docs/latest/images/gen_domain_messaging_scheduler_job_status.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULER_JOB_STATUSscheduleEventBusSchedulerJobStatusRequestHandler \ No newline at end of file +Communication detailsofmessage SCHEDULER_JOB_STATUSscheduleEventBusSchedulerJobStatusRequestHandler \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scheduler_started.svg b/docs/latest/images/gen_domain_messaging_scheduler_started.svg index ef5a0b1600..5ef4bc6adf 100644 --- a/docs/latest/images/gen_domain_messaging_scheduler_started.svg +++ b/docs/latest/images/gen_domain_messaging_scheduler_started.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULER_STARTEDnotificationscheduleEventBusNotificationMessageHandlerSchedulerStartHandler1SCHEDULER_STARTED2SCHEDULER_STARTED \ No newline at end of file +Communication detailsofmessage SCHEDULER_STARTEDschedulenotificationEventBusSchedulerStartHandlerNotificationMessageHandler1SCHEDULER_STARTED2SCHEDULER_STARTED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_scheduler_status_update.svg b/docs/latest/images/gen_domain_messaging_scheduler_status_update.svg index 8cf1e156b1..34c239d569 100644 --- a/docs/latest/images/gen_domain_messaging_scheduler_status_update.svg +++ b/docs/latest/images/gen_domain_messaging_scheduler_status_update.svg @@ -1 +1 @@ -Communication detailsofmessage SCHEDULER_STATUS_UPDATEscheduleadministrationEventBusSchedulerStatusServiceSchedulerAdministrationMessageHandler1SCHEDULER_STATUS_UPDATE2SCHEDULER_STATUS_UPDATE \ No newline at end of file +Communication detailsofmessage SCHEDULER_STATUS_UPDATEscheduleadministrationEventBusSchedulerStatusServiceSchedulerAdministrationMessageHandler1SCHEDULER_STATUS_UPDATE2SCHEDULER_STATUS_UPDATE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_source_upload_done.svg b/docs/latest/images/gen_domain_messaging_source_upload_done.svg index a168928823..9f69f39a32 100644 --- a/docs/latest/images/gen_domain_messaging_source_upload_done.svg +++ b/docs/latest/images/gen_domain_messaging_source_upload_done.svg @@ -1 +1 @@ -Communication detailsofmessage SOURCE_UPLOAD_DONEstatisticscheduleEventBusStatisticMessageHandlerSchedulerSourcecodeUploadService1SOURCE_UPLOAD_DONE2SOURCE_UPLOAD_DONE \ No newline at end of file +Communication detailsofmessage SOURCE_UPLOAD_DONEschedulestatisticEventBusSchedulerSourcecodeUploadServiceStatisticMessageHandler1SOURCE_UPLOAD_DONE2SOURCE_UPLOAD_DONE \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_start_encryption_rotation.svg b/docs/latest/images/gen_domain_messaging_start_encryption_rotation.svg index 8a93ff167a..3307c5c6b2 100644 --- a/docs/latest/images/gen_domain_messaging_start_encryption_rotation.svg +++ b/docs/latest/images/gen_domain_messaging_start_encryption_rotation.svg @@ -1 +1 @@ -Communication detailsofmessage START_ENCRYPTION_ROTATIONscheduleadministrationEventBusScheduleMessageHandlerAdministrationEncryptionRotationService1START_ENCRYPTION_ROTATION2START_ENCRYPTION_ROTATION \ No newline at end of file +Communication detailsofmessage START_ENCRYPTION_ROTATIONscheduleadministrationEventBusScheduleMessageHandlerAdministrationEncryptionRotationService1START_ENCRYPTION_ROTATION2START_ENCRYPTION_ROTATION \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_start_scan.svg b/docs/latest/images/gen_domain_messaging_start_scan.svg index b3099268a5..f0cab15a74 100644 --- a/docs/latest/images/gen_domain_messaging_start_scan.svg +++ b/docs/latest/images/gen_domain_messaging_start_scan.svg @@ -1 +1 @@ -Communication detailsofmessage START_SCANscanscheduleEventBusScanServiceSynchronSecHubJobExecutor1START_SCAN2START_SCANalt[failure]3UNSUPPORTED_OPERATION[success]4SCAN_DONE[failure]5SCAN_FAILED6 \ No newline at end of file +Communication detailsofmessage START_SCANscanscheduleEventBusScanServiceSynchronSecHubJobExecutor1START_SCAN2START_SCANalt[failure]3UNSUPPORTED_OPERATION[success]4SCAN_DONE[failure]5SCAN_FAILED[suspended]6SCAN_SUSPENDED7 \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_added_to_project.svg b/docs/latest/images/gen_domain_messaging_user_added_to_project.svg index 9f5143255e..2e0ec7f769 100644 --- a/docs/latest/images/gen_domain_messaging_user_added_to_project.svg +++ b/docs/latest/images/gen_domain_messaging_user_added_to_project.svg @@ -1 +1 @@ -Communication detailsofmessage USER_ADDED_TO_PROJECTscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectAssignUserService1USER_ADDED_TO_PROJECT2USER_ADDED_TO_PROJECT3USER_ADDED_TO_PROJECT \ No newline at end of file +Communication detailsofmessage USER_ADDED_TO_PROJECTscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectAssignUserService1USER_ADDED_TO_PROJECT2USER_ADDED_TO_PROJECT3USER_ADDED_TO_PROJECT \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_api_token_changed.svg b/docs/latest/images/gen_domain_messaging_user_api_token_changed.svg index fe58c3ba44..0015d420fc 100644 --- a/docs/latest/images/gen_domain_messaging_user_api_token_changed.svg +++ b/docs/latest/images/gen_domain_messaging_user_api_token_changed.svg @@ -1 +1 @@ -Communication detailsofmessage USER_API_TOKEN_CHANGEDauthorizationnotificationadministrationEventBusAuthMessageHandlerNotificationMessageHandlerInternalInitialDataServiceAnonymousUserGetAPITokenByOneTimeTokenService1USER_API_TOKEN_CHANGED2USER_API_TOKEN_CHANGED3USER_API_TOKEN_CHANGED4USER_API_TOKEN_CHANGED \ No newline at end of file +Communication detailsofmessage USER_API_TOKEN_CHANGEDadministrationauthorizationnotificationEventBusInternalInitialDataServiceAnonymousUserGetAPITokenByOneTimeTokenServiceAuthMessageHandlerNotificationMessageHandler1USER_API_TOKEN_CHANGED2USER_API_TOKEN_CHANGED3USER_API_TOKEN_CHANGED4USER_API_TOKEN_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_becomes_superadmin.svg b/docs/latest/images/gen_domain_messaging_user_becomes_superadmin.svg index 1c8d200fbd..1b3eccc145 100644 --- a/docs/latest/images/gen_domain_messaging_user_becomes_superadmin.svg +++ b/docs/latest/images/gen_domain_messaging_user_becomes_superadmin.svg @@ -1 +1 @@ -Communication detailsofmessage USER_BECOMES_SUPERADMINnotificationadministrationEventBusNotificationMessageHandlerUserGrantSuperAdminRightsService1USER_BECOMES_SUPERADMIN2USER_BECOMES_SUPERADMIN \ No newline at end of file +Communication detailsofmessage USER_BECOMES_SUPERADMINadministrationnotificationEventBusUserGrantSuperAdminRightsServiceNotificationMessageHandler1USER_BECOMES_SUPERADMIN2USER_BECOMES_SUPERADMIN \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_created.svg b/docs/latest/images/gen_domain_messaging_user_created.svg index 27480cb42b..0b2e68d1a2 100644 --- a/docs/latest/images/gen_domain_messaging_user_created.svg +++ b/docs/latest/images/gen_domain_messaging_user_created.svg @@ -1 +1 @@ -Communication detailsofmessage USER_CREATEDauthorizationadministrationEventBusAuthMessageHandlerInternalInitialDataServiceUserCreationService1USER_CREATED2USER_CREATED3USER_CREATED \ No newline at end of file +Communication detailsofmessage USER_CREATEDadministrationauthorizationEventBusInternalInitialDataServiceUserCreationServiceAuthMessageHandler1USER_CREATED2USER_CREATED3USER_CREATED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_deleted.svg b/docs/latest/images/gen_domain_messaging_user_deleted.svg index 787c856ba9..1430d3cfba 100644 --- a/docs/latest/images/gen_domain_messaging_user_deleted.svg +++ b/docs/latest/images/gen_domain_messaging_user_deleted.svg @@ -1 +1 @@ -Communication detailsofmessage USER_DELETEDscanauthorizationnotificationscheduleadministrationEventBusScanMessageHandlerAuthMessageHandlerNotificationMessageHandlerScheduleMessageHandlerUserDeleteService1USER_DELETED2USER_DELETED3USER_DELETED4USER_DELETED5USER_DELETED \ No newline at end of file +Communication detailsofmessage USER_DELETEDscanscheduleadministrationauthorizationnotificationEventBusScanMessageHandlerScheduleMessageHandlerUserDeleteServiceAuthMessageHandlerNotificationMessageHandler1USER_DELETED2USER_DELETED3USER_DELETED4USER_DELETED5USER_DELETED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_email_address_changed.svg b/docs/latest/images/gen_domain_messaging_user_email_address_changed.svg index 54476623cb..17130ad7c9 100644 --- a/docs/latest/images/gen_domain_messaging_user_email_address_changed.svg +++ b/docs/latest/images/gen_domain_messaging_user_email_address_changed.svg @@ -1 +1 @@ -Communication detailsofmessage USER_EMAIL_ADDRESS_CHANGEDnotificationadministrationEventBusNotificationMessageHandlerUserEmailAddressUpdateService1USER_EMAIL_ADDRESS_CHANGED2USER_EMAIL_ADDRESS_CHANGED \ No newline at end of file +Communication detailsofmessage USER_EMAIL_ADDRESS_CHANGEDadministrationnotificationEventBusUserEmailAddressUpdateServiceNotificationMessageHandler1USER_EMAIL_ADDRESS_CHANGED2USER_EMAIL_ADDRESS_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_new_api_token_requested.svg b/docs/latest/images/gen_domain_messaging_user_new_api_token_requested.svg index 386f7f2de8..bbffc37764 100644 --- a/docs/latest/images/gen_domain_messaging_user_new_api_token_requested.svg +++ b/docs/latest/images/gen_domain_messaging_user_new_api_token_requested.svg @@ -1 +1 @@ -Communication detailsofmessage USER_NEW_API_TOKEN_REQUESTEDnotificationadministrationEventBusNotificationMessageHandlerAnonymousUserRequestsNewApiTokenServiceUserCreationService1USER_NEW_API_TOKEN_REQUESTED2USER_NEW_API_TOKEN_REQUESTED3USER_NEW_API_TOKEN_REQUESTED \ No newline at end of file +Communication detailsofmessage USER_NEW_API_TOKEN_REQUESTEDadministrationnotificationEventBusUserCreationServiceAnonymousUserRequestsNewApiTokenServiceNotificationMessageHandler1USER_NEW_API_TOKEN_REQUESTED2USER_NEW_API_TOKEN_REQUESTED3USER_NEW_API_TOKEN_REQUESTED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_no_longer_superadmin.svg b/docs/latest/images/gen_domain_messaging_user_no_longer_superadmin.svg index 1cac4a7e5d..fa925102d1 100644 --- a/docs/latest/images/gen_domain_messaging_user_no_longer_superadmin.svg +++ b/docs/latest/images/gen_domain_messaging_user_no_longer_superadmin.svg @@ -1 +1 @@ -Communication detailsofmessage USER_NO_LONGER_SUPERADMINnotificationadministrationEventBusNotificationMessageHandlerUserRevokeSuperAdminRightsService1USER_NO_LONGER_SUPERADMIN2USER_NO_LONGER_SUPERADMIN \ No newline at end of file +Communication detailsofmessage USER_NO_LONGER_SUPERADMINadministrationnotificationEventBusUserRevokeSuperAdminRightsServiceNotificationMessageHandler1USER_NO_LONGER_SUPERADMIN2USER_NO_LONGER_SUPERADMIN \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_removed_from_project.svg b/docs/latest/images/gen_domain_messaging_user_removed_from_project.svg index ae76916d3b..2df0de873b 100644 --- a/docs/latest/images/gen_domain_messaging_user_removed_from_project.svg +++ b/docs/latest/images/gen_domain_messaging_user_removed_from_project.svg @@ -1 +1 @@ -Communication detailsofmessage USER_REMOVED_FROM_PROJECTscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectUnassignUserService1USER_REMOVED_FROM_PROJECT2USER_REMOVED_FROM_PROJECT3USER_REMOVED_FROM_PROJECT \ No newline at end of file +Communication detailsofmessage USER_REMOVED_FROM_PROJECTscanscheduleadministrationEventBusScanMessageHandlerScheduleMessageHandlerProjectUnassignUserService1USER_REMOVED_FROM_PROJECT2USER_REMOVED_FROM_PROJECT3USER_REMOVED_FROM_PROJECT \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_roles_changed.svg b/docs/latest/images/gen_domain_messaging_user_roles_changed.svg index 77bb2499ef..cc5f9fb997 100644 --- a/docs/latest/images/gen_domain_messaging_user_roles_changed.svg +++ b/docs/latest/images/gen_domain_messaging_user_roles_changed.svg @@ -1 +1 @@ -Communication detailsofmessage USER_ROLES_CHANGEDauthorizationadministrationEventBusAuthMessageHandlerUserRoleCalculationService1USER_ROLES_CHANGED2USER_ROLES_CHANGED \ No newline at end of file +Communication detailsofmessage USER_ROLES_CHANGEDadministrationauthorizationEventBusUserRoleCalculationServiceAuthMessageHandler1USER_ROLES_CHANGED2USER_ROLES_CHANGED \ No newline at end of file diff --git a/docs/latest/images/gen_domain_messaging_user_signup_requested.svg b/docs/latest/images/gen_domain_messaging_user_signup_requested.svg index 8a81f51903..8e23b03081 100644 --- a/docs/latest/images/gen_domain_messaging_user_signup_requested.svg +++ b/docs/latest/images/gen_domain_messaging_user_signup_requested.svg @@ -1 +1 @@ -Communication detailsofmessage USER_SIGNUP_REQUESTEDnotificationadministrationEventBusNotificationMessageHandlerAnonymousSignupCreateService1USER_SIGNUP_REQUESTED2USER_SIGNUP_REQUESTED \ No newline at end of file +Communication detailsofmessage USER_SIGNUP_REQUESTEDadministrationnotificationEventBusAnonymousSignupCreateServiceNotificationMessageHandler1USER_SIGNUP_REQUESTED2USER_SIGNUP_REQUESTED \ No newline at end of file diff --git a/docs/latest/images/gen_springprofiles-dev.svg b/docs/latest/images/gen_springprofiles-dev.svg index 66c937db12..d48da13e9f 100644 --- a/docs/latest/images/gen_springprofiles-dev.svg +++ b/docs/latest/images/gen_springprofiles-dev.svg @@ -1 +1 @@ -<dev>devadmin_accessreal_productsmocked_notificationslocalserverh2postgresdefaultinitial_admin_predefinedmocked_products \ No newline at end of file +<dev>devinitial_admin_predefinedh2real_productslocalserverpostgresmocked_notificationsdefaultadmin_accessmocked_products \ No newline at end of file diff --git a/docs/latest/images/gen_springprofiles-integrationtest.svg b/docs/latest/images/gen_springprofiles-integrationtest.svg index d1d5c48225..36f7361b5c 100644 --- a/docs/latest/images/gen_springprofiles-integrationtest.svg +++ b/docs/latest/images/gen_springprofiles-integrationtest.svg @@ -1 +1 @@ -<integrationtest>integrationtestadmin_accessreal_productsinitial_admin_staticmocked_notificationslocalserverh2postgresdefaultmocked_products \ No newline at end of file +<integrationtest>integrationtestinitial_admin_statich2real_productslocalserverpostgresmocked_notificationsdefaultadmin_accessmocked_products \ No newline at end of file diff --git a/docs/latest/images/gen_springprofiles-prod.svg b/docs/latest/images/gen_springprofiles-prod.svg index b1c342d6e7..a4fa47a379 100644 --- a/docs/latest/images/gen_springprofiles-prod.svg +++ b/docs/latest/images/gen_springprofiles-prod.svg @@ -1 +1 @@ -<prod>prodreal_productsserverinitial_admin_createdpostgresdefault \ No newline at end of file +<prod>prodreal_productsserverpostgresdefaultinitial_admin_created \ No newline at end of file diff --git a/docs/latest/images/gen_springprofiles.svg b/docs/latest/images/gen_springprofiles.svg index 19671d82f6..95547dab2c 100644 --- a/docs/latest/images/gen_springprofiles.svg +++ b/docs/latest/images/gen_springprofiles.svg @@ -1 +1 @@ -admin_accessreal_productsinitial_admin_staticservermocked_notificationslocalserverinitial_admin_createddevh2debugprodpostgresintegrationtestdefaultinitial_admin_predefinedmocked_productstest \ No newline at end of file +initial_admin_staticprodinitial_admin_predefinedh2real_productsdebuglocalserverintegrationtestserverpostgresmocked_notificationsdefaultinitial_admin_createddevadmin_accessmocked_productstest \ No newline at end of file diff --git a/docs/latest/sechub-architecture.html b/docs/latest/sechub-architecture.html index 036a3a9a4d..04eecf4269 100644 --- a/docs/latest/sechub-architecture.html +++ b/docs/latest/sechub-architecture.html @@ -531,7 +531,7 @@ @@ -3341,17 +3300,17 @@

7.5.16. UC_015-Admin assigns user to project

2

-

Update schedule authorization parts

- +

Assign user

+

SUPERADMIN

2

- +

The service will add the user to the project. If user does not have ROLE_USER it will obtain it

2

-

Assign user

-

SUPERADMIN

+

Update schedule authorization parts

+

3

-

The service will add the user to the project. If user does not have ROLE_USER it will obtain it

+

3

@@ -3440,10 +3399,10 @@

7.5.17. UC_016-Admin unassigns user from project

2

-

Update authorization parts

- +

Unassign user

+

SUPERADMIN

2

- +

The service will remove the user to the project. If users has no longer access to projects ROLE_USER will be removed

2

@@ -3454,10 +3413,10 @@

7.5.17. UC_016-Admin unassigns user from project

2

-

Unassign user

-

SUPERADMIN

+

Update authorization parts

+

4

-

The service will remove the user to the project. If users has no longer access to projects ROLE_USER will be removed

+

4

@@ -4270,14 +4229,14 @@

7.5.31. UC_030-Admin disables job processing in

Service call

SUPERADMIN

2

-

Sends request to scheduler domain to disable scheduler job processing

+

Sends request to scheduler to send updates about current status.

2

Service call

SUPERADMIN

3

-

Sends request to scheduler to send updates about current status.

+

Sends request to scheduler domain to disable scheduler job processing

3

@@ -7010,17 +6969,17 @@

7.5.77. UC_076-Admin fetches encryption status

1

-

Service call

- +

Rest call

+

SUPERADMIN

1

-

Services collects encryption status from domains via event bus

+

Admin fetches encryption status from domains via REST

1

-

Rest call

-

SUPERADMIN

+

Service call

-

Admin fetches encryption status from domains via REST

+ +

Services collects encryption status from domains via event bus

@@ -7125,6 +7084,152 @@

7.5.79. UC_078-User unmarks existing false posit +
+

7.5.80. UC_079-System suspends running jobs on SIGTERM

+
+

When a SecHub instance is receiving a SIGTERM signal from OS, +the server instance must block further job processing (on this instance) and +suspend all of its running jobs. Because after some time the job will be resumed +by another instance, this process will not stop any running PDS jobs.

+
+
+

Steps

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NrTitleRole(s)NextDescription

1

Scheduler terminates

2

Scheduler instance is terminating. Will stop processing new jobs and inform job executor to suspend

2

Scheduler job executor suspends current jobs

3

Scheduler instance is terminating. Will mark current running jobs of this instance as SUSPENDED

3

Scheduler job executor suspends current jobs

4

Scheduler instance is terminating. Will mark current running jobs of this instance as SUSPENDED

4

Scan job executor stops suspended jobs

5

Scheduler instance has marked jobs as suspended. Will stop execution of scans of these jobs

5

Scan job executable handles SUSPEND state

6

Scan job executable stops execution because suspended

6

Inform listeners

7

Inform listeners about job suspension

7

Administration handles suspended job

Administration domain removes suspended job from its running job list

+
+
+

7.5.81. UC_080-System resumes suspended jobs

+
+

SecHub jobs which have been suspended a minimum duration time +will be restarted automatically.

+
+
+

Steps

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NrTitleRole(s)NextDescription

1

Schedule suspended jobs

2

Scheduler checks not only for new jobs but also for resumed ones.

2

Resolve next job

3

Resolves UUID of job which shall be executed at next time. If there is a suspended job and shall be resumed +this job will be returned. Otherwise the selected schedule strategy will be used to determine next job uuid.

+

Remark: A suspended job shall only be executed when the minium duration time has been +reached. The time period can be configured and prevents side effects at deployments.

3

Mark next job to execute

4

When a suspended job is the next one, the job execution state will be changed to RESUMING

4

Resume job

The SecHub job will be resumed. This is done by triggering a soft restart request for the +job.

+

You can read Admin restarts a job for the steps which are +done at restart process. The steps are the same, except there is no audit logging +and the event is not triggered from administration but schedule domain.

+

7.6. Rest API documentation

@@ -8259,7 +8364,7 @@

7.6.9. Admin downloads all

-
$ curl 'https://sechub.example.com/api/admin/scan/download/9bd02859-6fbc-40c8-850e-9778a619792f' -i -u 'user:secret' -X GET \
+
$ curl 'https://sechub.example.com/api/admin/scan/download/3046ece0-0df5-4835-951f-7d8fc03960f9' -i -u 'user:secret' -X GET \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -9424,7 +9529,7 @@

7.6.20. Admin shows scan logs for pro
-
[{"sechubJobUUID":"8aa96b9a-d058-462a-844c-94cf06487cf0","executedBy":"spartakus","started":"2024-09-29T15:18:09.260348613","ended":"2024-09-30T15:18:09.260385873","status":"OK"}]
+
[{"sechubJobUUID":"c9332298-56a4-4dba-bdef-fabc2c3a6452","executedBy":"spartakus","started":"2024-10-17T10:39:15.358144515","ended":"2024-10-18T10:39:15.35816306","status":"OK"}]
@@ -10034,7 +10139,7 @@

7.6.25.1. Code Scan variant
-
{"jobId":"c26d4c65-fff4-465a-83ff-875439423465"}
+
{"jobId":"def6f6c8-e457-4ca6-9479-48d2efc01d27"}
@@ -10213,7 +10318,7 @@
7.6.25.2. Code Sc
-
{"jobId":"1683493f-a31b-4d71-97b5-e27501532b3c"}
+
{"jobId":"1be00ca3-124e-44a0-94a9-2d35086f2147"}
@@ -10372,7 +10477,7 @@
7.6.25.3. Secret scan variant
-
{"jobId":"c3763dee-4166-432e-817b-fcaff2832ecb"}
+
{"jobId":"86ba5157-b7cb-4be8-86ea-82025c665046"}
@@ -10531,7 +10636,7 @@
7.6.25.4. License scan variant
-
{"jobId":"5950a5ec-26c1-421d-ab3c-0101babe0004"}
+
{"jobId":"f4553bb6-2a45-4bff-a446-d89ea9c1f52d"}
@@ -10685,7 +10790,7 @@
7.6.25.5. Infrastructure s
-
{"jobId":"cb8589a0-cfc4-49f0-bcad-869f21ca1b69"}
+
{"jobId":"3a28b8ba-6b53-4722-b267-75bacb98484c"}
@@ -10854,7 +10959,7 @@
7.6.25.6. Web scan anonymou
-
{"jobId":"8b2da388-7999-4182-92ba-f0b79c126272"}
+
{"jobId":"1ee40c8d-f2de-4eec-b8b9-623c39f783a8"}
@@ -11018,7 +11123,7 @@
7.6.25.7. Web sca
-
{"jobId":"c8355ea5-057e-4430-bde8-b2fe541f1169"}
+
{"jobId":"8fcb3686-5be4-47bb-8061-6a8ab1565b2b"}
@@ -11177,7 +11282,7 @@
7.
-
{"jobId":"3f3f6c70-03e6-48b4-bc5d-a25a84afa794"}
+
{"jobId":"8a080fce-f66c-435b-97e4-07e80eb2ca96"}
@@ -11351,7 +11456,7 @@
7.6.25.9. Web Scan login
-
{"jobId":"30382244-a9df-4cb0-8518-b57c9e9240e4"}
+
{"jobId":"8aea5312-dc3b-4dde-a178-9b1ecff98b68"}
@@ -11462,6 +11567,31 @@
7.6.25.10. Web Sc

Webscan login definition

+

webScan.login.totp

+

Object

+

Optional TOTP configuration as an additional authentication factor.

+ + +

webScan.login.totp.seed

+

String

+

The seed/secret for the TOTP generation. If TOTP is configured this parameter is mandatory.

+ + +

webScan.login.totp.validityInSeconds

+

Number

+

The time in seconds the generated TOTP is valid. In most cases nothing is specified and the default of '30' seconds is used.

+ + +

webScan.login.totp.tokenLength

+

Number

+

The length of the generated TOTP. In most cases nothing is specified and the default length '6' is used.

+ + +

webScan.login.totp.hashAlgorithm

+

String

+

The hash algorithm to generate the TOTP. In most cases nothing is specified and the default hash algorithm 'HMAC_SHA1' is used. Currently available values are: 'HMAC_SHA1', 'HMAC_SHA256', 'HMAC_SHA512'

+ +

webScan.login.url

String

Login URL

@@ -11537,7 +11667,7 @@
7.6.25.10. Web Sc
$ curl 'https://sechub.example.com/api/project/project1/job' -i -X POST \
     -H 'Content-Type: application/json;charset=UTF-8' \
-    -d '{"webScan":{"login":{"url":"https://localhost/mywebapp/login","form":{"script":{"pages":[{"actions":[{"type":"USERNAME","selector":"#example_login_userid","value":"username1","description":"the username field"},{"type":"INPUT","selector":"#example_login_email_id","value":"user@example.com","description":"The email id field."}]},{"actions":[{"type":"WAIT","value":"2345","unit":"MILLISECOND"},{"type":"PASSWORD","selector":"#example_login_pwd","value":"Super$ecret234!"},{"type":"CLICK","selector":"#example_login_button"}]}]}}},"url":"https://localhost/mywebapp"},"apiVersion":"1.0"}'
+ -d '{"webScan":{"login":{"url":"https://localhost/mywebapp/login","form":{"script":{"pages":[{"actions":[{"type":"USERNAME","selector":"#example_login_userid","value":"username1","description":"the username field"},{"type":"INPUT","selector":"#example_login_email_id","value":"user@example.com","description":"The email id field."}]},{"actions":[{"type":"WAIT","value":"2345","unit":"MILLISECOND"},{"type":"PASSWORD","selector":"#example_login_pwd","value":"Super$ecret234!"},{"type":"CLICK","selector":"#example_login_button"}]}]}},"totp":{"seed":"example-seed","validityInSeconds":30,"tokenLength":6,"hashAlgorithm":"HMAC_SHA1"}},"url":"https://localhost/mywebapp"},"apiVersion":"1.0"}'
@@ -11545,7 +11675,7 @@
7.6.25.10. Web Sc
-
{"jobId":"a5f8631a-5380-40d7-80d2-0b648dcafbd3"}
+
{"jobId":"d908eed3-d118-4bf1-b240-f4e502e8ceb5"}
@@ -11709,7 +11839,7 @@
7.6.25.11. Web Scan headers v
-
{"jobId":"e3e02b1e-67c2-4854-a772-c1740b2317b6"}
+
{"jobId":"068eb212-10eb-4554-ac93-701d685b5674"}
@@ -11798,7 +11928,7 @@

7.6.26. User uploads source code

-
$ curl 'https://sechub.example.com/api/project/project1/job/6ed8868d-6acb-42c3-9cad-cfb0e0c0e1ff/sourcecode?checkSum=checkSumValue' -i -X POST \
+
$ curl 'https://sechub.example.com/api/project/project1/job/221af20b-5fef-4331-80c3-648fab489365/sourcecode?checkSum=checkSumValue' -i -X POST \
     -H 'Content-Type: multipart/form-data;charset=UTF-8' \
     -F 'file=PK  
       �<M                       test1.txtPK  ?
@@ -11895,7 +12025,7 @@ 

7.6.27. User approves sechub job

-
$ curl 'https://sechub.example.com/api/project/project1/job/ce0c8727-a594-46c8-ab3f-96f9d6888345/approve' -i -X PUT \
+
$ curl 'https://sechub.example.com/api/project/project1/job/da906539-b1c6-4723-98b6-11a871317b3d/approve' -i -X PUT \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -12047,7 +12177,7 @@

7.6.28. User checks sechub job state

-
$ curl 'https://sechub.example.com/api/project/project1/job/22fdf699-34d2-41f6-8765-a08f8d2206e4' -i -X GET \
+
$ curl 'https://sechub.example.com/api/project/project1/job/9519195b-5980-47e8-b148-a5e4ced013dd' -i -X GET \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -12056,7 +12186,7 @@

7.6.28. User checks sechub job state

-
{"jobUUID":"22fdf699-34d2-41f6-8765-a08f8d2206e4","owner":"CREATOR1","created":"","started":"2024-09-30T15:03:07.694934081","ended":"2024-09-30T15:18:07.694964117","state":"ENDED","result":"OK","trafficLight":"GREEN"}
+
{"jobUUID":"9519195b-5980-47e8-b148-a5e4ced013dd","owner":"CREATOR1","created":"","started":"2024-10-18T10:24:13.895149495","ended":"2024-10-18T10:39:13.895175654","state":"ENDED","result":"OK","trafficLight":"GREEN"}
@@ -12131,7 +12261,7 @@
7.6.29.1. JSON variant
-
$ curl 'https://sechub.example.com/api/project/project1/report/3d2d7e4f-cd76-4e0a-b4d4-fc89ab02277a' -i -u 'user:secret' -X GET \
+
$ curl 'https://sechub.example.com/api/project/project1/report/653d0fb6-bff9-4495-bc08-42b235cdd1fb' -i -u 'user:secret' -X GET \
     -H 'Content-Type: application/json;charset=UTF-8' \
     -H 'Accept: application/json'
@@ -12203,7 +12333,7 @@
7.6.29.2. HTML variant
-
$ curl 'https://sechub.example.com/api/project/project1/report/eb7a151e-0882-4ee7-a276-445783e780fa' -i -u 'user:secret' -X GET \
+
$ curl 'https://sechub.example.com/api/project/project1/report/1849bd53-08c4-4440-8422-443aee1ae81e' -i -u 'user:secret' -X GET \
     -H 'Content-Type: application/json;charset=UTF-8' \
     -H 'Accept: application/xhtml+xml'
@@ -12831,7 +12961,7 @@

7.6.33. User uploads binaries

-
$ curl 'https://sechub.example.com/api/project/project1/job/3b427a31-2dba-42b4-b0d8-8625814493b3/binaries' -i -X POST \
+
$ curl 'https://sechub.example.com/api/project/project1/job/ad80d3d1-5f66-4e93-99e6-319616991b42/binaries' -i -X POST \
     -H 'Content-Type: multipart/form-data;charset=UTF-8' \
     -H 'x-file-size: 10240' \
     -F 'file=test1.txt                                                                                           0000664 0001750 0001750 00000000000 13353454574 012170  0                                                                                                    ustar   albert                          albert                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ' \
@@ -12912,7 +13042,7 @@ 

7.6.34. User downloads job rep

-
$ curl 'https://sechub.example.com/api/project/project1/report/spdx/64ebec0a-6d7b-42f8-8a1d-0aa3ddebd86a' -i -u 'user:secret' -X GET \
+
$ curl 'https://sechub.example.com/api/project/project1/report/spdx/e063db4e-c2a9-4722-adf9-b4c07482d3cc' -i -u 'user:secret' -X GET \
     -H 'Content-Type: application/json;charset=UTF-8' \
     -H 'Accept: application/json'
@@ -13562,7 +13692,7 @@

7.6.41. Admin lists all running jobs

-
[{"jobUUID":"97de3eef-a5eb-4ebd-adeb-af3904149cb2","projectId":"project-name","owner":"owner-userid","status":"RUNNING","since":"2024-09-30T15:18:12.338065607"}]
+
[{"jobUUID":"851c6c76-d79c-448a-bd92-569e97b4970a","projectId":"project-name","owner":"owner-userid","status":"RUNNING","since":"2024-10-18T10:39:18.680340115"}]
@@ -13646,7 +13776,7 @@

7.6.42. Admin cancels a job

-
$ curl 'https://sechub.example.com/api/admin/jobs/cancel/846d1dab-b659-4a32-abb7-58573c159e84' -i -u 'user:secret' -X POST \
+
$ curl 'https://sechub.example.com/api/admin/jobs/cancel/1ac99e8c-fd70-49e6-8acf-da617638761e' -i -u 'user:secret' -X POST \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -13735,7 +13865,7 @@

7.6.43. Admin restarts a job

-
$ curl 'https://sechub.example.com/api/admin/jobs/restart/229ed548-90e5-46f4-9c1f-724f7661180b' -i -u 'user:secret' -X POST \
+
$ curl 'https://sechub.example.com/api/admin/jobs/restart/03d0e930-5f85-4b90-9cf4-781c553a0ac6' -i -u 'user:secret' -X POST \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -13824,7 +13954,7 @@

7.6.44. Admin restarts a job (hard)

-
$ curl 'https://sechub.example.com/api/admin/jobs/restart-hard/1a497618-8adc-4f95-b71d-f4c8ba1d3510' -i -u 'user:secret' -X POST \
+
$ curl 'https://sechub.example.com/api/admin/jobs/restart-hard/142dc34d-4bb3-44b2-a198-3b3e4b7fe3be' -i -u 'user:secret' -X POST \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -14357,7 +14487,7 @@

7.6.49. Admin creates an execut
-
4454fcf2-50a0-4fa1-ac3f-4e1f9983e136
+
e44135e8-3a64-4ac5-9324-f3bbc1b03623
@@ -14441,7 +14571,7 @@

7.6.50. Admin deletes executor con
-
$ curl 'https://sechub.example.com/api/admin/config/executor/96370d25-dd95-491e-8cd3-9f6a267c7773' -i -u 'user:secret' -X DELETE \
+
$ curl 'https://sechub.example.com/api/admin/config/executor/6d4dc911-39f4-41e7-8e92-76e2791e0431' -i -u 'user:secret' -X DELETE \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -14556,7 +14686,7 @@

7.6.51. Admin fetches executo
-
{"executorConfigurations":[{"uuid":"ab0ff465-0738-4f00-8511-02904b96d045","name":"example configuration","enabled":true}],"type":"executorConfigurationList"}
+
{"executorConfigurations":[{"uuid":"ed006aa5-2969-46eb-a681-397c61de0e73","name":"example configuration","enabled":true}],"type":"executorConfigurationList"}
@@ -14709,7 +14839,7 @@

7.6.52. Admin fetches executor con
-
$ curl 'https://sechub.example.com/api/admin/config/executor/79528b65-cde8-4a82-8bdb-15d3087bfcdc' -i -u 'user:secret' -X GET \
+
$ curl 'https://sechub.example.com/api/admin/config/executor/0c52c7be-a360-4102-bfb4-7c949e05a8b9' -i -u 'user:secret' -X GET \
     -H 'Content-Type: application/json;charset=UTF-8'
@@ -14718,7 +14848,7 @@

7.6.52. Admin fetches executor con
-
{"uuid":"79528b65-cde8-4a82-8bdb-15d3087bfcdc","name":"New name","productIdentifier":"PDS_CODESCAN","setup":{"baseURL":"https://product.example.com","credentials":{"user":"env:EXAMPLE_USENAME","password":"env:EXAMPLE_PASSWORD"},"jobParameters":[{"key":"example.key1","value":"A value"}]},"executorVersion":1,"enabled":false}
+
{"uuid":"0c52c7be-a360-4102-bfb4-7c949e05a8b9","name":"New name","productIdentifier":"PDS_CODESCAN","setup":{"baseURL":"https://product.example.com","credentials":{"user":"env:EXAMPLE_USENAME","password":"env:EXAMPLE_PASSWORD"},"jobParameters":[{"key":"example.key1","value":"A value"}]},"executorVersion":1,"enabled":false}
@@ -14866,7 +14996,7 @@

7.6.53. Admin updates execut
-
$ curl 'https://sechub.example.com/api/admin/config/executor/dbc377cb-365e-4f67-966f-02e821e2ecf5' -i -u 'user:secret' -X PUT \
+
$ curl 'https://sechub.example.com/api/admin/config/executor/3531018e-34ce-48e5-a20a-42e46c5b2c4d' -i -u 'user:secret' -X PUT \
     -H 'Content-Type: application/json;charset=UTF-8' \
     -d '{"name":"New name","productIdentifier":"PDS_CODESCAN","executorVersion":1,"enabled":false,"setup":{"baseURL":"https://productNew.example.com","credentials":{"user":"env:EXAMPLE_NEW_USENAME","password":"env:EXAMPLE_NEW_PASSWORD"},"jobParameters":[{"key":"example.key1","value":"A value but changed. Remark: the other parameter (example.key2) has been removed by this call"}]}}'
@@ -15210,7 +15340,7 @@

7.6.56. Admin updates execution profile
$ curl 'https://sechub.example.com/api/admin/config/execution/profile/existing-profile-1' -i -u 'user:secret' -X PUT \
     -H 'Content-Type: application/json;charset=UTF-8' \
-    -d '{"description":"changed description","configurations":[{"uuid":"87475ae8-285d-43ac-88d1-811d5a739cd9","executorVersion":0,"enabled":false,"setup":{"credentials":{},"jobParameters":[]}}],"enabled":true}'
+ -d '{"description":"changed description","configurations":[{"uuid":"10e16549-96a9-4274-af62-2f2f3cc0c43c","executorVersion":0,"enabled":false,"setup":{"credentials":{},"jobParameters":[]}}],"enabled":true}'

@@ -15366,7 +15496,7 @@

7.6.57. Admin fetches execution profile

-
{"description":"a description","enabled":true,"configurations":[{"uuid":"946f1b13-5186-4b43-b393-725061cf0c4f","name":"New name","productIdentifier":"PDS_CODESCAN","setup":{"baseURL":"https://product.example.com","credentials":{"user":"env:EXAMPLE_USENAME","password":"env:EXAMPLE_PASSWORD"},"jobParameters":[{"key":"example.key1","value":"A value but changed. Remark: the other parameter (example.key2) has been removed by this call"}]},"executorVersion":1,"enabled":false}],"projectIds":["project-1","project-2"]}
+
{"description":"a description","enabled":true,"configurations":[{"uuid":"9af28382-9a87-439f-b541-299bc82e9fa3","name":"New name","productIdentifier":"PDS_CODESCAN","setup":{"baseURL":"https://product.example.com","credentials":{"user":"env:EXAMPLE_USENAME","password":"env:EXAMPLE_PASSWORD"},"jobParameters":[{"key":"example.key1","value":"A value but changed. Remark: the other parameter (example.key2) has been removed by this call"}]},"executorVersion":1,"enabled":false}],"projectIds":["project-1","project-2"]}
@@ -16013,7 +16143,7 @@

7.6.64. Admin fetches encryption status
-
{"type":"encryptionStatus","domains":[{"name":"schedule","data":[{"id":"1","algorithm":"AES_GCM_SIV_256","passwordSource":{"type":"ENVIRONMENT_VARIABLE","data":"SECRET_1"},"usage":{"job.state.cancel_requested":4,"job.state.canceled":5,"job.state.ended":6,"job.state.initializing":1,"job.state.ready_to_start":2,"job.state.started":3},"createdFrom":"admin-username","created":"2024-08-01T09:26:00"}]}]}
+
{"type":"encryptionStatus","domains":[{"name":"schedule","data":[{"id":"1","algorithm":"AES_GCM_SIV_256","passwordSource":{"type":"ENVIRONMENT_VARIABLE","data":"SECRET_1"},"usage":{"job.state.cancel_requested":4,"job.state.canceled":5,"job.state.ended":8,"job.state.initializing":1,"job.state.ready_to_start":2,"job.state.resuming":7,"job.state.started":3,"job.state.suspended":6},"createdFrom":"admin-username","created":"2024-08-01T09:26:00"}]}]}
@@ -16561,7 +16691,7 @@

7.6.70. User lists jobs for project

-
{"page":0,"totalPages":1,"content":[{"jobUUID":"cd3e88bf-9145-4c66-85d2-b42c1b26466c","executedBy":"User1","created":"2024-09-30T15:01:07.858766366","started":"2024-09-30T15:03:07.85881128","ended":"2024-09-30T15:18:07.858826619","executionState":"ENDED","trafficLight":"GREEN","executionResult":"OK","metaData":{"labels":{"stage":"test"}}}]}
+
{"page":0,"totalPages":1,"content":[{"jobUUID":"fe4b0e69-dea1-4500-8349-8c13da22d627","executedBy":"User1","created":"2024-10-18T10:22:14.087376227","started":"2024-10-18T10:24:14.08740983","ended":"2024-10-18T10:39:14.087431199","executionState":"ENDED","trafficLight":"GREEN","executionResult":"OK","metaData":{"labels":{"stage":"test"}}}]}
@@ -16600,7 +16730,7 @@
7.7.2.1. Overview
7.7.2.1.1. Diagram
-Sequence diagram of messaging overview +Sequence diagram of messaging overview
@@ -16654,6 +16784,9 @@