Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upload file for customization.logo.* settings #4504

Merged
merged 139 commits into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
918418f
feat(settings): centralize the plugin settings
Desvelao Sep 13, 2022
de48a49
feat(settings): add setting services and replaced the references to c…
Desvelao Sep 13, 2022
c25a1a0
feat(settings): refactor the content of the default configuration file
Desvelao Sep 13, 2022
ffdb2d7
feat(inputs): create new inputs components
Desvelao Sep 13, 2022
e7cd9b0
feat(configuration): refactor the form of Settings/Configuration
Desvelao Sep 13, 2022
5999419
feat(settings): support updating multiple setting at the same time
Desvelao Sep 13, 2022
9a2b9ba
feat: add validation to the plugin settings
Desvelao Sep 13, 2022
f530d7a
feat(validation): add validation to the `PUT /utils/configuration`
Desvelao Sep 13, 2022
b6a7220
feat(validation): add validation to the configuration form in
Desvelao Sep 13, 2022
134ffd8
feat(validatio): remove no used import
Desvelao Sep 13, 2022
9b977e6
clean: remove not used code
Desvelao Sep 13, 2022
a984a7c
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 13, 2022
c2cb112
feat(settings): upload file for `customization.logo` settigs
Desvelao Sep 13, 2022
f3a7b71
feat(settings): Add validation for extensions of files for `customiza…
Desvelao Sep 13, 2022
17ad2e8
fix: fixed category name in `Settings/Configuration`
Desvelao Sep 13, 2022
ce4652e
fix(settings): Fix accessing to `validate` of undefined error
Desvelao Sep 13, 2022
23b925d
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 13, 2022
a454dd8
fix(settings): fixed error due to missing service
Desvelao Sep 13, 2022
a56e9d1
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 13, 2022
c39e70e
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 13, 2022
ea8ae9b
fix(settings): fixed problems setting a custom logo.
Desvelao Sep 13, 2022
1c9aee0
Made upload file mkdir recursive
asteriscos Sep 14, 2022
20ac021
Fixed configuration image preview ratios
asteriscos Sep 14, 2022
7002585
Fixed logo aspect ratio in wz-menu
asteriscos Sep 15, 2022
cfe5c72
Fix file input Remove button error
asteriscos Sep 15, 2022
5d68615
fix(settings): refactor the form and inputs of `Settings/Configuratio…
Desvelao Sep 16, 2022
ef8d6ad
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 16, 2022
cf15ef8
fix: add value transformation for the form inputs and output of field…
Desvelao Sep 19, 2022
2597cf6
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 19, 2022
951812e
fix: Fixed some settings validation
Desvelao Sep 19, 2022
e0a057e
fix(settings): fixed validation of literals
Desvelao Sep 19, 2022
9699336
fix(settings): removed unused import
Desvelao Sep 19, 2022
e5d7622
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 19, 2022
4c8678a
feat(settings): clean file picker inputs when there is a selected fil…
Desvelao Sep 19, 2022
79af3b8
fix(settings): get plugin setting description to display in Settings/…
Desvelao Sep 19, 2022
0a1ee1d
fix(settings): renamed properties related to transform the value of t…
Desvelao Sep 19, 2022
0109910
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 19, 2022
1ac7a5e
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 19, 2022
b4ef2cd
feat(settings): add description to the plugin setting definition prop…
Desvelao Sep 19, 2022
fac95d5
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 19, 2022
c300fc2
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 19, 2022
138db83
fix(settings): fix getConfiguration service when the configuration fi…
Desvelao Sep 20, 2022
710800d
fix(settings): Fixed error when do changes of the `useForm` hook an r…
Desvelao Sep 20, 2022
7d7decc
tests(settings): add test related to the plugin settings and its conf…
Desvelao Sep 20, 2022
5f4d0bd
feat(settings): rename plugin setting options of type select to match…
Desvelao Sep 21, 2022
0cb6be5
feat(settings): add plugin settings services and enhance the descript…
Desvelao Sep 21, 2022
34ddc38
tests(input-form): update tests of InputForm component
Desvelao Sep 21, 2022
f74553b
test(configuration-file): add tests of the default configuration file
Desvelao Sep 21, 2022
4bc1972
feat(settings): remove `extensions.mitre` plugin setting
Desvelao Sep 21, 2022
c4b4c3e
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 21, 2022
28c2266
test(settings): add test to validate the plugin setting when updating…
Desvelao Sep 22, 2022
3d2ca47
feat(settings): add documentation to some setting services and test s…
Desvelao Sep 22, 2022
ef631ff
fix: fixed documentation of setting service
Desvelao Sep 22, 2022
1851f9e
doc(settings): move the documentation of the plugin setting properties
Desvelao Sep 22, 2022
d2a8773
fix(settings): rename some plugin setting properties because of reque…
Desvelao Sep 23, 2022
1d34f6c
tests: fix tests of InputForm component
Desvelao Sep 23, 2022
ac3ebc2
fix: response properties when saving the configuration
Desvelao Sep 23, 2022
70e408d
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 23, 2022
1356c5b
fix(settings): fix validation plugin settings value in the UI
Desvelao Sep 23, 2022
5ce3672
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 23, 2022
5afb146
feat(settings): add validation of selected file size
Desvelao Sep 23, 2022
6e8b657
fix(settings): fix validation of numbers
Desvelao Sep 23, 2022
12e8a90
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 23, 2022
b0881c6
fix(settings): fix validation of numbers
Desvelao Sep 23, 2022
36ccbc0
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 23, 2022
6796284
fix(settings): fix an issue when removing a file from a file picker t…
Desvelao Sep 23, 2022
e42f9ae
fix(settings): fix error when deleting a custom image
Desvelao Sep 23, 2022
2bb0ce1
feat(settings): format bytes to meaningful unit.
Desvelao Sep 26, 2022
7855a3f
test(settings): Add tests related to validation for the `useForm` hoo…
Desvelao Sep 26, 2022
5105f24
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Sep 26, 2022
b7869d6
test(settings): add test to upload and delete customization files
Desvelao Sep 26, 2022
716a582
fix(settings): fix displaying toast to run the healthcheck when savin…
Desvelao Sep 26, 2022
8ae5067
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 26, 2022
494a8d0
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Sep 26, 2022
97f9318
feat(settings): add file size to the settings description
Desvelao Sep 27, 2022
0a97d9d
fix(settings): remove the selected files in the file pickers when cli…
Desvelao Sep 27, 2022
93157e3
Added category sorting + description + docs link
asteriscos Sep 28, 2022
a007e01
Added settings sorting within their category
asteriscos Sep 28, 2022
0549cb6
Fixed constant types definition
asteriscos Sep 28, 2022
26fa66c
Checks if localCompare exists validation
asteriscos Sep 28, 2022
1f4c01a
fix(settings): fixed plugin setting description doesn't display the m…
Desvelao Oct 3, 2022
33bc999
fix(settings): fix setting type of `wazuh.monitoring.replicas` and li…
Desvelao Oct 3, 2022
ffb1eb9
feat(settins): add plugin settings category description
Desvelao Oct 3, 2022
a935861
fix(settings): fix a problem comparing the initial and current value …
Desvelao Oct 3, 2022
3847992
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Oct 3, 2022
fbc1c5c
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Oct 3, 2022
03f5550
fix(settings): fix wrong conflict resolution
Desvelao Oct 3, 2022
b551b00
fix(settings): fix typo in setting description
Desvelao Oct 3, 2022
8adf7b4
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Oct 3, 2022
a3c56f6
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Oct 3, 2022
a4e202e
feat(settings): enhance the validation of plugin settings related to …
Desvelao Oct 4, 2022
08792c9
feat(settings): add validation of setting values in the inputs
Desvelao Oct 4, 2022
624a8f4
fix(tests): format tables of the tests
Desvelao Oct 5, 2022
d6a22a7
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Oct 5, 2022
14f0709
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Oct 5, 2022
38278c5
test(settings): add tests related to the `customization.logo.*` in th…
Desvelao Oct 5, 2022
282b7e9
Fix small typo
asteriscos Oct 5, 2022
dc7f80b
fix(settings): fix response when uploading custom files for `customiz…
Desvelao Oct 6, 2022
0f08dc1
feat(upload-file): get the file extension from file buffer.
Desvelao Oct 6, 2022
12fe59c
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Oct 6, 2022
7b29b6e
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Oct 6, 2022
04f7457
fix(settings): fix a typo in a toast related to modify the plugin set…
Desvelao Oct 6, 2022
066002e
Merge branch 'feat/centralize-plugin-settings' of https://github.com/…
Desvelao Oct 6, 2022
d6f6171
Merge branch 'feat/settings-validation' of https://github.com/wazuh/w…
Desvelao Oct 6, 2022
312461c
Changed Custom Branding documentation link
asteriscos Oct 11, 2022
6d5afcd
Merge centralize plugin settings PR
asteriscos Oct 11, 2022
938bacc
Fix white-labeling documentation url
asteriscos Oct 11, 2022
e3c31f3
Code format
asteriscos Oct 20, 2022
19c7cac
Delete unused imports
asteriscos Oct 20, 2022
84472df
Merge branch 'feat/centralize-plugin-settings' into feat/settings-val…
AlexRuiz7 Oct 20, 2022
e6da4c3
fix(settings): fix a problem with the useForm hook
Desvelao Oct 21, 2022
dffeb09
fix(settings): refactor the settings validation function to a class a…
Desvelao Oct 21, 2022
e5a28ea
feat(settings): add check for integer numbers and adapt the affected …
Desvelao Oct 21, 2022
25024e9
Merge branch 'feat/settings-validation' into feat/settings-upload-file
asteriscos Oct 24, 2022
254a718
Merge branch '4.4-7.10' into feat/settings-validation
AlexRuiz7 Oct 24, 2022
d4870d7
Fix semi-colon error
asteriscos Oct 25, 2022
368d171
Merge branch '4.4-7.10' into feat/settings-validation
AlexRuiz7 Oct 25, 2022
92a0109
Merge branch 'feat/settings-validation' into feat/settings-upload-file
AlexRuiz7 Oct 25, 2022
308f146
changelog: add entries to changelog
Desvelao Oct 25, 2022
af6f915
Merge branch 'feat/settings-validation' into feat/settings-upload-file
AlexRuiz7 Oct 25, 2022
beb02b5
Merge branch '4.4-7.10' into feat/settings-validation
AlexRuiz7 Oct 25, 2022
021e5a3
Merge branch 'feat/settings-validation' into feat/settings-upload-file
AlexRuiz7 Oct 25, 2022
9a2c0b8
Merge branch '4.4-7.10' into feat/settings-upload-file
AlexRuiz7 Oct 26, 2022
34ee9a3
fix(settings): fix some request changes
Desvelao Oct 26, 2022
fc46f92
fix(settings): fix an unsupported attribute for the number inputs
Desvelao Oct 26, 2022
1c96707
fix(settings): fix a problem when removing the `customization.logo.re…
Desvelao Oct 26, 2022
8535261
fix(settings): remove unused import
Desvelao Oct 26, 2022
b2794fa
Change validation error for inputs that don't allow whitespaces
AlexRuiz7 Oct 26, 2022
b7c2492
Update file-extension.ts
AlexRuiz7 Oct 26, 2022
723d105
feat(settings): change the layout of the filepicker input plus logo a…
Desvelao Oct 26, 2022
5195abf
test: update snapshots
Desvelao Oct 27, 2022
f831037
test: fix tests and update snapshots
Desvelao Oct 27, 2022
cafec69
changelog: add PR entry
Desvelao Oct 27, 2022
de863d1
changelog:fix PR entries
Desvelao Oct 27, 2022
9ddf35e
Merge branch '4.4-7.10' of https://github.com/wazuh/wazuh-kibana-app …
Desvelao Oct 27, 2022
9edc9da
fix(settings): fix a problem with SVG images that are not displayed w…
Desvelao Oct 28, 2022
88822ca
fix: remove comment
Desvelao Oct 28, 2022
ccd57ca
Fix logo image cache on upload
asteriscos Oct 28, 2022
60f9d79
Added a comment describing image versioning
asteriscos Oct 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,6 @@ cypress/.idea/
cypress/cypress.env.json
cypress/report/
cypress/cookies.json

