diff --git a/application/Espo/Resources/metadata/app/regExpPatterns.json b/application/Espo/Resources/metadata/app/regExpPatterns.json index 25c211196d..06469f240b 100644 --- a/application/Espo/Resources/metadata/app/regExpPatterns.json +++ b/application/Espo/Resources/metadata/app/regExpPatterns.json @@ -29,11 +29,11 @@ "isSystem": true }, "uriOptionalProtocol": { - "pattern": "([a-zA-Z0-9]+\\:\\/\\/)?[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',])*", + "pattern": "([a-zA-Z0-9]+\\:\\/\\/)?[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',~])*", "isSystem": true }, "uri": { - "pattern": "([a-zA-Z0-9]+\\:\\/\\/){1}[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',])*", + "pattern": "([a-zA-Z0-9]+\\:\\/\\/){1}[a-zA-Z0-9%\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',]+\\.([a-zA-Z0-9%\\&\\.\\/\\?\\:@\\-_=#$!+*\\(\\)',~])*", "isSystem": true } } diff --git a/client/src/views/fields/url-multiple.js b/client/src/views/fields/url-multiple.js index 3cfaf6e39a..ca4d5496a4 100644 --- a/client/src/views/fields/url-multiple.js +++ b/client/src/views/fields/url-multiple.js @@ -53,13 +53,32 @@ class UrlMultipleFieldView extends ArrayFieldView { value = this.strip(value); } - if (value === decodeURI(value)) { - value = encodeURI(value); + try { + if (value === decodeURI(value)) { + value = encodeURI(value); + } + } catch (e) { + console.warn(`Malformed URI ${value}.`); } super.addValueFromUi(value); } + /** + * @private + * @param {string} value + * @return {string} + */ + decodeURI(value) { + try { + return decodeURI(value); + } catch (e) { + console.warn(`Malformed URI ${value}.`); + + return value; + } + } + /** * @param {string} value * @return {string} @@ -88,7 +107,7 @@ class UrlMultipleFieldView extends ArrayFieldView { return $('') .attr('href', this.prepareUrl(value)) .attr('target', '_blank') - .text(decodeURI(value)); + .text(this.decodeURI(value)); }); return $list @@ -111,7 +130,7 @@ class UrlMultipleFieldView extends ArrayFieldView { .attr('href', this.prepareUrl(value)) .css('user-drag', 'none') .attr('target', '_blank') - .text(decodeURI(value)) + .text(this.decodeURI(value)) ); return $item.get(0).outerHTML; diff --git a/client/src/views/fields/url.js b/client/src/views/fields/url.js index fd5bf50231..fb3dbdcb4a 100644 --- a/client/src/views/fields/url.js +++ b/client/src/views/fields/url.js @@ -102,7 +102,7 @@ class UrlFieldView extends VarcharFieldView { return; } - const decoded = parsedValue ? decodeURI(parsedValue) : ''; + const decoded = parsedValue ? this.decodeURI(parsedValue) : ''; this.$element.val(decoded); }); @@ -112,7 +112,22 @@ class UrlFieldView extends VarcharFieldView { getValueForDisplay() { const value = this.model.get(this.name); - return value ? decodeURI(value) : null; + return value ? this.decodeURI(value) : null; + } + + /** + * @private + * @param {string} value + * @return {string} + */ + decodeURI(value) { + try { + return decodeURI(value); + } catch (e) { + console.warn(`Malformed URI ${value}.`); + + return value; + } } /** @@ -126,8 +141,14 @@ class UrlFieldView extends VarcharFieldView { value = this.strip(value); } - if (value === decodeURI(value)) { - value = encodeURI(value); + try { + if (value === decodeURI(value)) { + value = encodeURI(value); + } + } catch (e) { + console.warn(`Malformed URI ${value}.`); + + return value; } return value;