fix(utf8): закрыть lossy-границы конфигурации и API
This commit is contained in:
@@ -148,7 +148,8 @@ describe("запись обратима разбором", () => {
|
||||
});
|
||||
|
||||
test("непредставимое значение — отказ записи, а не потеря части секрета", () => {
|
||||
// Отвергается то, что НЕ ЗАГРУЗИТ systemd, а не то, что нам не нравится.
|
||||
// Отвергается документированное множество EnvironmentFile, а не то, что
|
||||
// нам не нравится.
|
||||
for (const rejected of [
|
||||
String.fromCodePoint(0x0000),
|
||||
String.fromCodePoint(0xfdd0),
|
||||
@@ -157,10 +158,10 @@ describe("запись обратима разбором", () => {
|
||||
]) {
|
||||
expect(() =>
|
||||
assertEnvTransportable("HY2XS_ADMIN_INITIAL_PASSWORD", `abcde${rejected}`)
|
||||
).toThrow(/systemd refuses to load/);
|
||||
).toThrow(/documented systemd EnvironmentFile contract/);
|
||||
expect(() =>
|
||||
formatEnvAssignment("HY2XS_ADMIN_INITIAL_PASSWORD", `abcde${rejected}`)
|
||||
).toThrow(/systemd refuses to load/);
|
||||
).toThrow(/documented systemd EnvironmentFile contract/);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -172,11 +173,11 @@ describe("запись обратима разбором", () => {
|
||||
expect(new TextEncoder().encode(lone)).toEqual(new Uint8Array([0xef, 0xbf, 0xbd]));
|
||||
expect(isEnvTransportable(lone)).toBe(false);
|
||||
expect(() => assertEnvTransportable("HY2XS_ADMIN_CON_PASS", `abcde${lone}`)).toThrow(
|
||||
/systemd refuses to load/
|
||||
/documented systemd EnvironmentFile contract/
|
||||
);
|
||||
});
|
||||
|
||||
// Домен транспорта — ЧУЖОЕ множество, и он не шире и не уже множества systemd.
|
||||
// Домен транспорта — ЧУЖОЕ документированное множество systemd.
|
||||
//
|
||||
// Управляющие символы формат несёт: внутри двойных кавычек перевод строки
|
||||
// накапливается как обычный байт и переживает round-trip. Запрещает их
|
||||
@@ -191,10 +192,9 @@ describe("запись обратима разбором", () => {
|
||||
expect(parseEnvFile(rendered).HY2XS_ADMIN_INITIAL_PASSWORD).toBe(value);
|
||||
}
|
||||
|
||||
// U+FEFF формат тоже несёт: 0xFEFF & 0xFFFE === 0xFEFE, и unichar_is_valid
|
||||
// его принимает. Комментарий `/* BOM */` в исходнике systemd относится к
|
||||
// U+xFFFE и является его собственной неточностью.
|
||||
expect(isEnvTransportable(String.fromCodePoint(0xfeff))).toBe(true);
|
||||
// Публичный контракт EnvironmentFile запрещает U+FEFF. Реализация v257.13
|
||||
// случайно пропускает его; продукт не закрепляет это расхождение.
|
||||
expect(isEnvTransportable(String.fromCodePoint(0xfeff))).toBe(false);
|
||||
});
|
||||
|
||||
// Соседи запрещённых диапазонов обязаны проходить: правило описывает ровно
|
||||
@@ -260,6 +260,16 @@ describe("непредставимая конфигурация отвергае
|
||||
).toThrow();
|
||||
});
|
||||
|
||||
test("исходный U+FEFF отвергается до разбора, даже вне используемого значения", () => {
|
||||
for (const source of [
|
||||
`\uFEFF${envText()}`,
|
||||
`${envText()}\n# comment \uFEFF\n`,
|
||||
`${envText()}\nUNKNOWN_KEY="value\uFEFF"\n`
|
||||
]) {
|
||||
expect(() => parseRuntimeEnv(source)).toThrow(/U\+FEFF/);
|
||||
}
|
||||
});
|
||||
|
||||
// Ограничение принадлежит ФОРМАТУ, а не полю пароля: любой параметр сломал бы
|
||||
// загрузку юнита тем же способом. HY2XS_ADMIN_CON_PASS проходит через
|
||||
// requireValue и никаких проверок содержимого раньше не имел вовсе.
|
||||
@@ -271,7 +281,7 @@ describe("непредставимая конфигурация отвергае
|
||||
"HY2XS_ACME_EMAIL"
|
||||
]) {
|
||||
expect(() => parseRuntimeEnv(envText({ [key]: `"value${noncharacter}"` }))).toThrow(
|
||||
/systemd refuses to load/
|
||||
/documented systemd EnvironmentFile contract/
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user