feat: 迁移游戏商务绑定审核流程和列表
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
package gameplatform
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/sha1"
|
||||
"crypto/subtle"
|
||||
"encoding/hex"
|
||||
"kra/internal/biz/business"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Passwords struct{ AuthCode, MigrateAuthCode, TablePrefix string }
|
||||
|
||||
func NewPasswords() business.PlatformPasswordVerifier {
|
||||
prefix := os.Getenv("SW_SDK_TABLE_PREFIX")
|
||||
if prefix == "" {
|
||||
prefix = "sys_"
|
||||
}
|
||||
return &Passwords{AuthCode: os.Getenv("SW_SDK_AUTH_CODE"), MigrateAuthCode: os.Getenv("SW_SDK_MIGRATE_AUTH_CODE"), TablePrefix: prefix}
|
||||
}
|
||||
func md5Hex(value string) string { sum := md5.Sum([]byte(value)); return hex.EncodeToString(sum[:]) }
|
||||
|
||||
func (p *Passwords) Verify(password, stored string) (bool, error) {
|
||||
if strings.TrimSpace(password) == "" || strings.TrimSpace(stored) == "" {
|
||||
return false, nil
|
||||
}
|
||||
var expected string
|
||||
switch {
|
||||
case strings.HasPrefix(stored, "###"):
|
||||
if p.AuthCode == "" {
|
||||
return false, business.ErrPlatformPasswordConfig
|
||||
}
|
||||
expected = "###" + md5Hex(md5Hex(p.AuthCode+password))
|
||||
case strings.HasPrefix(stored, "##$##"):
|
||||
if p.MigrateAuthCode == "" {
|
||||
return false, business.ErrPlatformPasswordConfig
|
||||
}
|
||||
sha := sha1.Sum([]byte(password))
|
||||
expected = "##$##" + md5Hex(hex.EncodeToString(sha[:])+p.MigrateAuthCode)
|
||||
default:
|
||||
decor := md5Hex(p.TablePrefix)
|
||||
expected = decor[:12] + md5Hex(password) + decor[len(decor)-4:]
|
||||
}
|
||||
return subtle.ConstantTimeCompare([]byte(expected), []byte(stored)) == 1, nil
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package gameplatform
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestLegacyPasswordFormats(t *testing.T) {
|
||||
p := &Passwords{AuthCode: "test-auth", MigrateAuthCode: "test-migrate", TablePrefix: "sys_"}
|
||||
// 固定向量由独立的 Python hashlib 按原 Java 算法生成。
|
||||
for _, hash := range []string{"###eef6d9b7160f32a869f3e03b7ea575a5", "9db2515d8fcc62cc2d8b4bf2d8728120d052163a77df7f09", "##$##073cf9a979400c63c0dc69f201efcdf8"} {
|
||||
if ok, err := p.Verify("demo123", hash); err != nil || !ok {
|
||||
t.Fatalf("旧密码格式不兼容: %v", err)
|
||||
}
|
||||
if ok, _ := p.Verify("wrong", hash); ok {
|
||||
t.Fatal("错误密码被接受")
|
||||
}
|
||||
}
|
||||
if ok, err := (&Passwords{}).Verify("demo123", "###eef6d9b7160f32a869f3e03b7ea575a5"); ok || err == nil {
|
||||
t.Fatal("缺少兼容盐时必须明确报错")
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"kra/internal/biz/system"
|
||||
"kra/internal/integration/cache"
|
||||
"kra/internal/integration/email"
|
||||
"kra/internal/integration/gameplatform"
|
||||
mqintegration "kra/internal/integration/mq"
|
||||
paymentintegration "kra/internal/integration/payment"
|
||||
"kra/internal/integration/sms"
|
||||
@@ -22,6 +23,7 @@ import (
|
||||
)
|
||||
|
||||
var ProviderSet = wire.NewSet(
|
||||
gameplatform.NewPasswords,
|
||||
cache.New,
|
||||
email.NewEmailRepo,
|
||||
sms.NewSender,
|
||||
|
||||
Reference in New Issue
Block a user