Simple-Tracker / qBittorrent-ClientBlocker

一款适用于 qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) 的客户端屏蔽器, 默认屏蔽包括但不限于迅雷等客户端. A client blocker compatible with qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) which is prohibited to include but not limited to clients such as Xunlei.
MIT License
934 stars 24 forks source link

[bug] docker环境下使用纯数字用户名或密码会登录失败 #17

Closed festoney8 closed 6 months ago

festoney8 commented 6 months ago

版本:2.7

经查,原因为根据环境变量生成 config.json 时 tonumberQBUsernameQBPassword 转换成数字导致

https://github.com/Simple-Tracker/qBittorrent-ClientBlocker/blob/c50e04fcdf4c11dd2c81fd9cffea52cd1f9a8683/Dockerfile#L21

复现:

/app # export QBUsername=123456
/app # export QBPassword=654321
/app # env
HOSTNAME=7d1be1200d1f
SHLVL=1
HOME=/root
qBURL=http://192.168.8.1:2017
QBUsername=123456
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
QBPassword=654321
PWD=/app
/app # (jq -n 'env|to_entries[]|{(.key): (.value|(if . == "true" then true elif . == "false" then false else (tonumber? // .) end))}' | jq -s add)
 > config.json
/app # cat config.json 
{
  "HOSTNAME": "7d1be1200d1f",
  "SHLVL": 1,
  "HOME": "/root",
  "qBURL": "http://192.168.8.1:2017",
  "QBUsername": 123456,
  "TERM": "xterm",
  "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "QBPassword": 654321,
  "PWD": "/app"
}
Simple-Tracker commented 6 months ago

感谢反馈!

已将 jq 命令修改以解决此问题, 并发布在 2.8b1.

From: (jq -n 'env|to_entries[]|{(.key): (.value|(if . == "true" then true elif . == "false" then false else (tonumber? // .) end))}' | jq -s add) To: (jq -n 'env|to_entries[]|{(.key): (if ((.key|ascii_downcase) == "blocklist") then [] elif ((.key|ascii_downcase) != "qbusername" and ((.key|ascii_downcase) != "qbpassword")) then (.value|tonumber?) // .value else (.value) end)}' | jq -s add)

% export QbuSERNAME=13728328
% export qBPassworD=24828429
% export bLOCKlIST=i8uesjjr
% export number1=1
% (jq -n 'env|to_entries[]|{(.key): (if ((.key|ascii_downcase) == "blocklist") then [] elif ((.key|ascii_downcase) != "qbusername" and ((.key|ascii_downcase) != "qbpassword")) then ((.value|tonumber?) // .value) else (.value) end)}' | jq -s add)
{
  "QbuSERNAME": "13728328",
  "qBPassworD": "24828429",
  "bLOCKlIST": [],
  "number1": 1,
}
festoney8 commented 6 months ago

好好好,明天我发个PR把docker的blocklist解决一下

Simple-Tracker commented 6 months ago

比起修改程序, 有一种更简便的方法: 客户端于 Docker 使用的是 CMD 命令, 这意味着你可以通过自定义输入命令来取消从环境变量转换的行为, 并将本机或远端的配置文件挂入容器.

另外, 若要提交 PR, 由于 Docker 是属于一种兼容 (而非推荐) 的运行模式, 因此原则上来说是在尽可能不要对程序主体做大的改动的情况下完成目标 (或独立出一个模块/文件去完成不同的平台兼容). 这种特殊模式的解析与否可以通过修改 Flag 去实现, 如 --env 或 --docker, 同时对 Dockerfile 进行改动.

毕竟, 在环境变量传达数组这个想法, 用 jq 确实是太难实现/太复杂烧脑了.