oasis_test_v2 2.2.110 → 2.2.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,12 @@
10
10
  # 环境变量:
11
11
  # LARK_BIN — 真实 lark-cli 绝对路径(避免递归调用自身)
12
12
  # FEISHU_CREDS_FILE — 凭据文件路径(内含 export LARKSUITE_CLI_* 行)
13
+ #
14
+ # 按 Agent 限制可用模块(产品反馈「飞书连接器·按 Agent 的权限模型」):凭据文件里有
15
+ # OASIS_FEISHU_ALLOW 时,只放行所选模块的 `lark-cli <domain>` 与 `lark-cli api <METHOD> /open-apis/<service>/…`,
16
+ # 机器人与用户身份一样拦(bot 的企业 token 能调应用开通的全集,飞书侧分不开)。放行表由 inject() 按
17
+ # FEISHU_AUTH_SELECTION 算好写入(feishuModulePolicyEnv),这里不认识任何模块,只查表。
18
+ # 被拦时照 lark-cli 的错误形状往 stderr 打一段 JSON、退出码 3(与 lark-cli 自己的鉴权失败同码)。
13
19
 
14
20
  set -euo pipefail
15
21
 
@@ -21,10 +27,94 @@ source "$(dirname "$(realpath "$0")")/../_base/wrapper-base.sh"
21
27
  oasis_resolve_bin
22
28
  oasis_check_available
23
29
 
30
+ # 放行表只认凭据文件里的:先清掉 agent 环境里可能带进来的同名变量。
31
+ unset OASIS_FEISHU_ALLOW OASIS_FEISHU_NEED OASIS_FEISHU_MODULES
32
+
24
33
  # Load feishu credentials into THIS process only (not visible to the agent).
25
34
  if [ -n "${FEISHU_CREDS_FILE:-}" ] && [ -f "${FEISHU_CREDS_FILE}" ]; then
26
35
  # shellcheck disable=SC1090
27
36
  source "${FEISHU_CREDS_FILE}"
28
37
  fi
29
38
 
