From 0b5a43e39a8e8e359de0e8f584b1fdfc15ccf469 Mon Sep 17 00:00:00 2001 From: Yann Stepienik Date: Fri, 28 Aug 2026 17:51:17 +0100 Subject: [PATCH] [release] v0.23.2-unstable002 --- api-docs/openapi.json | 5 +- api-docs/swagger.json | 5 +- api-docs/swagger.yaml | 4 +- changelog.md | 5 +- go-sdk/client.gen.go | 609 +++++++++++++++++----------------- go-sdk/version.go | 2 +- package-lock.json | 14 +- package.json | 4 +- src/configapi/api_tokens.go | 10 + src/configapi/set.go | 8 + src/index.go | 2 +- src/launcher/launcher.go | 74 +++-- src/launcher/launcher_test.go | 58 ++++ src/proxy/app_gate.go | 31 ++ src/proxy/app_gate_test.go | 58 ++++ src/user/create.go | 5 + src/user/edit.go | 5 + src/user/me.go | 1 - src/user/password_reset.go | 3 - src/user/resend.go | 3 - src/utils/loggedIn.go | 80 +++++ src/utils/permissions_test.go | 60 ++++ src/utils/types.go | 2 +- 23 files changed, 685 insertions(+), 363 deletions(-) create mode 100644 src/launcher/launcher_test.go create mode 100644 src/proxy/app_gate_test.go create mode 100644 src/utils/permissions_test.go diff --git a/api-docs/openapi.json b/api-docs/openapi.json index f0d95b6b..96ef0f06 100644 --- a/api-docs/openapi.json +++ b/api-docs/openapi.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.23.2-unstable001" + "version": "0.23.2-unstable002" }, "paths": { "/_logs": { @@ -13297,9 +13297,6 @@ "nickname": { "type": "string" }, - "registerKey": { - "type": "string" - }, "registerKeyExp": { "type": "string" }, diff --git a/api-docs/swagger.json b/api-docs/swagger.json index 38e3b2b9..adde6c9d 100644 --- a/api-docs/swagger.json +++ b/api-docs/swagger.json @@ -4,7 +4,7 @@ "description": "REST API for Cosmos Cloud server management", "title": "Cosmos Server API", "contact": {}, - "version": "0.23.2-unstable001" + "version": "0.23.2-unstable002" }, "basePath": "/cosmos", "paths": { @@ -11456,9 +11456,6 @@ "nickname": { "type": "string" }, - "registerKey": { - "type": "string" - }, "registerKeyExp": { "type": "string" }, diff --git a/api-docs/swagger.yaml b/api-docs/swagger.yaml index 0e753b97..e59f9091 100644 --- a/api-docs/swagger.yaml +++ b/api-docs/swagger.yaml @@ -2050,8 +2050,6 @@ definitions: type: string nickname: type: string - registerKey: - type: string registerKeyExp: type: string registeredAt: @@ -2066,7 +2064,7 @@ info: contact: {} description: REST API for Cosmos Cloud server management title: Cosmos Server API - version: 0.23.2-unstable001 + version: 0.23.2-unstable002 paths: /_logs: get: diff --git a/changelog.md b/changelog.md index c5ff3768..839e88f8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,9 @@ ## Version 0.23.02 - Hardened RClone /about path - - Hardened get config path + - Hardened set/get config path + - Hardened Update system + - Hardened Invite system + - Fix issue with App Gate not checking 2FA consistently - Fix temperature reading when there's a warning (Thanks @BetterAndBetterII) - Fix xram/swap shown under disks (Thanks @madejackson) diff --git a/go-sdk/client.gen.go b/go-sdk/client.gen.go index 45574b76..07b9f338 100644 --- a/go-sdk/client.gen.go +++ b/go-sdk/client.gen.go @@ -1371,7 +1371,6 @@ type UtilsUser struct { LastPasswordChangedAt *string `json:"lastPasswordChangedAt,omitempty"` Link *string `json:"link,omitempty"` Nickname string `json:"nickname"` - RegisterKey *string `json:"registerKey,omitempty"` RegisterKeyExp *string `json:"registerKeyExp,omitempty"` RegisteredAt *string `json:"registeredAt,omitempty"` Role int `json:"role"` @@ -36461,323 +36460,323 @@ func ParsePostRcloneVfsStatsResponse(rsp *http.Response) (*PostRcloneVfsStatsRes // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/go-sdk/version.go b/go-sdk/version.go index 8225b73f..7e1415b9 100644 --- a/go-sdk/version.go +++ b/go-sdk/version.go @@ -1,4 +1,4 @@ package cosmossdk // Version is the SDK version, synced with Cosmos Server at build time. -const Version = "0.23.2-unstable001" +const Version = "0.23.2-unstable002" diff --git a/package-lock.json b/package-lock.json index 5c021489..6104ee5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "cosmos-server", - "version": "0.19.0-unstable92", + "version": "0.23.2-unstable001", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cosmos-server", - "version": "0.19.0-unstable92", + "version": "0.23.2-unstable001", + "hasInstallScript": true, "dependencies": { "@ant-design/colors": "^6.0.0", "@ant-design/icons": "^4.7.0", @@ -31,7 +32,7 @@ "browserslist": "^4.21.7", "date-fns": "^2.30.0", "dayjs": "^1.11.10", - "dompurify": "^3.3.1", + "dompurify": "^3.4.14", "dot": "^1.1.3", "express": "^4.18.2", "flag-icons": "^7.2.3", @@ -5096,10 +5097,9 @@ } }, "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", - "license": "(MPL-2.0 OR Apache-2.0)", + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", "optionalDependencies": { "@types/trusted-types": "^2.0.7" } diff --git a/package.json b/package.json index 0b4c28b6..a347b1cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cosmos-server", - "version": "0.23.2-unstable001", + "version": "0.23.2-unstable002", "description": "", "main": "test-server.js", "bugs": { @@ -31,7 +31,7 @@ "browserslist": "^4.21.7", "date-fns": "^2.30.0", "dayjs": "^1.11.10", - "dompurify": "^3.3.1", + "dompurify": "^3.4.14", "dot": "^1.1.3", "express": "^4.18.2", "flag-icons": "^7.2.3", diff --git a/src/configapi/api_tokens.go b/src/configapi/api_tokens.go index 11bace73..231c4a9c 100644 --- a/src/configapi/api_tokens.go +++ b/src/configapi/api_tokens.go @@ -171,6 +171,11 @@ func createAPIToken(w http.ResponseWriter, req *http.Request) { permissions = utils.DefaultAdminTokenPermissions } + if !utils.CanGrant(req, permissions) { + utils.HTTPError(w, "Cannot create a token with permissions you do not hold", http.StatusForbidden, "AT016") + return + } + owner := utils.GetAuthContext(req).Nickname rawToken, tokenConfig, err := GenerateAPIToken(request.Name, request.Description, owner, permissions) @@ -362,6 +367,11 @@ func updateAPIToken(w http.ResponseWriter, req *http.Request) { token.Description = *request.Description } if request.Permissions != nil { + if !utils.CanGrant(req, request.Permissions) { + utils.ConfigLock.Unlock() + utils.HTTPError(w, "Cannot grant a token permissions you do not hold", http.StatusForbidden, "AT034") + return + } token.Permissions = request.Permissions } if request.IPWhitelist != nil { diff --git a/src/configapi/set.go b/src/configapi/set.go index 23bf1748..4ec44862 100644 --- a/src/configapi/set.go +++ b/src/configapi/set.go @@ -174,6 +174,14 @@ func ConfigApiSet(w http.ResponseWriter, req *http.Request) { // restore API token as we cannot edit it here request.APITokens = config.APITokens + if !sameRoles(request.Roles, config.Roles) { + if err := utils.ValidateRolesChange(req, utils.GetRoles(), request.Roles); err != nil { + utils.Error("SettingsUpdate: "+err.Error(), nil) + utils.HTTPError(w, err.Error(), http.StatusForbidden, "UC006") + return + } + } + // restore DNS if user cannot read credentials, as they are sent as empty and we don't want to override them canReadCredentials := utils.HasPermission(req, utils.PERM_CREDENTIALS_READ) if !canReadCredentials { diff --git a/src/index.go b/src/index.go index 2f1a1b72..e24df54d 100644 --- a/src/index.go +++ b/src/index.go @@ -206,7 +206,7 @@ func main() { } // @title Cosmos Server API -// @version 0.23.2-unstable001 +// @version 0.23.2-unstable002 // @description REST API for Cosmos Cloud server management // @BasePath /cosmos // @securityDefinitions.apikey BearerAuth diff --git a/src/launcher/launcher.go b/src/launcher/launcher.go index 670de166..bb94f52c 100644 --- a/src/launcher/launcher.go +++ b/src/launcher/launcher.go @@ -31,6 +31,34 @@ import ( // return nil // } +// closing handles per entry rather than deferring them all in unzip's loop +func extractEntry(f *zip.File, fpath string) error { + if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { + return err + } + rc, err := f.Open() + if err != nil { + return err + } + defer rc.Close() + outFile, err := os.Create(fpath) + if err != nil { + return err + } + defer outFile.Close() + _, err = io.Copy(outFile, rc) + return err +} + +// insideDir rejects paths that escape dest (Zip Slip) +func insideDir(dest, fpath string) bool { + rel, err := filepath.Rel(dest, fpath) + if err != nil { + return false + } + return rel != ".." && !strings.HasPrefix(rel, ".."+string(os.PathSeparator)) +} + func unzip(src string, dest string) error { // Open the zip file r, err := zip.OpenReader(src) @@ -39,6 +67,11 @@ func unzip(src string, dest string) error { } defer r.Close() + dest, err = filepath.Abs(dest) + if err != nil { + return err + } + // Determine the root directory name in the zip var rootFolder string if len(r.File) > 0 { @@ -48,16 +81,24 @@ func unzip(src string, dest string) error { // Loop through each file in the archive for _, f := range r.File { + // symlinks could point anywhere; the update never ships them + if f.Mode()&os.ModeSymlink != 0 { + return fmt.Errorf("refusing symlink entry in archive: %s", f.Name) + } + // Skip the root folder from the file path fpath := filepath.Join(dest, strings.TrimPrefix(f.Name, rootFolder)) + if filepath.IsAbs(f.Name) || !insideDir(dest, fpath) { + return fmt.Errorf("refusing archive entry outside destination: %s", f.Name) + } // Check if the file matches "cosmos-launcher" or "cosmos-launcher-arm64" for renaming baseName := filepath.Base(fpath) - - if baseName == "start.sh" { - // skip - continue - } + + if baseName == "start.sh" { + // skip + continue + } if baseName == "cosmos-launcher" || baseName == "cosmos-launcher-arm64" { fpath = filepath.Join(filepath.Dir(fpath), baseName+".updated") @@ -69,28 +110,7 @@ func unzip(src string, dest string) error { continue } - // Ensure that directories are created if necessary - if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { - return err - } - - // Open the file inside the zip archive - rc, err := f.Open() - if err != nil { - return err - } - defer rc.Close() - - // Create the destination file - outFile, err := os.Create(fpath) - if err != nil { - return err - } - defer outFile.Close() - - // Copy the content of the file - _, err = io.Copy(outFile, rc) - if err != nil { + if err := extractEntry(f, fpath); err != nil { return err } } diff --git a/src/launcher/launcher_test.go b/src/launcher/launcher_test.go new file mode 100644 index 00000000..5a2a83fc --- /dev/null +++ b/src/launcher/launcher_test.go @@ -0,0 +1,58 @@ +package main + +import ( + "archive/zip" + "os" + "path/filepath" + "testing" +) + +func writeZip(t *testing.T, dir string, names ...string) string { + t.Helper() + p := filepath.Join(dir, "u.zip") + f, err := os.Create(p) + if err != nil { + t.Fatal(err) + } + w := zip.NewWriter(f) + for _, n := range names { + e, err := w.Create(n) + if err != nil { + t.Fatal(err) + } + e.Write([]byte("x")) + } + w.Close() + f.Close() + return p +} + +func TestUnzipRejectsTraversal(t *testing.T) { + for _, bad := range []string{"cosmos/../../evil", "../evil", "/etc/evil"} { + tmp := t.TempDir() + dest := filepath.Join(tmp, "dest") + os.Mkdir(dest, 0o755) + z := writeZip(t, tmp, "cosmos/ok.txt", bad) + if err := unzip(z, dest); err == nil { + t.Errorf("entry %q accepted, want rejection", bad) + } + if _, err := os.Stat(filepath.Join(tmp, "evil")); err == nil { + t.Errorf("entry %q escaped to parent dir", bad) + } + } +} + +func TestUnzipHappyPath(t *testing.T) { + tmp := t.TempDir() + dest := filepath.Join(tmp, "dest") + os.Mkdir(dest, 0o755) + z := writeZip(t, tmp, "cosmos/a.txt", "cosmos/sub/b.txt", "cosmos/cosmos-launcher") + if err := unzip(z, dest); err != nil { + t.Fatal(err) + } + for _, want := range []string{"a.txt", "sub/b.txt", "cosmos-launcher.updated"} { + if _, err := os.Stat(filepath.Join(dest, want)); err != nil { + t.Errorf("missing %s", want) + } + } +} diff --git a/src/proxy/app_gate.go b/src/proxy/app_gate.go index cd019cf2..59c5b779 100644 --- a/src/proxy/app_gate.go +++ b/src/proxy/app_gate.go @@ -60,12 +60,38 @@ func performLogin(w http.ResponseWriter, req *http.Request, route utils.ProxyRou return nil } +// redirectToMFA sends a half-authenticated session to the MFA page on the main domain +func redirectToMFA(w http.ResponseWriter, req *http.Request, mfaState int) error { + config := utils.GetMainConfig() + mainDomain := config.HTTPConfig.Hostname + scheme := "http://" + if utils.IsHTTPS { + scheme = "https://" + } + // cross-host apps can't redirect back to themselves; bounce to the UI home + back := "/cosmos-ui" + if req.Host == mainDomain { + back = req.URL.Path + } + page := "loginmfa" + if mfaState == 2 { + page = "newmfa" + } + http.Redirect(w, req, scheme+mainDomain+"/cosmos-ui/"+page+"?invalid=1&redirect="+url.QueryEscape(back), http.StatusTemporaryRedirect) + return errors.New("User requires MFA") +} + func LoggedInOnlyWithRedirect(w http.ResponseWriter, req *http.Request, route utils.ProxyRouteConfig) error { if utils.GetAuthContext(req).Nickname == "" { utils.Error("App gate: User is not logged in", nil) return performLogin(w, req, route) } + if st := utils.GetAuthContext(req).MFAState; st != 0 { + utils.Error("App gate: MFA required", nil) + return redirectToMFA(w, req, st) + } + return nil } @@ -81,5 +107,10 @@ func AdminOnlyWithRedirect(w http.ResponseWriter, req *http.Request, route utils return errors.New("User is not Admin") } + if st := utils.GetAuthContext(req).MFAState; st != 0 { + utils.Error("App gate: MFA required", nil) + return redirectToMFA(w, req, st) + } + return nil } diff --git a/src/proxy/app_gate_test.go b/src/proxy/app_gate_test.go new file mode 100644 index 00000000..aa7cfa3a --- /dev/null +++ b/src/proxy/app_gate_test.go @@ -0,0 +1,58 @@ +package proxy + +import ( + "context" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/azukaar/cosmos-server/src/utils" +) + +func gateReq(host string, ctx *utils.AuthContext) *http.Request { + r := httptest.NewRequest("GET", "http://"+host+"/app/page", nil) + return r.WithContext(context.WithValue(r.Context(), utils.AuthCtxKey, ctx)) +} + +func TestAppGateBlocksPendingMFA(t *testing.T) { + cfg := utils.Config{} + cfg.HTTPConfig.Hostname = "cosmos.example" + utils.LoadBaseMainConfig(cfg) + route := utils.ProxyRouteConfig{Name: "app", Host: "app.example", AuthEnabled: true} + admin := []utils.Permission{utils.PERM_LOGIN, utils.PERM_ADMIN_READ} + + cases := []struct { + name string + gate func(http.ResponseWriter, *http.Request, utils.ProxyRouteConfig) error + state int + host string + page string + back string + }{ + {"user pending totp", LoggedInOnlyWithRedirect, 1, "app.example", "loginmfa", "%2Fcosmos-ui"}, + {"user needs enrol", LoggedInOnlyWithRedirect, 2, "app.example", "newmfa", "%2Fcosmos-ui"}, + {"admin pending totp", AdminOnlyWithRedirect, 1, "app.example", "loginmfa", "%2Fcosmos-ui"}, + {"same host keeps path", LoggedInOnlyWithRedirect, 1, "cosmos.example", "loginmfa", "%2Fapp%2Fpage"}, + } + for _, c := range cases { + w := httptest.NewRecorder() + err := c.gate(w, gateReq(c.host, &utils.AuthContext{Nickname: "u", Permissions: admin, MFAState: c.state}), route) + if err == nil { + t.Errorf("%s: gate admitted the session", c.name) + continue + } + loc := w.Header().Get("Location") + if w.Code != http.StatusTemporaryRedirect || !strings.HasPrefix(loc, "http://cosmos.example/cosmos-ui/"+c.page+"?") || !strings.HasSuffix(loc, "redirect="+c.back) { + t.Errorf("%s: got %d %q", c.name, w.Code, loc) + } + } + + // fully authenticated sessions still pass both gates + for _, gate := range []func(http.ResponseWriter, *http.Request, utils.ProxyRouteConfig) error{LoggedInOnlyWithRedirect, AdminOnlyWithRedirect} { + w := httptest.NewRecorder() + if err := gate(w, gateReq("app.example", &utils.AuthContext{Nickname: "u", Permissions: admin, MFAState: 0}), route); err != nil { + t.Errorf("MFA-complete session rejected: %v", err) + } + } +} diff --git a/src/user/create.go b/src/user/create.go index 7b6fb456..08f78fff 100644 --- a/src/user/create.go +++ b/src/user/create.go @@ -67,6 +67,11 @@ func UserCreate(w http.ResponseWriter, req *http.Request) { if utils.GetRolePermissions(role) == nil { role = utils.USER } + if !utils.CanGrant(req, utils.GetRolePermissions(role)) { + utils.Error("UserCreation: cannot assign a role with permissions the caller lacks", nil) + utils.HTTPError(w, "Cannot assign a role with permissions you do not hold", http.StatusForbidden, "UC007") + return + } utils.Debug("UserCreation: Creating user " + nickname) diff --git a/src/user/edit.go b/src/user/edit.go index d78361db..127e637d 100644 --- a/src/user/edit.go +++ b/src/user/edit.go @@ -75,6 +75,11 @@ func UserEdit(w http.ResponseWriter, req *http.Request) { if utils.CheckPermissions(w, req, utils.PERM_USERS) != nil { return } + if !utils.CanGrant(req, utils.GetRolePermissions(*request.Role)) { + utils.Error("UserEdit: cannot assign a role with permissions the caller lacks", nil) + utils.HTTPError(w, "Cannot assign a role with permissions you do not hold", http.StatusForbidden, "UE003") + return + } toSet["Role"] = *request.Role } diff --git a/src/user/me.go b/src/user/me.go index 31e18171..9e3e241c 100644 --- a/src/user/me.go +++ b/src/user/me.go @@ -37,7 +37,6 @@ func Me(w http.ResponseWriter, req *http.Request) { user.Link = "/api/user/" + user.Nickname user.Email = "" - user.RegisterKey = "" json.NewEncoder(w).Encode(map[string]interface{}{ "status": "OK", diff --git a/src/user/password_reset.go b/src/user/password_reset.go index d4f0140e..4d9e9cdb 100644 --- a/src/user/password_reset.go +++ b/src/user/password_reset.go @@ -68,9 +68,6 @@ func ResetPassword(w http.ResponseWriter, req *http.Request) { RegisterKeyExp := time.Now().Add(time.Hour * 24 * 7) RegisterKey := utils.GenerateRandomString(48) - utils.Debug(RegisterKey) - utils.Debug(RegisterKeyExp.String()) - err := utils.UpdateUser(nickname, map[string]interface{}{ "RegisterKeyExp": RegisterKeyExp, "RegisterKey": RegisterKey, diff --git a/src/user/resend.go b/src/user/resend.go index bd6b4f51..0cc53395 100644 --- a/src/user/resend.go +++ b/src/user/resend.go @@ -61,9 +61,6 @@ func UserResendInviteLink(w http.ResponseWriter, req *http.Request) { RegisterKeyExp := time.Now().Add(time.Hour * 24 * 7) RegisterKey := utils.GenerateRandomString(48) - utils.Debug(RegisterKey) - utils.Debug(RegisterKeyExp.String()) - err := utils.UpdateUser(nickname, map[string]interface{}{ "RegisterKeyExp": RegisterKeyExp, "RegisterKey": RegisterKey, diff --git a/src/utils/loggedIn.go b/src/utils/loggedIn.go index 26cacf5f..8a236a7d 100644 --- a/src/utils/loggedIn.go +++ b/src/utils/loggedIn.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net/http" + "strings" ) func GetAuthContext(req *http.Request) *AuthContext { @@ -210,3 +211,82 @@ func HasPermission(req *http.Request, permission Permission) bool { return true } + +func callerPermissions(req *http.Request) []Permission { + ctx := GetAuthContext(req) + if ctx.APIToken != nil { + return ctx.APIToken.Permissions + } + if ctx.Nickname == "" { + return nil + } + return ctx.Permissions +} + +// CanGrant: nobody can hand out a permission they do not hold themselves +func CanGrant(req *http.Request, perms []Permission) bool { + own := callerPermissions(req) + for _, p := range perms { + if p == PERM_LOGIN || p == PERM_LOGIN_WEAK { + continue + } + if !containsPermission(own, p) { + return false + } + } + return true +} + +// MissingGrants returns the permissions in perms the caller cannot grant +func MissingGrants(req *http.Request, perms []Permission) []Permission { + own := callerPermissions(req) + var missing []Permission + for _, p := range perms { + if p == PERM_LOGIN || p == PERM_LOGIN_WEAK || containsPermission(own, p) { + continue + } + missing = append(missing, p) + } + return missing +} + +// permissions the built-in Admin role can never lose, so nobody locks the server out +var AdminRoleRequiredPermissions = []Permission{PERM_LOGIN, PERM_ADMIN, PERM_USERS, PERM_CONFIGURATION} + +// NewlyGrantedPermissions lists permissions next grants that prev did not +func NewlyGrantedPermissions(prev, next map[Role]RoleConfig) []Permission { + seen := map[Permission]bool{} + var out []Permission + for role, rc := range next { + old := prev[role] + if _, ok := prev[role]; !ok { + old = defaultRoles[role] + } + for _, p := range rc.Permissions { + if !containsPermission(old.Permissions, p) && !seen[p] { + seen[p] = true + out = append(out, p) + } + } + } + return out +} + +// ValidateRolesChange enforces grant rules for a roles-matrix update +func ValidateRolesChange(req *http.Request, prev, next map[Role]RoleConfig) error { + if missing := MissingGrants(req, NewlyGrantedPermissions(prev, next)); len(missing) > 0 { + labels := make([]string, len(missing)) + for i, p := range missing { + labels[i] = PermissionLabel(p) + } + return fmt.Errorf("cannot grant permissions you do not hold: %s", strings.Join(labels, ", ")) + } + if admin, ok := next[ADMIN]; ok { + for _, p := range AdminRoleRequiredPermissions { + if !containsPermission(admin.Permissions, p) { + return fmt.Errorf("the Admin role must keep permission: %s", PermissionLabel(p)) + } + } + } + return nil +} diff --git a/src/utils/permissions_test.go b/src/utils/permissions_test.go new file mode 100644 index 00000000..a67bdc70 --- /dev/null +++ b/src/utils/permissions_test.go @@ -0,0 +1,60 @@ +package utils + +import ( + "context" + "net/http" + "testing" +) + +func reqWithPerms(perms []Permission) *http.Request { + r, _ := http.NewRequest("GET", "/", nil) + ctx := &AuthContext{Nickname: "u", Permissions: perms, IsSudoed: true} + return r.WithContext(context.WithValue(r.Context(), AuthCtxKey, ctx)) +} + +func TestCanGrant(t *testing.T) { + r := reqWithPerms([]Permission{PERM_LOGIN, PERM_CONFIGURATION}) + if !CanGrant(r, []Permission{PERM_LOGIN, PERM_LOGIN_WEAK, PERM_CONFIGURATION}) { + t.Error("should grant held permissions (login ones are free)") + } + if CanGrant(r, []Permission{PERM_ADMIN}) { + t.Error("must not grant PERM_ADMIN without holding it") + } + tok, _ := http.NewRequest("GET", "/", nil) + tok = tok.WithContext(context.WithValue(tok.Context(), AuthCtxKey, &AuthContext{APIToken: &APITokenContext{Permissions: []Permission{PERM_ADMIN}}})) + if CanGrant(tok, []Permission{PERM_USERS}) { + t.Error("api token must not grant beyond its own permissions") + } + anon, _ := http.NewRequest("GET", "/", nil) + if CanGrant(anon, []Permission{PERM_ADMIN_READ}) { + t.Error("anonymous cannot grant anything") + } +} + +func TestValidateRolesChange(t *testing.T) { + prev := map[Role]RoleConfig{} + for k, v := range defaultRoles { + prev[k] = v + } + // config-only user tries to give USER role PERM_ADMIN + r := reqWithPerms([]Permission{PERM_LOGIN, PERM_CONFIGURATION}) + next := map[Role]RoleConfig{USER: {Name: "User", Permissions: []Permission{PERM_LOGIN, PERM_ADMIN}}} + if err := ValidateRolesChange(r, prev, next); err == nil { + t.Error("escalation via roles matrix must be rejected") + } + // same edit by a full admin is fine + admin := reqWithPerms(defaultRoles[ADMIN].Permissions) + if err := ValidateRolesChange(admin, prev, next); err != nil { + t.Errorf("admin edit rejected: %v", err) + } + // brand new role compared against nothing: all perms are new grants + next = map[Role]RoleConfig{Role(7): {Name: "Ops", Permissions: []Permission{PERM_RESOURCES}}} + if err := ValidateRolesChange(r, prev, next); err == nil { + t.Error("new role with unheld permission must be rejected") + } + // admin lockout guard + next = map[Role]RoleConfig{ADMIN: {Name: "Admin", Permissions: []Permission{PERM_LOGIN, PERM_USERS, PERM_CONFIGURATION}}} + if err := ValidateRolesChange(admin, prev, next); err == nil { + t.Error("stripping PERM_ADMIN from Admin role must be rejected") + } +} diff --git a/src/utils/types.go b/src/utils/types.go index 2b184597..d2effd44 100644 --- a/src/utils/types.go +++ b/src/utils/types.go @@ -157,7 +157,7 @@ type FileStats struct { type User struct { Nickname string `validate:"required" json:"nickname" bson:"Nickname"` Password string `validate:"required" json:"-" bson:"Password"` - RegisterKey string `json:"registerKey" bson:"RegisterKey"` + RegisterKey string `json:"-" bson:"RegisterKey"` RegisterKeyExp time.Time `json:"registerKeyExp" bson:"RegisterKeyExp"` Role Role `validate:"required" json:"role" bson:"Role"` PasswordCycle int `json:"-" bson:"PasswordCycle"`