Implement global tokens.

This commit is contained in:
Juliusz Chroboczek
2025-08-12 18:13:14 +02:00
parent 630a316baf
commit b78b2c040d
4 changed files with 63 additions and 9 deletions
+3
View File
@@ -94,6 +94,9 @@ func (token *Stateful) match(group string) bool {
return true return true
} }
if token.IncludeSubgroups { if token.IncludeSubgroups {
if token.Group == "" {
return true
}
return strings.HasPrefix(group, token.Group + "/") return strings.HasPrefix(group, token.Group + "/")
} }
return false return false
+38
View File
@@ -80,6 +80,22 @@ func TestStatefulCheck(t *testing.T) {
Permissions: []string{"present", "message"}, Permissions: []string{"present", "message"},
Expires: &future, Expires: &future,
} }
token6 := &Stateful{
Token: "token",
Group: "",
IncludeSubgroups: false,
Username: &user,
Permissions: []string{"present", "message"},
Expires: &future,
}
token7 := &Stateful{
Token: "token",
Group: "",
IncludeSubgroups: true,
Username: &user,
Permissions: []string{"present", "message"},
Expires: &future,
}
success := []struct { success := []struct {
token *Stateful token *Stateful
@@ -129,6 +145,13 @@ func TestStatefulCheck(t *testing.T) {
expUsername: "user", expUsername: "user",
expPermissions: []string{"present", "message"}, expPermissions: []string{"present", "message"},
}, },
{
token: token7,
group: "group/subgroup",
username: &user,
expUsername: "user",
expPermissions: []string{"present", "message"},
},
} }
for i, s := range success { for i, s := range success {
@@ -166,6 +189,21 @@ func TestStatefulCheck(t *testing.T) {
group: "groups", group: "groups",
username: &user, username: &user,
}, },
{
token: token6,
group: "",
username: &user,
},
{
token: token6,
group: "group",
username: &user,
},
{
token: token7,
group: "",
username: &user,
},
} }
for i, s := range failure { for i, s := range failure {
+5 -4
View File
@@ -155,11 +155,10 @@ func apiHandler(w http.ResponseWriter, r *http.Request) {
func apiGroupHandler(w http.ResponseWriter, r *http.Request, pth string) { func apiGroupHandler(w http.ResponseWriter, r *http.Request, pth string) {
first, kind, rest := splitPath(pth) first, kind, rest := splitPath(pth)
if first == "" { g := ""
notFound(w) if first != "" {
return g = first[1:]
} }
g := first[1:]
if g == "" && kind == "" { if g == "" && kind == "" {
if apiCORS(w, r, "HEAD, GET") { if apiCORS(w, r, "HEAD, GET") {
return return
@@ -537,12 +536,14 @@ func tokensHandler(w http.ResponseWriter, r *http.Request, g, pth string) {
return return
} }
if g != "" {
// check that the group exists // check that the group exists
_, err := group.GetDescription(g) _, err := group.GetDescription(g)
if err != nil { if err != nil {
httpError(w, err) httpError(w, err)
return return
} }
}
if pth == "/" { if pth == "/" {
if r.Method == "HEAD" || r.Method == "GET" { if r.Method == "HEAD" || r.Method == "GET" {
tokens, etag, err := token.List(g) tokens, etag, err := token.List(g)
+12
View File
@@ -312,6 +312,12 @@ func TestApi(t *testing.T) {
t.Errorf("Create token: %v %v", err, resp.StatusCode) t.Errorf("Create token: %v %v", err, resp.StatusCode)
} }
resp, err = do("POST", "/galene-api/v0/.groups/.tokens/",
"application/json", "", "", "{\"includeSubgroups\": true}")
if err != nil || resp.StatusCode != http.StatusCreated {
t.Errorf("Create global token: %v %v", err, resp.StatusCode)
}
var toknames []string var toknames []string
err = getJSON("/galene-api/v0/.groups/test/.tokens/", &toknames) err = getJSON("/galene-api/v0/.groups/test/.tokens/", &toknames)
if err != nil || len(toknames) != 1 { if err != nil || len(toknames) != 1 {
@@ -319,6 +325,12 @@ func TestApi(t *testing.T) {
} }
tokname := toknames[0] tokname := toknames[0]
var globalToknames []string
err = getJSON("/galene-api/v0/.groups/test/.tokens/", &globalToknames)
if err != nil || len(globalToknames) != 1 {
t.Errorf("Get global tokens: %v %v", err, globalToknames)
}
tokens, etag, err := token.List("test") tokens, etag, err := token.List("test")
if err != nil || len(tokens) != 1 || tokens[0].Token != tokname { if err != nil || len(tokens) != 1 || tokens[0].Token != tokname {
t.Errorf("token.List: %v %v", tokens, err) t.Errorf("token.List: %v %v", tokens, err)