{"record":{"id":"0e918d0b7568e42f","repo":"BigPizzaV3/CodexPlusPlus","slug":"error-0e918d","errorCode":null,"errorMessage":"待处理的一键换肤记录无效","messagePattern":"待处理的一键换肤记录无效","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_community.rs","lineNumber":236,"sourceCode":"\nfn version_id_from_link(url: &str) -> anyhow::Result<String> {\n    let version_id = url\n        .strip_prefix(\"dreamskin://apply?version=\")\n        .or_else(|| url.strip_prefix(\"dreamskin://apply/?version=\"))\n        .context(\"一键换肤链接无效\")?;\n    validate_version_id(version_id)?;\n    Ok(version_id.to_string())\n}\n\npub fn load_pending_community_link() -> anyhow::Result<Option<String>> {\n    let path = pending_link_path();\n    if !path.exists() {\n        return Ok(None);\n    }\n    let metadata = std::fs::symlink_metadata(&path)?;\n    if !metadata.file_type().is_file() || metadata.file_type().is_symlink() || metadata.len() > 4096\n    {\n        bail!(\"待处理的一键换肤记录无效\");\n    }\n    let value: serde_json::Value = serde_json::from_slice(&std::fs::read(path)?)?;\n    let version_id = value\n        .get(\"versionId\")\n        .and_then(serde_json::Value::as_str)\n        .context(\"待处理的一键换肤记录缺少版本 ID\")?\n        .to_string();\n    validate_version_id(&version_id)?;\n    Ok(Some(version_id))\n}\n\npub fn clear_pending_community_link() -> anyhow::Result<()> {\n    let path = pending_link_path();\n    match std::fs::remove_file(path) {\n        Ok(()) => Ok(()),\n        Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()),\n        Err(error) => Err(error.into()),\n    }","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_community.rs#L218-L254","documentation":"Raised in load_pending_community_link: the pending one-click-skin link record file exists but is invalid — it is not a regular file (symlink or other special file) or otherwise fails safety checks, so the stored link cannot be trusted and is rejected instead of being processed.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_community.rs:236 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Delete the invalid pending-link file in the app state dir and re-apply the link","Re-trigger the one-click skin apply from the community page","Check for symlink attacks or manual tampering in the state dir"],"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-14T00:17:10.932Z"}