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]
|
type currentSignServer atomic.Pointer[config.SignServer]
|
||||||
|
|
||||||
func (c *currentSignServer) get() *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()
|
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())
|
data, err := hex.DecodeString(gjson.GetBytes(response, "data").String())
|
||||||
if err != nil {
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(data) == 0 {
|
if len(data) == 0 {
|
||||||
@ -210,7 +214,7 @@ func signCallback(uin string, results []gjson.Result, t string) {
|
|||||||
body, _ := hex.DecodeString(result.Get("body").String())
|
body, _ := hex.DecodeString(result.Get("body").String())
|
||||||
ret, err := cli.SendSsoPacket(cmd, body)
|
ret, err := cli.SendSsoPacket(cmd, body)
|
||||||
if err != nil || len(ret) == 0 {
|
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 出错或返回数据为空时跳过
|
continue // 发送 SsoPacket 出错或返回数据为空时跳过
|
||||||
}
|
}
|
||||||
signSubmit(uin, cmd, callbackID, ret, t)
|
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) {
|
func sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []byte, extra []byte, token []byte, err error) {
|
||||||
i := 0
|
i := 0
|
||||||
for {
|
for {
|
||||||
|
|
||||||
|
sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
|
||||||
cs := ss.get()
|
cs := ss.get()
|
||||||
if cs == nil {
|
if cs == nil {
|
||||||
|
// 最好在请求后判断,否则若被设置为nil后不会再请求签名,
|
||||||
|
// 导致在下一次有请求签名服务操作之前,ss无法更新
|
||||||
err = errors.New("nil signserver")
|
err = errors.New("nil signserver")
|
||||||
|
log.Warn("nil sign-server") // 返回的err并不会log出来,加条日志
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sign, extra, token, err = signRequset(seq, uin, cmd, qua, buff)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("获取sso sign时出现错误: %v. server: %v", err, cs.URL)
|
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]
|
cs, master := ss.get(), &base.SignServers[0]
|
||||||
if (cs == nil || cs.URL != master.URL) && isServerAvaliable(master.URL) {
|
if (cs == nil || cs.URL != master.URL) && isServerAvaliable(master.URL) {
|
||||||
ss.set(master)
|
ss.set(master)
|
||||||
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", cs.URL)
|
log.Infof("主签名服务器可用,已切换至主签名服务器 %v", master.URL)
|
||||||
}
|
}
|
||||||
cs = ss.get()
|
cs = ss.get()
|
||||||
if cs == nil {
|
if cs == nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user