Some checks are pending
Security Checks / security (push) Waiting to run
统一 frontend、backend、test、test-log 和 out 目录,更新构建、部署及测试入口;纳入配置管理兼容与首次安全引导修复;排除本机配置、密钥和测试产物。
72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
package setup
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"git.pcux.cn/xuans/Smail/config"
|
|
"git.pcux.cn/xuans/Smail/db"
|
|
"git.pcux.cn/xuans/Smail/models"
|
|
"git.pcux.cn/xuans/Smail/utils/context"
|
|
"git.pcux.cn/xuans/Smail/utils/password"
|
|
)
|
|
|
|
func TestValidateAdminPasswordLengthBoundaries(t *testing.T) {
|
|
for _, candidate := range []string{"12345678", "123456789012"} {
|
|
if err := validateAdminPassword(candidate); err != nil {
|
|
t.Fatalf("password length %d was rejected: %v", len(candidate), err)
|
|
}
|
|
}
|
|
|
|
for _, candidate := range []string{"1234567", "1234567890123"} {
|
|
if err := validateAdminPassword(candidate); err == nil {
|
|
t.Fatalf("password length %d was accepted", len(candidate))
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSetAdminPasswordValidatesAndPreventsDuplicates(t *testing.T) {
|
|
oldConfig := config.Instance
|
|
config.Instance = &config.Config{DbType: config.DBTypeSQLite, DbDSN: filepath.Join(t.TempDir(), "setup.db")}
|
|
t.Cleanup(func() { config.Instance = oldConfig })
|
|
if err := db.Init(""); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = db.Instance.Close() })
|
|
|
|
ctx := &context.Context{}
|
|
if err := SetAdminPassword(ctx, ".invalid", "StrongP12"); err == nil {
|
|
t.Fatal("invalid administrator account was accepted")
|
|
}
|
|
if err := SetAdminPassword(ctx, "admin-user", "short"); err == nil {
|
|
t.Fatal("short administrator password was accepted")
|
|
}
|
|
if err := SetAdminPassword(ctx, "admin-user", "StrongP12"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := SetAdminPassword(ctx, "second-admin", "StrongP45"); err == nil {
|
|
t.Fatal("duplicate administrator initialization was accepted")
|
|
}
|
|
|
|
var user models.User
|
|
if _, err := db.Instance.Where("account = ?", "admin-user").Get(&user); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if user.ID == 0 || user.IsAdmin != 1 || !password.Verify(user.Password, "StrongP12") {
|
|
t.Fatal("administrator was not initialized correctly")
|
|
}
|
|
}
|
|
func TestAdminPasswordRequiresInitializedDatabase(t *testing.T) {
|
|
oldInstance := db.Instance
|
|
db.Instance = nil
|
|
t.Cleanup(func() { db.Instance = oldInstance })
|
|
|
|
ctx := &context.Context{}
|
|
if _, err := GetAdminPassword(ctx); err == nil {
|
|
t.Fatal("admin account lookup succeeded without an initialized database")
|
|
}
|
|
if err := SetAdminPassword(ctx, "admin-user", "StrongP12"); err == nil {
|
|
t.Fatal("admin account creation succeeded without an initialized database")
|
|
}
|
|
}
|