Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/ashione_vertex.json
T

1 line
54 KiB
JSON

{"repo": "ashione/vertex", "files": {"scripts/sanitize_config.py": {"cf6bd2a987acd9480e2d7fee3b7dd08a0657a4dd": {"t": 1785746866.0105453, "n": 5979, "h": "0e122716b433f9db", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = []\n\n # 检查根目录config/(如果存在)\n root_config_dir = project_root / \"config\"\n if root_config_dir.exists():\n # 添加根目录配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(root_config_dir.glob(pattern))\n\n # 检查vertex_flow/config/目录\n vertex_config_dir = project_root / \"vertex_flow\" / \"config\"\n if vertex_config_dir.exists():\n # 添加vertex_flow配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(vertex_config_dir.glob(pattern))\n\n # 如果没有找到配置文件,使用默认列表\n if not config_files:\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n project_root / \"vertex_flow\" / \"config\" / \"mcp.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "98f9b6f13d7cc97bb715f14c6ab12a2ec5c797a5": {"t": 1785768227.1768978, "n": 5979, "h": "0e122716b433f9db", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = []\n\n # 检查根目录config/(如果存在)\n root_config_dir = project_root / \"config\"\n if root_config_dir.exists():\n # 添加根目录配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(root_config_dir.glob(pattern))\n\n # 检查vertex_flow/config/目录\n vertex_config_dir = project_root / \"vertex_flow\" / \"config\"\n if vertex_config_dir.exists():\n # 添加vertex_flow配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(vertex_config_dir.glob(pattern))\n\n # 如果没有找到配置文件,使用默认列表\n if not config_files:\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n project_root / \"vertex_flow\" / \"config\" / \"mcp.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "1e892d7b74fa7f40f7be914db7bdfe702d5c82f7": {"t": 1785768229.5116405, "n": 5905, "h": "0062620031d85295", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = []\n\n # 检查根目录config/(如果存在)\n root_config_dir = project_root / \"config\"\n if root_config_dir.exists():\n # 添加根目录配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(root_config_dir.glob(pattern))\n\n # 检查vertex_flow/config/目录\n vertex_config_dir = project_root / \"vertex_flow\" / \"config\"\n if vertex_config_dir.exists():\n # 添加vertex_flow配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(vertex_config_dir.glob(pattern))\n\n # 如果没有找到配置文件,使用默认列表\n if not config_files:\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "0fe1db5ed7393a48bf7cd31163aa71b5903bcc23": {"t": 1785768233.064553, "n": 6086, "h": "7aaa81970c567dc1", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n # 匹配格式: sk: ${llm.deepseek.sk:-sk-1c72572257634abb90a9b17520a94847}\n # 或: sk: ${llm.openrouter.sk:-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}\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = []\n\n # 检查根目录config/(如果存在)\n root_config_dir = project_root / \"config\"\n if root_config_dir.exists():\n # 添加根目录配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(root_config_dir.glob(pattern))\n\n # 检查vertex_flow/config/目录\n vertex_config_dir = project_root / \"vertex_flow\" / \"config\"\n if vertex_config_dir.exists():\n # 添加vertex_flow配置文件\n for pattern in [\"*.yml\", \"*.yaml\", \"*.template\"]:\n config_files.extend(vertex_config_dir.glob(pattern))\n\n # 如果没有找到配置文件,使用默认列表\n if not config_files:\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "6bf1159377a99b9e338a563fee0d2c662f2c0679": {"t": 1785768236.387562, "n": 5467, "h": "bfcb112826e8af84", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n # 匹配格式: sk: ${llm.deepseek.sk:-sk-1c72572257634abb90a9b17520a94847}\n # 或: sk: ${llm.openrouter.sk:-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}\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "dbf239af1ed69559c5cef4076a9cdb676850a487": {"t": 1785768238.4532454, "n": 5528, "h": "b6cb7aefe0579f16", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n # 匹配格式: sk: ${llm.deepseek.sk:-sk-1c72572257634abb90a9b17520a94847}\n # 或: sk: ${llm.openrouter.sk:-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}\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml\",\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "abae85649925eb838a9c16dff8a1338509b9053a": {"t": 1785768240.9519827, "n": 5598, "h": "d400877272e33107", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值和api-key值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 1. 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行SK替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 2. 匹配包含真实API密钥的sk配置(新格式)\n # 匹配格式: sk: ${llm.deepseek.sk:-sk-1c72572257634abb90a9b17520a94847}\n # 或: sk: ${llm.openrouter.sk:-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}\n new_sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,})(\\})\"\n\n def replace_new_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(sk_value) > 10:\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式SK替换\n sanitized_content = re.sub(new_sk_pattern, replace_new_sk, sanitized_content)\n\n # 3. 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n # 4. 匹配包含真实API密钥的api-key配置(新格式)\n # 匹配格式: api-key: ${vector.dashvector.api_key:-sk-abc123...}\n new_api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:-)(sk-[a-zA-Z0-9\\-]{10,}|[a-zA-Z0-9]{20,})(\\})\"\n\n def replace_new_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果包含真实的API密钥(长度 > 10),则脱敏\n if len(api_value) > 10:\n if api_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n return f\"{prefix}{sanitized}{suffix}\"\n else:\n return match.group(0) # 保持原样\n\n # 执行新格式API密钥替换\n sanitized_content = re.sub(new_api_key_pattern, replace_new_api_key, sanitized_content)\n\n # 5. 匹配通用敏感信息占位符(避免占位符被误脱敏)\n # 保护格式如: YOUR_XXX_API_KEY 不被脱敏\n placeholder_pattern = r\"(\\s*(?:sk|api-key):\\s*\\$\\{[^:]+:-)(YOUR_[A-Z_]+_(?:API_)?KEY)(\\})\"\n\n def protect_placeholder(match):\n # 占位符不需要脱敏,保持原样\n return match.group(0)\n\n # 这一步实际上不需要替换,只是为了明确逻辑\n # sanitized_content = re.sub(placeholder_pattern, protect_placeholder, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表(按重要性排序)\n config_files = [\n # 新的配置文件位置(优先级高)\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml\",\n project_root / \"vertex_flow\" / \"config\" / \"llm.yml.template\",\n # 旧的配置文件位置(向后兼容)\n project_root / \"config\" / \"llm.yml\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n total_files = 0\n\n for config_file in config_files:\n if config_file.exists():\n total_files += 1\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n print(f\"\\n📊 处理统计:\")\n print(f\" 检查的文件: {total_files}\")\n print(f\" 脱敏的文件: {sanitized_count}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共对 {sanitized_count} 个配置文件进行了脱敏处理\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏或已经脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}, "e5918b29efd64a9a91327969c832fb60a41d293a": {"t": 1785768243.9938579, "n": 3123, "h": "4ff76f5a0670193c", "c": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n配置文件脱敏工具\n用于在提交前自动对配置文件中的敏感信息进行脱敏处理\n\"\"\"\n\nimport os\nimport re\nimport sys\nfrom pathlib import Path\n\n\ndef sanitize_sk_values(content):\n \"\"\"\n 对配置文件中的sk值进行脱敏处理\n\n Args:\n content (str): 配置文件内容\n\n Returns:\n str: 脱敏后的内容\n \"\"\"\n # 匹配sk配置行的正则表达式\n # 匹配格式: sk: ${llm.deepseek.sk:sk-[ACTUAL_KEY]}\n # 也匹配: sk: ${llm.openrouter.sk:sk-or-v1-[ACTUAL_KEY]}\n sk_pattern = r\"(\\s*sk:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9\\-]+)(\\})\"\n\n def replace_sk(match):\n prefix = match.group(1)\n sk_value = match.group(2)\n suffix = match.group(3)\n\n # 保留sk-前缀,后面用***代替\n if sk_value.startswith(\"sk-or-\"):\n sanitized = \"sk-or-***SANITIZED***\"\n elif sk_value.startswith(\"sk-\"):\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = \"***SANITIZED***\"\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行替换\n sanitized_content = re.sub(sk_pattern, replace_sk, content)\n\n # 匹配api-key配置行的正则表达式\n # 匹配格式: api-key: ${vector.dashvector.api_key:sk-}\n api_key_pattern = r\"(\\s*api-key:\\s*\\$\\{[^:]+:)(sk-[a-zA-Z0-9]*)(\\})\"\n\n def replace_api_key(match):\n prefix = match.group(1)\n api_value = match.group(2)\n suffix = match.group(3)\n\n # 如果api_value不为空且不是占位符,则脱敏\n if api_value and api_value != \"sk-\" and len(api_value) > 3:\n sanitized = \"sk-***SANITIZED***\"\n else:\n sanitized = api_value # 保持原样(空值或占位符)\n\n return f\"{prefix}{sanitized}{suffix}\"\n\n # 执行api-key替换\n sanitized_content = re.sub(api_key_pattern, replace_api_key, sanitized_content)\n\n return sanitized_content\n\n\ndef sanitize_file(file_path):\n \"\"\"\n 对指定文件进行脱敏处理\n\n Args:\n file_path (str): 文件路径\n\n Returns:\n bool: 是否进行了脱敏处理\n \"\"\"\n try:\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n original_content = f.read()\n\n sanitized_content = sanitize_sk_values(original_content)\n\n # 检查是否有变化\n if original_content != sanitized_content:\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n f.write(sanitized_content)\n print(f\"✓ 已对 {file_path} 进行脱敏处理\")\n return True\n else:\n print(f\"- {file_path} 无需脱敏\")\n return False\n\n except Exception as e:\n print(f\"✗ 处理文件 {file_path} 时出错: {e}\")\n return False\n\n\ndef main():\n \"\"\"\n 主函数\n \"\"\"\n # 获取项目根目录\n script_dir = Path(__file__).parent\n project_root = script_dir.parent\n\n # 需要脱敏的配置文件列表\n config_files = [\n project_root / \"config\" / \"llm.yml\",\n # 可以添加其他需要脱敏的配置文件\n ]\n\n print(\"🔒 开始配置文件脱敏处理...\")\n\n sanitized_count = 0\n for config_file in config_files:\n if config_file.exists():\n if sanitize_file(str(config_file)):\n sanitized_count += 1\n else:\n print(f\"⚠ 配置文件不存在: {config_file}\")\n\n if sanitized_count > 0:\n print(f\"\\n✓ 共处理了 {sanitized_count} 个配置文件\")\n print(\"请检查脱敏结果,确认无误后再提交\")\n else:\n print(\"\\n- 所有配置文件均无需脱敏\")\n\n\nif __name__ == \"__main__\":\n main()\n"}}}}