Rename public group URLs to halls

This commit is contained in:
Storm Dragon committed 2026-05-17 22:22:46 -04:00
1 parent bda0e548d3
commit 55528b8e62
21 files changed
+312 -312

No files matched your search

+4 -4
View File
@@ -34,7 +34,7 @@ func checkAdmin(w http.ResponseWriter, r *http.Request) bool {
// checkPasswordAdmin checks whether the client authentifies as either an
// administrator or the given user. It is used to check whether the
// client has the right to change user's password.
func checkPasswordAdmin(w http.ResponseWriter, r *http.Request, groupname, user string, wildcard bool) bool {
func checkPasswordAdmin(w http.ResponseWriter, r *http.Request, hallname, user string, wildcard bool) bool {
username, password, ok := r.BasicAuth()
if ok {
ok, err := adminMatch(username, password)
@@ -47,11 +47,11 @@ func checkPasswordAdmin(w http.ResponseWriter, r *http.Request, groupname, user
}
}
if ok && !wildcard && username == user {
desc, err := group.GetDescription(groupname)
desc, err := group.GetDescription(hallname)
if err != nil {
internalError(w,
"Get description for group %v: %v",
groupname, err,
hallname, err,
)
return false
}
@@ -169,7 +169,7 @@ func apiHandler(w http.ResponseWriter, r *http.Request) {
}
w.Header().Set("cache-control", "no-cache")
sendJSON(w, r, stats.GetGroups())
case ".groups":
case ".halls":
apiGroupHandler(w, r, rest)
default:
http.NotFound(w, r)
+59 -59
View File
@@ -115,58 +115,58 @@ func TestApi(t *testing.T) {
}
var groups []string
err = getJSON("/skald-api/v0/.groups/", &groups)
err = getJSON("/skald-api/v0/.halls/", &groups)
if err != nil || len(groups) != 0 {
t.Errorf("Get groups: %v", err)
t.Errorf("Get halls: %v", err)
}
resp, err := do("PUT", "/skald-api/v0/.groups/test/",
resp, err := do("PUT", "/skald-api/v0/.halls/test/",
"application/json", "\"foo\"", "",
"{}")
if err != nil || resp.StatusCode != http.StatusPreconditionFailed {
t.Errorf("Create group (bad ETag): %v %v", err, resp.StatusCode)
t.Errorf("Create hall (bad ETag): %v %v", err, resp.StatusCode)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/",
resp, err = do("PUT", "/skald-api/v0/.halls/test/",
"text/plain", "", "",
"Hello, world!")
if err != nil || resp.StatusCode != http.StatusUnsupportedMediaType {
t.Errorf("Create group (bad content-type): %v %v",
t.Errorf("Create hall (bad content-type): %v %v",
err, resp.StatusCode)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/",
resp, err = do("PUT", "/skald-api/v0/.halls/test/",
"application/json", "", "*",
"{}")
if err != nil || resp.StatusCode != http.StatusCreated {
t.Errorf("Create group: %v %v", err, resp.StatusCode)
t.Errorf("Create hall: %v %v", err, resp.StatusCode)
}
var desc *group.Description
err = getJSON("/skald-api/v0/.groups/test/", &desc)
err = getJSON("/skald-api/v0/.halls/test/", &desc)
if err != nil || len(desc.Users) != 0 {
t.Errorf("Get group: %v", err)
t.Errorf("Get hall: %v", err)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/",
resp, err = do("PUT", "/skald-api/v0/.halls/test/",
"application/json", "", "*",
"{}")
if err != nil || resp.StatusCode != http.StatusPreconditionFailed {
t.Errorf("Create group (bad ETag): %v %v", err, resp.StatusCode)
t.Errorf("Create hall (bad ETag): %v %v", err, resp.StatusCode)
}
resp, err = do("DELETE", "/skald-api/v0/.groups/test/",
resp, err = do("DELETE", "/skald-api/v0/.halls/test/",
"", "", "*", "")
if err != nil || resp.StatusCode != http.StatusPreconditionFailed {
t.Errorf("Delete group (bad ETag): %v %v", err, resp.StatusCode)
t.Errorf("Delete hall (bad ETag): %v %v", err, resp.StatusCode)
}
err = getJSON("/skald-api/v0/.groups/", &groups)
err = getJSON("/skald-api/v0/.halls/", &groups)
if err != nil || len(groups) != 1 || groups[0] != "test" {
t.Errorf("Get groups: %v %v", err, groups)
t.Errorf("Get halls: %v %v", err, groups)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.keys",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.keys",
"application/jwk-set+json", "", "",
`{"keys": [{
"kty": "oct", "alg": "HS256",
@@ -176,12 +176,12 @@ func TestApi(t *testing.T) {
t.Errorf("Set key: %v %v", err, resp.StatusCode)
}
err = getJSON("/skald-api/v0/.groups/test/.users/", &groups)
err = getJSON("/skald-api/v0/.halls/test/.users/", &groups)
if err != nil || len(groups) != 0 {
t.Errorf("Get users: %v", err)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.users/jch",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.users/jch",
"text/plain", "", "*",
`hello, world!`)
if err != nil || resp.StatusCode != http.StatusUnsupportedMediaType {
@@ -189,7 +189,7 @@ func TestApi(t *testing.T) {
err, resp.StatusCode)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.users/jch",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.users/jch",
"application/json", "", "*",
`{"permissions": "present"}`)
if err != nil || resp.StatusCode != http.StatusCreated {
@@ -197,26 +197,26 @@ func TestApi(t *testing.T) {
}
var users []string
err = getJSON("/skald-api/v0/.groups/test/.users/", &users)
err = getJSON("/skald-api/v0/.halls/test/.users/", &users)
if err != nil || len(users) != 1 || users[0] != "jch" {
t.Errorf("Get users: %v %v", err, users)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.users/jch",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.users/jch",
"application/json", "", "*",
`{"permissions": "present"}`)
if err != nil || resp.StatusCode != http.StatusPreconditionFailed {
t.Errorf("Create user (bad ETag): %v %v", err, resp.StatusCode)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.users/jch/.password",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.users/jch/.password",
"application/json", "", "",
`"toto"`)
if err != nil || resp.StatusCode != http.StatusNoContent {
t.Errorf("Set password (PUT): %v %v", err, resp.StatusCode)
}
resp, err = do("POST", "/skald-api/v0/.groups/test/.users/jch/.password",
resp, err = do("POST", "/skald-api/v0/.halls/test/.users/jch/.password",
"text/plain", "", "",
`toto`)
if err != nil || resp.StatusCode != http.StatusNoContent {
@@ -224,7 +224,7 @@ func TestApi(t *testing.T) {
}
var user group.UserDescription
err = getJSON("/skald-api/v0/.groups/test/.users/jch", &user)
err = getJSON("/skald-api/v0/.halls/test/.users/jch", &user)
if err != nil {
t.Errorf("Get user: %v", err)
}
@@ -245,10 +245,10 @@ func TestApi(t *testing.T) {
t.Errorf("Password.Type: %v", desc.Users["jch"].Password.Type)
}
resp, err = do("DELETE", "/skald-api/v0/.groups/test/.users/jch",
resp, err = do("DELETE", "/skald-api/v0/.halls/test/.users/jch",
"", "", "", "")
if err != nil || resp.StatusCode != http.StatusNoContent {
t.Errorf("Delete group: %v %v", err, resp.StatusCode)
t.Errorf("Delete hall: %v %v", err, resp.StatusCode)
}
desc, err = group.GetDescription("test")
@@ -260,14 +260,14 @@ func TestApi(t *testing.T) {
t.Errorf("Users (after delete): %#v", desc.Users)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test/.wildcard-user",
resp, err = do("PUT", "/skald-api/v0/.halls/test/.wildcard-user",
"application/json", "", "*",
`{"permissions": "present"}`)
if err != nil || resp.StatusCode != http.StatusCreated {
t.Errorf("Create wildcard user: %v %v", err, resp.StatusCode)
}
err = getJSON("/skald-api/v0/.groups/test/.wildcard-user", &user)
err = getJSON("/skald-api/v0/.halls/test/.wildcard-user", &user)
if err != nil {
t.Errorf("Get wildcard user: %v", err)
}
@@ -281,7 +281,7 @@ func TestApi(t *testing.T) {
t.Errorf("Got %v, expected %v", desc.WildcardUser, user)
}
resp, err = do("DELETE", "/skald-api/v0/.groups/test/.wildcard-user",
resp, err = do("DELETE", "/skald-api/v0/.halls/test/.wildcard-user",
"", "", "", "")
if err != nil || resp.StatusCode != http.StatusNoContent {
t.Errorf("Delete wildcard user: %v %v", err, resp.StatusCode)
@@ -300,33 +300,33 @@ func TestApi(t *testing.T) {
t.Errorf("Keys: %v", len(desc.AuthKeys))
}
resp, err = do("POST", "/skald-api/v0/.groups/test/.tokens/",
resp, err = do("POST", "/skald-api/v0/.halls/test/.tokens/",
"application/json", "", "", `{"group":"bad"}`)
if err != nil || resp.StatusCode != http.StatusBadRequest {
t.Errorf("Create token (bad group): %v %v", err, resp.StatusCode)
}
resp, err = do("POST", "/skald-api/v0/.groups/test/.tokens/",
resp, err = do("POST", "/skald-api/v0/.halls/test/.tokens/",
"application/json", "", "", "{}")
if err != nil || resp.StatusCode != http.StatusCreated {
t.Errorf("Create token: %v %v", err, resp.StatusCode)
}
resp, err = do("POST", "/skald-api/v0/.groups/.tokens/",
resp, err = do("POST", "/skald-api/v0/.halls/.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
err = getJSON("/skald-api/v0/.groups/test/.tokens/", &toknames)
err = getJSON("/skald-api/v0/.halls/test/.tokens/", &toknames)
if err != nil || len(toknames) != 1 {
t.Errorf("Get tokens: %v %v", err, toknames)
}
tokname := toknames[0]
var globalToknames []string
err = getJSON("/skald-api/v0/.groups/test/.tokens/", &globalToknames)
err = getJSON("/skald-api/v0/.halls/test/.tokens/", &globalToknames)
if err != nil || len(globalToknames) != 1 {
t.Errorf("Get global tokens: %v %v", err, globalToknames)
}
@@ -336,7 +336,7 @@ func TestApi(t *testing.T) {
t.Errorf("token.List: %v %v", tokens, err)
}
tokenpath := "/skald-api/v0/.groups/test/.tokens/" + tokname
tokenpath := "/skald-api/v0/.halls/test/.tokens/" + tokname
var tok token.Stateful
err = getJSON(tokenpath, &tok)
if err != nil {
@@ -375,13 +375,13 @@ func TestApi(t *testing.T) {
t.Errorf("Got %v, expected %v (%v)", tok.Expires, e, err)
}
resp, err = do("PUT", "/skald-api/v0/.groups/test2",
resp, err = do("PUT", "/skald-api/v0/.halls/test2",
"application/json", "", "*", "{}")
if err != nil || resp.StatusCode != http.StatusCreated {
t.Errorf("Create test2: %v %v", err, resp.StatusCode)
}
tokenpath2 := "/skald-api/v0/.groups/test2/.tokens/" + tokname
tokenpath2 := "/skald-api/v0/.halls/test2/.tokens/" + tokname
resp, err = do("GET", tokenpath2, "", "", "", "")
if err != nil || resp.StatusCode != http.StatusNotFound {
t.Errorf("Get token in bad group: %v %v", err, resp.StatusCode)
@@ -402,16 +402,16 @@ func TestApi(t *testing.T) {
t.Errorf("Token list: %v %v", tokens, err)
}
resp, err = do("DELETE", "/skald-api/v0/.groups/test/.keys",
resp, err = do("DELETE", "/skald-api/v0/.halls/test/.keys",
"", "", "", "")
if err != nil || resp.StatusCode != http.StatusNoContent {
t.Errorf("Delete keys: %v %v", err, resp.StatusCode)
}
resp, err = do("DELETE", "/skald-api/v0/.groups/test/",
resp, err = do("DELETE", "/skald-api/v0/.halls/test/",
"", "", "", "")
if err != nil || resp.StatusCode != http.StatusNoContent {
t.Errorf("Delete group: %v %v", err, resp.StatusCode)
t.Errorf("Delete hall: %v %v", err, resp.StatusCode)
}
_, err = group.GetDescription("test")
@@ -448,8 +448,8 @@ func TestApiBadAuth(t *testing.T) {
}
do("GET", "/skald-api/v0/.stats")
do("GET", "/skald-api/v0/.groups/")
do("PUT", "/skald-api/v0/.groups/test/")
do("GET", "/skald-api/v0/.halls/")
do("PUT", "/skald-api/v0/.halls/test/")
f, err := os.Create(filepath.Join(group.Directory, "test.json"))
if err != nil {
@@ -460,20 +460,20 @@ func TestApiBadAuth(t *testing.T) {
}\n`)
f.Close()
do("PUT", "/skald-api/v0/.groups/test/")
do("DELETE", "/skald-api/v0/.groups/test/")
do("GET", "/skald-api/v0/.groups/test/.users/")
do("GET", "/skald-api/v0/.groups/test/.users/jch")
do("GET", "/skald-api/v0/.groups/test/.users/jch")
do("PUT", "/skald-api/v0/.groups/test/.users/jch")
do("DELETE", "/skald-api/v0/.groups/test/.users/jch")
do("GET", "/skald-api/v0/.groups/test/.users/not-jch")
do("PUT", "/skald-api/v0/.groups/test/.users/not-jch")
do("PUT", "/skald-api/v0/.groups/test/.users/jch/.password")
do("POST", "/skald-api/v0/.groups/test/.users/jch/.password")
do("GET", "/skald-api/v0/.groups/test/.tokens/")
do("POST", "/skald-api/v0/.groups/test/.tokens/")
do("GET", "/skald-api/v0/.groups/test/.tokens/token")
do("PUT", "/skald-api/v0/.groups/test/.tokens/token")
do("DELETE", "/skald-api/v0/.groups/test/.tokens/token")
do("PUT", "/skald-api/v0/.halls/test/")
do("DELETE", "/skald-api/v0/.halls/test/")
do("GET", "/skald-api/v0/.halls/test/.users/")
do("GET", "/skald-api/v0/.halls/test/.users/jch")
do("GET", "/skald-api/v0/.halls/test/.users/jch")
do("PUT", "/skald-api/v0/.halls/test/.users/jch")
do("DELETE", "/skald-api/v0/.halls/test/.users/jch")
do("GET", "/skald-api/v0/.halls/test/.users/not-jch")
do("PUT", "/skald-api/v0/.halls/test/.users/not-jch")
do("PUT", "/skald-api/v0/.halls/test/.users/jch/.password")
do("POST", "/skald-api/v0/.halls/test/.users/jch/.password")
do("GET", "/skald-api/v0/.halls/test/.tokens/")
do("POST", "/skald-api/v0/.halls/test/.tokens/")
do("GET", "/skald-api/v0/.halls/test/.tokens/token")
do("PUT", "/skald-api/v0/.halls/test/.tokens/token")
do("DELETE", "/skald-api/v0/.halls/test/.tokens/token")
}
+8 -8
View File
@@ -35,7 +35,7 @@ var Insecure bool
func Serve(address string, dataDir string) error {
http.Handle("/", &fileHandler{http.Dir(StaticRoot)})
http.HandleFunc("/group/", groupHandler)
http.HandleFunc("/hall/", groupHandler)
http.HandleFunc("/recordings",
func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r,
@@ -43,7 +43,7 @@ func Serve(address string, dataDir string) error {
})
http.HandleFunc("/recordings/", recordingsHandler)
http.HandleFunc("/ws", wsHandler)
http.HandleFunc("/public-groups.json", publicHandler)
http.HandleFunc("/public-halls.json", publicHandler)
http.HandleFunc("/skald-api/", apiHandler)
s := &http.Server{
@@ -346,7 +346,7 @@ func groupHandler(w http.ResponseWriter, r *http.Request) {
return
}
name := parseGroupName("/group/", r.URL.Path)
name := parseGroupName("/hall/", r.URL.Path)
if name == "" {
notFound(w)
return
@@ -358,8 +358,8 @@ func groupHandler(w http.ResponseWriter, r *http.Request) {
return
}
if r.URL.Path != "/group/"+name+"/" {
http.Redirect(w, r, "/group/"+name+"/",
if r.URL.Path != "/hall/"+name+"/" {
http.Redirect(w, r, "/hall/"+name+"/",
http.StatusPermanentRedirect)
return
}
@@ -415,7 +415,7 @@ func groupStatusHandler(w http.ResponseWriter, r *http.Request) {
internalError(w, "groupStatusHandler: this shouldn't happen")
return
}
name := parseGroupName("/group/", pth)
name := parseGroupName("/hall/", pth)
if name == "" {
notFound(w)
return
@@ -705,13 +705,13 @@ func handleGroupAction(w http.ResponseWriter, r *http.Request, group string) {
}
}
func checkGroupPermissions(w http.ResponseWriter, r *http.Request, groupname string) bool {
func checkGroupPermissions(w http.ResponseWriter, r *http.Request, hallname string) bool {
user, pass, ok := r.BasicAuth()
if !ok {
return false
}
g := group.Get(groupname)
g := group.Get(hallname)
if g == nil {
return false
}
+8 -8
View File
@@ -19,17 +19,17 @@ func TestParseGroupName(t *testing.T) {
{"/foo", ""},
{"foo", ""},
{"group/foo", ""},
{"/group", ""},
{"/group/..", ""},
{"/group/foo/../bar", "bar"},
{"/group/foo", "foo"},
{"/group/foo/", "foo"},
{"/group/foo/bar", "foo/bar"},
{"/group/foo/bar/", "foo/bar"},
{"/hall", ""},
{"/hall/..", ""},
{"/hall/foo/../bar", "bar"},
{"/hall/foo", "foo"},
{"/hall/foo/", "foo"},
{"/hall/foo/bar", "foo/bar"},
{"/hall/foo/bar/", "foo/bar"},
}
for _, pg := range a {
g := parseGroupName("/group/", pg.p)
g := parseGroupName("/hall/", pg.p)
if g != pg.g {
t.Errorf("Path %v, got %v, expected %v",
pg.p, g, pg.g)
+2 -2
View File
@@ -153,7 +153,7 @@ func whipEndpointHandler(w http.ResponseWriter, r *http.Request) {
return
}
name := parseGroupName("/group/", pth)
name := parseGroupName("/hall/", pth)
if name == "" {
notFound(w)
return
@@ -269,7 +269,7 @@ func whipResourceHandler(w http.ResponseWriter, r *http.Request) {
return
}
name := parseGroupName("/group/", pth)
name := parseGroupName("/hall/", pth)
if name == "" {
notFound(w)
return