{"record":{"id":"f1e81f5ddf401fd0","repo":"BigPizzaV3/CodexPlusPlus","slug":"name-f1e81f","errorCode":null,"errorMessage":"主题包文件名不安全：{name}","messagePattern":"主题包文件名不安全：(.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_package.rs","lineNumber":827,"sourceCode":"    }\n    seen.contains(\"blur\")\n}\n\nfn parse_json<T: serde::de::DeserializeOwned>(bytes: &[u8], label: &str) -> anyhow::Result<T> {\n    serde_json::from_slice(bytes).with_context(|| format!(\"{label} 不是有效 JSON\"))\n}\n\nfn validate_archive_entry_name(name: &str) -> anyhow::Result<()> {\n    if name.is_empty() || name.starts_with('/') || name.contains('\\\\') {\n        bail!(\"主题包路径不安全：{name}\");\n    }\n    if name != name.trim()\n        || name.contains(['\\0', ':'])\n        || name.split('/').any(|part| part == \".\" || part == \"..\")\n        || (!name.starts_with(\"__MACOSX/\")\n            && name.split('/').filter(|part| !part.is_empty()).count() > 2)\n    {\n        bail!(\"主题包文件名不安全：{name}\");\n    }\n    Ok(())\n}\n\nfn normalize_package_entries(\n    entries: Vec<(String, Option<Vec<u8>>)>,\n) -> anyhow::Result<std::collections::BTreeMap<String, Vec<u8>>> {\n    let content_entries = entries\n        .into_iter()\n        .filter_map(|(name, content)| content.map(|content| (name, content)))\n        .collect::<Vec<_>>();\n    if content_entries.is_empty() {\n        bail!(\"Dream Skin 主题包为空\");\n    }\n\n    let root_files = content_entries.iter().any(|(name, _)| !name.contains('/'));\n    let prefix = if root_files {\n        if content_entries.iter().any(|(name, _)| name.contains('/')) {","sourceCodeStart":809,"sourceCodeEnd":845,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_package.rs#L809-L845","documentation":"Filename guard in validate_archive_entry_name: the entry name has leading/trailing whitespace, contains NUL or ':', has '.' or '..' path segments, or nests more than two directory levels (outside __MACOSX). This constrains package layout to at most one top-level theme directory.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_package.rs:827 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild the ZIP so files sit at the root or inside a single theme folder","Rename entries to remove whitespace, NUL, ':' and dot segments"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}