39
+ # 任何模块都放行的命令(帮助、查参数、内置技能、自检);与 scopes.ts FEISHU_NEUTRAL_COMMANDS 同一份。
40
+ FEISHU_NEUTRAL_COMMANDS=" help schema skills whoami doctor completion auth config profile update "
41
+ # 任何模块都放行的接口 service;与 scopes.ts FEISHU_NEUTRAL_API_SERVICES 同一份。
42
+ FEISHU_NEUTRAL_API=" authen auth "
43
+
44
+ feishu_blocked() {
45
+ # $1 = 放行表里的键(cmd:<domain> / api:<service>);$2 = 给人看的命令写法(已过滤成安全字符)。
46
+ local key="$1" shown="$2" need="" message hint
47
+ local entry
48
+ for entry in ${OASIS_FEISHU_NEED:-}; do
49
+ if [ "${entry%%=*}" = "$key" ]; then need="${entry#*=}"; break; fi
50
+ done
51
+ if [ -n "$need" ]; then
52
+ message="本 agent 的飞书连接器没有开放「${need}」模块,${shown} 已被 Oasis 拦下(机器人与用户身份都不可用)。当前开放的模块:${OASIS_FEISHU_MODULES:-无}。"
53
+ hint="如需使用,请让配置人在 Oasis 里这个 agent 的飞书连接器详情点「重新连接」,勾选「${need}」后完成授权。"
54
+ else
55
+ message="${shown} 不属于任何可勾选的飞书功能模块;本 agent 的飞书调用已按模块限制,Oasis 不放行它。当前开放的模块:${OASIS_FEISHU_MODULES:-无}。"
56
+ hint="请改用已开放模块对应的 lark-cli 命令;确需此能力请联系 Oasis 管理员。"
57
+ fi
58
+ printf '{\n "ok": false,\n "error": {\n "type": "oasis_module_blocked",\n "message": "%s",\n "hint": "%s"\n }\n}\n' "$message" "$hint" >&2
59
+ exit 3
60
+ }
61
+
62
+ # 只把「看起来像命令名 / service 名」的字符串回显出来,其余一律写成占位——它要进 JSON。
63
+ feishu_safe() {
64
+ case "$1" in
65
+ ''|*[!A-Za-z0-9_.-]*) printf '%s' "该命令" ;;
66
+ *) printf '%s' "$1" ;;
67
+ esac
68
+ }
69
+
70
+ feishu_enforce_modules() {
71
+ [ -n "${OASIS_FEISHU_ALLOW:-}" ] || return 0 # 没保存过模块选择:不限制
72
+ local args=("$@") i=0 n=$# cmd=""
73
+ # 跳过命令前的全局参数(--profile X、-h/--help、-v/--version)。
74
+ while [ "$i" -lt "$n" ]; do
75
+ case "${args[$i]}" in
76
+ --profile) i=$((i + 2)) ;;
77
+ -*) i=$((i + 1)) ;;
78
+ *) cmd="${args[$i]}"; break ;;
79
+ esac
80
+ done
81
+ [ -n "$cmd" ] || return 0 # 只有 --help / --version 之类
82
+ case "$FEISHU_NEUTRAL_COMMANDS" in *" $cmd "*) return 0 ;; esac
83
+
84
+ if [ "$cmd" = "api" ]; then
85
+ # lark-cli api <METHOD> <path> [flags]:取 api 之后第二个位置参数为 path(跳过带值的参数)。
86
+ local pos=0 path="" a
87
+ i=$((i + 1))
88
+ while [ "$i" -lt "$n" ]; do
89
+ a="${args[$i]}"
90
+ case "$a" in
91
+ --as|--data|--file|--format|--jq|-q|--output|-o|--page-delay|--page-limit|--page-size|--params|--profile) i=$((i + 2)); continue ;;
92
+ -*) i=$((i + 1)); continue ;;
93
+ esac
94
+ pos=$((pos + 1))
95
+ if [ "$pos" -eq 2 ]; then path="$a"; break; fi
96
+ i=$((i + 1))
97
+ done
98
+ [ -n "$path" ] || return 0 # 没给 path:lark-cli 自己报用法错,不会发请求
99
+ # 归一成 <service>/…:lark-cli 接受完整 URL、/open-apis/ 前缀可省、前导斜杠可省。
100
+ local p="$path"
101
+ p="${p#http://}"; p="${p#https://}"
102
+ case "$path" in http://*|https://*) p="${p#*/}" ;; esac
103
+ while [ "${p#/}" != "$p" ]; do p="${p#/}"; done
104
+ p="${p#open-apis/}"
105
+ while [ "${p#/}" != "$p" ]; do p="${p#/}"; done
106
+ # 路径里带 .. 或百分号编码的,不去猜它最后落到哪个 service——直接拒。
107
+ case "$p" in *..*|*%*|*\\*) feishu_blocked "api:?" "lark-cli api(路径含 .. 或编码字符)" ;; esac
108
+ local svc="${p%%[/?#]*}"
109
+ case "$FEISHU_NEUTRAL_API" in *" $svc "*) return 0 ;; esac
110
+ case "$OASIS_FEISHU_ALLOW" in *" api:$svc "*) return 0 ;; esac
111
+ feishu_blocked "api:$svc" "lark-cli api …/open-apis/$(feishu_safe "$svc")/…"
112
+ fi
113
+
114
+ case "$OASIS_FEISHU_ALLOW" in *" cmd:$cmd "*) return 0 ;; esac
115
+ feishu_blocked "cmd:$cmd" "lark-cli $(feishu_safe "$cmd")"
116
+ }
117
+
118
+ feishu_enforce_modules "$@"
119
+
30
120
  exec "$LARK_BIN" "$@"