# Customization plugin assets
public/assets/custom/*
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ All notable changes to the Wazuh app project will be documented in this file.
- Added agent synchronization status in the agent module. [#3874](https://github.com/wazuh/wazuh-kibana-app/pull/3874)
- 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 [#4501](https://github.com/wazuh/wazuh-kibana-app/pull/4503)
- 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)

### Changed

Expand All @@ -20,6 +20,7 @@ All notable changes to the Wazuh app project will be documented in this file.
- Made Agents Overview icons load independently [#4363](https://github.com/wazuh/wazuh-kibana-app/pull/4363)
- Improved the message displayed when there is a versions mismatch between the Wazuh API and the Wazuh APP [#4529](https://github.com/wazuh/wazuh-kibana-app/pull/4529)
- Changed the endpoint that updates the plugin configuration to support multiple settings. [#4501](https://github.com/wazuh/wazuh-kibana-app/pull/4501)
- Allowed to upload an image for the `customization.logo.*` settings in `Settings/Configuration` [#4504](https://github.com/wazuh/wazuh-kibana-app/pull/4504)

### Fixed

Expand Down
166 changes: 153 additions & 13 deletions common/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,11 @@ export const DOCUMENTATION_WEB_BASE_URL = "https://documentation.wazuh.com";
// Default Elasticsearch user name context
export const ELASTIC_NAME = 'elastic';


// Customization
export const CUSTOMIZATION_ENDPOINT_PAYLOAD_UPLOAD_CUSTOM_FILE_MAXIMUM_BYTES = 1048576;


// Plugin settings
export enum SettingCategory {
GENERAL,
Expand All @@ -357,6 +362,35 @@ type TPluginSettingOptionsSelect = {
select: { text: string, value: any }[]
};

type TPluginSettingOptionsEditor = {
editor: {
language: string
}
};

type TPluginSettingOptionsFile = {
file: {
type: 'image'
extensions?: string[]
size?: {
maxBytes?: number
minBytes?: number
}
recommended?: {
dimensions?: {
width: number,
height: number,
unit: string
}
}
store?: {
relativePathFileSystem: string
filename: string
resolveStaticURL: (filename: string) => string
}
}
};

type TPluginSettingOptionsNumber = {
number: {
min?: number
Expand All @@ -365,12 +399,6 @@ type TPluginSettingOptionsNumber = {
}
};

type TPluginSettingOptionsEditor = {
editor: {
language: string
}
};

type TPluginSettingOptionsSwitch = {
switch: {
values: {
Expand All @@ -387,6 +415,7 @@ export enum EpluginSettingType {
number = 'number',
editor = 'editor',
select = 'select',
filepicker = 'filepicker'
};

export type TPluginSetting = {
Expand All @@ -413,14 +442,14 @@ 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 | TPluginSettingOptionsSelect | TPluginSettingOptionsSwitch
options?: TPluginSettingOptionsNumber | TPluginSettingOptionsEditor | TPluginSettingOptionsFile | TPluginSettingOptionsSelect | TPluginSettingOptionsSwitch
// 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
uiFormTransformConfigurationValueToInputValue?: (value: any) => any
// Transform the input value changed in the form of Settings/Configuration and returned in the `changed` property of the hook useForm
uiFormTransformInputValueToConfigurationValue?: (value: any) => any
// Validate the value in the form of Settings/Configuration. It returns a string if there is some validation error.
// Validate the value in the form of Settings/Configuration. It returns a string if there is some validation error.
validate?: (value: any) => string | undefined
// Validate function creator to validate the setting in the backend. It uses `schema` of the `@kbn/config-schema` package.
validateBackend?: (schema: any) => (value: unknown) => string | undefined
Expand Down Expand Up @@ -898,39 +927,150 @@ export const PLUGIN_SETTINGS: { [key: string]: TPluginSetting } = {
title: "App main logo",
description: `This logo is used in the app main menu, at the top left corner.`,
category: SettingCategory.CUSTOMIZATION,
type: EpluginSettingType.text,
type: EpluginSettingType.filepicker,
defaultValue: "",
isConfigurableFromFile: true,
isConfigurableFromUI: true,
options: {
file: {
type: 'image',
extensions: ['.jpeg', '.jpg', '.png', '.svg'],
size: {
maxBytes: CUSTOMIZATION_ENDPOINT_PAYLOAD_UPLOAD_CUSTOM_FILE_MAXIMUM_BYTES,
},
recommended: {
dimensions: {
width: 300,
height: 70,
unit: 'px'
}
},
store: {
relativePathFileSystem: 'public/assets/custom/images',
filename: 'customization.logo.app',
resolveStaticURL: (filename: string) => `custom/images/${filename}?v=${Date.now()}`
// ?v=${Date.now()} is used to force the browser to reload the image when a new file is uploaded
}
}
},
validate: function(value){
return SettingsValidator.compose(
SettingsValidator.filePickerFileSize({...this.options.file.size, meaningfulUnit: true}),
SettingsValidator.filePickerSupportedExtensions(this.options.file.extensions)
)(value)
},
},
"customization.logo.healthcheck": {
title: "Healthcheck logo",
description: `This logo is displayed during the Healthcheck routine of the app.`,
category: SettingCategory.CUSTOMIZATION,
type: EpluginSettingType.text,
type: EpluginSettingType.filepicker,
defaultValue: "",
isConfigurableFromFile: true,
isConfigurableFromUI: true,
options: {
file: {
type: 'image',
extensions: ['.jpeg', '.jpg', '.png', '.svg'],
size: {
maxBytes: CUSTOMIZATION_ENDPOINT_PAYLOAD_UPLOAD_CUSTOM_FILE_MAXIMUM_BYTES,
},
recommended: {
dimensions: {
width: 300,
height: 70,
unit: 'px'
}
},
store: {
relativePathFileSystem: 'public/assets/custom/images',
filename: 'customization.logo.healthcheck',
resolveStaticURL: (filename: string) => `custom/images/${filename}?v=${Date.now()}`
// ?v=${Date.now()} is used to force the browser to reload the image when a new file is uploaded
}
}
},
validate: function(value){
return SettingsValidator.compose(
SettingsValidator.filePickerFileSize({...this.options.file.size, meaningfulUnit: true}),
SettingsValidator.filePickerSupportedExtensions(this.options.file.extensions)
)(value)
},
},
"customization.logo.reports": {
title: "PDF reports logo",
description: `This logo is used in the PDF reports generated by the app. It's placed at the top left corner of every page of the PDF.`,
category: SettingCategory.CUSTOMIZATION,
type: EpluginSettingType.text,
type: EpluginSettingType.filepicker,
defaultValue: "",
defaultValueIfNotSet: REPORTS_LOGO_IMAGE_ASSETS_RELATIVE_PATH,
isConfigurableFromFile: true,
isConfigurableFromUI: true,
options: {
file: {
type: 'image',
extensions: ['.jpeg', '.jpg', '.png'],
size: {
maxBytes: CUSTOMIZATION_ENDPOINT_PAYLOAD_UPLOAD_CUSTOM_FILE_MAXIMUM_BYTES,
},
recommended: {
dimensions: {
width: 190,
height: 40,
unit: 'px'
}
},
store: {
relativePathFileSystem: 'public/assets/custom/images',
filename: 'customization.logo.reports',
resolveStaticURL: (filename: string) => `custom/images/${filename}`
}
}
},
validate: function(value){
return SettingsValidator.compose(
SettingsValidator.filePickerFileSize({...this.options.file.size, meaningfulUnit: true}),
SettingsValidator.filePickerSupportedExtensions(this.options.file.extensions)
)(value)
},
},
"customization.logo.sidebar": {
title: "Navigation drawer logo",
description: `This is the logo for the app to display in the platform's navigation drawer, this is, the main sidebar collapsible menu.`,
category: SettingCategory.CUSTOMIZATION,
type: EpluginSettingType.text,
type: EpluginSettingType.filepicker,
defaultValue: "",
isConfigurableFromFile: true,
isConfigurableFromUI: true,
requiresReloadingBrowserTab: true,
options: {
file: {
type: 'image',
extensions: ['.jpeg', '.jpg', '.png', '.svg'],
size: {
maxBytes: CUSTOMIZATION_ENDPOINT_PAYLOAD_UPLOAD_CUSTOM_FILE_MAXIMUM_BYTES,
},
recommended: {
dimensions: {
width: 80,
height: 80,
unit: 'px'
}
},
store: {
relativePathFileSystem: 'public/assets/custom/images',
filename: 'customization.logo.sidebar',
resolveStaticURL: (filename: string) => `custom/images/${filename}?v=${Date.now()}`
// ?v=${Date.now()} is used to force the browser to reload the image when a new file is uploaded
}
}
},
validate: function(value){
return SettingsValidator.compose(
SettingsValidator.filePickerFileSize({...this.options.file.size, meaningfulUnit: true}),
SettingsValidator.filePickerSupportedExtensions(this.options.file.extensions)
)(value)
},
},
"disabled_roles": {
title: "Disable roles",
Expand Down Expand Up @@ -1361,7 +1501,7 @@ export const PLUGIN_SETTINGS: { [key: string]: TPluginSetting } = {
SettingsValidator.isString,
SettingsValidator.isNotEmptyString,
SettingsValidator.hasNoSpaces,
SettingsValidator.noLiteralString('.', '..'),
SettingsValidator.noLiteralString('.', '..'),
SettingsValidator.noStartsWithString('-', '_', '+', '.'),
SettingsValidator.hasNotInvalidCharacters('\\', '/', '?', '"', '<', '>', '|', ',', '#')
)),
Expand Down
24 changes: 24 additions & 0 deletions common/plugin-settings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,30 @@ describe('[settings] Input validation', () => {
${'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."}
Expand Down
17 changes: 17 additions & 0 deletions common/services/file-extension.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { getFileExtensionFromBuffer } from "./file-extension";
import fs from 'fs';
import path from 'path';

describe('getFileExtensionFromBuffer', () => {
it.each`
filepath | extension
${'../../server/routes/wazuh-utils/fixtures/fixture_image_small.jpg'} | ${'jpg'}
${'../../server/routes/wazuh-utils/fixtures/fixture_image_small.png'} | ${'png'}
${'../../server/routes/wazuh-utils/fixtures/fixture_image_big.png'} | ${'png'}
${'../../server/routes/wazuh-utils/fixtures/fixture_image_small.svg'} | ${'svg'}
${'../../server/routes/wazuh-utils/fixtures/fixture_file.txt'} | ${'unknown'}
`(`filepath: $filepath expects to get extension: $extension`, ({ extension, filepath }) => {
const bufferFile = fs.readFileSync(path.join(__dirname, filepath));
expect(getFileExtensionFromBuffer(bufferFile)).toBe(extension);
});
});
23 changes: 23 additions & 0 deletions common/services/file-extension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* Get the file extension from a file buffer. Calculates the image format by reading the first 4 bytes of the image (header)
* Supported types: jpeg, jpg, png, svg
* Additionally, this function allows checking gif images.
* @param buffer file buffer
* @returns the file extension. Example: jpg, png, svg. it Returns unknown if it can not find the extension.
*/
export function getFileExtensionFromBuffer(buffer: Buffer): string {
const imageFormat = buffer.toString('hex').substring(0, 4);
switch (imageFormat) {
case '4749':
return 'gif';
case 'ffd8':
return 'jpg'; // Also jpeg
case '8950':
return 'png';
case '3c73':
case '3c3f':
return 'svg';
default:
return 'unknown';
}
};
20 changes: 20 additions & 0 deletions common/services/file-size.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {formatBytes } from "./file-size";

