Register hosts under Containers/VMs/Docker with encrypted key storage, and require re-authentication for sensitive account changes.
79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"codeberg.org/SquidSE/ClusterCanvas/service/internal/auth"
|
|
"codeberg.org/SquidSE/ClusterCanvas/service/internal/settings"
|
|
)
|
|
|
|
func seedCompletedSetup(t *testing.T, configDir string) *http.Cookie {
|
|
t.Helper()
|
|
|
|
keyBytes := make([]byte, 32)
|
|
for index := range keyBytes {
|
|
keyBytes[index] = byte(index + 1)
|
|
}
|
|
t.Setenv(settings.ConfigKeyEnvVar, base64.StdEncoding.EncodeToString(keyBytes))
|
|
|
|
now := time.Now().UTC()
|
|
passwordHash, err := auth.HashPassword("correct horse battery staple extra")
|
|
if err != nil {
|
|
t.Fatalf("HashPassword: %v", err)
|
|
}
|
|
|
|
user := settings.UserCredential{
|
|
ID: "test-user-id",
|
|
Username: "Admin",
|
|
PasswordHash: passwordHash,
|
|
Enabled: true,
|
|
GroupNames: []string{settings.AdministratorsGroupName},
|
|
CreatedAt: now,
|
|
PasswordChangedAt: now,
|
|
}
|
|
if err := settings.SavePasswords(configDir, settings.PasswordStore{Users: []settings.UserCredential{user}}, keyBytes); err != nil {
|
|
t.Fatalf("SavePasswords: %v", err)
|
|
}
|
|
|
|
security := settings.DefaultSecuritySettings()
|
|
payload := settings.Settings{
|
|
SetupCompleted: true,
|
|
Groups: []settings.Group{
|
|
{
|
|
Name: settings.AdministratorsGroupName,
|
|
ScopeKind: settings.GroupScopeGroup,
|
|
ScopeName: "Admin Group",
|
|
Permissions: allPermissionList(),
|
|
},
|
|
},
|
|
Security: security,
|
|
Network: settings.DefaultNetworkSettings(),
|
|
}
|
|
if err := settings.SaveSettings(configDir, payload); err != nil {
|
|
t.Fatalf("SaveSettings: %v", err)
|
|
}
|
|
|
|
manager := auth.NewSessionManager(configDir, keyBytes)
|
|
recorder := httptest.NewRecorder()
|
|
if _, err := manager.CreateSession(recorder, user.ID, security); err != nil {
|
|
t.Fatalf("CreateSession: %v", err)
|
|
}
|
|
|
|
for _, cookie := range recorder.Result().Cookies() {
|
|
if cookie.Name == auth.SessionCookieName {
|
|
return cookie
|
|
}
|
|
}
|
|
t.Fatal("session cookie not set")
|
|
return nil
|
|
}
|
|
|
|
func withSession(request *http.Request, cookie *http.Cookie) *http.Request {
|
|
request.AddCookie(cookie)
|
|
return request
|
|
}
|