fix(auth): tighten curator job response review fixes

This commit is contained in:
Quick
2026-05-26 19:34:16 -04:00
parent 60959f5812
commit 2e550c3d35
5 changed files with 22 additions and 1 deletions
+1
View File
@@ -171,6 +171,7 @@ func sanitizeAdminJobResponseForClaims(response *adminJobResponse, claims *auth.
}
response.RequestPayload = json.RawMessage(`{}`)
response.ResultPayload = sanitizeNonAdminAdminJobResultPayload(response.JobType, response.ResultPayload)
response.ErrorMessage = ""
response.PublicURL = ""
response.DownloadURL = ""
response.DownloadExpiresAt = nil
+5 -1
View File
@@ -53,7 +53,8 @@ func TestAdminJobToResponseForClaims_NonAdminSanitizesItemRefreshPayloads(t *tes
ResultPayload: json.RawMessage(
`{"requested_content_id":"item-1","detail_content_id":"item-2","scan_path":"/srv/media/private/movie","scan_result":{"New":1,"RootObservations":[{"RootPath":"/srv/media/private","SampleFilePath":"/srv/media/private/movie.mkv"}]}}`,
),
PublicURL: "https://example.test/public",
ErrorMessage: "scan scope: stat /srv/media/private/movie: permission denied",
PublicURL: "https://example.test/public",
}
resp := adminJobToResponseForClaims(nil, job, nil, claims)
@@ -74,4 +75,7 @@ func TestAdminJobToResponseForClaims_NonAdminSanitizesItemRefreshPayloads(t *tes
!bytes.Contains(resp.ResultPayload, []byte("detail_content_id")) {
t.Fatalf("ResultPayload = %s, want safe item refresh summary fields", resp.ResultPayload)
}
if resp.ErrorMessage != "" {
t.Fatalf("ErrorMessage = %q, want stripped for non-admin", resp.ErrorMessage)
}
}
+11
View File
@@ -0,0 +1,11 @@
package handlers
import "testing"
func TestUpdateRequiresSessionRevocation_ForPermissions(t *testing.T) {
if !updateRequiresSessionRevocation(updateUserRequest{
Permissions: updateStringSliceField{Set: true, Value: []string{"metadata_curation"}},
}) {
t.Fatal("permission updates should revoke sessions")
}
}
+3
View File
@@ -30,6 +30,9 @@ func NewPermissionMiddleware(users PermissionUserLoader, libraries MetadataTarge
return &PermissionMiddleware{users: users, libraries: libraries}
}
// RequireMetadataCurationForItem allows admins or users with metadata_curation
// permission when every library containing the target item is within the user's
// assigned libraries. A nil user library list means unrestricted library access.
func (m *PermissionMiddleware) RequireMetadataCurationForItem(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
claims := GetClaims(r.Context())
+2
View File
@@ -1678,6 +1678,8 @@ func NewRouter(deps Dependencies) chi.Router {
})
if adminJobsHandler != nil {
// Curators must poll their own item-refresh jobs, so this stays outside
// the admin-only group. HandleGet enforces per-job authorization.
r.Get("/jobs/{id}", adminJobsHandler.HandleGet)
}