describe('formatBytes', () => {
it.each`
bytes | decimals | expected
${1024} | ${2} | ${'1 KB'}
${1023} | ${2} | ${'1023 Bytes'}
${1500} | ${2} | ${'1.46 KB'}
${1500} | ${1} | ${'1.5 KB'}
${1500} | ${3} | ${'1.465 KB'}
${1048576} | ${2} | ${'1 MB'}
${1048577} | ${2} | ${'1 MB'}
${1475487} | ${2} | ${'1.41 MB'}
${1475487} | ${1} | ${'1.4 MB'}
${1475487} | ${3} | ${'1.407 MB'}
${1073741824} | ${2} | ${'1 GB'}
`(`bytes: $bytes | decimals: $decimals | expected: $expected`, ({ bytes, decimals, expected }) => {
expect(formatBytes(bytes, decimals)).toBe(expected);
});
});
17 changes: 17 additions & 0 deletions common/services/file-size.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/**
* Format the number the bytes to the higher unit.
* @param bytes Bytes
* @param decimals Number of decimals
* @returns Formatted value with the unit
*/
export function formatBytes(bytes: number, decimals: number = 2): string {
if (!+bytes) return '0 Bytes';

const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

const i = Math.floor(Math.log(bytes) / Math.log(k));

return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
};
Loading