From 9561c0ab069b622d45c0ef010346de9a26f8159e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 11:41:47 +0100 Subject: [PATCH] [Backport 4.4-2.3-wzd] Add header and footer report customization (#4782) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add header and footer report customization (#4505) * feat(settings): centralize the plugin settings Create the plugin setting schema Define the current plugin settings Remove refactored code * feat(settings): add setting services and replaced the references to constants * feat(settings): refactor the content of the default configuration file Use dynamically the definition of the plugin settings * feat(inputs): create new inputs components Add new hooks to manage when a input value or form has changed Add new inputs components * feat(configuration): refactor the form of Settings/Configuration Refactor Header, BottomBar, Configuration components Remove deprecated files * feat(settings): support updating multiple setting at the same time Changed the endpoint that updating the plugin setting to support multiple settings at the same time Refactor the getConfiguration service. Split the logic to: - Read the file and transform to JSON - Obfuscate the password key of the host configuration * feat: add validation to the plugin settings Create services to validate Add the validation to the plugin settings * feat(validation): add validation to the `PUT /utils/configuration` endpoint * feat(validation): add validation to the configuration form in `Settings/Configuration` * feat(validatio): remove no used import * clean: remove not used code * Add report header-footer configuration * fix: fixed category name in `Settings/Configuration` * fix(settings): Fix accessing to `validate` of undefined error * fix(settings): fixed error due to missing service * Fix custom logo ratio in PDF sheet * fix(settings): refactor the form and inputs of `Settings/Configuration` to control the global state of the form * fix: add value transformation for the form inputs and output of fields changed * fix: Fixed some settings validation * fix(settings): fixed validation of literals * fix(settings): removed unused import * fix(settings): renamed properties related to transform the value of the input * feat(settings): add description to the plugin setting definition properties * fix(settings): fix getConfiguration service when the configuration file has no `hosts` entry * fix(settings): Fixed error when do changes of the `useForm` hook an rename methods of this * tests(settings): add test related to the plugin settings and its configuration from the UI * feat(settings): rename plugin setting options of type select to match its type * feat(settings): add plugin settings services and enhance the description of the plugin settings in default configuration file and UI * tests(input-form): update tests of InputForm component * test(configuration-file): add tests of the default configuration file * feat(settings): remove `extensions.mitre` plugin setting * test(settings): add test to validate the plugin setting when updating it through PUT /utils/configuration fix some plugin settings validation * feat(settings): add documentation to some setting services and test some of them * fix: fixed documentation of setting service * doc(settings): move the documentation of the plugin setting properties * fix(settings): rename some plugin setting properties because of request changes - Rename plugin setting properties: - `default` to `defaultValue` - `defaultHidden` to `defaultValueIfNotSet` - `configurableFile` to `isConfigurableFromFile` - configurableUI` to `isConfigurableFromUI` - `requireHealthCheck` to `requiresRunningHealthCheck` - `requireReload` to `requiresReloadingBrowserTab` - `requireRestart` to `requiresRestartingPluginPlatform` - Fix tests * tests: fix tests of InputForm component * fix: response properties when saving the configuration * fix(settings): fix validation plugin settings value in the UI * fix(settings): fix `customization.reports.header` and `customization.reports.footer` setting properties * fix(settings): fix validation of numbers * fix(settings): fix validation of numbers * test(settings): Add tests related to validation for the `useForm` hook and the `InputForm` component * fix(settings): fix displaying toast to run the healthcheck when saving the configuration * test(settings): add tests for the `customization.reports.footer` and `customization.reports.header` settings * Added category sorting + description + docs link * Added settings sorting within their category * Fixed constant types definition * Checks if localCompare exists validation * fix(settings): fixed plugin setting description doesn't display the minimum number value when it is falsy (0) * fix(settings): fix setting type of `wazuh.monitoring.replicas` and limit the valid number for the number input * feat(settins): add plugin settings category description * fix(settings): fix a problem comparing the initial and current value for the plugin settings of the `number` type * fix(settings): fix wrong conflict resolution * fix(settings): fix typo in setting description * Add set custom header footer unit test * feat(settings): enhance the validation of plugin settings related to indices or index patterns taking in account the supported characters * feat(settings): add validation of setting values in the inputs * Added unit test to verify the PDF report integrity * fix(tests): format tables of the tests * fix: remove unnecessary import * test(endpoints): add test to GET /reports endpoint * Improved report unit test with more cases * Fix small typo * fix(settings): fix a typo in a toast related to modify the plugin settings from UI * Changed Custom Branding documentation link * Merge centralize plugin settings PR * Fix white-labeling documentation link * Code format * Delete unused imports * fix(settings): fix a problem with the useForm hook * fix(settings): refactor the settings validation function to a class and rename the file * feat(settings): add check for integer numbers and adapt the affected settings * test: fix tests * Set textArea size * Add max character length validation * test(settings): fix tests * changelog: add PR entry * test(settings): format tests Co-authored-by: Antonio David Gutiérrez Co-authored-by: Álex (cherry picked from commit ce29034e17045a808b43390f314b44fbf2c7c8e2) Co-authored-by: Federico Rodriguez --- CHANGELOG.md | 1 + common/constants.ts | 55 +- common/plugin-settings.test.ts | 468 +++++++++--------- common/services/settings-validator.ts | 7 +- .../form/__snapshots__/index.test.tsx.snap | 11 + public/components/common/form/index.test.tsx | 15 +- public/components/common/form/index.tsx | 2 + .../common/form/input_text_area.tsx | 15 + .../components/category/category.tsx | 1 - .../settings/configuration/configuration.tsx | 2 +- server/lib/reporting/printer.ts | 67 ++- server/routes/wazuh-reporting.test.ts | 311 ++++++++---- server/routes/wazuh-utils/wazuh-utils.test.ts | 438 ++++++++-------- 13 files changed, 823 insertions(+), 570 deletions(-) create mode 100644 public/components/common/form/input_text_area.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index fd76da48fc..23257743e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to the Wazuh app project will be documented in this file. - Redesign the SCA table from agent's dashboard [#4512](https://github.com/wazuh/wazuh-kibana-app/pull/4512) - Enhanced the plugin setting description displayed in the UI and the configuration file. [#4501](https://github.com/wazuh/wazuh-kibana-app/pull/4501) - Added validation to the plugin settings in the form of `Settings/Configuration` and the endpoint to update the plugin configuration [#4503](https://github.com/wazuh/wazuh-kibana-app/pull/4503) +- Added new plugin settings to customize the header and footer on the PDF reports [#4505](https://github.com/wazuh/wazuh-kibana-app/pull/4505) ### Changed diff --git a/common/constants.ts b/common/constants.ts index 6c3d0143b3..98c9fd5276 100644 --- a/common/constants.ts +++ b/common/constants.ts @@ -357,6 +357,11 @@ export enum SettingCategory { CUSTOMIZATION, }; +type TPluginSettingOptionsTextArea = { + rowsSize?: number + maxLength?: number +}; + type TPluginSettingOptionsSelect = { select: { text: string, value: any }[] }; @@ -441,7 +446,13 @@ export type TPluginSetting = { // Modify the setting requires restarting the plugin platform to take effect. requiresRestartingPluginPlatform?: boolean // Define options related to the `type`. - options?: TPluginSettingOptionsNumber | TPluginSettingOptionsEditor | TPluginSettingOptionsFile | TPluginSettingOptionsSelect | TPluginSettingOptionsSwitch + options?: + TPluginSettingOptionsEditor | + TPluginSettingOptionsFile | + TPluginSettingOptionsNumber | + TPluginSettingOptionsSelect | + TPluginSettingOptionsSwitch | + TPluginSettingOptionsTextArea // Transform the input value. The result is saved in the form global state of Settings/Configuration uiFormTransformChangedInputValue?: (value: any) => any // Transform the configuration value or default as initial value for the input in Settings/Configuration @@ -544,7 +555,6 @@ export const PLUGIN_SETTINGS: { [key: string]: TPluginSetting } = { validateBackend: function(schema){ return schema.boolean(); }, - }, "checks.fields": { title: "Known fields", @@ -1071,6 +1081,46 @@ export const PLUGIN_SETTINGS: { [key: string]: TPluginSetting } = { )(value) }, }, + "customization.reports.footer": { + title: "Reports footer", + description: "Set the footer of the reports.", + category: SettingCategory.CUSTOMIZATION, + type: EpluginSettingType.textarea, + defaultValue: "", + defaultValueIfNotSet: REPORTS_PAGE_FOOTER_TEXT, + isConfigurableFromFile: true, + isConfigurableFromUI: true, + options: { rowsSize: 2, maxLength: 30 }, + validate: function (value) { + return SettingsValidator.multipleLinesString({ + max: this.options.rowsSize, + maxLength: this.options.maxLength + })(value) + }, + validateBackend: function (schema) { + return schema.string({ validate: this.validate.bind(this) }); + }, + }, + "customization.reports.header": { + title: "Reports header", + description: "Set the header of the reports.", + category: SettingCategory.CUSTOMIZATION, + type: EpluginSettingType.textarea, + defaultValue: "", + defaultValueIfNotSet: REPORTS_PAGE_HEADER_TEXT, + isConfigurableFromFile: true, + isConfigurableFromUI: true, + options: { rowsSize: 3, maxLength: 20 }, + validate: function (value) { + return SettingsValidator.multipleLinesString({ + max: this.options.rowsSize, + maxLength: this.options?.maxLength + })(value) + }, + validateBackend: function(schema){ + return schema.string({validate: this.validate?.bind(this)}); + }, + }, "disabled_roles": { title: "Disable roles", description: "Disabled the plugin visibility for users with the roles.", @@ -1784,7 +1834,6 @@ export const PLUGIN_SETTINGS: { [key: string]: TPluginSetting } = { export type TPluginSettingKey = keyof typeof PLUGIN_SETTINGS; - export enum HTTP_STATUS_CODES { CONTINUE = 100, SWITCHING_PROTOCOLS = 101, diff --git a/common/plugin-settings.test.ts b/common/plugin-settings.test.ts index d67e514eab..d68f6dc4d2 100644 --- a/common/plugin-settings.test.ts +++ b/common/plugin-settings.test.ts @@ -2,235 +2,245 @@ import { PLUGIN_SETTINGS } from "./constants"; describe('[settings] Input validation', () => { it.each` - setting | value | expectedValidation - ${'alerts.sample.prefix'} | ${'test'} | ${undefined} - ${'alerts.sample.prefix'} | ${''} | ${"Value can not be empty."} - ${'alerts.sample.prefix'} | ${'test space'} | ${"No whitespaces allowed."} - ${'alerts.sample.prefix'} | ${'-test'} | ${"It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'_test'} | ${"It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'+test'} | ${"It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'.test'} | ${"It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'checks.api'} | ${true} | ${undefined} - ${'checks.api'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.fields'} | ${true} | ${undefined} - ${'checks.fields'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.maxBuckets'} | ${true} | ${undefined} - ${'checks.maxBuckets'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.pattern'} | ${true} | ${undefined} - ${'checks.pattern'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.setup'} | ${true} | ${undefined} - ${'checks.setup'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.template'} | ${true} | ${undefined} - ${'checks.template'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'checks.timeFilter'} | ${true} | ${undefined} - ${'checks.timeFilter'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'cron.prefix'} | ${'test'} | ${undefined} - ${'cron.prefix'} | ${'test space'} | ${"No whitespaces allowed."} - ${'cron.prefix'} | ${''} | ${"Value can not be empty."} - ${'cron.prefix'} | ${'-test'} | ${"It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'_test'} | ${"It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'+test'} | ${"It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'.test'} | ${"It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.apis'} | ${['test']} | ${undefined} - ${'cron.statistics.apis'} | ${['test ']} | ${"No whitespaces allowed."} - ${'cron.statistics.apis'} | ${['']} | ${"Value can not be empty."} - ${'cron.statistics.apis'} | ${['test', 4]} | ${"Value is not a string."} - ${'cron.statistics.apis'} | ${'test space'} | ${"Value is not a valid list."} - ${'cron.statistics.apis'} | ${true} | ${"Value is not a valid list."} - ${'cron.statistics.index.creation'} | ${'h'} | ${undefined} - ${'cron.statistics.index.creation'} | ${'d'} | ${undefined} - ${'cron.statistics.index.creation'} | ${'w'} | ${undefined} - ${'cron.statistics.index.creation'} | ${'m'} | ${undefined} - ${'cron.statistics.index.creation'} | ${'test'} | ${"Invalid value. Allowed values: h, d, w, m."} - ${'cron.statistics.index.name'} | ${'test'} | ${undefined} - ${'cron.statistics.index.name'} | ${''} | ${"Value can not be empty."} - ${'cron.statistics.index.name'} | ${'test space'} | ${"No whitespaces allowed."} - ${'cron.statistics.index.name'} | ${'-test'} | ${"It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'_test'} | ${"It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'+test'} | ${"It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'.test'} | ${"It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.replicas'} | ${0} | ${undefined} - ${'cron.statistics.index.replicas'} | ${-1} | ${"Value should be greater or equal than 0."} - ${'cron.statistics.index.replicas'} | ${'1.2'} | ${'Number should be an integer.'} - ${'cron.statistics.index.replicas'} | ${1.2} | ${'Number should be an integer.'} - ${'cron.statistics.index.shards'} | ${1} | ${undefined} - ${'cron.statistics.index.shards'} | ${-1} | ${"Value should be greater or equal than 1."} - ${'cron.statistics.index.shards'} | ${'1.2'} | ${'Number should be an integer.'} - ${'cron.statistics.index.shards'} | ${1.2} | ${'Number should be an integer.'} - ${'cron.statistics.interval'} | ${'0 */5 * * * *'} | ${undefined} - ${'cron.statistics.interval'} | ${'0 */5 * * *'} | ${undefined} - ${'cron.statistics.interval'} | ${'custom'} | ${"Interval is not valid."} - ${'cron.statistics.interval'} | ${true} | ${"Interval is not valid."} - ${'cron.statistics.status'} | ${true} | ${undefined} - ${'cron.statistics.status'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'customization.logo.app'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} - ${'customization.logo.app'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} - ${'customization.logo.app'} | ${{size: 124000, name: 'image.png'}} | ${undefined} - ${'customization.logo.app'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} - ${'customization.logo.app'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} - ${'customization.logo.app'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} - ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} - ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} - ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.png'}} | ${undefined} - ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} - ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} - ${'customization.logo.healthcheck'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} - ${'customization.logo.reports'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} - ${'customization.logo.reports'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} - ${'customization.logo.reports'} | ${{size: 124000, name: 'image.png'}} | ${undefined} - ${'customization.logo.reports'} | ${{size: 124000, name: 'image.svg'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png.'} - ${'customization.logo.reports'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png.'} - ${'customization.logo.reports'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} - ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} - ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} - ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.png'}} | ${undefined} - ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} - ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} - ${'customization.logo.sidebar'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} - ${'disabled_roles'} | ${['test']} | ${undefined} - ${'disabled_roles'} | ${['']} | ${'Value can not be empty.'} - ${'disabled_roles'} | ${['test space']} | ${"No whitespaces allowed."} - ${'disabled_roles'} | ${['test', 4]} | ${"Value is not a string."} - ${'enrollment.dns'} | ${'test'} | ${undefined} - ${'enrollment.dns'} | ${''} | ${undefined} - ${'enrollment.dns'} | ${'test space'} | ${"No whitespaces allowed."} - ${'enrollment.password'} | ${'test'} | ${undefined} - ${'enrollment.password'} | ${''} | ${"Value can not be empty."} - ${'enrollment.password'} | ${'test space'} | ${undefined} - ${'extensions.audit'} | ${true} | ${undefined} - ${'extensions.audit'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.aws'} | ${true} | ${undefined} - ${'extensions.aws'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.ciscat'} | ${true} | ${undefined} - ${'extensions.ciscat'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.gcp'} | ${true} | ${undefined} - ${'extensions.gcp'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.gdpr'} | ${true} | ${undefined} - ${'extensions.gdpr'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.hipaa'} | ${true} | ${undefined} - ${'extensions.hipaa'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.nist'} | ${true} | ${undefined} - ${'extensions.nist'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.oscap'} | ${true} | ${undefined} - ${'extensions.oscap'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.osquery'} | ${true} | ${undefined} - ${'extensions.osquery'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.pci'} | ${true} | ${undefined} - ${'extensions.pci'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.tsc'} | ${true} | ${undefined} - ${'extensions.tsc'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'extensions.virustotal'} | ${true} | ${undefined} - ${'extensions.virustotal'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} - ${'ip.ignore'} | ${['test']} | ${undefined} - ${'ip.ignore'} | ${['test*']} | ${undefined} - ${'ip.ignore'} | ${['']} | ${'Value can not be empty.'} - ${'ip.ignore'} | ${['test space']} | ${"No whitespaces allowed."} - ${'ip.ignore'} | ${true} | ${"Value is not a valid list."} - ${'ip.ignore'} | ${['-test']} | ${"It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['_test']} | ${"It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['+test']} | ${"It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['.test']} | ${"It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['test\\']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test/']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test?']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test"']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test<']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test>']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test|']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test,']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test#']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test', 'test#']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.selector'} | ${true} | ${undefined} - ${'ip.selector'} | ${''} | ${'It should be a boolean. Allowed values: true or false.'} - ${'logs.level'} | ${'info'} | ${undefined} - ${'logs.level'} | ${'debug'} | ${undefined} - ${'logs.level'} | ${''} | ${'Invalid value. Allowed values: info, debug.'} - ${'pattern'} | ${'test'} | ${undefined} - ${'pattern'} | ${'test*'} | ${undefined} - ${'pattern'} | ${''} | ${'Value can not be empty.'} - ${'pattern'} | ${'test space'} | ${"No whitespaces allowed."} - ${'pattern'} | ${'-test'} | ${"It can't start with: -, _, +, .."} - ${'pattern'} | ${'_test'} | ${"It can't start with: -, _, +, .."} - ${'pattern'} | ${'+test'} | ${"It can't start with: -, _, +, .."} - ${'pattern'} | ${'.test'} | ${"It can't start with: -, _, +, .."} - ${'pattern'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'timeout'} | ${15000} | ${undefined} - ${'timeout'} | ${1000} | ${'Value should be greater or equal than 1500.'} - ${'timeout'} | ${''} | ${'Value should be greater or equal than 1500.'} - ${'timeout'} | ${'1.2'} | ${'Number should be an integer.'} - ${'timeout'} | ${1.2} | ${'Number should be an integer.'} - ${'wazuh.monitoring.creation'} | ${'h'} | ${undefined} - ${'wazuh.monitoring.creation'} | ${'d'} | ${undefined} - ${'wazuh.monitoring.creation'} | ${'w'} | ${undefined} - ${'wazuh.monitoring.creation'} | ${'m'} | ${undefined} - ${'wazuh.monitoring.creation'} | ${'test'} | ${"Invalid value. Allowed values: h, d, w, m."} - ${'wazuh.monitoring.enabled'} | ${true} | ${undefined} - ${'wazuh.monitoring.frequency'} | ${100} | ${undefined} - ${'wazuh.monitoring.frequency'} | ${40} | ${"Value should be greater or equal than 60."} - ${'wazuh.monitoring.frequency'} | ${'1.2'} | ${'Number should be an integer.'} - ${'wazuh.monitoring.frequency'} | ${1.2} | ${'Number should be an integer.'} - ${'wazuh.monitoring.pattern'} | ${'test'} | ${undefined} - ${'wazuh.monitoring.pattern'} | ${'test*'} | ${undefined} - ${'wazuh.monitoring.pattern'} | ${''} | ${'Value can not be empty.'} - ${'wazuh.monitoring.pattern'} | ${'-test'} | ${"It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'_test'} | ${"It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'+test'} | ${"It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'.test'} | ${"It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.replicas'} | ${0} | ${undefined} - ${'wazuh.monitoring.replicas'} | ${-1} | ${"Value should be greater or equal than 0."} - ${'wazuh.monitoring.replicas'} | ${'1.2'} | ${'Number should be an integer.'} - ${'wazuh.monitoring.replicas'} | ${1.2} | ${'Number should be an integer.'} - ${'wazuh.monitoring.shards'} | ${1} | ${undefined} - ${'wazuh.monitoring.shards'} | ${-1} | ${"Value should be greater or equal than 1."} - ${'wazuh.monitoring.shards'} | ${'1.2'} | ${'Number should be an integer.'} - ${'wazuh.monitoring.shards'} | ${1.2} | ${'Number should be an integer.'} + setting | value | expectedValidation + ${'alerts.sample.prefix'} | ${'test'} | ${undefined} + ${'alerts.sample.prefix'} | ${''} | ${"Value can not be empty."} + ${'alerts.sample.prefix'} | ${'test space'} | ${"No whitespaces allowed."} + ${'alerts.sample.prefix'} | ${'-test'} | ${"It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'_test'} | ${"It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'+test'} | ${"It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'.test'} | ${"It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'checks.api'} | ${true} | ${undefined} + ${'checks.api'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.fields'} | ${true} | ${undefined} + ${'checks.fields'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.maxBuckets'} | ${true} | ${undefined} + ${'checks.maxBuckets'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.pattern'} | ${true} | ${undefined} + ${'checks.pattern'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.setup'} | ${true} | ${undefined} + ${'checks.setup'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.template'} | ${true} | ${undefined} + ${'checks.template'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'checks.timeFilter'} | ${true} | ${undefined} + ${'checks.timeFilter'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'cron.prefix'} | ${'test'} | ${undefined} + ${'cron.prefix'} | ${'test space'} | ${"No whitespaces allowed."} + ${'cron.prefix'} | ${''} | ${"Value can not be empty."} + ${'cron.prefix'} | ${'-test'} | ${"It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'_test'} | ${"It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'+test'} | ${"It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'.test'} | ${"It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.apis'} | ${['test']} | ${undefined} + ${'cron.statistics.apis'} | ${['test ']} | ${"No whitespaces allowed."} + ${'cron.statistics.apis'} | ${['']} | ${"Value can not be empty."} + ${'cron.statistics.apis'} | ${['test', 4]} | ${"Value is not a string."} + ${'cron.statistics.apis'} | ${'test space'} | ${"Value is not a valid list."} + ${'cron.statistics.apis'} | ${true} | ${"Value is not a valid list."} + ${'cron.statistics.index.creation'} | ${'h'} | ${undefined} + ${'cron.statistics.index.creation'} | ${'d'} | ${undefined} + ${'cron.statistics.index.creation'} | ${'w'} | ${undefined} + ${'cron.statistics.index.creation'} | ${'m'} | ${undefined} + ${'cron.statistics.index.creation'} | ${'test'} | ${"Invalid value. Allowed values: h, d, w, m."} + ${'cron.statistics.index.name'} | ${'test'} | ${undefined} + ${'cron.statistics.index.name'} | ${''} | ${"Value can not be empty."} + ${'cron.statistics.index.name'} | ${'test space'} | ${"No whitespaces allowed."} + ${'cron.statistics.index.name'} | ${'-test'} | ${"It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'_test'} | ${"It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'+test'} | ${"It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'.test'} | ${"It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test*'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.replicas'} | ${0} | ${undefined} + ${'cron.statistics.index.replicas'} | ${-1} | ${"Value should be greater or equal than 0."} + ${'cron.statistics.index.replicas'} | ${'1.2'} | ${'Number should be an integer.'} + ${'cron.statistics.index.replicas'} | ${1.2} | ${'Number should be an integer.'} + ${'cron.statistics.index.shards'} | ${1} | ${undefined} + ${'cron.statistics.index.shards'} | ${-1} | ${"Value should be greater or equal than 1."} + ${'cron.statistics.index.shards'} | ${'1.2'} | ${'Number should be an integer.'} + ${'cron.statistics.index.shards'} | ${1.2} | ${'Number should be an integer.'} + ${'cron.statistics.interval'} | ${'0 */5 * * * *'} | ${undefined} + ${'cron.statistics.interval'} | ${'0 */5 * * *'} | ${undefined} + ${'cron.statistics.interval'} | ${'custom'} | ${"Interval is not valid."} + ${'cron.statistics.interval'} | ${true} | ${"Interval is not valid."} + ${'cron.statistics.status'} | ${true} | ${undefined} + ${'cron.statistics.status'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'customization.logo.app'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} + ${'customization.logo.app'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} + ${'customization.logo.app'} | ${{size: 124000, name: 'image.png'}} | ${undefined} + ${'customization.logo.app'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} + ${'customization.logo.app'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} + ${'customization.logo.app'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} + ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} + ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} + ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.png'}} | ${undefined} + ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} + ${'customization.logo.healthcheck'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} + ${'customization.logo.healthcheck'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} + ${'customization.logo.reports'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} + ${'customization.logo.reports'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} + ${'customization.logo.reports'} | ${{size: 124000, name: 'image.png'}} | ${undefined} + ${'customization.logo.reports'} | ${{size: 124000, name: 'image.svg'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png.'} + ${'customization.logo.reports'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png.'} + ${'customization.logo.reports'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} + ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.jpg'}} | ${undefined} + ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.jpeg'}} | ${undefined} + ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.png'}} | ${undefined} + ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.svg'}} | ${undefined} + ${'customization.logo.sidebar'} | ${{size: 124000, name: 'image.txt'}} | ${'File extension is invalid. Allowed file extensions: .jpeg, .jpg, .png, .svg.'} + ${'customization.logo.sidebar'} | ${{size: 1240000, name: 'image.txt'}} | ${'File size should be lower or equal than 1 MB.'} + ${'customization.reports.footer'} | ${'Test'} | ${undefined} + ${'customization.reports.footer'} | ${'Test\nTest'} | ${undefined} + ${'customization.reports.footer'} | ${'Test\nTest\nTest\nTest\nTest'} | ${'The string should have less or equal to 2 line/s.'} + ${'customization.reports.footer'} | ${'Line with 30 characters \nTest'} | ${undefined} + ${'customization.reports.footer'} | ${'Line with 31 characters \nTest'} | ${"The maximum length of a line is 30 characters."} + ${'customization.reports.header'} | ${'Test'} | ${undefined} + ${'customization.reports.header'} | ${'Test\nTest'} | ${undefined} + ${'customization.reports.header'} | ${'Test\nTest\nTest\nTest\nTest'} | ${'The string should have less or equal to 3 line/s.'} + ${'customization.reports.header'} | ${'Line with 20 charact\nTest'} | ${undefined} + ${'customization.reports.header'} | ${'Line with 23 characters\nTest'} | ${"The maximum length of a line is 20 characters."} + ${'disabled_roles'} | ${['test']} | ${undefined} + ${'disabled_roles'} | ${['']} | ${'Value can not be empty.'} + ${'disabled_roles'} | ${['test space']} | ${"No whitespaces allowed."} + ${'disabled_roles'} | ${['test', 4]} | ${"Value is not a string."} + ${'enrollment.dns'} | ${'test'} | ${undefined} + ${'enrollment.dns'} | ${''} | ${undefined} + ${'enrollment.dns'} | ${'test space'} | ${"No whitespaces allowed."} + ${'enrollment.password'} | ${'test'} | ${undefined} + ${'enrollment.password'} | ${''} | ${"Value can not be empty."} + ${'enrollment.password'} | ${'test space'} | ${undefined} + ${'extensions.audit'} | ${true} | ${undefined} + ${'extensions.audit'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.aws'} | ${true} | ${undefined} + ${'extensions.aws'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.ciscat'} | ${true} | ${undefined} + ${'extensions.ciscat'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.gcp'} | ${true} | ${undefined} + ${'extensions.gcp'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.gdpr'} | ${true} | ${undefined} + ${'extensions.gdpr'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.hipaa'} | ${true} | ${undefined} + ${'extensions.hipaa'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.nist'} | ${true} | ${undefined} + ${'extensions.nist'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.oscap'} | ${true} | ${undefined} + ${'extensions.oscap'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.osquery'} | ${true} | ${undefined} + ${'extensions.osquery'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.pci'} | ${true} | ${undefined} + ${'extensions.pci'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.tsc'} | ${true} | ${undefined} + ${'extensions.tsc'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'extensions.virustotal'} | ${true} | ${undefined} + ${'extensions.virustotal'} | ${0} | ${'It should be a boolean. Allowed values: true or false.'} + ${'ip.ignore'} | ${['test']} | ${undefined} + ${'ip.ignore'} | ${['test*']} | ${undefined} + ${'ip.ignore'} | ${['']} | ${'Value can not be empty.'} + ${'ip.ignore'} | ${['test space']} | ${"No whitespaces allowed."} + ${'ip.ignore'} | ${true} | ${"Value is not a valid list."} + ${'ip.ignore'} | ${['-test']} | ${"It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['_test']} | ${"It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['+test']} | ${"It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['.test']} | ${"It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['test\\']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test/']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test?']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test"']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test<']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test>']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test|']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test,']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test#']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test', 'test#']} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.selector'} | ${true} | ${undefined} + ${'ip.selector'} | ${''} | ${'It should be a boolean. Allowed values: true or false.'} + ${'logs.level'} | ${'info'} | ${undefined} + ${'logs.level'} | ${'debug'} | ${undefined} + ${'logs.level'} | ${''} | ${'Invalid value. Allowed values: info, debug.'} + ${'pattern'} | ${'test'} | ${undefined} + ${'pattern'} | ${'test*'} | ${undefined} + ${'pattern'} | ${''} | ${'Value can not be empty.'} + ${'pattern'} | ${'test space'} | ${"No whitespaces allowed."} + ${'pattern'} | ${'-test'} | ${"It can't start with: -, _, +, .."} + ${'pattern'} | ${'_test'} | ${"It can't start with: -, _, +, .."} + ${'pattern'} | ${'+test'} | ${"It can't start with: -, _, +, .."} + ${'pattern'} | ${'.test'} | ${"It can't start with: -, _, +, .."} + ${'pattern'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'timeout'} | ${15000} | ${undefined} + ${'timeout'} | ${1000} | ${'Value should be greater or equal than 1500.'} + ${'timeout'} | ${''} | ${'Value should be greater or equal than 1500.'} + ${'timeout'} | ${'1.2'} | ${'Number should be an integer.'} + ${'timeout'} | ${1.2} | ${'Number should be an integer.'} + ${'wazuh.monitoring.creation'} | ${'h'} | ${undefined} + ${'wazuh.monitoring.creation'} | ${'d'} | ${undefined} + ${'wazuh.monitoring.creation'} | ${'w'} | ${undefined} + ${'wazuh.monitoring.creation'} | ${'m'} | ${undefined} + ${'wazuh.monitoring.creation'} | ${'test'} | ${"Invalid value. Allowed values: h, d, w, m."} + ${'wazuh.monitoring.enabled'} | ${true} | ${undefined} + ${'wazuh.monitoring.frequency'} | ${100} | ${undefined} + ${'wazuh.monitoring.frequency'} | ${40} | ${"Value should be greater or equal than 60."} + ${'wazuh.monitoring.frequency'} | ${'1.2'} | ${'Number should be an integer.'} + ${'wazuh.monitoring.frequency'} | ${1.2} | ${'Number should be an integer.'} + ${'wazuh.monitoring.pattern'} | ${'test'} | ${undefined} + ${'wazuh.monitoring.pattern'} | ${'test*'} | ${undefined} + ${'wazuh.monitoring.pattern'} | ${''} | ${'Value can not be empty.'} + ${'wazuh.monitoring.pattern'} | ${'-test'} | ${"It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'_test'} | ${"It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'+test'} | ${"It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'.test'} | ${"It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'test\\'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test/'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test?'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test"'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test<'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test>'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test|'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test,'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test#'} | ${"It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.replicas'} | ${0} | ${undefined} + ${'wazuh.monitoring.replicas'} | ${-1} | ${"Value should be greater or equal than 0."} + ${'wazuh.monitoring.replicas'} | ${'1.2'} | ${'Number should be an integer.'} + ${'wazuh.monitoring.replicas'} | ${1.2} | ${'Number should be an integer.'} + ${'wazuh.monitoring.shards'} | ${1} | ${undefined} + ${'wazuh.monitoring.shards'} | ${-1} | ${"Value should be greater or equal than 1."} + ${'wazuh.monitoring.shards'} | ${'1.2'} | ${'Number should be an integer.'} + ${'wazuh.monitoring.shards'} | ${1.2} | ${'Number should be an integer.'} `('$setting | $value | $expectedValidation', ({ setting, value, expectedValidation }) => { expect( PLUGIN_SETTINGS[setting].validate( diff --git a/common/services/settings-validator.ts b/common/services/settings-validator.ts index 8b11ea7ef8..75fef368be 100644 --- a/common/services/settings-validator.ts +++ b/common/services/settings-validator.ts @@ -56,14 +56,17 @@ export class SettingsValidator { * @param options * @returns */ - static multipleLinesString(options: { min?: number, max?: number } = {}) { + static multipleLinesString(options: { min?: number, max?: number, maxLength?: number } = {}) { return function (value: number) { const lines = value.split(/\r\n|\r|\n/).length; + if (typeof options.maxLength !== 'undefined' && value.split('\n').some(line => line.length > options.maxLength)) { + return `The maximum length of a line is ${options.maxLength} characters.`; + }; if (typeof options.min !== 'undefined' && lines < options.min) { return `The string should have more or ${options.min} line/s.`; }; if (typeof options.max !== 'undefined' && lines > options.max) { - return `The string should have less or ${options.max} line/s.`; + return `The string should have less or equal to ${options.max} line/s.`; }; } }; diff --git a/public/components/common/form/__snapshots__/index.test.tsx.snap b/public/components/common/form/__snapshots__/index.test.tsx.snap index 70002a6d8e..e310c1780b 100644 --- a/public/components/common/form/__snapshots__/index.test.tsx.snap +++ b/public/components/common/form/__snapshots__/index.test.tsx.snap @@ -437,3 +437,14 @@ exports[`[component] InputForm Renders correctly to match the snapshot: Input: t `; + +exports[`[component] InputForm Renders correctly to match the snapshot: Input: textarea 1`] = ` +
+ +
+`; diff --git a/public/components/common/form/index.test.tsx b/public/components/common/form/index.test.tsx index 4487c5cd53..17e21ee8ec 100644 --- a/public/components/common/form/index.test.tsx +++ b/public/components/common/form/index.test.tsx @@ -13,13 +13,14 @@ describe('[component] InputForm', () => { const optionsSelect = {select: [{text: 'Label1', value: 'value1'}, {text: 'Label2', value: 'value2'}]}; const optionsSwitch = {switch: {values: {enabled: {label: 'Enabled', value: true}, disabled: {label: 'Disabled', value: false}}}}; it.each` - inputType | value | options - ${'editor'} | ${'{}'} | ${optionsEditor} - ${'filepicker'} | ${'{}'} | ${optionsFilepicker} - ${'number'} | ${4} | ${undefined} - ${'select'} | ${'value1'} | ${optionsSelect} - ${'switch'} | ${true} | ${optionsSwitch} - ${'text'} | ${'test'} | ${undefined} + inputType | value | options + ${'editor'} | ${'{}'} | ${optionsEditor} + ${'filepicker'} | ${'{}'} | ${optionsFilepicker} + ${'number'} | ${4} | ${undefined} + ${'select'} | ${'value1'} | ${optionsSelect} + ${'switch'} | ${true} | ${optionsSwitch} + ${'text'} | ${'test'} | ${undefined} + ${'textarea'} | ${'test'} | ${undefined} `('Renders correctly to match the snapshot: Input: $inputType', ({ inputType, value, options }) => { const wrapper = render( { + return ( + + ); +}; diff --git a/public/components/settings/configuration/components/categories/components/category/category.tsx b/public/components/settings/configuration/components/categories/components/category/category.tsx index 4aaca2ab08..67fc5184ee 100644 --- a/public/components/settings/configuration/components/categories/components/category/category.tsx +++ b/public/components/settings/configuration/components/categories/components/category/category.tsx @@ -117,7 +117,6 @@ export const Category: React.FunctionComponent = ({ aria-label={item.key} content='Invalid' /> )} - {isUpdated && ( { // Update the settings that uploads a file if(Object.keys(settingsToUpdate.fileUpload).length){ requests.push(...Object.entries(settingsToUpdate.fileUpload) - .map(([pluginSettingKey, {file, extension}]) => { + .map(([pluginSettingKey, {file}]) => { // Create the form data const formData = new FormData(); formData.append('file', file); diff --git a/server/lib/reporting/printer.ts b/server/lib/reporting/printer.ts index 7a2e09dba8..ff1f1d247a 100644 --- a/server/lib/reporting/printer.ts +++ b/server/lib/reporting/printer.ts @@ -10,13 +10,14 @@ import { import { log } from '../logger'; import * as TimSort from 'timsort'; import { getConfiguration } from '../get-configuration'; -import { REPORTS_PRIMARY_COLOR, REPORTS_LOGO_IMAGE_ASSETS_RELATIVE_PATH, REPORTS_PAGE_FOOTER_TEXT, REPORTS_PAGE_HEADER_TEXT } from '../../../common/constants'; +import { REPORTS_PRIMARY_COLOR} from '../../../common/constants'; +import { getSettingDefaultValue } from '../../../common/services/settings'; const COLORS = { PRIMARY: REPORTS_PRIMARY_COLOR }; -const pageConfiguration = (nameLogo) => ({ +const pageConfiguration = ({ pathToLogo, pageHeader, pageFooter }) => ({ styles: { h1: { fontSize: 22, @@ -54,11 +55,11 @@ const pageConfiguration = (nameLogo) => ({ margin: [40, 20, 0, 0], columns: [ { - image: path.join(__dirname, `../../../public/assets/${nameLogo}`), - width: 190 + image: path.join(__dirname, `../../../public/assets/${pathToLogo}`), + fit: [190, 50] }, { - text: REPORTS_PAGE_HEADER_TEXT, + text: pageHeader, alignment: 'right', margin: [0, 0, 40, 0], color: COLORS.PRIMARY @@ -70,7 +71,7 @@ const pageConfiguration = (nameLogo) => ({ return { columns: [ { - text: REPORTS_PAGE_FOOTER_TEXT, + text: pageFooter, color: COLORS.PRIMARY, margin: [40, 40, 0, 0] }, @@ -473,7 +474,7 @@ export class ReportPrinter{ this.addContent(typeof title === 'string' ? { text: title, style: 'h4' } : title) .addNewLine(); } - + if (!items || !items.length) { this.addContent({ text: 'No results match your search criteria', @@ -494,23 +495,23 @@ export class ReportPrinter{ style: 'standard' } }) - }); + }); // 385 is the max initial width per column let totalLength = columns.length - 1; const widthColumn = 385/totalLength; let totalWidth = totalLength * widthColumn; - + const widths:(number)[] = []; - + for (let step = 0; step < columns.length - 1; step++) { let columnLength = this.getColumnWidth(columns[step], tableRows, step); - + if (columnLength <= Math.round(totalWidth / totalLength)) { widths.push(columnLength); totalWidth -= columnLength; - } + } else { widths.push(Math.round(totalWidth / totalLength)); totalWidth -= Math.round((totalWidth / totalLength)); @@ -518,7 +519,7 @@ export class ReportPrinter{ totalLength--; } widths.push('*'); - + this.addContent({ fontSize: 8, table: { @@ -562,9 +563,9 @@ export class ReportPrinter{ `agents: ${agents}`, 'debug' ); - + this.addNewLine(); - + this.addContent({ text: 'NOTE: This report only includes the authorized agents of the user who generated the report', @@ -613,22 +614,36 @@ export class ReportPrinter{ ); } - async print(reportPath: string){ - const nameLogo = ( await getConfiguration() )['customization.logo.reports'] || REPORTS_LOGO_IMAGE_ASSETS_RELATIVE_PATH; + async print(reportPath: string) { + return new Promise((resolve, reject) => { + try { + const configuration = getConfiguration(); - const document = this._printer.createPdfKitDocument({...pageConfiguration(nameLogo), content: this._content}); - await document.pipe( - fs.createWriteStream(reportPath) - ); - document.end(); + const pathToLogo = configuration['customization.logo.reports'] || getSettingDefaultValue('customization.logo.reports'); + const pageHeader = configuration['customization.reports.header'] || getSettingDefaultValue('customization.reports.header'); + const pageFooter = configuration['customization.reports.footer'] || getSettingDefaultValue('customization.reports.footer'); + + const document = this._printer.createPdfKitDocument({ ...pageConfiguration({ pathToLogo, pageHeader, pageFooter }), content: this._content }); + + document.on('error', reject); + document.on('end', resolve); + + document.pipe( + fs.createWriteStream(reportPath) + ); + document.end(); + } catch (ex) { + reject(ex); + } + }); } /** * Returns the width of a given column - * - * @param column - * @param tableRows - * @param step + * + * @param column + * @param tableRows + * @param step * @returns {number} */ getColumnWidth(column, tableRows, index){ diff --git a/server/routes/wazuh-reporting.test.ts b/server/routes/wazuh-reporting.test.ts index b56ea7b2ff..ae8f52de63 100644 --- a/server/routes/wazuh-reporting.test.ts +++ b/server/routes/wazuh-reporting.test.ts @@ -1,96 +1,231 @@ // To launch this file // yarn test:jest --testEnvironment node --verbose server/routes/wazuh-reporting -import axios from 'axios'; -import { PLUGIN_PLATFORM_REQUEST_HEADERS } from '../../common/constants'; - -function buildAxiosOptions(method: string, path: string, data: any = {}, headers: any = {}){ - return { - method: method, - headers: { ...PLUGIN_PLATFORM_REQUEST_HEADERS, 'content-type': 'application/json', ...headers }, - url: `http://localhost:5601${path}`, - data: data - }; +import { Router } from '../../../../src/core/server/http/router/router'; +import { HttpServer } from '../../../../src/core/server/http/http_server'; +import { loggingSystemMock } from '../../../../src/core/server/logging/logging_system.mock'; +import { ByteSizeValue } from '@kbn/config-schema'; +import supertest from 'supertest'; +import { WazuhUtilsRoutes } from './wazuh-utils'; +import { WazuhReportingRoutes } from './wazuh-reporting'; +import { WazuhUtilsCtrl } from '../controllers/wazuh-utils/wazuh-utils'; +import md5 from 'md5'; +import path from 'path'; +import { createDataDirectoryIfNotExists, createDirectoryIfNotExists } from '../lib/filesystem'; +import { + WAZUH_DATA_CONFIG_APP_PATH, + WAZUH_DATA_CONFIG_DIRECTORY_PATH, + WAZUH_DATA_DOWNLOADS_REPORTS_DIRECTORY_PATH, + WAZUH_DATA_LOGS_DIRECTORY_PATH, + WAZUH_DATA_ABSOLUTE_PATH, + WAZUH_DATA_DOWNLOADS_DIRECTORY_PATH +} from '../../common/constants'; +import { execSync } from 'child_process'; +import fs from 'fs'; + +jest.mock('../lib/reporting/extended-information', () => ({ + extendedInformation: jest.fn() +})); +const USER_NAME = 'admin'; +const loggingService = loggingSystemMock.create(); +const logger = loggingService.get(); +const context = { + wazuh: { + security: { + getCurrentUser: (request) => { + // x-test-username header doesn't exist when the platform or plugin are running. + // It is used to generate the output of this method so we can simulate the user + // that does the request to the endpoint and is expected by the endpoint handlers + // of the plugin. + const username = request.headers['x-test-username']; + return { username, hashUsername: md5(username) } + } + } + } }; +const enhanceWithContext = (fn: (...args: any[]) => any) => fn.bind(null, context); +let server, innerServer; + +// BEFORE ALL +beforeAll(async () => { + // Create /data/wazuh directory. + createDataDirectoryIfNotExists(); + + // Create /data/wazuh/config directory. + createDirectoryIfNotExists(WAZUH_DATA_CONFIG_DIRECTORY_PATH); + + // Create /data/wazuh/logs directory. + createDirectoryIfNotExists(WAZUH_DATA_LOGS_DIRECTORY_PATH); + + // Create server + const config = { + name: 'plugin_platform', + host: '127.0.0.1', + maxPayload: new ByteSizeValue(1024), + port: 10002, + ssl: { enabled: false }, + compression: { enabled: true }, + requestId: { + allowFromAnyIp: true, + ipAllowlist: [], + }, + } as any; + server = new HttpServer(loggingService, 'tests'); + const router = new Router('', logger, enhanceWithContext); + const { registerRouter, server: innerServerTest, ...rest } = await server.setup(config); + innerServer = innerServerTest; + + // Mock decorator + jest.spyOn(WazuhUtilsCtrl.prototype as any, 'routeDecoratorProtectedAdministratorRoleValidToken') + .mockImplementation((handler) => async (...args) => handler(...args)); + + // Register routes + WazuhUtilsRoutes(router); + WazuhReportingRoutes(router); + + // Register router + registerRouter(router); + + // start server + await server.start(); +}); -describe.skip('Wazuh Reporting', () => { - describe('Wazuh API - /reports', () => { - test('[200] Returns the available reports for user', () => { - const options = buildAxiosOptions('get', '/reports', {}, { - cookie: 'wz-user=elastic' - }); - return axios(options).then(response => { - expect(response.status).toBe(200); - expect(Array.isArray(response.data.reports)).toBe(true); - }).catch(error => {throw error}) +afterAll(async () => { + // Stop server + await server.stop(); + + // Clear all mocks + jest.clearAllMocks(); + + // Remove /data/wazuh directory. + execSync(`rm -rf ${WAZUH_DATA_ABSOLUTE_PATH}`); +}); + +describe('[endpoint] GET /reports', () => { + const directories = [ + { username: 'admin', files: 0 }, + { username: '../../etc', files: 1 }, + ]; + beforeAll(() => { + // Create /data/wazuh directory. + createDataDirectoryIfNotExists(); + + // Create /data/wazuh/config directory. + createDirectoryIfNotExists(WAZUH_DATA_CONFIG_DIRECTORY_PATH); + + // Create /data/wazuh/logs directory. + createDirectoryIfNotExists(WAZUH_DATA_LOGS_DIRECTORY_PATH); + + // Create /data/wazuh/downloads directory. + createDirectoryIfNotExists(WAZUH_DATA_DOWNLOADS_DIRECTORY_PATH); + + // Create /data/wazuh/downloads/reports directory. + createDirectoryIfNotExists(WAZUH_DATA_DOWNLOADS_REPORTS_DIRECTORY_PATH); + + // Create directories and file/s within directory. + directories.forEach(({ username, files }) => { + const hashUsername = md5(username); + createDirectoryIfNotExists(path.join(WAZUH_DATA_DOWNLOADS_REPORTS_DIRECTORY_PATH, hashUsername)); + if (files) { + Array.from(Array(files).keys()).forEach(indexFile => { + console.log('Generating', username, indexFile) + fs.closeSync(fs.openSync(path.join(WAZUH_DATA_DOWNLOADS_REPORTS_DIRECTORY_PATH, hashUsername, `report_${indexFile}.pdf`), 'w')); + }); + } }); }); - //TODO: do the test for these endpoints - // describe('Wazuh API - /reports/{name}', () => { - // test('[200] Returns the available reports for user and name', () => { - // const options = buildAxiosOptions('get', '/reports/wazuh-report.pdf', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // expect(response.status).toBe(200); - // expect(Array.isArray(response.data.reports)).toBe(true); - // }).catch(error => {throw error}) - // }); - - // test('[200] Returns the available reports for user and name', () => { - // const options = buildAxiosOptions('delete', '/reports/wazuh-report.pdf', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // }).catch(error => {throw error}) - // }); - // }); - - // describe('Wazuh API - /reports/modules/{moduleID}', () => { - // test('[200] Generates a modules reports the available reports for user and name', () => { - // const options = buildAxiosOptions('post', '/reports/modules/{moduleID}', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // expect(response.status).toBe(200); - // expect(Array.isArray(response.data.reports)).toBe(true); - // }).catch(error => {throw error}) - // }); - // }); - - // describe('Wazuh API - /reports/groups/{groupID}', () => { - // test('[200] Generates a modules reports the available reports for user and name', () => { - // const options = buildAxiosOptions('post', '/reports/groups/{groupID}', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // expect(response.status).toBe(200); - // expect(Array.isArray(response.data.reports)).toBe(true); - // }).catch(error => {throw error}) - // }); - // }); - - // describe('Wazuh API - /reports/agents/{agentID}', () => { - // test('[200] Generates a modules reports the available reports for user and name', () => { - // const options = buildAxiosOptions('post', '/reports/agents/{agentID}', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // expect(response.status).toBe(200); - // expect(Array.isArray(response.data.reports)).toBe(true); - // }).catch(error => {throw error}) - // }); - // }); - - // describe('Wazuh API - /reports/agents/{agentID}/inventory', () => { - // test('[200] Generates a modules reports the available reports for user and name', () => { - // const options = buildAxiosOptions('post', '/reports/agents/{agentID}/inventory', {}, { - // cookie: 'wz-user=elastic' - // }); - // return axios(options).then(response => { - // expect(response.status).toBe(200); - // expect(Array.isArray(response.data.reports)).toBe(true); - // }).catch(error => {throw error}) - // }); - // }); + afterAll(async () => { + // Remove /data/wazuh/downloads directory. + execSync(`rm -rf ${WAZUH_DATA_DOWNLOADS_DIRECTORY_PATH}`); + }); + + it.each(directories)('get reports of $username. status response: $responseStatus', async ({ username, files }) => { + const response = await supertest(innerServer.listener) + .get(`/reports`) + .set('x-test-username', username) + .expect(200); + expect(response.body.reports).toHaveLength(files); + }); +}); + +describe('[endpoint] PUT /utils/configuration', () => { + beforeEach(() => { + // Create the configuration file with custom content + const fileContent = `--- + pattern: test-alerts-* + + hosts: + - default: + url: https://localhost + port: 55000 + username: wazuh-wui + password: wazuh-wui + run_as: false + `; + + fs.writeFileSync(WAZUH_DATA_CONFIG_APP_PATH, fileContent, 'utf8'); + }); + + afterEach(() => { + // Remove the configuration file + fs.unlinkSync(WAZUH_DATA_CONFIG_APP_PATH); + }); + + // expectedMD5 variable is a verified md5 of a report generated with this header and footer + // If any of the parameters is changed this variable should be updated with the new md5 + it.each` + footer | header | responseStatusCode | expectedMD5 | tab + ${null} | ${null} | ${200} | ${'1bdc0cc05cc79fdfbb9b734a4e1cc07b'} | ${'pm'} + ${'Custom\nFooter'} | ${'info@company.com\nFake Avenue 123'}| ${200} | ${'0acbd4ee321699791b080b45c11dfe2b'} | ${'general'} + ${''} | ${''} | ${200} | ${'5f9e16540e9d8109bed75b2a8f825164'} | ${'fim'} + ${'Custom Footer'} | ${null} | ${200} | ${'5bd4c559419028fd0d282c5e8408ecff'} | ${'aws'} + ${null} | ${'Custom Header'} | ${200} | ${'f6bfca395bc3fc78105f66120f336443'} | ${'gcp'} +`(`Set custom report header and footer - Verify PDF output`, async ({footer, header, responseStatusCode, expectedMD5, tab}) => { + + // Mock PDF report parameters + const reportBody = { "array": [], "filters": [], "time": { "from": '2022-10-01T09:59:40.825Z', "to": '2022-10-04T09:59:40.825Z' }, "searchBar": "", "tables": [], "tab": tab, "section": "overview", "agents": false, "browserTimezone": "Europe/Madrid", "indexPatternTitle": "wazuh-alerts-*", "apiId": "default" }; + + // Define custom configuration + const configurationBody = {}; + + if (typeof footer == 'string') { + configurationBody['customization.reports.footer'] = footer; + } + if (typeof header == 'string') { + configurationBody['customization.reports.header'] = header; + } + + // Set custom report header and footer + if (typeof footer == 'string' || typeof header == 'string') { + const responseConfig = await supertest(innerServer.listener) + .put('/utils/configuration') + .send(configurationBody) + .expect(responseStatusCode); + + if (typeof footer == 'string') { + expect(responseConfig.body?.data?.updatedConfiguration?.['customization.reports.footer']).toMatch(configurationBody['customization.reports.footer']); + } + if (typeof header == 'string') { + expect(responseConfig.body?.data?.updatedConfiguration?.['customization.reports.header']).toMatch(configurationBody['customization.reports.header']); + } + } + + // Generate PDF report + const responseReport = await supertest(innerServer.listener) + .post(`/reports/modules/${tab}`) + .set('x-test-username', USER_NAME) + .send(reportBody) + .expect(200); + const fileName = responseReport.body?.message.match(/([A-Z-0-9]*\.pdf)/gi)[0]; + const userPath = md5(USER_NAME); + const reportPath = `${WAZUH_DATA_DOWNLOADS_REPORTS_DIRECTORY_PATH}/${userPath}/${fileName}`; + const PDFbuffer = fs.readFileSync(reportPath); + const PDFcontent = PDFbuffer.toString('utf8'); + const content = PDFcontent + .replace(/\[<[a-z0-9].+> <[a-z0-9].+>\]/gi, '') + .replace(/(obj\n\(D:[0-9].+Z\)\nendobj)/gi, ''); + const PDFmd5 = md5(content); + + expect(PDFmd5).toBe(expectedMD5); + }); }); diff --git a/server/routes/wazuh-utils/wazuh-utils.test.ts b/server/routes/wazuh-utils/wazuh-utils.test.ts index 3c02026011..097d3b48be 100644 --- a/server/routes/wazuh-utils/wazuh-utils.test.ts +++ b/server/routes/wazuh-utils/wazuh-utils.test.ts @@ -139,8 +139,8 @@ hosts: }); it.each` - settings | responseStatusCode - ${{ pattern: 'test-alerts-groupA-*' }} | ${200} + settings | responseStatusCode + ${{ pattern: 'test-alerts-groupA-*' }} | ${200} ${{ pattern: 'test-alerts-groupA-*', 'logs.level': 'debug' }} | ${200} `(`Update the plugin configuration: $settings. PUT /utils/configuration - $responseStatusCode`, async ({ responseStatusCode, settings }) => { const response = await supertest(innerServer.listener) @@ -205,217 +205,229 @@ hosts: }); it.each` - setting | value | responseStatusCode | responseBodyMessage - ${'alerts.sample.prefix'} | ${'test'} | ${200} | ${null} - ${'alerts.sample.prefix'} | ${''} | ${400} | ${"[request body.alerts.sample.prefix]: Value can not be empty."} - ${'alerts.sample.prefix'} | ${'test space'} | ${400} | ${"[request body.alerts.sample.prefix]: No whitespaces allowed."} - ${'alerts.sample.prefix'} | ${4} | ${400} | ${'[request body.alerts.sample.prefix]: expected value of type [string] but got [number]'} - ${'alerts.sample.prefix'} | ${'-test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'_test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'+test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'.test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} - ${'alerts.sample.prefix'} | ${'test\\'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test/'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test?'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test"'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test<'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test>'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test|'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test,'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test#'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'alerts.sample.prefix'} | ${'test*'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'checks.api'} | ${true} | ${200} | ${null} - ${'checks.api'} | ${0} | ${400} | ${'[request body.checks.api]: expected value of type [boolean] but got [number]'} - ${'checks.fields'} | ${true} | ${200} | ${null} - ${'checks.fields'} | ${0} | ${400} | ${'[request body.checks.fields]: expected value of type [boolean] but got [number]'} - ${'checks.maxBuckets'} | ${true} | ${200} | ${null} - ${'checks.maxBuckets'} | ${0} | ${400} | ${'[request body.checks.maxBuckets]: expected value of type [boolean] but got [number]'} - ${'checks.pattern'} | ${true} | ${200} | ${null} - ${'checks.pattern'} | ${0} | ${400} | ${'[request body.checks.pattern]: expected value of type [boolean] but got [number]'} - ${'checks.setup'} | ${true} | ${200} | ${null} - ${'checks.setup'} | ${0} | ${400} | ${'[request body.checks.setup]: expected value of type [boolean] but got [number]'} - ${'checks.template'} | ${true} | ${200} | ${null} - ${'checks.template'} | ${0} | ${400} | ${'[request body.checks.template]: expected value of type [boolean] but got [number]'} - ${'checks.timeFilter'} | ${true} | ${200} | ${null} - ${'checks.timeFilter'} | ${0} | ${400} | ${'[request body.checks.timeFilter]: expected value of type [boolean] but got [number]'} - ${'cron.prefix'} | ${'test'} | ${200} | ${null} - ${'cron.prefix'} | ${'test space'} | ${400} | ${"[request body.cron.prefix]: No whitespaces allowed."} - ${'cron.prefix'} | ${''} | ${400} | ${"[request body.cron.prefix]: Value can not be empty."} - ${'cron.prefix'} | ${4} | ${400} | ${'[request body.cron.prefix]: expected value of type [string] but got [number]'} - ${'cron.prefix'} | ${'-test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'_test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'+test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'.test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} - ${'cron.prefix'} | ${'test\\'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test/'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test?'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test"'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test<'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test>'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test|'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test,'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test#'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.prefix'} | ${'test*'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.apis'} | ${['test']} | ${200} | ${null} - ${'cron.statistics.apis'} | ${['test ']} | ${400} | ${"[request body.cron.statistics.apis.0]: No whitespaces allowed."} - ${'cron.statistics.apis'} | ${['']} | ${400} | ${"[request body.cron.statistics.apis.0]: Value can not be empty."} - ${'cron.statistics.apis'} | ${['test', 4]} | ${400} | ${"[request body.cron.statistics.apis.1]: expected value of type [string] but got [number]"} - ${'cron.statistics.apis'} | ${'test space'} | ${400} | ${"[request body.cron.statistics.apis]: could not parse array value from json input"} - ${'cron.statistics.apis'} | ${true} | ${400} | ${"[request body.cron.statistics.apis]: expected value of type [array] but got [boolean]"} - ${'cron.statistics.index.creation'} | ${'h'} | ${200} | ${null} - ${'cron.statistics.index.creation'} | ${'d'} | ${200} | ${null} - ${'cron.statistics.index.creation'} | ${'w'} | ${200} | ${null} - ${'cron.statistics.index.creation'} | ${'m'} | ${200} | ${null} - ${'cron.statistics.index.creation'} | ${'test'} | ${400} | ${"[request body.cron.statistics.index.creation]: types that failed validation:\n- [request body.cron.statistics.index.creation.0]: expected value to equal [h]\n- [request body.cron.statistics.index.creation.1]: expected value to equal [d]\n- [request body.cron.statistics.index.creation.2]: expected value to equal [w]\n- [request body.cron.statistics.index.creation.3]: expected value to equal [m]"} - ${'cron.statistics.index.name'} | ${'test'} | ${200} | ${null} - ${'cron.statistics.index.name'} | ${''} | ${400} | ${"[request body.cron.statistics.index.name]: Value can not be empty."} - ${'cron.statistics.index.name'} | ${'test space'} | ${400} | ${"[request body.cron.statistics.index.name]: No whitespaces allowed."} - ${'cron.statistics.index.name'} | ${true} | ${400} | ${"[request body.cron.statistics.index.name]: expected value of type [string] but got [boolean]"} - ${'cron.statistics.index.name'} | ${'-test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'_test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'+test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'.test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} - ${'cron.statistics.index.name'} | ${'test\\'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test/'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test?'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test"'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test<'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test>'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test|'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test,'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test#'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.name'} | ${'test*'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} - ${'cron.statistics.index.replicas'} | ${0} | ${200} | ${null} - ${'cron.statistics.index.replicas'} | ${-1} | ${400} | ${"[request body.cron.statistics.index.replicas]: Value should be greater or equal than 0."} - ${'cron.statistics.index.replicas'} | ${'custom'} | ${400} | ${"[request body.cron.statistics.index.replicas]: expected value of type [number] but got [string]"} - ${'cron.statistics.index.replicas'} | ${1.2} | ${400} | ${"[request body.cron.statistics.index.replicas]: Number should be an integer."} - ${'cron.statistics.index.shards'} | ${1} | ${200} | ${null} - ${'cron.statistics.index.shards'} | ${-1} | ${400} | ${"[request body.cron.statistics.index.shards]: Value should be greater or equal than 1."} - ${'cron.statistics.index.shards'} | ${1.2} | ${400} | ${"[request body.cron.statistics.index.shards]: Number should be an integer."} - ${'cron.statistics.interval'} | ${'0 */5 * * * *'} | ${200} | ${null} - ${'cron.statistics.interval'} | ${'0 */5 * * *'} | ${200} | ${null} - ${'cron.statistics.interval'} | ${'custom'} | ${400} | ${"[request body.cron.statistics.interval]: Interval is not valid."} - ${'cron.statistics.interval'} | ${true} | ${400} | ${"[request body.cron.statistics.interval]: expected value of type [string] but got [boolean]"} - ${'cron.statistics.status'} | ${true} | ${200} | ${null} - ${'cron.statistics.status'} | ${0} | ${400} | ${'[request body.cron.statistics.status]: expected value of type [boolean] but got [number]'} - ${'disabled_roles'} | ${['test']} | ${200} | ${null} - ${'disabled_roles'} | ${['']} | ${400} | ${'[request body.disabled_roles.0]: Value can not be empty.'} - ${'disabled_roles'} | ${['test space']} | ${400} | ${"[request body.disabled_roles.0]: No whitespaces allowed."} - ${'disabled_roles'} | ${['test', 4]} | ${400} | ${"[request body.disabled_roles.1]: expected value of type [string] but got [number]"} - ${'enrollment.dns'} | ${'test'} | ${200} | ${null} - ${'enrollment.dns'} | ${''} | ${200} | ${null} - ${'enrollment.dns'} | ${'test space'} | ${400} | ${"[request body.enrollment.dns]: No whitespaces allowed."} - ${'enrollment.dns'} | ${true} | ${400} | ${'[request body.enrollment.dns]: expected value of type [string] but got [boolean]'} - ${'enrollment.password'} | ${'test'} | ${200} | ${null} - ${'enrollment.password'} | ${''} | ${400} | ${"[request body.enrollment.password]: Value can not be empty."} - ${'enrollment.password'} | ${'test space'} | ${200} | ${null} - ${'enrollment.password'} | ${true} | ${400} | ${'[request body.enrollment.password]: expected value of type [string] but got [boolean]'} - ${'extensions.audit'} | ${true} | ${200} | ${null} - ${'extensions.audit'} | ${0} | ${400} | ${'[request body.extensions.audit]: expected value of type [boolean] but got [number]'} - ${'extensions.aws'} | ${true} | ${200} | ${null} - ${'extensions.aws'} | ${0} | ${400} | ${'[request body.extensions.aws]: expected value of type [boolean] but got [number]'} - ${'extensions.ciscat'} | ${true} | ${200} | ${null} - ${'extensions.ciscat'} | ${0} | ${400} | ${'[request body.extensions.ciscat]: expected value of type [boolean] but got [number]'} - ${'extensions.gcp'} | ${true} | ${200} | ${null} - ${'extensions.gcp'} | ${0} | ${400} | ${'[request body.extensions.gcp]: expected value of type [boolean] but got [number]'} - ${'extensions.gdpr'} | ${true} | ${200} | ${null} - ${'extensions.gdpr'} | ${0} | ${400} | ${'[request body.extensions.gdpr]: expected value of type [boolean] but got [number]'} - ${'extensions.hipaa'} | ${true} | ${200} | ${null} - ${'extensions.hipaa'} | ${0} | ${400} | ${'[request body.extensions.hipaa]: expected value of type [boolean] but got [number]'} - ${'extensions.nist'} | ${true} | ${200} | ${null} - ${'extensions.nist'} | ${0} | ${400} | ${'[request body.extensions.nist]: expected value of type [boolean] but got [number]'} - ${'extensions.oscap'} | ${true} | ${200} | ${null} - ${'extensions.oscap'} | ${0} | ${400} | ${'[request body.extensions.oscap]: expected value of type [boolean] but got [number]'} - ${'extensions.osquery'} | ${true} | ${200} | ${null} - ${'extensions.osquery'} | ${0} | ${400} | ${'[request body.extensions.osquery]: expected value of type [boolean] but got [number]'} - ${'extensions.pci'} | ${true} | ${200} | ${null} - ${'extensions.pci'} | ${0} | ${400} | ${'[request body.extensions.pci]: expected value of type [boolean] but got [number]'} - ${'extensions.tsc'} | ${true} | ${200} | ${null} - ${'extensions.tsc'} | ${0} | ${400} | ${'[request body.extensions.tsc]: expected value of type [boolean] but got [number]'} - ${'extensions.virustotal'} | ${true} | ${200} | ${null} - ${'extensions.virustotal'} | ${0} | ${400} | ${'[request body.extensions.virustotal]: expected value of type [boolean] but got [number]'} - ${'ip.ignore'} | ${['test']} | ${200} | ${null} - ${'ip.ignore'} | ${['test*']} | ${200} | ${null} - ${'ip.ignore'} | ${['']} | ${400} | ${'[request body.ip.ignore.0]: Value can not be empty.'} - ${'ip.ignore'} | ${['test space']} | ${400} | ${"[request body.ip.ignore.0]: No whitespaces allowed."} - ${'ip.ignore'} | ${true} | ${400} | ${"[request body.ip.ignore]: expected value of type [array] but got [boolean]"} - ${'ip.ignore'} | ${['-test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['_test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['+test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['.test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} - ${'ip.ignore'} | ${['test\\']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test/']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test?']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test"']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test<']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test>']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test|']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test,']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test#']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.ignore'} | ${['test', 'test#']} | ${400} | ${"[request body.ip.ignore.1]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'ip.selector'} | ${true} | ${200} | ${null} - ${'ip.selector'} | ${''} | ${400} | ${'[request body.ip.selector]: expected value of type [boolean] but got [string]'} - ${'logs.level'} | ${'info'} | ${200} | ${null} - ${'logs.level'} | ${'debug'} | ${200} | ${null} - ${'logs.level'} | ${''} | ${400} | ${'[request body.logs.level]: types that failed validation:\n- [request body.logs.level.0]: expected value to equal [info]\n- [request body.logs.level.1]: expected value to equal [debug]'} - ${'pattern'} | ${'test'} | ${200} | ${null} - ${'pattern'} | ${'test*'} | ${200} | ${null} - ${'pattern'} | ${''} | ${400} | ${'[request body.pattern]: Value can not be empty.'} - ${'pattern'} | ${'test space'} | ${400} | ${"[request body.pattern]: No whitespaces allowed."} - ${'pattern'} | ${true} | ${400} | ${'[request body.pattern]: expected value of type [string] but got [boolean]'} - ${'pattern'} | ${'-test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} - ${'pattern'} | ${'_test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} - ${'pattern'} | ${'+test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} - ${'pattern'} | ${'.test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} - ${'pattern'} | ${'test\\'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test/'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test?'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test"'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test<'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test>'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test|'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test,'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'pattern'} | ${'test#'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'timeout'} | ${15000} | ${200} | ${null} - ${'timeout'} | ${1000} | ${400} | ${'[request body.timeout]: Value should be greater or equal than 1500.'} - ${'timeout'} | ${''} | ${400} | ${'[request body.timeout]: expected value of type [number] but got [string]'} - ${'timeout'} | ${1.2} | ${400} | ${"[request body.timeout]: Number should be an integer."} - ${'wazuh.monitoring.creation'} | ${'h'} | ${200} | ${null} - ${'wazuh.monitoring.creation'} | ${'d'} | ${200} | ${null} - ${'wazuh.monitoring.creation'} | ${'w'} | ${200} | ${null} - ${'wazuh.monitoring.creation'} | ${'m'} | ${200} | ${null} - ${'wazuh.monitoring.creation'} | ${'test'} | ${400} | ${"[request body.wazuh.monitoring.creation]: types that failed validation:\n- [request body.wazuh.monitoring.creation.0]: expected value to equal [h]\n- [request body.wazuh.monitoring.creation.1]: expected value to equal [d]\n- [request body.wazuh.monitoring.creation.2]: expected value to equal [w]\n- [request body.wazuh.monitoring.creation.3]: expected value to equal [m]"} - ${'wazuh.monitoring.enabled'} | ${true} | ${200} | ${null} - ${'wazuh.monitoring.enabled'} | ${0} | ${400} | ${'[request body.wazuh.monitoring.enabled]: expected value of type [boolean] but got [number]'} - ${'wazuh.monitoring.frequency'} | ${100} | ${200} | ${null} - ${'wazuh.monitoring.frequency'} | ${40} | ${400} | ${"[request body.wazuh.monitoring.frequency]: Value should be greater or equal than 60."} - ${'wazuh.monitoring.frequency'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.frequency]: Number should be an integer."} - ${'wazuh.monitoring.frequency'} | ${''} | ${400} | ${'[request body.wazuh.monitoring.frequency]: expected value of type [number] but got [string]'} - ${'wazuh.monitoring.pattern'} | ${'test'} | ${200} | ${null} - ${'wazuh.monitoring.pattern'} | ${'test*'} | ${200} | ${null} - ${'wazuh.monitoring.pattern'} | ${''} | ${400} | ${'[request body.wazuh.monitoring.pattern]: value has length [0] but it must have a minimum length of [1].'} - ${'wazuh.monitoring.pattern'} | ${true} | ${400} | ${'[request body.wazuh.monitoring.pattern]: expected value of type [string] but got [boolean]'} - ${'wazuh.monitoring.pattern'} | ${'-test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'_test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'+test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'.test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} - ${'wazuh.monitoring.pattern'} | ${'test\\'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test/'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test?'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test"'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test<'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test>'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test|'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test,'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.pattern'} | ${'test#'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} - ${'wazuh.monitoring.replicas'} | ${0} | ${200} | ${null} - ${'wazuh.monitoring.replicas'} | ${-1} | ${400} | ${"[request body.wazuh.monitoring.replicas]: Value should be greater or equal than 0."} - ${'wazuh.monitoring.replicas'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.replicas]: Number should be an integer."} - ${'wazuh.monitoring.replicas'} | ${'custom'} | ${400} | ${"[request body.wazuh.monitoring.replicas]: expected value of type [number] but got [string]"} - ${'wazuh.monitoring.shards'} | ${1} | ${200} | ${null} - ${'wazuh.monitoring.shards'} | ${-1} | ${400} | ${"[request body.wazuh.monitoring.shards]: Value should be greater or equal than 1."} - ${'wazuh.monitoring.shards'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.shards]: Number should be an integer."} - ${'wazuh.monitoring.shards'} | ${'custom'} | ${400} | ${"[request body.wazuh.monitoring.shards]: expected value of type [number] but got [string]"} + setting | value | responseStatusCode | responseBodyMessage + ${'alerts.sample.prefix'} | ${'test'} | ${200} | ${null} + ${'alerts.sample.prefix'} | ${''} | ${400} | ${"[request body.alerts.sample.prefix]: Value can not be empty."} + ${'alerts.sample.prefix'} | ${'test space'} | ${400} | ${"[request body.alerts.sample.prefix]: No whitespaces allowed."} + ${'alerts.sample.prefix'} | ${4} | ${400} | ${'[request body.alerts.sample.prefix]: expected value of type [string] but got [number]'} + ${'alerts.sample.prefix'} | ${'-test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'_test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'+test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'.test'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't start with: -, _, +, .."} + ${'alerts.sample.prefix'} | ${'test\\'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test/'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test?'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test"'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test<'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test>'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test|'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test,'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test#'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'alerts.sample.prefix'} | ${'test*'} | ${400} | ${"[request body.alerts.sample.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'checks.api'} | ${true} | ${200} | ${null} + ${'checks.api'} | ${0} | ${400} | ${'[request body.checks.api]: expected value of type [boolean] but got [number]'} + ${'checks.fields'} | ${true} | ${200} | ${null} + ${'checks.fields'} | ${0} | ${400} | ${'[request body.checks.fields]: expected value of type [boolean] but got [number]'} + ${'checks.maxBuckets'} | ${true} | ${200} | ${null} + ${'checks.maxBuckets'} | ${0} | ${400} | ${'[request body.checks.maxBuckets]: expected value of type [boolean] but got [number]'} + ${'checks.pattern'} | ${true} | ${200} | ${null} + ${'checks.pattern'} | ${0} | ${400} | ${'[request body.checks.pattern]: expected value of type [boolean] but got [number]'} + ${'checks.setup'} | ${true} | ${200} | ${null} + ${'checks.setup'} | ${0} | ${400} | ${'[request body.checks.setup]: expected value of type [boolean] but got [number]'} + ${'checks.template'} | ${true} | ${200} | ${null} + ${'checks.template'} | ${0} | ${400} | ${'[request body.checks.template]: expected value of type [boolean] but got [number]'} + ${'checks.timeFilter'} | ${true} | ${200} | ${null} + ${'checks.timeFilter'} | ${0} | ${400} | ${'[request body.checks.timeFilter]: expected value of type [boolean] but got [number]'} + ${'cron.prefix'} | ${'test'} | ${200} | ${null} + ${'cron.prefix'} | ${'test space'} | ${400} | ${"[request body.cron.prefix]: No whitespaces allowed."} + ${'cron.prefix'} | ${''} | ${400} | ${"[request body.cron.prefix]: Value can not be empty."} + ${'cron.prefix'} | ${4} | ${400} | ${'[request body.cron.prefix]: expected value of type [string] but got [number]'} + ${'cron.prefix'} | ${'-test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'_test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'+test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'.test'} | ${400} | ${"[request body.cron.prefix]: It can't start with: -, _, +, .."} + ${'cron.prefix'} | ${'test\\'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test/'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test?'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test"'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test<'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test>'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test|'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test,'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test#'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.prefix'} | ${'test*'} | ${400} | ${"[request body.cron.prefix]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.apis'} | ${['test']} | ${200} | ${null} + ${'cron.statistics.apis'} | ${['test ']} | ${400} | ${"[request body.cron.statistics.apis.0]: No whitespaces allowed."} + ${'cron.statistics.apis'} | ${['']} | ${400} | ${"[request body.cron.statistics.apis.0]: Value can not be empty."} + ${'cron.statistics.apis'} | ${['test', 4]} | ${400} | ${"[request body.cron.statistics.apis.1]: expected value of type [string] but got [number]"} + ${'cron.statistics.apis'} | ${'test space'} | ${400} | ${"[request body.cron.statistics.apis]: could not parse array value from json input"} + ${'cron.statistics.apis'} | ${true} | ${400} | ${"[request body.cron.statistics.apis]: expected value of type [array] but got [boolean]"} + ${'cron.statistics.index.creation'} | ${'h'} | ${200} | ${null} + ${'cron.statistics.index.creation'} | ${'d'} | ${200} | ${null} + ${'cron.statistics.index.creation'} | ${'w'} | ${200} | ${null} + ${'cron.statistics.index.creation'} | ${'m'} | ${200} | ${null} + ${'cron.statistics.index.creation'} | ${'test'} | ${400} | ${"[request body.cron.statistics.index.creation]: types that failed validation:\n- [request body.cron.statistics.index.creation.0]: expected value to equal [h]\n- [request body.cron.statistics.index.creation.1]: expected value to equal [d]\n- [request body.cron.statistics.index.creation.2]: expected value to equal [w]\n- [request body.cron.statistics.index.creation.3]: expected value to equal [m]"} + ${'cron.statistics.index.name'} | ${'test'} | ${200} | ${null} + ${'cron.statistics.index.name'} | ${''} | ${400} | ${"[request body.cron.statistics.index.name]: Value can not be empty."} + ${'cron.statistics.index.name'} | ${'test space'} | ${400} | ${"[request body.cron.statistics.index.name]: No whitespaces allowed."} + ${'cron.statistics.index.name'} | ${true} | ${400} | ${"[request body.cron.statistics.index.name]: expected value of type [string] but got [boolean]"} + ${'cron.statistics.index.name'} | ${'-test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'_test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'+test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'.test'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't start with: -, _, +, .."} + ${'cron.statistics.index.name'} | ${'test\\'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test/'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test?'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test"'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test<'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test>'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test|'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test,'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test#'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.name'} | ${'test*'} | ${400} | ${"[request body.cron.statistics.index.name]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #, *."} + ${'cron.statistics.index.replicas'} | ${0} | ${200} | ${null} + ${'cron.statistics.index.replicas'} | ${-1} | ${400} | ${"[request body.cron.statistics.index.replicas]: Value should be greater or equal than 0."} + ${'cron.statistics.index.replicas'} | ${'custom'} | ${400} | ${"[request body.cron.statistics.index.replicas]: expected value of type [number] but got [string]"} + ${'cron.statistics.index.replicas'} | ${1.2} | ${400} | ${"[request body.cron.statistics.index.replicas]: Number should be an integer."} + ${'cron.statistics.index.shards'} | ${1} | ${200} | ${null} + ${'cron.statistics.index.shards'} | ${-1} | ${400} | ${"[request body.cron.statistics.index.shards]: Value should be greater or equal than 1."} + ${'cron.statistics.index.shards'} | ${1.2} | ${400} | ${"[request body.cron.statistics.index.shards]: Number should be an integer."} + ${'cron.statistics.interval'} | ${'0 */5 * * * *'} | ${200} | ${null} + ${'cron.statistics.interval'} | ${'0 */5 * * *'} | ${200} | ${null} + ${'cron.statistics.interval'} | ${'custom'} | ${400} | ${"[request body.cron.statistics.interval]: Interval is not valid."} + ${'cron.statistics.interval'} | ${true} | ${400} | ${"[request body.cron.statistics.interval]: expected value of type [string] but got [boolean]"} + ${'cron.statistics.status'} | ${true} | ${200} | ${null} + ${'cron.statistics.status'} | ${0} | ${400} | ${'[request body.cron.statistics.status]: expected value of type [boolean] but got [number]'} + ${'customization.reports.footer'} | ${'Test'} | ${200} | ${null} + ${'customization.reports.footer'} | ${'Test\nTest'} | ${200} | ${null} + ${'customization.reports.footer'} | ${'Test\nTest\nTest\nTest\nTest'} | ${400} | ${"[request body.customization.reports.footer]: The string should have less or equal to 2 line/s."} + ${'customization.reports.footer'} | ${'Line with 30 characters \nTest'} | ${200} | ${undefined} + ${'customization.reports.footer'} | ${'Line with 31 characters \nTest'} | ${400} | ${"[request body.customization.reports.footer]: The maximum length of a line is 30 characters."} + ${'customization.reports.footer'} | ${true} | ${400} | ${'[request body.customization.reports.footer]: expected value of type [string] but got [boolean]'} + ${'customization.reports.header'} | ${'Test'} | ${200} | ${null} + ${'customization.reports.header'} | ${'Test\nTest'} | ${200} | ${null} + ${'customization.reports.header'} | ${'Test\nTest\nTest\nTest\nTest'} | ${400} | ${"[request body.customization.reports.header]: The string should have less or equal to 3 line/s."} + ${'customization.reports.header'} | ${'Line with 20 charact\nTest'} | ${200} | ${undefined} + ${'customization.reports.header'} | ${'Line with 23 characters\nTest'} | ${400} | ${"[request body.customization.reports.header]: The maximum length of a line is 20 characters."} + ${'customization.reports.header'} | ${true} | ${400} | ${'[request body.customization.reports.header]: expected value of type [string] but got [boolean]'} + ${'disabled_roles'} | ${['test']} | ${200} | ${null} + ${'disabled_roles'} | ${['']} | ${400} | ${'[request body.disabled_roles.0]: Value can not be empty.'} + ${'disabled_roles'} | ${['test space']} | ${400} | ${"[request body.disabled_roles.0]: No whitespaces allowed."} + ${'disabled_roles'} | ${['test', 4]} | ${400} | ${"[request body.disabled_roles.1]: expected value of type [string] but got [number]"} + ${'enrollment.dns'} | ${'test'} | ${200} | ${null} + ${'enrollment.dns'} | ${''} | ${200} | ${null} + ${'enrollment.dns'} | ${'test space'} | ${400} | ${"[request body.enrollment.dns]: No whitespaces allowed."} + ${'enrollment.dns'} | ${true} | ${400} | ${'[request body.enrollment.dns]: expected value of type [string] but got [boolean]'} + ${'enrollment.password'} | ${'test'} | ${200} | ${null} + ${'enrollment.password'} | ${''} | ${400} | ${"[request body.enrollment.password]: Value can not be empty."} + ${'enrollment.password'} | ${'test space'} | ${200} | ${null} + ${'enrollment.password'} | ${true} | ${400} | ${'[request body.enrollment.password]: expected value of type [string] but got [boolean]'} + ${'extensions.audit'} | ${true} | ${200} | ${null} + ${'extensions.audit'} | ${0} | ${400} | ${'[request body.extensions.audit]: expected value of type [boolean] but got [number]'} + ${'extensions.aws'} | ${true} | ${200} | ${null} + ${'extensions.aws'} | ${0} | ${400} | ${'[request body.extensions.aws]: expected value of type [boolean] but got [number]'} + ${'extensions.ciscat'} | ${true} | ${200} | ${null} + ${'extensions.ciscat'} | ${0} | ${400} | ${'[request body.extensions.ciscat]: expected value of type [boolean] but got [number]'} + ${'extensions.gcp'} | ${true} | ${200} | ${null} + ${'extensions.gcp'} | ${0} | ${400} | ${'[request body.extensions.gcp]: expected value of type [boolean] but got [number]'} + ${'extensions.gdpr'} | ${true} | ${200} | ${null} + ${'extensions.gdpr'} | ${0} | ${400} | ${'[request body.extensions.gdpr]: expected value of type [boolean] but got [number]'} + ${'extensions.hipaa'} | ${true} | ${200} | ${null} + ${'extensions.hipaa'} | ${0} | ${400} | ${'[request body.extensions.hipaa]: expected value of type [boolean] but got [number]'} + ${'extensions.nist'} | ${true} | ${200} | ${null} + ${'extensions.nist'} | ${0} | ${400} | ${'[request body.extensions.nist]: expected value of type [boolean] but got [number]'} + ${'extensions.oscap'} | ${true} | ${200} | ${null} + ${'extensions.oscap'} | ${0} | ${400} | ${'[request body.extensions.oscap]: expected value of type [boolean] but got [number]'} + ${'extensions.osquery'} | ${true} | ${200} | ${null} + ${'extensions.osquery'} | ${0} | ${400} | ${'[request body.extensions.osquery]: expected value of type [boolean] but got [number]'} + ${'extensions.pci'} | ${true} | ${200} | ${null} + ${'extensions.pci'} | ${0} | ${400} | ${'[request body.extensions.pci]: expected value of type [boolean] but got [number]'} + ${'extensions.tsc'} | ${true} | ${200} | ${null} + ${'extensions.tsc'} | ${0} | ${400} | ${'[request body.extensions.tsc]: expected value of type [boolean] but got [number]'} + ${'extensions.virustotal'} | ${true} | ${200} | ${null} + ${'extensions.virustotal'} | ${0} | ${400} | ${'[request body.extensions.virustotal]: expected value of type [boolean] but got [number]'} + ${'ip.ignore'} | ${['test']} | ${200} | ${null} + ${'ip.ignore'} | ${['test*']} | ${200} | ${null} + ${'ip.ignore'} | ${['']} | ${400} | ${'[request body.ip.ignore.0]: Value can not be empty.'} + ${'ip.ignore'} | ${['test space']} | ${400} | ${"[request body.ip.ignore.0]: No whitespaces allowed."} + ${'ip.ignore'} | ${true} | ${400} | ${"[request body.ip.ignore]: expected value of type [array] but got [boolean]"} + ${'ip.ignore'} | ${['-test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['_test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['+test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['.test']} | ${400} | ${"[request body.ip.ignore.0]: It can't start with: -, _, +, .."} + ${'ip.ignore'} | ${['test\\']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test/']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test?']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test"']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test<']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test>']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test|']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test,']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test#']} | ${400} | ${"[request body.ip.ignore.0]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.ignore'} | ${['test', 'test#']} | ${400} | ${"[request body.ip.ignore.1]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'ip.selector'} | ${true} | ${200} | ${null} + ${'ip.selector'} | ${''} | ${400} | ${'[request body.ip.selector]: expected value of type [boolean] but got [string]'} + ${'logs.level'} | ${'info'} | ${200} | ${null} + ${'logs.level'} | ${'debug'} | ${200} | ${null} + ${'logs.level'} | ${''} | ${400} | ${'[request body.logs.level]: types that failed validation:\n- [request body.logs.level.0]: expected value to equal [info]\n- [request body.logs.level.1]: expected value to equal [debug]'} + ${'pattern'} | ${'test'} | ${200} | ${null} + ${'pattern'} | ${'test*'} | ${200} | ${null} + ${'pattern'} | ${''} | ${400} | ${'[request body.pattern]: Value can not be empty.'} + ${'pattern'} | ${'test space'} | ${400} | ${"[request body.pattern]: No whitespaces allowed."} + ${'pattern'} | ${true} | ${400} | ${'[request body.pattern]: expected value of type [string] but got [boolean]'} + ${'pattern'} | ${'-test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} + ${'pattern'} | ${'_test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} + ${'pattern'} | ${'+test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} + ${'pattern'} | ${'.test'} | ${400} | ${"[request body.pattern]: It can't start with: -, _, +, .."} + ${'pattern'} | ${'test\\'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test/'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test?'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test"'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test<'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test>'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test|'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test,'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'pattern'} | ${'test#'} | ${400} | ${"[request body.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'timeout'} | ${15000} | ${200} | ${null} + ${'timeout'} | ${1000} | ${400} | ${'[request body.timeout]: Value should be greater or equal than 1500.'} + ${'timeout'} | ${''} | ${400} | ${'[request body.timeout]: expected value of type [number] but got [string]'} + ${'timeout'} | ${1.2} | ${400} | ${"[request body.timeout]: Number should be an integer."} + ${'wazuh.monitoring.creation'} | ${'h'} | ${200} | ${null} + ${'wazuh.monitoring.creation'} | ${'d'} | ${200} | ${null} + ${'wazuh.monitoring.creation'} | ${'w'} | ${200} | ${null} + ${'wazuh.monitoring.creation'} | ${'m'} | ${200} | ${null} + ${'wazuh.monitoring.creation'} | ${'test'} | ${400} | ${"[request body.wazuh.monitoring.creation]: types that failed validation:\n- [request body.wazuh.monitoring.creation.0]: expected value to equal [h]\n- [request body.wazuh.monitoring.creation.1]: expected value to equal [d]\n- [request body.wazuh.monitoring.creation.2]: expected value to equal [w]\n- [request body.wazuh.monitoring.creation.3]: expected value to equal [m]"} + ${'wazuh.monitoring.enabled'} | ${true} | ${200} | ${null} + ${'wazuh.monitoring.enabled'} | ${0} | ${400} | ${'[request body.wazuh.monitoring.enabled]: expected value of type [boolean] but got [number]'} + ${'wazuh.monitoring.frequency'} | ${100} | ${200} | ${null} + ${'wazuh.monitoring.frequency'} | ${40} | ${400} | ${"[request body.wazuh.monitoring.frequency]: Value should be greater or equal than 60."} + ${'wazuh.monitoring.frequency'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.frequency]: Number should be an integer."} + ${'wazuh.monitoring.frequency'} | ${''} | ${400} | ${'[request body.wazuh.monitoring.frequency]: expected value of type [number] but got [string]'} + ${'wazuh.monitoring.pattern'} | ${'test'} | ${200} | ${null} + ${'wazuh.monitoring.pattern'} | ${'test*'} | ${200} | ${null} + ${'wazuh.monitoring.pattern'} | ${''} | ${400} | ${'[request body.wazuh.monitoring.pattern]: value has length [0] but it must have a minimum length of [1].'} + ${'wazuh.monitoring.pattern'} | ${true} | ${400} | ${'[request body.wazuh.monitoring.pattern]: expected value of type [string] but got [boolean]'} + ${'wazuh.monitoring.pattern'} | ${'-test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'_test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'+test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'.test'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't start with: -, _, +, .."} + ${'wazuh.monitoring.pattern'} | ${'test\\'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test/'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test?'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test"'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test<'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test>'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test|'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test,'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.pattern'} | ${'test#'} | ${400} | ${"[request body.wazuh.monitoring.pattern]: It can't contain invalid characters: \\, /, ?, \", <, >, |, ,, #."} + ${'wazuh.monitoring.replicas'} | ${0} | ${200} | ${null} + ${'wazuh.monitoring.replicas'} | ${-1} | ${400} | ${"[request body.wazuh.monitoring.replicas]: Value should be greater or equal than 0."} + ${'wazuh.monitoring.replicas'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.replicas]: Number should be an integer."} + ${'wazuh.monitoring.replicas'} | ${'custom'} | ${400} | ${"[request body.wazuh.monitoring.replicas]: expected value of type [number] but got [string]"} + ${'wazuh.monitoring.shards'} | ${1} | ${200} | ${null} + ${'wazuh.monitoring.shards'} | ${-1} | ${400} | ${"[request body.wazuh.monitoring.shards]: Value should be greater or equal than 1."} + ${'wazuh.monitoring.shards'} | ${1.2} | ${400} | ${"[request body.wazuh.monitoring.shards]: Number should be an integer."} + ${'wazuh.monitoring.shards'} | ${'custom'} | ${400} | ${"[request body.wazuh.monitoring.shards]: expected value of type [number] but got [string]"} `(`$setting: $value - PUT /utils/configuration - $responseStatusCode`, async ({ responseBodyMessage, responseStatusCode, setting, value }) => { const body = { [setting]: value }; const response = await supertest(innerServer.listener)