修复密钥同步问题
This commit is contained in:
parent
68e0ee27f2
commit
e1e7e53590
31
main.go
31
main.go
|
|
@ -20,6 +20,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
// 输入参数
|
||||||
|
if len(os.Args) > 1 {
|
||||||
|
initConfig(os.Args[1]) //第一个参数是配置文件路径
|
||||||
|
} else {
|
||||||
|
initConfig("") //没有输入参数,则使用默认配置文件路径
|
||||||
|
}
|
||||||
gin.SetMode(gin.ReleaseMode)
|
gin.SetMode(gin.ReleaseMode)
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
err := dao.Init()
|
err := dao.Init()
|
||||||
|
|
@ -68,6 +74,31 @@ func init() {
|
||||||
panic("failed to read config file:" + err.Error())
|
panic("failed to read config file:" + err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func initConfig(configPath string) {
|
||||||
|
if proto.Config.TOKEN_SECRET != "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 创建cid的目录
|
||||||
|
os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm)
|
||||||
|
os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm)
|
||||||
|
os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm)
|
||||||
|
//系统是linux、macos还是windows
|
||||||
|
if configPath == "" {
|
||||||
|
if os.Getenv("OS") == "Windows_NT" {
|
||||||
|
configPath = "C:/Users/Administrator/vp.conf"
|
||||||
|
} else if os.Getenv("OS") == "linux" {
|
||||||
|
//文件地址/home/saw-ai/saw-ai.conf
|
||||||
|
configPath = "/etc/vp.conf"
|
||||||
|
} else {
|
||||||
|
configPath = "/etc/vp.conf"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//读取配置文件
|
||||||
|
err := proto.ReadConfig(configPath)
|
||||||
|
if err != nil {
|
||||||
|
panic("failed to read config file:" + err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func writeLogger(c *gin.Context) {
|
func writeLogger(c *gin.Context) {
|
||||||
ip := c.ClientIP()
|
ip := c.ClientIP()
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ var ConfigRWLock = &sync.RWMutex{}
|
||||||
var SigningKeyRWLock = &sync.RWMutex{}
|
var SigningKeyRWLock = &sync.RWMutex{}
|
||||||
|
|
||||||
var SyncSecretReqLog int64
|
var SyncSecretReqLog int64
|
||||||
|
var CurrentConfigPath string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MYSQL_USER = "video_t2"
|
MYSQL_USER = "video_t2"
|
||||||
|
|
@ -97,22 +98,12 @@ type ConfigStruct struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func WriteConfigToFile() {
|
func WriteConfigToFile() {
|
||||||
//系统是linux、macos还是windows
|
|
||||||
var configPath string
|
|
||||||
if os.Getenv("OS") == "Windows_NT" {
|
|
||||||
configPath = "D:/Code/videoplayer/vp.conf"
|
|
||||||
} else if os.Getenv("OS") == "linux" {
|
|
||||||
//文件地址/home/saw-ai/saw-ai.conf
|
|
||||||
configPath = "/home/videoplayer/vp.conf"
|
|
||||||
} else {
|
|
||||||
configPath = "/home/videoplayer/vp.conf"
|
|
||||||
}
|
|
||||||
configData, err := json.MarshalIndent(Config, "", " ")
|
configData, err := json.MarshalIndent(Config, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("WriteConfigToFile json marshal error:", err)
|
log.Println("WriteConfigToFile json marshal error:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = os.WriteFile(configPath, configData, 0644)
|
err = os.WriteFile(CurrentConfigPath, configData, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("WriteConfigToFile write file error:", err)
|
log.Println("WriteConfigToFile write file error:", err)
|
||||||
return
|
return
|
||||||
|
|
@ -123,6 +114,7 @@ func WriteConfigToFile() {
|
||||||
// 读取配置文件
|
// 读取配置文件
|
||||||
func ReadConfig(path string) error {
|
func ReadConfig(path string) error {
|
||||||
//查看配置文件是否存在,不存在则创建
|
//查看配置文件是否存在,不存在则创建
|
||||||
|
CurrentConfigPath = path
|
||||||
_, err := os.Stat(path)
|
_, err := os.Stat(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Config file not found!")
|
fmt.Println("Config file not found!")
|
||||||
|
|
|
||||||
|
|
@ -191,6 +191,10 @@ func DelMonitorDeviceListWithStatus(userId int, deviceReq []proto.GetMonitorDevi
|
||||||
// 更新token密钥
|
// 更新token密钥
|
||||||
func SyncTokenSecretFromUserCenter() {
|
func SyncTokenSecretFromUserCenter() {
|
||||||
secretSettings, err := GetTokenSecretFromUserCenter()
|
secretSettings, err := GetTokenSecretFromUserCenter()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("SyncTokenSecretFromUserCenter error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
//写入redis
|
//写入redis
|
||||||
secretSettingsBytes, err2 := json.Marshal(secretSettings)
|
secretSettingsBytes, err2 := json.Marshal(secretSettings)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
|
|
@ -202,12 +206,8 @@ func SyncTokenSecretFromUserCenter() {
|
||||||
}
|
}
|
||||||
worker.SetRedis("secret_sync_settings", string(secretSettingsBytes)) //将密钥信息存入redis
|
worker.SetRedis("secret_sync_settings", string(secretSettingsBytes)) //将密钥信息存入redis
|
||||||
|
|
||||||
if err != nil {
|
if secretSettings.Curr != "" && secretSettings.Curr != proto.Config.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
|
||||||
log.Println("SyncTokenSecretFromUserCenter error:", err)
|
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.Config.TOKEN_SECRET)
|
||||||
return
|
|
||||||
}
|
|
||||||
if secretSettings.Curr != "" && secretSettings.Curr != proto.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
|
|
||||||
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.TOKEN_SECRET)
|
|
||||||
//如果当前密钥与配置文件中的密钥不一致,则需要更新配置文件中的密钥
|
//如果当前密钥与配置文件中的密钥不一致,则需要更新配置文件中的密钥
|
||||||
proto.SigningKeyRWLock.Lock()
|
proto.SigningKeyRWLock.Lock()
|
||||||
proto.SigningKey = []byte(secretSettings.Curr)
|
proto.SigningKey = []byte(secretSettings.Curr)
|
||||||
|
|
@ -227,7 +227,6 @@ func SyncTokenSecretFromUserCenter() {
|
||||||
|
|
||||||
proto.SyncSecretReqLog++ //记录同步密钥请求次数
|
proto.SyncSecretReqLog++ //记录同步密钥请求次数
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetNextSecretToCurrent(secret_copy proto.SecretSyncSettings) {
|
func SetNextSecretToCurrent(secret_copy proto.SecretSyncSettings) {
|
||||||
var secret_sync_settings proto.SecretSyncSettings
|
var secret_sync_settings proto.SecretSyncSettings
|
||||||
redisKey := "secret_sync_settings"
|
redisKey := "secret_sync_settings"
|
||||||
|
|
@ -300,13 +299,18 @@ func GetTokenSecretFromUserCenter() (*proto.SecretSyncSettings, error) {
|
||||||
log.Println("GetTokenSecretFromUserCenter json unmarshal error:", err)
|
log.Println("GetTokenSecretFromUserCenter json unmarshal error:", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if respObject.Code != 0 {
|
||||||
|
log.Println("GetTokenSecretFromUserCenter error code:", respObject.Code, "\t, message:", respObject.Message)
|
||||||
|
return nil, fmt.Errorf("GetTokenSecretFromUserCenter error code: %d, message: %s", respObject.Code, respObject.Message)
|
||||||
|
}
|
||||||
|
|
||||||
//对称加密密钥。通过密钥加 secret_key 取md5
|
//对称加密密钥。通过密钥加 secret_key 取md5
|
||||||
secretKeyMd5 := worker.GenerateMD5(proto.TOKEN_SECRET + "_sync_secret")
|
secretKeyMd5 := worker.GenerateMD5(proto.Config.TOKEN_SECRET + "_sync_secret")
|
||||||
|
|
||||||
//解密返回数据
|
//解密返回数据
|
||||||
dataContent, err2 := worker.AESDecrypt(respObject.Data, []byte(secretKeyMd5))
|
dataContent, err2 := worker.AESDecrypt(respObject.Data, []byte(secretKeyMd5))
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2)
|
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2, "\t, secret:", proto.Config.TOKEN_SECRET, "\t, secretKey:", secretKeyMd5, "\t, data:", respObject.Data)
|
||||||
return nil, err2
|
return nil, err2
|
||||||
}
|
}
|
||||||
var secretResp proto.SecretSyncSettings
|
var secretResp proto.SecretSyncSettings
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue