#!/usr/bin/env bash
# 组合包安装脚本（Trove 自动生成，勿手改；组合包文档为准）
# combo: combo-permission-security ｜ 权限与安全排查（Permission denied / EACCES / 属主不一致） ｜ 状态: partial
# 生成: 2026-09-24 ｜ 详情: https://trove.xin/combos/combo-permission-security.html ｜ 依赖警告见文档
# 按官方下载源 + 国内镜像适配；每条命令后可验证（预期输出见组合包文档）。
# 注意：本包为配置/排查型，命令含占位符或示例片段，不能整段直跑；请按文档逐步复制执行。

# ==== [1/6] 通用定位：先分清「权限错」与「环境错」 ====
# 版本要求: 无
# 权限错的特征：报错关键字 Permission denied / EACCES / too open / dubious ownership；
  # 与「环境错」（daemon 不可达 / 端口冲突，见 combo-docker-wsl-env）区分开，走不同排查链。
  # 先看工具自己的日志定位（Codex 沙盒示例，Windows 侧）：
  #   C:\Users\<user>\.codex\.sandbox\sandbox.<date>.log
  # 本环境实证：C:\Users\<user>\.codex\.sandbox\ 下存在按日期命名的多份沙盒日志

# ==== [2/6] Docker 容器：uid 对齐 ====
# 版本要求: >= 20.10（与 combo-docker-wsl-env 一致）
# 容器 uid 对齐宿主（推荐）：
#   docker run -u "$(id -u):$(id -g)" -v "$PWD/data:/data" ...
  # compose：user: "${UID}:${GID}"（${UID} 需在 shell 里导出）
  # 一次性修正宿主目录属主：
  sudo chown -R 1000:1000 ./data
  # 临时应急（破坏最小权限原则，仅本机调试）：
#   docker run -u 0:0 ...

# ==== [3/6] Git：safe.directory 白名单 ====
# 版本要求: git >= 2.35（白名单报错提示机制；本机实测 2.53.0）
# 白名单按目录登记、不递归——同盘其他仓库还要再 add：
#   git config --global --add safe.directory <仓库绝对路径>
  # 仓库很多时才考虑全局信任（共享机器不推荐）：
  git config --global --add safe.directory '*'
  # Linux 文件系统可直接改属主（NTFS/exFAT 挂载盘无效，见下方 drvfs 警告）：
#   sudo chown -R $(id -u):$(id -g) <仓库路径>

# ==== [4/6] npm：全局 prefix 改到用户目录 ====
# 版本要求: 无（任意 npm 版本；本机 node v22.22.1，npm prefix 默认 /usr/local——正是 EACCES 高发默认值）
# 形态 1（推荐，一劳永逸）：
  npm config set prefix ~/.npm-global
  echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
  # 形态 2：把 ~/.npm 所有权还给自己：
  sudo chown -R $(whoami) ~/.npm
  # 国内网络：npm 全局包走 npmmirror（见 combo-mirror-setup）：
  npm config set registry https://registry.npmmirror.com

# ==== [5/6] SSH：私钥权限收紧 ====
# 版本要求: 无
# Linux/macOS/WSL 侧：
  chmod 600 ~/.ssh/id_ed25519    # 私钥
  chmod 644 ~/.ssh/*.pub         # 公钥
  chmod 700 ~/.ssh               # 目录
  # Windows 原生 OpenSSH（chmod 不适用）：
  icacls "私钥路径" /inheritance:r /grant:r "%USERNAME%:R"
  # WSL 访问 /mnt/c 上的密钥：drvfs 不支持 chmod（实测 chmod 600 后 ls 仍 777）——
  # 复制到 WSL 内再 chmod，或在 Windows 侧用 icacls 修

# ==== [6/6] Codex 沙盒：日志定位 + 属主/ACL 修复 ====
# 版本要求: 无
# 1) 先看日志定位（比瞎猜快），搜 setup refresh had errors / write ACE：
  #    C:\Users\<user>\.codex\.sandbox\sandbox.<date>.log（旧版路径 .codex.sandbox）
  # 2) 改 owner（最常见修复）：
#   takeown /f <目录> /r /d y
  # 3) 补 ACL（owner 正确仍缺权限时）：
#   icacls <目录> /grant <user>:(OI)(CI)F /T
  # 4) 验证：重开会话触发 setup refresh，日志 errors=[] 即恢复（幂等，无需重装）

