65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
package services
|
|
|
|
import (
|
|
"cmii-uav-watchdog-common/models"
|
|
"cmii-uav-watchdog-common/totp_tier_one"
|
|
"cmii-uav-watchdog-common/utils"
|
|
"cmii-uav-watchdog-common/wdd_log"
|
|
)
|
|
|
|
func ProcessAuthorizationFile(authFile models.AuthorizationFile) (models.AuthorizationCode, error) {
|
|
// 解密项目NameSpace
|
|
projectNamespace, err := totp_tier_one.Decrypt(authFile.EncryptedNamespace, authFile.ProjectNamespace)
|
|
if err != nil {
|
|
wdd_log.Error("解密项目Name失败: %v", err)
|
|
return models.AuthorizationCode{}, err
|
|
}
|
|
|
|
// 获取项目信息
|
|
projectInfo, err := GetProjectInfo(projectNamespace)
|
|
if err != nil {
|
|
wdd_log.Error("获取项目信息失败: %v", err)
|
|
return models.AuthorizationCode{}, err
|
|
}
|
|
|
|
// 验证TOTP验证码
|
|
if !totp_tier_one.VerifyTierOneTOTPCode(authFile.TOTPCode, projectInfo.TierOneSecret) {
|
|
wdd_log.Warn("TOTP验证失败: %s", authFile.TOTPCode)
|
|
return models.AuthorizationCode{}, err
|
|
}
|
|
|
|
// 处理加密的主机信息
|
|
|
|
// 一级TOTP密钥
|
|
key := projectInfo.TierOneSecret
|
|
|
|
// 注意:由于我们无法解密主机信息(我们只需要验证其有效性),所以直接使用
|
|
authorizedHostMap := make(map[string]models.HostInfo)
|
|
for encryptedInfo, hostInfo := range authFile.EncryptedHostMap {
|
|
// 使用 DecryptHostInfo 验证主机信息是否被篡改
|
|
isOK, err := totp_tier_one.DecryptHostInfo(encryptedInfo, hostInfo, key)
|
|
if !isOK || err != nil {
|
|
wdd_log.Error("主机信息验证失败: %v", err)
|
|
continue
|
|
}
|
|
|
|
// 验证通过,将主机信息添加到授权列表
|
|
authorizedHostMap[encryptedInfo] = hostInfo
|
|
}
|
|
|
|
// 生成新的TOTP验证码
|
|
newTOTPCode, err := totp_tier_one.GenerateTierOneTOTPCode(projectInfo.TierOneSecret)
|
|
if err != nil {
|
|
wdd_log.Error("生成TOTP验证码失败: %v", err)
|
|
return models.AuthorizationCode{}, err
|
|
}
|
|
|
|
return models.AuthorizationCode{
|
|
TOTPCode: newTOTPCode,
|
|
CurrentTime: utils.CurentTimeString(),
|
|
EncryptedHostMap: authorizedHostMap,
|
|
ProjectNamespace: projectNamespace,
|
|
EncryptedNamespace: authFile.EncryptedNamespace,
|
|
}, nil
|
|
}
|