* Fix browser Uncaught TypeError when create a Properties type configuration * Change Properties content verification method * Update front end resources
This commit is contained in:
parent
43f606519b
commit
4310b3ee47
@ -58,7 +58,6 @@ request.middleWare((_config = {}) => {
|
|||||||
if (res.code === 403 && !hasAlert) {
|
if (res.code === 403 && !hasAlert) {
|
||||||
hasAlert = true;
|
hasAlert = true;
|
||||||
window.Dialog.alert({
|
window.Dialog.alert({
|
||||||
language: aliwareIntl.currentLanguageCode || 'zh-cn',
|
|
||||||
style: { width: 400 },
|
style: { width: 400 },
|
||||||
content: res.message,
|
content: res.message,
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
@ -81,7 +80,6 @@ request.middleWare((_config = {}) => {
|
|||||||
hasAlert = true;
|
hasAlert = true;
|
||||||
|
|
||||||
window.Dialog.alert({
|
window.Dialog.alert({
|
||||||
language: aliwareIntl.currentLanguageCode || 'zh-cn',
|
|
||||||
style: { width: 400 },
|
style: { width: 400 },
|
||||||
content: aliwareIntl.get('com.alibaba.nacos.pubshow'), // '子账号没有权限,请联系主账号负责人RAM上授权',
|
content: aliwareIntl.get('com.alibaba.nacos.pubshow'), // '子账号没有权限,请联系主账号负责人RAM上授权',
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
|
@ -266,7 +266,6 @@ class NewConfig extends React.Component {
|
|||||||
} else {
|
} else {
|
||||||
Dialog.confirm({
|
Dialog.confirm({
|
||||||
content: locale.confirmSyanx,
|
content: locale.confirmSyanx,
|
||||||
language: aliwareIntl.currentLanguageCode || 'zh-cn',
|
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
this.publicConfigBeforeCheck(content);
|
this.publicConfigBeforeCheck(content);
|
||||||
},
|
},
|
||||||
@ -352,7 +351,6 @@ class NewConfig extends React.Component {
|
|||||||
error: res => {
|
error: res => {
|
||||||
this.closeLoading();
|
this.closeLoading();
|
||||||
Dialog.alert({
|
Dialog.alert({
|
||||||
language: aliwareIntl.currentLanguageCode || 'zh-cn',
|
|
||||||
content: locale.publishFailed,
|
content: locale.publishFailed,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -16,6 +16,92 @@
|
|||||||
|
|
||||||
import * as yamljs from 'yamljs';
|
import * as yamljs from 'yamljs';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验一个配置项
|
||||||
|
*/
|
||||||
|
function validateProperty(property) {
|
||||||
|
let { length } = property;
|
||||||
|
let keyLen = 0;
|
||||||
|
let valueStart = length;
|
||||||
|
let hasSep = false;
|
||||||
|
let precedingBackslash = false;
|
||||||
|
let c;
|
||||||
|
// 解析 key
|
||||||
|
while (keyLen < length) {
|
||||||
|
c = property[keyLen];
|
||||||
|
if ((c === '=' || c === ':') && !precedingBackslash) {
|
||||||
|
valueStart = keyLen + 1;
|
||||||
|
hasSep = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((c === ' ' || c === '\t' || c === '\f') && !precedingBackslash) {
|
||||||
|
valueStart = keyLen + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c === '\\') {
|
||||||
|
precedingBackslash = !precedingBackslash;
|
||||||
|
} else {
|
||||||
|
precedingBackslash = false;
|
||||||
|
}
|
||||||
|
keyLen++;
|
||||||
|
}
|
||||||
|
// 解析 value
|
||||||
|
while (valueStart < length) {
|
||||||
|
c = property[valueStart];
|
||||||
|
if (c !== ' ' && c !== '\t' && c !== '\f') {
|
||||||
|
if (!hasSep && (c === '=' || c === ':')) {
|
||||||
|
hasSep = true;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
valueStart++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
validateKeyOrValueForProperty(property, 0, keyLen) &&
|
||||||
|
validateKeyOrValueForProperty(property, valueStart, length)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateKeyOrValueForProperty(property, start, end) {
|
||||||
|
// check null
|
||||||
|
if (start >= end) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let index = 0;
|
||||||
|
let c;
|
||||||
|
while (index < property.length) {
|
||||||
|
c = property[index++];
|
||||||
|
if (c !== '\\') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = property[index++];
|
||||||
|
// check backslash
|
||||||
|
if (!isPropertyEscape(c)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check Unicode
|
||||||
|
if (c === 'u') {
|
||||||
|
let unicode = property.slice(index, index + 4).join('');
|
||||||
|
if (unicode.match(/^[a-f0-9]{4}$/i) === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
index += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPropertyEscape(c = '') {
|
||||||
|
return 'abfnrt\\"\'0! #:=u'.includes(c);
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
/**
|
/**
|
||||||
* 检测json是否合法
|
* 检测json是否合法
|
||||||
@ -65,12 +151,91 @@ export default {
|
|||||||
* 检测属性是否正确
|
* 检测属性是否正确
|
||||||
*/
|
*/
|
||||||
validateProperties(str = '') {
|
validateProperties(str = '') {
|
||||||
const reg = /^[^=]+=.+$/;
|
let isNewLine = true;
|
||||||
return str
|
let isCommentLine = false;
|
||||||
.replace('\n\r', '\n')
|
let isSkipWhiteSpace = true;
|
||||||
.split('\n')
|
let precedingBackslash = false;
|
||||||
.filter(_str => _str)
|
let appendedLineBegin = false;
|
||||||
.every(_str => reg.test(_str.trim()));
|
let skipLF = false;
|
||||||
|
let hasProperty = false;
|
||||||
|
let property = [];
|
||||||
|
for (let i = 0; i < str.length; i++) {
|
||||||
|
let c = str[i];
|
||||||
|
|
||||||
|
if (skipLF) {
|
||||||
|
skipLF = false;
|
||||||
|
if (c === '\n') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 跳过行首空白字符
|
||||||
|
if (isSkipWhiteSpace) {
|
||||||
|
if (c === ' ' || c === '\t' || c === '\f') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!appendedLineBegin && (c === '\r' || c === '\n')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
appendedLineBegin = false;
|
||||||
|
isSkipWhiteSpace = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断注释行
|
||||||
|
if (isNewLine) {
|
||||||
|
isNewLine = false;
|
||||||
|
if (c === '#' || c === '!') {
|
||||||
|
isCommentLine = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c !== '\n' && c !== '\r') {
|
||||||
|
property.push(c);
|
||||||
|
if (c === '\\') {
|
||||||
|
precedingBackslash = !precedingBackslash;
|
||||||
|
} else {
|
||||||
|
precedingBackslash = false;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 跳过注释行
|
||||||
|
if (isCommentLine || property.length === 0) {
|
||||||
|
isNewLine = true;
|
||||||
|
isCommentLine = false;
|
||||||
|
isSkipWhiteSpace = true;
|
||||||
|
property = [];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理转移字符
|
||||||
|
if (precedingBackslash) {
|
||||||
|
property.pop();
|
||||||
|
precedingBackslash = false;
|
||||||
|
isSkipWhiteSpace = true;
|
||||||
|
appendedLineBegin = true;
|
||||||
|
if (c === '\r') {
|
||||||
|
skipLF = true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 解析出配置项
|
||||||
|
// 进行校验
|
||||||
|
if (!validateProperty(property)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
hasProperty = true;
|
||||||
|
property = [];
|
||||||
|
isNewLine = true;
|
||||||
|
isSkipWhiteSpace = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 校验最后一行
|
||||||
|
if (property.length > 0 && !isCommentLine) {
|
||||||
|
return validateProperty(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasProperty;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user