fix(GOV-011): 放宽 MySQL 服务端为完整 5.7 系列
This commit is contained in:
@@ -73,8 +73,8 @@ export function assertSafeDevelopmentConfiguration(config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客户端保持 5.7 系列以生成兼容导出;服务端固定 5.7.42,避免开发、测试和生产
|
* mysql、mysqldump 与服务端统一接受完整 5.7.x;字符集和排序规则仍按精确值
|
||||||
* 由不同补丁行为产生漂移。同时核对数据库真实字符规则,而不是信任 env 声明。
|
* 校验,避免放宽补丁版本时意外放宽数据库结构兼容边界。
|
||||||
*/
|
*/
|
||||||
export function assertMysql57Metadata(metadata) {
|
export function assertMysql57Metadata(metadata) {
|
||||||
if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata.mysqlClientVersion ?? '')) {
|
if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata.mysqlClientVersion ?? '')) {
|
||||||
@@ -85,8 +85,8 @@ export function assertMysql57Metadata(metadata) {
|
|||||||
`mysqldump 客户端必须为 5.7.x,实际 ${metadata.mysqldumpClientVersion || '(空)'}`,
|
`mysqldump 客户端必须为 5.7.x,实际 ${metadata.mysqldumpClientVersion || '(空)'}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!/^5\.7\.42(?:[-+].*)?$/.test(metadata.serverVersion ?? '')) {
|
if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata.serverVersion ?? '')) {
|
||||||
throw new Error(`MySQL 服务端必须为 5.7.42,实际 ${metadata.serverVersion || '(空)'}`);
|
throw new Error(`MySQL 服务端必须为 5.7.x,实际 ${metadata.serverVersion || '(空)'}`);
|
||||||
}
|
}
|
||||||
requireExactValue(metadata.databaseCharset, REQUIRED_CHARSET, '开发数据库字符集不符合要求');
|
requireExactValue(metadata.databaseCharset, REQUIRED_CHARSET, '开发数据库字符集不符合要求');
|
||||||
requireExactValue(
|
requireExactValue(
|
||||||
|
|||||||
@@ -132,19 +132,28 @@ test('拒绝错误字符集、排序规则和不完整的启用配置', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('只接受 MySQL 5.7 客户端、5.7.42 服务端和固定数据库字符规则', () => {
|
test('接受完整 MySQL 5.7.x 服务端系列', () => {
|
||||||
assert.doesNotThrow(() => assertMysql57Metadata(validMetadata));
|
for (const serverVersion of ['5.7.0', '5.7.41', '5.7.42-log']) {
|
||||||
|
assert.doesNotThrow(() =>
|
||||||
|
assertMysql57Metadata({ ...validMetadata, serverVersion }),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('拒绝非 MySQL 5.7.x 版本并保持固定数据库字符规则', () => {
|
||||||
|
for (const serverVersion of ['5.6.51', '8.0.40', '5.7', '5.7.x', '']) {
|
||||||
assert.throws(
|
assert.throws(
|
||||||
() => assertMysql57Metadata({ ...validMetadata, serverVersion: '8.0.39' }),
|
() => assertMysql57Metadata({ ...validMetadata, serverVersion }),
|
||||||
/服务端必须为 5\.7\.42/,
|
/MySQL 服务端必须为 5\.7\.x/,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
assert.throws(
|
||||||
|
() => assertMysql57Metadata({ ...validMetadata, mysqlClientVersion: '8.0.40' }),
|
||||||
|
/mysql 客户端必须为 5\.7\.x/,
|
||||||
);
|
);
|
||||||
assert.throws(
|
assert.throws(
|
||||||
() => assertMysql57Metadata({ ...validMetadata, serverVersion: '5.7.41' }),
|
() => assertMysql57Metadata({ ...validMetadata, mysqldumpClientVersion: '8.0.40' }),
|
||||||
/服务端必须为 5\.7\.42/,
|
/mysqldump 客户端必须为 5\.7\.x/,
|
||||||
);
|
|
||||||
assert.throws(
|
|
||||||
() => assertMysql57Metadata({ ...validMetadata, mysqlClientVersion: '8.0.39' }),
|
|
||||||
/mysql 客户端必须为 5\.7/,
|
|
||||||
);
|
);
|
||||||
assert.throws(
|
assert.throws(
|
||||||
() => assertMysql57Metadata({ ...validMetadata, databaseCollation: 'utf8mb4_bin' }),
|
() => assertMysql57Metadata({ ...validMetadata, databaseCollation: 'utf8mb4_bin' }),
|
||||||
@@ -501,7 +510,7 @@ test('校验拒绝篡改成错误 MySQL 版本或伪造对象范围的真实清
|
|||||||
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
||||||
manifest.mysql_server_version = '8.0.39';
|
manifest.mysql_server_version = '8.0.39';
|
||||||
writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
|
||||||
assert.throws(() => verifyBaselineDirectory(target, 'v0.0.5'), /服务端必须为 5\.7\.42/);
|
assert.throws(() => verifyBaselineDirectory(target, 'v0.0.5'), /服务端必须为 5\.7\.x/);
|
||||||
|
|
||||||
manifest.mysql_server_version = '5.7.42-log';
|
manifest.mysql_server_version = '5.7.42-log';
|
||||||
manifest.objects.events = false;
|
manifest.objects.events = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user