mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-04 19:17:37 +08:00
fix nil pointer dereference caused by nil 'cs' (#2440)
* fix: nil pointer dereference caused by nil 'cs' 修复刷新 token 时若当前签名服务不可用而主签名服务可用会导致panic的问题。 btw, energy 出现decode error时打印出导致错误的数据内容 * optimize: 只配置了一个签名服务时不进行检查和切换操作 * fix(qsign): 刷新token提示未初始化 修复在qsign崩溃重启前请求了签名服务器导致当前签名服务器被标记为不可用(`ss.set(nil)`), 从而不会再执行sign请求(除非有其他请求签名服务器的操作) 这可能导致下一次刷新token提示uin is not registered或者提示未初始化 * update qsign.go
This commit is contained in:
parent
f16d72f0ca
commit
1c34643f4f
@ -27,6 +27,10 @@ import (
|
||||
type currentSignServer atomic.Pointer[config.SignServer]
|
||||
|
||||
func (c *currentSignServer) get() *config.SignServer {
|
||||
if len(base.SignServers) == 1 {
|
||||
// 只配置了一个签名服务时不检查以及切换, 在get阶段返回,防止返回nil导致其他bug(可能)
|
||||
return &base.SignServers[0]
|
||||
}
|
||||
return (*atomic.Pointer[config.SignServer])(c).Load()
|
||||
}
|
||||
|
||||
@ -168,7 +172,7 @@ func energy(uin uint64, id string, _ string, salt []byte) ([]byte, error) {
|
||||
}
|
||||
data, err := hex.DecodeString(gjson.GetBytes(response, "data").String())
|
||||
if err != nil {
|
||||
log.Warnf("获取T544 sign时出现错误: %v", err)
|
||||
log.Warnf("获取T544 sign时出现错误: %v (data: %v)", err, gjson.GetBytes(response, "data").String())
|
||||
return nil, err
|
||||
}
|
||||
if len(data) == 0 {
|
||||
@ -210,7 +214,7 @@ func signCallback(uin string, results []gjson.Result, t string) {
|
||||
body, _ := hex.DecodeString(result.Get("body").String())
|
||||
ret, err := cli.SendSsoPacket(cmd, body)
|
||||
if err != nil || len(ret) == 0 {
|
||||
log.Warnf("Callback error: %v, Or response data is empty", err)
|
||||
log.Warnf("Callback error: %v, or response data is empty", err)
|
||||
continue // 发送 SsoPacket 出错或返回数据为空时跳过
|
||||
}
|
||||
signSubmit(uin, cmd, callbackID, ret, t)
|
||||
@ -288,12 +292,16 @@ var lastToken = ""
|
||||
func sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []byte, extra []byte, token []byte, err error) {
|
||||
i := 0
|
||||
for {
|
||||
|
||||
sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
|
||||
cs := ss.get()
|
||||
if cs == nil {
|
||||
// 最好在请求后判断,否则若被设置为nil后不会再请求签名,
|
||||
// 导致在下一次有请求签名服务操作之前,ss无法更新
|
||||
err = errors.New("nil signserver")
|
||||
log.Warn("nil sign-server") // 返回的err并不会log出来,加条日志
|
||||
return
|
||||
}
|
||||
sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
|
||||
if err != nil {
|
||||
log.Warnf("获取sso sign时出现错误: %v. server: %v", err, cs.URL)
|
||||
}
|
||||
@ -397,7 +405,7 @@ func signStartRefreshToken(interval int64) {
|
||||
cs, master := ss.get(), &base.SignServers[0]
|
||||
if (cs == nil || cs.URL != master.URL) && isServerAvaliable(master.URL) {
|
||||
ss.set(master)
|
||||
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", cs.URL)
|
||||
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", master.URL)
|
||||
}
|
||||
cs = ss.get()
|
||||
if cs == nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user