浏览代码

perf: 将管理员校验的字段改为userid,从而解决普通用户绕过校验的问题 (#175)

二丫讲梵 2 年之前
父节点
当前提交
9c85125907
共有 6 个文件被更改,包括 16 次插入5 次删除
  1. 3 1
      README.md
  2. 3 1
      config.example.yml
  3. 4 1
      docker-compose.yml
  4. 1 1
      main.go
  5. 1 1
      pkg/process/db.go
  6. 4 0
      public/tools.go

+ 3 - 1
README.md

@@ -377,7 +377,9 @@ allow_groups:
   - "学无止境"
 # 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
 allow_users: ["张三","李四"]
-# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
+# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
+# 比如 ["1301691029702722","1301691029702733"],这个信息需要在钉钉管理后台的通讯录当中获取:https://oa.dingtalk.com/contacts.htm#/contacts
+# 注意:如果下边的app_secrets为空,以及使用outgoing的方式配置机器人,这两种情况下,都表示没有人是管理员
 admin_users: []
 # 钉钉机器人在应用信息中的AppSecret,为了校验回调的请求是否合法,如果留空,将会忽略校验,则该接口将会存在其他人也能随意调用的安全隐患,因此强烈建议配置正确的secret,如果你的服务对接给多个机器人,这里可以配置多个机器人的secret
 app_secrets: []

+ 3 - 1
config.example.yml

@@ -24,7 +24,9 @@ chat_type: "0"
 allow_groups: []
 # 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
 allow_users: []
-# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
+# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
+# 比如 ["1301691029702722","1301691029702733"],这个信息需要在钉钉管理后台的通讯录当中获取:https://oa.dingtalk.com/contacts.htm#/contacts
+# 注意:如果下边的app_secrets为空,以及使用outgoing的方式配置机器人,这两种情况下,都表示没有人是管理员
 admin_users: []
 # 钉钉机器人在应用信息中的AppSecret,为了校验回调的请求是否合法,如果留空,将会忽略校验,则该接口将会存在其他人也能随意调用的安全隐患,因此强烈建议配置正确的secret,如果你的服务对接给多个机器人,这里可以配置多个机器人的secret
 app_secrets: []

+ 4 - 1
docker-compose.yml

@@ -19,7 +19,10 @@ services:
       CHAT_TYPE: "0" # 限定对话类型 0:不限 1:只能单聊 2:只能群聊
       ALLOW_GROUPS: "" # 哪些群组可以进行对话,如果留空,则表示允许所有群组,如果要限制,则填写群组的名字,比如 "aa,bb"
       ALLOW_USERS: "" # 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则填写用户的名字,比如 "张三,李四"
-      ADMIN_USERS: "" # 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则填写用户的名字,比如 "张三,李四"
+      # 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
+      # 比如 "1301691029702722,1301691029702733",这个信息需要在钉钉管理后台的通讯录当中获取:https://oa.dingtalk.com/contacts.htm#/contacts
+      # 注意:如果下边的app_secrets为空,以及使用outgoing的方式配置机器人,这两种情况下,都表示没有人是管理员
+      ADMIN_USERS: ""
       APP_SECRETS: "" # 钉钉机器人在应用信息中的AppSecret,为了校验回调的请求是否合法,如果留空,将会忽略校验,则该接口将会存在其他人也能随意调用的安全隐患,因此强烈建议配置正确的secret,如果你的服务对接给多个机器人,这里可以配置多个机器人的secret,比如 "xxxx,yyyy"
       HELP: "欢迎使用本工具\n\n你可以查看:[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)\n\n这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/),觉得不错你可以来波素质三连." # 帮助信息,放在配置文件,可供自定义
     volumes:

+ 1 - 1
main.go

@@ -56,7 +56,7 @@ func Start() {
 			}
 			return nil
 		}
-		if !public.JudgeGroup(msgObj.GetChatTitle()) && !public.JudgeUsers(msgObj.SenderNick) && !public.JudgeAdminUsers(msgObj.SenderNick) {
+		if !public.JudgeGroup(msgObj.GetChatTitle()) && !public.JudgeUsers(msgObj.SenderNick) && !public.JudgeAdminUsers(msgObj.SenderStaffId) {
 			_, err = msgObj.ReplyToDingtalk(string(dingbot.TEXT), "抱歉,您不在该机器人对话功能的白名单当中!")
 			if err != nil {
 				logger.Warning(fmt.Errorf("send message error: %v", err))

+ 1 - 1
pkg/process/db.go

@@ -16,7 +16,7 @@ import (
 // SelectHistory 查询会话历史
 func SelectHistory(rmsg *dingbot.ReceiveMsg) error {
 	name := strings.TrimSpace(strings.Split(rmsg.Text.Content, ":")[1])
-	if !public.JudgeAdminUsers(rmsg.SenderNick) {
+	if !public.JudgeAdminUsers(rmsg.SenderStaffId) {
 		_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), "**🤷 抱歉,您没有查询对话记录的权限,只有程序管理员可以查询!**")
 		if err != nil {
 			logger.Error(fmt.Errorf("send message error: %v", err))

+ 4 - 0
public/tools.go

@@ -57,6 +57,10 @@ func JudgeUsers(s string) bool {
 
 // JudgeAdminUsers 判断用户是否为系统管理员
 func JudgeAdminUsers(s string) bool {
+	// 如果secret或者用户的userid都为空的话,那么默认没有管理员
+	if len(Config.AppSecrets) == 0 || s == "" {
+		return false
+	}
 	// 如果没有指定,则没有人是管理员
 	if len(Config.AdminUsers) == 0 {
 		return false