diff --git a/api-schema/tmi-openapi.json b/api-schema/tmi-openapi.json index f0a5e385..4e650f70 100644 --- a/api-schema/tmi-openapi.json +++ b/api-schema/tmi-openapi.json @@ -6273,8 +6273,8 @@ }, "path": { "type": "string", - "description": "JSON path to target", - "pattern": "^(/[^/]*)*$", + "description": "JSON Pointer (RFC 6901) to the target; must start with \"/\" (the document root \"\" is not allowed)", + "pattern": "^(/[^/]*)+$", "maxLength": 512 }, "value": { @@ -6322,6 +6322,12 @@ } } ] + }, + "from": { + "type": "string", + "description": "JSON Pointer (RFC 6901) to the source location. Required for move and copy operations, ignored otherwise; must start with \"/\".", + "pattern": "^(/[^/]*)+$", + "maxLength": 512 } }, "required": [ @@ -8243,7 +8249,13 @@ "maxLength": 128, "pattern": "^[^\\x00-\\x1F]*$", "description": "Survey status: active surveys appear in intake, inactive are hidden but editable, archived are read-only and preserved for historical reference", - "nullable": true + "nullable": true, + "enum": [ + "active", + "inactive", + "archived" + ], + "x-go-type": "string" }, "settings": { "$ref": "#/components/schemas/SurveySettings" @@ -14391,7 +14403,7 @@ "IsConfidentialQueryParam": { "name": "is_confidential", "in": "query", - "description": "Filter by secret_project flag", + "description": "Filter survey responses by their is_confidential flag, intersected with the caller's reviewer scope", "schema": { "type": "boolean" } @@ -14412,7 +14424,13 @@ "schema": { "type": "string", "maxLength": 128, - "pattern": "^[^\\x00-\\x1F]*$" + "pattern": "^[^\\x00-\\x1F]*$", + "enum": [ + "active", + "inactive", + "archived" + ], + "x-go-type": "string" } }, "SurveyId": { diff --git a/api/api.go b/api/api.go index c514ea47..a06b9205 100644 --- a/api/api.go +++ b/api/api.go @@ -4786,10 +4786,13 @@ type InvokeAddonResponseStatus string // JsonPatchDocument JSON Patch document as defined in RFC 6902 type JsonPatchDocument = []struct { + // From JSON Pointer (RFC 6901) to the source location. Required for move and copy operations, ignored otherwise; must start with "/". + From *string `json:"from,omitempty"` + // Op Patch operation type Op JsonPatchDocumentOp `json:"op"` - // Path JSON path to target + // Path JSON Pointer (RFC 6901) to the target; must start with "/" (the document root "" is not allowed) Path string `json:"path"` // Value The value to use for add/replace/test operations. Can be any JSON value per RFC 6902 (string, number, boolean, object, array, or null). @@ -9607,7 +9610,7 @@ type ListTriageSurveyResponsesParams struct { // SurveyId Filter by survey ID SurveyId *SurveyIdQueryParam `form:"survey_id,omitempty" json:"survey_id,omitempty"` - // IsConfidential Filter by secret_project flag + // IsConfidential Filter survey responses by their is_confidential flag, intersected with the caller's reviewer scope IsConfidential *IsConfidentialQueryParam `form:"is_confidential,omitempty" json:"is_confidential,omitempty"` // Limit Maximum number of results to return @@ -25137,2051 +25140,2066 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options // 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/api/client_credentials_handlers.go b/api/client_credentials_handlers.go index 3b31b0b7..0827419d 100644 --- a/api/client_credentials_handlers.go +++ b/api/client_credentials_handlers.go @@ -19,7 +19,7 @@ import ( // CreateCurrentUserClientCredential handles POST /me/client_credentials // Creates a new OAuth 2.0 client credential for machine-to-machine authentication -// SEM@32e22d40fa43dfa14fa39b14713e41c740ebe026: build a client credential for the authenticated user, enforcing authorization, quota, and direct_write rules (writes DB) +// SEM@fd749f0ab4b11da6219ce6594a51301843131dc9: build a client credential for the authenticated user, enforcing quota and conflict rules (writes DB) func (s *Server) CreateCurrentUserClientCredential(c *gin.Context) { logger := slogging.Get().WithContext(c) @@ -161,32 +161,7 @@ func (s *Server) CreateCurrentUserClientCredential(c *gin.Context) { ExpiresAt: timeFromPtr(req.ExpiresAt), }) if err != nil { - if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { - logger.Debug("Request cancelled during credential create: %v", err) - return - } - if errors.Is(err, dberrors.ErrDuplicate) || errors.Is(err, dberrors.ErrConstraint) { - logger.Warn("Client credential creation failed due to constraint: %v", err) - c.JSON(http.StatusConflict, Error{ - Error: ErrorError(errcode.Conflict), - ErrorDescription: "A client credential with these details already exists", - }) - return - } - if errors.Is(err, dberrors.ErrTransient) { - logger.Warn("Transient DB error creating client credential: %v", err) - c.Header("Retry-After", "30") - c.JSON(http.StatusServiceUnavailable, Error{ - Error: ErrorError(errcode.ServiceUnavailable), - ErrorDescription: "Database temporarily unavailable, please retry", - }) - return - } - logger.Error("Failed to create client credential for user %s: %v", ownerUUID, err) - c.JSON(http.StatusInternalServerError, Error{ - Error: ErrorError(errcode.ServerError), - ErrorDescription: "Failed to create client credential", - }) + respondClientCredentialCreateError(c, logger, ownerUUID, err) return } @@ -209,9 +184,40 @@ func (s *Server) CreateCurrentUserClientCredential(c *gin.Context) { c.JSON(http.StatusCreated, apiResp) } +// respondClientCredentialCreateError maps a credential create failure to a documented response. +// SEM@4f8575cbdd6a06b8391482229de6c8cb075359d3: map a client credential create error to its documented HTTP error response +func respondClientCredentialCreateError(c *gin.Context, logger *slogging.ContextLogger, ownerUUID uuid.UUID, err error) { + if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { + logger.Debug("Request canceled during credential create: %v", err) + return + } + if errors.Is(err, dberrors.ErrDuplicate) || errors.Is(err, dberrors.ErrConstraint) { + logger.Warn("Client credential creation failed due to constraint: %v", err) + c.JSON(http.StatusBadRequest, Error{ + Error: ErrorError(errcode.InvalidInput), + ErrorDescription: "The client credential could not be created with the supplied details", + }) + return + } + if errors.Is(err, dberrors.ErrTransient) { + logger.Warn("Transient DB error creating client credential: %v", err) + c.Header("Retry-After", "30") + c.JSON(http.StatusServiceUnavailable, Error{ + Error: ErrorError(errcode.ServiceUnavailable), + ErrorDescription: "Database temporarily unavailable, please retry", + }) + return + } + logger.Error("Failed to create client credential for user %s: %v", ownerUUID, err) + c.JSON(http.StatusInternalServerError, Error{ + Error: ErrorError(errcode.ServerError), + ErrorDescription: "Failed to create client credential", + }) +} + // ListCurrentUserClientCredentials handles GET /me/client_credentials // Retrieves all client credentials owned by the authenticated user (without secrets) -// SEM@32e22d40fa43dfa14fa39b14713e41c740ebe026: list the authenticated user's client credentials with pagination, omitting secrets (reads DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: list the authenticated user's client credentials with pagination, omitting secrets (reads DB) func (s *Server) ListCurrentUserClientCredentials(c *gin.Context, params ListCurrentUserClientCredentialsParams) { logger := slogging.Get().WithContext(c) userUUID := c.GetString("userInternalUUID") @@ -317,7 +323,7 @@ func (s *Server) ListCurrentUserClientCredentials(c *gin.Context, params ListCur // DeleteCurrentUserClientCredential handles DELETE /me/client_credentials/{credential_id} // Permanently deletes a client credential -// SEM@9750a568b8ffb60cfd241d61263b7e23f990899e: delete and revoke a client credential owned by the authenticated user (writes DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: delete and revoke a client credential owned by the authenticated user (writes DB) func (s *Server) DeleteCurrentUserClientCredential(c *gin.Context, credentialId openapi_types.UUID) { logger := slogging.Get().WithContext(c) userUUID := c.GetString("userInternalUUID") diff --git a/api/client_credentials_handlers_test.go b/api/client_credentials_handlers_test.go index fd439ea1..4c9496d2 100644 --- a/api/client_credentials_handlers_test.go +++ b/api/client_credentials_handlers_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/ericfitz/tmi/internal/dberrors" + "github.com/ericfitz/tmi/internal/slogging" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -754,3 +756,32 @@ func TestCreateCurrentUserClientCredential_AddonLink(t *testing.T) { w, _ = post(`{"name":"tf-wh","direct_write":true,"addon_id":"` + knownAddon.String() + `"}`) assert.Equal(t, http.StatusServiceUnavailable, w.Code) } + +// #1105: POST /me/client_credentials documents no 409, so a store constraint or +// duplicate error must map to a documented code (400 invalid_input). +func TestRespondClientCredentialCreateError(t *testing.T) { + gin.SetMode(gin.TestMode) + + cases := []struct { + name string + err error + wantStatus int + wantCode string + }{ + {"Constraint", fmt.Errorf("insert: %w", dberrors.ErrConstraint), http.StatusBadRequest, "invalid_input"}, + {"Duplicate", fmt.Errorf("insert: %w", dberrors.ErrDuplicate), http.StatusBadRequest, "invalid_input"}, + {"Transient", fmt.Errorf("insert: %w", dberrors.ErrTransient), http.StatusServiceUnavailable, "service_unavailable"}, + {"Unknown", fmt.Errorf("boom"), http.StatusInternalServerError, "server_error"}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + c, w := CreateTestGinContextWithBody("POST", "/me/client_credentials", "application/json", []byte(testCredBody)) + respondClientCredentialCreateError(c, slogging.Get().WithContext(c), uuid.New(), tc.err) + + assert.Equal(t, tc.wantStatus, w.Code) + var errResp Error + require.NoError(t, json.Unmarshal(w.Body.Bytes(), &errResp)) + assert.Equal(t, tc.wantCode, string(errResp.Error)) + }) + } +} diff --git a/api/config_handlers_test.go b/api/config_handlers_test.go index 0fba6017..45e9fdc5 100644 --- a/api/config_handlers_test.go +++ b/api/config_handlers_test.go @@ -1711,6 +1711,11 @@ func TestUpdateSystemSetting_TimmyValidation(t *testing.T) { assert.Equal(t, http.StatusBadRequest, w.Code) assert.Contains(t, w.Body.String(), "invalid_input") }) + t.Run("negative max tokens is 400", func(t *testing.T) { + w := put(t, "dev", "timmy.llm_max_tokens", `{"value": "-5", "type": "int"}`) + assert.Equal(t, http.StatusBadRequest, w.Code) + assert.Contains(t, w.Body.String(), "invalid_input") + }) t.Run("development dump flag true is 200", func(t *testing.T) { w := put(t, "dev", "timmy.dump_extracted_text_to_note", `{"value": "true", "type": "bool"}`) assert.Equal(t, http.StatusOK, w.Code) diff --git a/api/patch_root_path_test.go b/api/patch_root_path_test.go new file mode 100644 index 00000000..83ce2850 --- /dev/null +++ b/api/patch_root_path_test.go @@ -0,0 +1,410 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +// A root-path JSON Patch op must be rejected with 400 invalid_input, never +// applied to the in-memory object and answered 200 (#1109). +func TestPatchIntakeSurveyResponse_RejectsRootPathOp(t *testing.T) { + store := newMockSurveyResponseStore() + saveSurveyStores(t, nil, store) + id := seedSurveyResponse(store, uuid.New(), ResponseStatusDraft, TestUsers.Owner.InternalUUID) + // Any store write would surface as a non-400 status below. + store.updateErr = errors.New("update must not be called") + store.updateStatusErr = errors.New("update status must not be called") + + patch := []byte(`[{"op":"replace","path":"","value":{"status":"submitted","is_confidential":true}}]`) + c, w := CreateTestGinContextWithBody("PATCH", fmt.Sprintf("/intake/survey_responses/%s", id), "application/json-patch+json", patch) + TestUsers.Owner.SetContext(c) + (&Server{}).PatchIntakeSurveyResponse(c, id, PatchIntakeSurveyResponseParams{}) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") + stored := store.responses[id] + assert.Equal(t, ResponseStatusDraft, *stored.Status) + assert.False(t, *stored.IsConfidential) +} + +func TestPatchDiagram_RejectsRootPathOp(t *testing.T) { + InitializeMockStores() + gin.SetMode(gin.TestMode) + r := gin.New() + r.Use(func(c *gin.Context) { + c.Set("userEmail", "bob@example.com") + c.Set("userID", "bob-provider-id") + c.Set("userIdP", "test") + c.Set("userProvider", "test") + c.Set("userName", "Bob") + c.Set("userId", "bob@example.com") + c.Next() + }) + r.Use(ThreatModelMiddleware()) + + wsHub := NewWebSocketHubForTests() + tmHandler := NewThreatModelHandler(wsHub) + diagramHandler := NewThreatModelDiagramHandler(wsHub) + r.POST("/threat_models", tmHandler.CreateThreatModel) + r.POST("/threat_models/:threat_model_id/diagrams", func(c *gin.Context) { + diagramHandler.CreateDiagram(c, c.Param("threat_model_id")) + }) + r.PATCH("/threat_models/:threat_model_id/diagrams/:diagram_id", func(c *gin.Context) { + diagramHandler.PatchDiagram(c, c.Param("threat_model_id"), c.Param("diagram_id")) + }) + + do := func(method, path string, body []byte) *httptest.ResponseRecorder { + req := httptest.NewRequest(method, path, bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + return w + } + + tmBody, _ := json.Marshal(map[string]any{"name": "Test TM", "threat_model_framework": "STRIDE"}) + w := do("POST", "/threat_models", tmBody) + require.Equal(t, http.StatusCreated, w.Code) + var tm ThreatModel + require.NoError(t, json.Unmarshal(w.Body.Bytes(), &tm)) + + dBody, _ := json.Marshal(map[string]any{"name": "D", "type": "DFD-1.0.0"}) + w = do("POST", "/threat_models/"+tm.Id.String()+"/diagrams", dBody) + require.Equal(t, http.StatusCreated, w.Code) + var d DfdDiagram + require.NoError(t, json.Unmarshal(w.Body.Bytes(), &d)) + + w = do("PATCH", "/threat_models/"+tm.Id.String()+"/diagrams/"+d.Id.String(), + []byte(`[{"op":"replace","path":"","value":{"name":"x"}}]`)) + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") + + // A path without a leading slash passes the binding tags, so only the + // shared validator catches it. + w = do("PATCH", "/threat_models/"+tm.Id.String()+"/diagrams/"+d.Id.String(), + []byte(`[{"op":"replace","path":"name","value":"x"}]`)) + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") + + // move removes its source, so a prohibited "from" must be rejected too. + w = do("PATCH", "/threat_models/"+tm.Id.String()+"/diagrams/"+d.Id.String(), + []byte(`[{"op":"move","path":"/description","from":"/id"}]`)) + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") +} + +// The OpenAPI request validator must enforce the JsonPatchDocument schema: +// root path "" is rejected with 400, and move/copy "from" is accepted. +func TestOpenAPIValidation_JSONPatchPaths(t *testing.T) { + gin.SetMode(gin.TestMode) + mw, err := SetupOpenAPIValidation() + require.NoError(t, err) + r := gin.New() + r.Use(mw) + r.PATCH("/projects/:project_id", func(c *gin.Context) { c.Status(http.StatusOK) }) + url := "/projects/" + uuid.New().String() + + tests := []struct { + name string + body string + want int + }{ + {"root path rejected", `[{"op":"replace","path":"","value":{"name":"x"}}]`, http.StatusBadRequest}, + {"path without slash rejected", `[{"op":"replace","path":"name","value":"x"}]`, http.StatusBadRequest}, + {"from without slash rejected", `[{"op":"move","path":"/a","from":"b"}]`, http.StatusBadRequest}, + {"normal replace accepted", `[{"op":"replace","path":"/name","value":"x"}]`, http.StatusOK}, + {"move with from accepted", `[{"op":"move","path":"/a","from":"/b"}]`, http.StatusOK}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req := httptest.NewRequest("PATCH", url, bytes.NewBufferString(tt.body)) + req.Header.Set("Content-Type", "application/json-patch+json") + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + assert.Equal(t, tt.want, w.Code, w.Body.String()) + }) + } +} + +func TestPatchIntakeSurveyResponse_RejectsProhibitedFromPath(t *testing.T) { + for _, op := range []string{"move", "copy"} { + t.Run(op, func(t *testing.T) { + store := newMockSurveyResponseStore() + saveSurveyStores(t, nil, store) + id := seedSurveyResponse(store, uuid.New(), ResponseStatusDraft, TestUsers.Owner.InternalUUID) + + patch := []byte(fmt.Sprintf(`[{"op":%q,"path":"/ui_state","from":"/owner"}]`, op)) + c, w := CreateTestGinContextWithBody("PATCH", fmt.Sprintf("/intake/survey_responses/%s", id), "application/json-patch+json", patch) + TestUsers.Owner.SetContext(c) + (&Server{}).PatchIntakeSurveyResponse(c, id, PatchIntakeSurveyResponseParams{}) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") + }) + } +} + +func TestValidatePatchProhibitedPaths_FromAndPrefix(t *testing.T) { + assert.NotNil(t, ValidatePatchProhibitedPaths([]PatchOperation{{Op: "move", Path: "/description", From: "/id"}})) + assert.NotNil(t, ValidatePatchProhibitedPaths([]PatchOperation{{Op: "copy", Path: "/description", From: "/created_at"}})) + assert.NotNil(t, ValidatePatchProhibitedPaths([]PatchOperation{{Op: "move", Path: "/description", From: "/id/x"}})) + assert.Nil(t, ValidatePatchProhibitedPaths([]PatchOperation{{Op: "move", Path: "/description", From: "/name"}})) + // "from" is ignored for ops that do not use it. + assert.Nil(t, ValidatePatchProhibitedPaths([]PatchOperation{{Op: "replace", Path: "/name", From: "/id"}})) +} + +func TestBulkPatchThreats_RejectsProhibitedPaths(t *testing.T) { + ops := []map[string]any{ + {"op": "replace", "path": "/id", "value": testUUID1}, + {"op": "replace", "path": "/created_at", "value": "2020-01-01T00:00:00Z"}, + {"op": "move", "path": "/description", "from": "/id"}, + } + for _, op := range ops { + t.Run(fmt.Sprintf("%v_%v", op["op"], op["path"]), func(t *testing.T) { + r, mockStore := setupThreatSubResourceHandler() + mockStore.On("Patch", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&Threat{}, nil).Maybe() + mockStore.On("Get", mock.Anything, mock.Anything).Return(&Threat{}, nil).Maybe() + + body, err := json.Marshal(map[string]any{ + "patches": []map[string]any{{"id": testUUID2, "operations": []map[string]any{op}}}, + }) + require.NoError(t, err) + req := httptest.NewRequest("PATCH", "/threat_models/"+testUUID1+"/threats/bulk", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "invalid_input") + mockStore.AssertNotCalled(t, "Patch", mock.Anything, mock.Anything, mock.Anything, mock.Anything) + }) + } +} + +func TestPatchProjectAndTeam_RejectProhibitedFromAndSubPath(t *testing.T) { + gin.SetMode(gin.TestMode) + server := &Server{} + bodies := map[string]string{ + "move from prohibited path": `[{"op":"move","path":"/description","from":"/id"}]`, + "copy from prohibited path": `[{"op":"copy","path":"/description","from":"/created_by"}]`, + "prohibited sub-path": `[{"op":"replace","path":"/id/x","value":"v"}]`, + } + for name, body := range bodies { + t.Run("project "+name, func(t *testing.T) { + projectStore := newMockProjectStore() + seedProjectInStore(projectStore, testProjectID, "Project", testTeamID) + saveTeamProjectStores(t, nil, projectStore) + db := setupTestTeamAuthDB(t) + seedTeamAuthData(t, db, testTeamID, testUserUUID) + seedProjectAuthData(t, db, testProjectID, testTeamID) + + projectUUID, _ := uuid.Parse(testProjectID) + c, w := CreateTestGinContextWithBody("PATCH", "/projects/"+testProjectID, "application/json-patch+json", []byte(body)) + TestUsers.Owner.SetContext(c) + server.PatchProject(c, projectUUID, PatchProjectParams{}) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "not allowed") + }) + t.Run("team "+name, func(t *testing.T) { + store := newMockTeamStore() + seedTeamInStore(store, testTeamID, "Team") + saveTeamProjectStores(t, store, nil) + db := setupTestTeamAuthDB(t) + seedTeamAuthData(t, db, testTeamID, testUserUUID) + + teamUUID, _ := uuid.Parse(testTeamID) + c, w := CreateTestGinContextWithBody("PATCH", "/teams/"+testTeamID, "application/json-patch+json", []byte(body)) + TestUsers.Owner.SetContext(c) + server.PatchTeam(c, teamUUID, PatchTeamParams{}) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "not allowed") + }) + } +} + +func TestBulkPatchThreats_ValidatesAllEntriesBeforeApplying(t *testing.T) { + r, mockStore := setupThreatSubResourceHandler() + mockStore.On("Patch", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(&Threat{}, nil).Maybe() + + body, err := json.Marshal(map[string]any{ + "patches": []map[string]any{ + {"id": testUUID2, "operations": []map[string]any{{"op": "replace", "path": "/name", "value": "ok"}}}, + {"id": "00000000-0000-0000-0000-000000000003", "operations": []map[string]any{{"op": "replace", "path": "/id", "value": testUUID1}}}, + }, + }) + require.NoError(t, err) + req := httptest.NewRequest("PATCH", "/threat_models/"+testUUID1+"/threats/bulk", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + mockStore.AssertNotCalled(t, "Patch", mock.Anything, mock.Anything, mock.Anything, mock.Anything) +} + +func TestPatchGuards_RejectMoveCopyFromGuardedPath(t *testing.T) { + gin.SetMode(gin.TestMode) + server := &Server{} + patches := map[string]string{ + "move from guarded": `[{"op":"move","path":"/description","from":"%s"}]`, + "copy from guarded": `[{"op":"copy","path":"/description","from":"%s"}]`, + } + + t.Run("admin survey", func(t *testing.T) { + for name, tmpl := range patches { + t.Run(name, func(t *testing.T) { + store := newMockSurveyStore() + saveSurveyStores(t, store, nil) + surveyID := seedSurvey(store, "Original", "v1", SurveyStatusActive) + c, w := CreateTestGinContextWithBody(http.MethodPatch, fmt.Sprintf("/admin/surveys/%s", surveyID), + "application/json-patch+json", []byte(fmt.Sprintf(tmpl, "/created_by"))) + TestUsers.Owner.SetContext(c) + server.PatchAdminSurvey(c, surveyID) + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "not allowed") + }) + } + }) + + t.Run("triage survey response", func(t *testing.T) { + for name, tmpl := range patches { + t.Run(name, func(t *testing.T) { + store := newMockSurveyResponseStore() + saveSurveyStores(t, nil, store) + id := seedSurveyResponse(store, uuid.New(), ResponseStatusSubmitted, TestUsers.Owner.InternalUUID) + c, w := CreateTestGinContextWithBody("PATCH", fmt.Sprintf("/triage/survey_responses/%s", id), + "application/json-patch+json", []byte(fmt.Sprintf(tmpl, "/owner"))) + asTriageUser(t, c, GroupSecurityReviewers) + server.PatchTriageSurveyResponse(c, id) + assert.Equal(t, http.StatusBadRequest, w.Code, w.Body.String()) + assert.Contains(t, w.Body.String(), "not allowed") + }) + } + }) + + t.Run("team note sharable", func(t *testing.T) { + for name, tmpl := range patches { + t.Run(name, func(t *testing.T) { + store := newMockTeamNoteStore() + seedTeamNoteInStore(store, testTeamNoteID, true) + saveTeamNoteStore(t, store) + db := setupTestTeamAuthDB(t) + seedTeamAuthData(t, db, testTeamID, testUserUUID) + teamUUID, _ := uuid.Parse(testTeamID) + noteUUID, _ := uuid.Parse(testTeamNoteID) + c, w := CreateTestGinContextWithBody("PATCH", "/teams/"+testTeamID+"/notes/"+testTeamNoteID, + "application/json", []byte(fmt.Sprintf(tmpl, "/sharable"))) + TestUsers.Owner.SetContext(c) + server.PatchTeamNote(c, teamUUID, noteUUID) + assert.Equal(t, http.StatusForbidden, w.Code, w.Body.String()) + }) + } + }) + + t.Run("project note sharable", func(t *testing.T) { + for name, tmpl := range patches { + t.Run(name, func(t *testing.T) { + store := newMockProjectNoteStore() + seedProjectNoteInStore(store, testProjectNoteID, true) + saveProjectNoteStore(t, store) + db := setupTestTeamAuthDB(t) + seedTeamAuthData(t, db, testTeamID, testUserUUID) + seedProjectAuthData(t, db, testProjectID, testTeamID) + projectUUID, _ := uuid.Parse(testProjectID) + noteUUID, _ := uuid.Parse(testProjectNoteID) + c, w := CreateTestGinContextWithBody("PATCH", "/projects/"+testProjectID+"/notes/"+testProjectNoteID, + "application/json", []byte(fmt.Sprintf(tmpl, "/sharable"))) + TestUsers.Owner.SetContext(c) + server.PatchProjectNote(c, projectUUID, noteUUID) + assert.Equal(t, http.StatusForbidden, w.Code, w.Body.String()) + }) + } + }) +} + +// Removing /status (via remove or move-from) is a 400; copy/move into /status +// is validated as a status target. In every case the stored status stays put. +func TestPatchSurveyResponse_StatusViaMoveCopyRemove(t *testing.T) { + cases := map[string]struct { + patch string + want int + // writes is true when the case legitimately rewrites revision_notes or + // reaches the store's own status validation. + writes bool + }{ + "move from status": {`[{"op":"move","path":"/revision_notes","from":"/status"}]`, http.StatusBadRequest, false}, + "remove status": {`[{"op":"remove","path":"/status"}]`, http.StatusBadRequest, false}, + "copy status elsewhere": {`[{"op":"copy","path":"/revision_notes","from":"/status"}]`, http.StatusOK, true}, + "copy bogus value into status": {`[{"op":"copy","path":"/status","from":"/revision_notes"}]`, http.StatusBadRequest, true}, + "move bogus value into status": {`[{"op":"move","path":"/status","from":"/revision_notes"}]`, http.StatusBadRequest, true}, + } + for _, handler := range []string{"intake", "triage"} { + for name, tc := range cases { + t.Run(handler+" "+name, func(t *testing.T) { + store := newMockSurveyResponseStore() + saveSurveyStores(t, nil, store) + initial := ResponseStatusDraft + if handler == "triage" { + initial = ResponseStatusSubmitted + } + id := seedSurveyResponse(store, uuid.New(), initial, TestUsers.Owner.InternalUUID) + notes := "not-a-status" + store.responses[id].RevisionNotes = ¬es + // The real store rejects unknown status values; the mock needs telling. + store.updateStatusErr = errors.New("invalid status value") + + var c *gin.Context + var w *httptest.ResponseRecorder + if handler == "intake" { + c, w = CreateTestGinContextWithBody("PATCH", fmt.Sprintf("/intake/survey_responses/%s", id), "application/json-patch+json", []byte(tc.patch)) + TestUsers.Owner.SetContext(c) + (&Server{}).PatchIntakeSurveyResponse(c, id, PatchIntakeSurveyResponseParams{}) + } else { + c, w = CreateTestGinContextWithBody("PATCH", fmt.Sprintf("/triage/survey_responses/%s", id), "application/json-patch+json", []byte(tc.patch)) + asTriageUser(t, c, GroupSecurityReviewers) + (&Server{}).PatchTriageSurveyResponse(c, id) + } + assert.Equal(t, tc.want, w.Code, w.Body.String()) + if !tc.writes { + assert.Equal(t, initial, *store.responses[id].Status, "status must be unchanged") + assert.Equal(t, "not-a-status", *store.responses[id].RevisionNotes, "revision_notes must be unchanged") + } + }) + } + } +} + +func TestCheckOwnershipChanges_MoveAndCopy(t *testing.T) { + owner, auth := CheckOwnershipChanges([]PatchOperation{{Op: "move", Path: "/owner", From: "/name"}}) + assert.True(t, owner) + assert.False(t, auth) + owner, auth = CheckOwnershipChanges([]PatchOperation{{Op: "move", Path: "/name", From: "/owner"}}) + assert.True(t, owner) + assert.False(t, auth) + owner, auth = CheckOwnershipChanges([]PatchOperation{{Op: "copy", Path: "/authorization/0", From: "/name"}}) + assert.False(t, owner) + assert.True(t, auth) + owner, auth = CheckOwnershipChanges([]PatchOperation{{Op: "move", Path: "/name", From: "/authorization"}}) + assert.False(t, owner) + assert.True(t, auth) + owner, _ = CheckOwnershipChanges([]PatchOperation{{Op: "replace", Path: "/owner/provider_id", Value: "x"}}) + assert.True(t, owner) + owner, _ = CheckOwnershipChanges([]PatchOperation{{Op: "replace", Path: "/owners", Value: "x"}}) + assert.False(t, owner) + // copy only reads its source + owner, auth = CheckOwnershipChanges([]PatchOperation{{Op: "copy", Path: "/name", From: "/owner"}}) + assert.False(t, owner) + assert.False(t, auth) +} diff --git a/api/patch_utils.go b/api/patch_utils.go index 38c81e16..a37b4127 100644 --- a/api/patch_utils.go +++ b/api/patch_utils.go @@ -14,7 +14,7 @@ import ( ) // ApplyPatchOperations applies JSON Patch operations to an entity and returns the modified entity -// SEM@95fbc20511ce80f464d07e7723483035dbf87346: apply RFC 6902 JSON Patch operations to an entity, promoting replace to add and rejecting case-aliased keys (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: apply RFC 6902 JSON Patch operations to an entity, promoting replace to add and rejecting case-aliased keys (pure) func ApplyPatchOperations[T any](original T, operations []PatchOperation) (T, error) { var zero T @@ -126,7 +126,7 @@ func ApplyPatchOperations[T any](original T, operations []PatchOperation) (T, er } // ValidatePatchAuthorization validates that the user has permission to perform the patch operations -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: validate that the caller's role permits the requested ownership or authorization changes (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: validate that the caller's role permits the requested ownership or authorization changes (pure) func ValidatePatchAuthorization(operations []PatchOperation, userRole Role) error { // Check if any operations modify owner or authorization fields ownerChanging, authChanging := CheckOwnershipChanges(operations) @@ -155,41 +155,60 @@ var readOnlyPatchPaths = []string{ "/modified_at", } -// ValidatePatchProhibitedPaths rejects any PATCH operation that targets a -// server-managed (read-only) path. Returns a *RequestError with HTTP 400 on -// the first prohibited path found, or nil when all paths are allowed. -// SEM@270f55053109ed75ccf6cdf123884b9edf831d15: reject patch operations that target read-only fields such as id or created_at (pure) -func ValidatePatchProhibitedPaths(operations []PatchOperation) *RequestError { +// FindProhibitedPatchPath returns the first prohibited path (or sub-path of +// one) that any operation reads or writes, and whether one was found. It +// checks the "from" source of move and copy as well as the target: move removes +// its source, and copy would expose a prohibited field (owner, is_confidential, +// ...) through a field the caller may read. +// SEM@a7d2f8aeb90bc354bf081e462f3579fabb8503fe: find the first prohibited path touched by JSON Patch operations (pure) +func FindProhibitedPatchPath(operations []PatchOperation, prohibited []string) (string, bool) { for _, op := range operations { - for _, prohibited := range readOnlyPatchPaths { - if op.Path == prohibited || strings.HasPrefix(op.Path, prohibited+"/") { - field := strings.TrimPrefix(prohibited, "/") - return InvalidInputError(fmt.Sprintf( - "Field '%s' is not allowed in PATCH requests. %s", - field, - GetFieldErrorMessage(field, "PATCH"), - )) + for _, path := range patchOpPaths(op) { + for _, p := range prohibited { + if path == p || strings.HasPrefix(path, p+"/") { + return p, true + } } } } + return "", false +} + +// ValidatePatchProhibitedPaths rejects any PATCH operation that targets a +// server-managed (read-only) path, or moves/copies from one. Returns a +// *RequestError with HTTP 400 on the first prohibited path found, or nil when +// all paths are allowed. +// SEM@a7d2f8aeb90bc354bf081e462f3579fabb8503fe: reject patch operations that read or write read-only fields such as id or created_at (pure) +func ValidatePatchProhibitedPaths(operations []PatchOperation) *RequestError { + if p, found := FindProhibitedPatchPath(operations, readOnlyPatchPaths); found { + field := strings.TrimPrefix(p, "/") + return InvalidInputError(fmt.Sprintf( + "Field '%s' is not allowed in PATCH requests. %s", + field, + GetFieldErrorMessage(field, "PATCH"), + )) + } return nil } // CheckOwnershipChanges analyzes patch operations to determine if owner or authorization fields are being modified -// SEM@cdbe48c974fb76e1161972733b30bb0d1c02c3b1: detect whether patch operations modify the owner or authorization fields (pure) +// SEM@2a1432a9123ec75f66c846ef9aa32f0a1c7bbab1: detect whether patch operations modify the owner or authorization fields (pure) func CheckOwnershipChanges(operations []PatchOperation) (ownerChanging, authChanging bool) { for _, op := range operations { - if op.Op == string(Replace) || op.Op == string(Add) || op.Op == string(Remove) { - switch op.Path { - case "/owner": + // move and copy write op.Path; move also removes op.From. + var written []string + switch JsonPatchDocumentOp(op.Op) { + case Replace, Add, Remove, Copy: + written = []string{op.Path} + case Move: + written = []string{op.Path, op.From} + } + for _, path := range written { + switch { + case path == "/owner" || strings.HasPrefix(path, "/owner/"): ownerChanging = true - case "/authorization": + case path == "/authorization" || strings.HasPrefix(path, "/authorization/"): authChanging = true - default: - // Check for authorization array operations like /authorization/0, /authorization/- - if len(op.Path) > 15 && op.Path[:15] == "/authorization/" { - authChanging = true - } } } } @@ -231,7 +250,7 @@ func promoteReplaceToAdd(originalBytes []byte, operations []PatchOperation) []Pa // validateReplacePaths checks that all "replace" operations target paths that exist in the // original document. This is a workaround for evanphx/json-patch v1 which silently adds // fields instead of returning an error when replacing a nonexistent path (violating RFC 6902). -// SEM@3d0d5a8cf02fa74fad102f0f99c2b936a164bbea: reject replace operations whose target path does not exist in the serialized entity (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: reject replace operations whose target path does not exist in the serialized entity (pure) func validateReplacePaths(originalBytes []byte, operations []PatchOperation) error { var doc any if err := json.Unmarshal(originalBytes, &doc); err != nil { @@ -289,7 +308,7 @@ func pathExistsInDoc(doc any, parts []string) bool { } // ValidatePatchedEntity validates that the patched entity meets business rules -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: run a caller-supplied validator against the patched entity and map failures to 400 errors (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: run a caller-supplied validator against the patched entity and map failures to 400 errors (pure) func ValidatePatchedEntity[T any](original, patched T, userName string, validator func(T, T, string) error) error { if validator == nil { return nil diff --git a/api/patch_utils_extended_test.go b/api/patch_utils_extended_test.go index c6a60d19..ea1d9f72 100644 --- a/api/patch_utils_extended_test.go +++ b/api/patch_utils_extended_test.go @@ -269,7 +269,7 @@ func TestCheckOwnershipChanges_NearMissPaths(t *testing.T) { {"/authorization_note is not /authorization", "/authorization_note", false, false}, {"/auth is not /authorization", "/auth", false, false}, {"/authorized is not /authorization", "/authorized", false, false}, - {"/owner/name is not tracked", "/owner/name", false, false}, + {"/owner/provider_id is an owner change", "/owner/provider_id", true, false}, } for _, tt := range tests { diff --git a/api/project_handlers.go b/api/project_handlers.go index 243153e0..7d75678e 100644 --- a/api/project_handlers.go +++ b/api/project_handlers.go @@ -292,7 +292,7 @@ func (s *Server) UpdateProject(c *gin.Context, projectId openapi_types.UUID, _ U // PatchProject partially updates a project via JSON Patch. // Requires team membership or admin. // PATCH /projects/{project_id} -// SEM@15f223d3629a108c4549d8bb619851c44a5d4b18: apply JSON Patch operations to a project with optimistic-locking enforcement, emitting an update event (mutates DB) +// SEM@a7d2f8aeb90bc354bf081e462f3579fabb8503fe: apply JSON Patch operations to a project with optimistic-locking enforcement, emitting an update event (mutates DB) func (s *Server) PatchProject(c *gin.Context, projectId openapi_types.UUID, _ PatchProjectParams) { logger := slogging.Get() ctx := c.Request.Context() @@ -327,13 +327,9 @@ func (s *Server) PatchProject(c *gin.Context, projectId openapi_types.UUID, _ Pa // Validate prohibited fields prohibitedPaths := []string{"/id", "/created_at", "/modified_at", "/created_by", "/modified_by"} - for _, op := range operations { - for _, p := range prohibitedPaths { - if op.Path == p { - HandleRequestError(c, InvalidInputError("Field '"+strings.TrimPrefix(p, "/")+"' is not allowed in PATCH requests")) - return - } - } + if p, found := FindProhibitedPatchPath(operations, prohibitedPaths); found { + HandleRequestError(c, InvalidInputError("Field '"+strings.TrimPrefix(p, "/")+"' is not allowed in PATCH requests")) + return } // Get existing project diff --git a/api/project_note_handlers.go b/api/project_note_handlers.go index f14e2c45..1e9c6c7f 100644 --- a/api/project_note_handlers.go +++ b/api/project_note_handlers.go @@ -24,7 +24,7 @@ import ( // // `action` completes "You must be a project team member or administrator to // project notes". -// SEM@bfe3f043180e288dc7f18690340fbdd493d5813c: authorize a caller as project team member or admin, writing 404/403/500 on failure (reads DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: authorize a caller as project team member or admin, writing 404/403/500 on failure (reads DB) func requireProjectTeamMemberOrAdmin( c *gin.Context, ctx context.Context, projectID, userUUID, action string, ) bool { @@ -130,7 +130,7 @@ func (s *Server) ListProjectNotes(c *gin.Context, projectId openapi_types.UUID, // CreateProjectNote creates a new note for a project. // POST /projects/{project_id}/notes -// SEM@5180d2f924048649e7687f6b3733094086224488: store a new sanitized project note, restricting sharable fields by role (mutates DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: store a new sanitized project note, restricting sharable fields by role (mutates DB) func (s *Server) CreateProjectNote(c *gin.Context, projectId openapi_types.UUID) { logger := slogging.Get() ctx := c.Request.Context() @@ -199,7 +199,7 @@ func (s *Server) CreateProjectNote(c *gin.Context, projectId openapi_types.UUID) // GetProjectNote returns a specific project note. // GET /projects/{project_id}/notes/{project_note_id} -// SEM@5180d2f924048649e7687f6b3733094086224488: fetch a project note, hiding non-sharable notes from unprivileged users as 404 (reads DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: fetch a project note, hiding non-sharable notes from unprivileged users as 404 (reads DB) func (s *Server) GetProjectNote(c *gin.Context, projectId openapi_types.UUID, projectNoteId ProjectNoteId) { ctx := c.Request.Context() @@ -233,7 +233,7 @@ func (s *Server) GetProjectNote(c *gin.Context, projectId openapi_types.UUID, pr // UpdateProjectNote replaces a project note. // PUT /projects/{project_id}/notes/{project_note_id} -// SEM@5180d2f924048649e7687f6b3733094086224488: update a project note, enforcing sharable-field and visibility restrictions by role (mutates DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: update a project note, enforcing sharable-field and visibility restrictions by role (mutates DB) func (s *Server) UpdateProjectNote(c *gin.Context, projectId openapi_types.UUID, projectNoteId ProjectNoteId) { logger := slogging.Get() ctx := c.Request.Context() @@ -317,7 +317,7 @@ func (s *Server) UpdateProjectNote(c *gin.Context, projectId openapi_types.UUID, // PatchProjectNote partially updates a project note using JSON Patch. // PATCH /projects/{project_id}/notes/{project_note_id} -// SEM@d276bf5e1126f3d0a1dcda0c73c3a265feffa704: apply a JSON Patch to a project note, sanitizing the patched fields and blocking sharable-field changes for unprivileged users (mutates DB) +// SEM@d30ebe3b866d5558268f5a280963e91e27c1dedd: apply a JSON Patch to a project note, sanitizing the patched fields and blocking sharable-field changes for unprivileged users (mutates DB) func (s *Server) PatchProjectNote(c *gin.Context, projectId openapi_types.UUID, projectNoteId ProjectNoteId) { logger := slogging.Get() ctx := c.Request.Context() @@ -358,14 +358,12 @@ func (s *Server) PatchProjectNote(c *gin.Context, projectId openapi_types.UUID, // Non-privileged users cannot patch the sharable field if !privileged { - for _, op := range operations { - if op.Path == "/sharable" { - c.JSON(http.StatusForbidden, Error{ - Error: ErrorError(errcode.Forbidden), - ErrorDescription: "Only administrators and security reviewers can modify the sharable field", - }) - return - } + if _, touches := FindProhibitedPatchPath(operations, []string{"/sharable"}); touches { + c.JSON(http.StatusForbidden, Error{ + Error: ErrorError(errcode.Forbidden), + ErrorDescription: "Only administrators and security reviewers can modify the sharable field", + }) + return } } @@ -383,7 +381,7 @@ func (s *Server) PatchProjectNote(c *gin.Context, projectId openapi_types.UUID, // DeleteProjectNote deletes a project note. // DELETE /projects/{project_id}/notes/{project_note_id} -// SEM@5180d2f924048649e7687f6b3733094086224488: delete a project note, hiding non-sharable notes from unprivileged users as 404 (mutates DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: delete a project note, hiding non-sharable notes from unprivileged users as 404 (mutates DB) func (s *Server) DeleteProjectNote(c *gin.Context, projectId openapi_types.UUID, projectNoteId ProjectNoteId) { logger := slogging.Get() ctx := c.Request.Context() diff --git a/api/rate_limit_middleware.go b/api/rate_limit_middleware.go index d8656a82..514393ad 100644 --- a/api/rate_limit_middleware.go +++ b/api/rate_limit_middleware.go @@ -12,7 +12,7 @@ import ( ) // RateLimitMiddleware creates a middleware that enforces API rate limiting -// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: enforce per-user API rate limits and set rate limit response headers, skipping public and auth endpoints +// SEM@198cb4aafd0f97decb9482d12ee2c915f8d3983c: enforce per-user API rate limits and set rate limit headers, skipping public endpoints func RateLimitMiddleware(server *Server) gin.HandlerFunc { return func(c *gin.Context) { logger := slogging.Get().WithContext(c) @@ -37,22 +37,15 @@ func RateLimitMiddleware(server *Server) gin.HandlerFunc { return } - // Extract user ID from context (set by JWT middleware) - userIDValue, exists := c.Get("user_id") - if !exists { - // No user ID means not authenticated - skip rate limiting for this request + // Key on the authenticated user set by the JWT middleware + userID, authenticated := rateLimitUserKey(c) + if !authenticated { + // No user means not authenticated - skip rate limiting for this request // (JWT middleware will handle authentication failures) c.Next() return } - userID, ok := userIDValue.(string) - if !ok || userID == "" { - logger.Warn("Invalid user_id in context for rate limiting") - c.Next() - return - } - // Check rate limit allowed, retryAfter, err := server.apiRateLimiter.CheckRateLimit(c.Request.Context(), userID) if err != nil { @@ -95,6 +88,20 @@ func RateLimitMiddleware(server *Server) gin.HandlerFunc { } } +// rateLimitUserKey returns the per-user rate limit key from the JWT middleware's context +// values: the internal UUID (the quota store key), else the provider user ID. +// SEM@198cb4aafd0f97decb9482d12ee2c915f8d3983c: derive the rate limit bucket key for the authenticated user from request context (pure) +func rateLimitUserKey(c *gin.Context) (string, bool) { + for _, key := range []string{"userInternalUUID", "userID"} { + if v, ok := c.Get(key); ok { + if id, ok := v.(string); ok && id != "" { + return id, true + } + } + } + return "", false +} + // isPublicEndpoint checks if the path is a public discovery endpoint. // Note: "/" (health/info) is intentionally excluded — it is hit by ALB health // checks, kubelet probes, and frontend status polls, so IP-based rate limiting diff --git a/api/rate_limit_middleware_test.go b/api/rate_limit_middleware_test.go index 2eee0add..90b6bd41 100644 --- a/api/rate_limit_middleware_test.go +++ b/api/rate_limit_middleware_test.go @@ -114,7 +114,7 @@ func TestRateLimitMiddleware(t *testing.T) { c.JSON(http.StatusOK, gin.H{"status": "ok"}) }) - // No user_id in context + // No authenticated user in context req := httptest.NewRequest("GET", "/api/test", nil) w := httptest.NewRecorder() router.ServeHTTP(w, req) @@ -143,7 +143,7 @@ func TestRateLimitMiddleware(t *testing.T) { router := gin.New() router.Use(func(c *gin.Context) { - c.Set("user_id", userID) + c.Set("userInternalUUID", userID) c.Next() }) router.Use(RateLimitMiddleware(server)) @@ -183,7 +183,7 @@ func TestRateLimitMiddleware(t *testing.T) { router := gin.New() router.Use(func(c *gin.Context) { - c.Set("user_id", userID) + c.Set("userInternalUUID", userID) c.Next() }) router.Use(RateLimitMiddleware(server)) @@ -230,7 +230,7 @@ func TestRateLimitMiddleware(t *testing.T) { router := gin.New() router.Use(func(c *gin.Context) { - c.Set("user_id", userID) + c.Set("userInternalUUID", userID) c.Next() }) router.Use(RateLimitMiddleware(server)) @@ -257,6 +257,83 @@ func TestRateLimitMiddleware(t *testing.T) { }) } +// TestRateLimitMiddleware_JWTContextKeys drives the middleware with the context keys the +// JWT middleware actually sets (userInternalUUID, userID) rather than a test-only key. +func TestRateLimitMiddleware_JWTContextKeys(t *testing.T) { + gin.SetMode(gin.TestMode) + + run := func(t *testing.T, keys map[string]string, quotaKey string) { + client, mr := setupTestRedis(t) + defer mr.Close() + defer func() { _ = client.Close() }() + + quotaUUID, _ := uuid.Parse(quotaKey) + server := &Server{ + apiRateLimiter: NewAPIRateLimiter(client, &mockAPIQuotaStore{ + quotas: map[string]UserAPIQuota{ + quotaKey: {UserId: quotaUUID, MaxRequestsPerMinute: 2}, + }, + }), + } + + router := gin.New() + router.Use(func(c *gin.Context) { + for k, v := range keys { + c.Set(k, v) + } + c.Next() + }) + router.Use(RateLimitMiddleware(server)) + router.GET("/api/test", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{"status": "ok"}) + }) + + var codes []int + var last *httptest.ResponseRecorder + for i := 0; i < 3; i++ { + w := httptest.NewRecorder() + router.ServeHTTP(w, httptest.NewRequest("GET", "/api/test", nil)) + codes = append(codes, w.Code) + last = w + } + assert.Equal(t, []int{http.StatusOK, http.StatusOK, http.StatusTooManyRequests}, codes) + assert.Equal(t, "2", last.Header().Get("X-RateLimit-Limit")) + assert.NotEmpty(t, last.Header().Get("Retry-After")) + } + + t.Run("keys on userInternalUUID", func(t *testing.T) { + id := uuid.New().String() + run(t, map[string]string{"userInternalUUID": id, "userID": "provider-user-1"}, id) + }) + + t.Run("falls back to userID when internal UUID absent", func(t *testing.T) { + run(t, map[string]string{"userID": "provider-user-2"}, "provider-user-2") + }) + + t.Run("ignores legacy user_id key", func(t *testing.T) { + client, mr := setupTestRedis(t) + defer mr.Close() + defer func() { _ = client.Close() }() + + server := &Server{ + apiRateLimiter: NewAPIRateLimiter(client, &mockAPIQuotaStore{quotas: map[string]UserAPIQuota{}}), + } + router := gin.New() + router.Use(func(c *gin.Context) { + c.Set("user_id", "legacy") + c.Next() + }) + router.Use(RateLimitMiddleware(server)) + router.GET("/api/test", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{"status": "ok"}) + }) + w := httptest.NewRecorder() + router.ServeHTTP(w, httptest.NewRequest("GET", "/api/test", nil)) + assert.Equal(t, http.StatusOK, w.Code) + assert.Empty(t, w.Header().Get("X-RateLimit-Limit")) + }) +} + func TestIPRateLimitMiddleware(t *testing.T) { gin.SetMode(gin.TestMode) @@ -548,7 +625,7 @@ func TestRateLimitingDisabledBypass(t *testing.T) { router := gin.New() router.Use(func(c *gin.Context) { - c.Set("user_id", "test-user-id") + c.Set("userInternalUUID", "test-user-id") c.Next() }) router.Use(RateLimitMiddleware(server)) diff --git a/api/request_utils.go b/api/request_utils.go index e65bb9b7..18aa7645 100644 --- a/api/request_utils.go +++ b/api/request_utils.go @@ -86,7 +86,7 @@ const ( // ValidatePaginationParams validates limit and offset parameters // Returns a RequestError if validation fails, nil otherwise -// SEM@d8e6843d222487b09e3f3ab6f1ce56ed7ab59ac6: validate limit and offset pagination parameters against allowed bounds (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: validate limit and offset pagination parameters against allowed bounds (pure) func ValidatePaginationParams(limit, offset *int) *RequestError { if limit != nil { if *limit < 0 || *limit > MaxPaginationLimit { @@ -102,7 +102,7 @@ func ValidatePaginationParams(limit, offset *int) *RequestError { } // ParsePatchRequest parses JSON Patch operations from the request body -// SEM@59c58c6a840231ad2c078c9afd1e7bac7a07b651: parse and validate a JSON Patch operation array from the request body (pure) +// SEM@40d527743ae56474b63b0a5f7d5f397c797e4d33: parse a JSON Patch operation array from the request body and validate its paths func ParsePatchRequest(c *gin.Context) ([]PatchOperation, error) { bodyBytes, err := c.GetRawData() if err != nil { @@ -141,11 +141,32 @@ func ParsePatchRequest(c *gin.Context) ([]PatchOperation, error) { } } + if reqErr := ValidatePatchOperationPaths(operations); reqErr != nil { + return nil, reqErr + } + return operations, nil } +// ValidatePatchOperationPaths rejects whole-document JSON Patch operations: a +// root path ("") or any path or move/copy "from" that is not a JSON Pointer +// starting with "/". Exact-path checks on prohibited fields cannot see a +// root-path operation, so every PATCH handler must reject them up front. +// SEM@40d527743ae56474b63b0a5f7d5f397c797e4d33: reject JSON Patch operations targeting the document root or invalid pointer paths (pure) +func ValidatePatchOperationPaths(operations []PatchOperation) *RequestError { + for i, op := range operations { + if !strings.HasPrefix(op.Path, "/") { + return InvalidInputError(fmt.Sprintf("operation %d: path must be a JSON Pointer starting with '/'; root-path operations are not allowed", i)) + } + if (op.Op == "move" || op.Op == "copy") && !strings.HasPrefix(op.From, "/") { + return InvalidInputError(fmt.Sprintf("operation %d: from must be a JSON Pointer starting with '/'", i)) + } + } + return nil +} + // ParseRequestBody parses JSON request body into the specified type -// SEM@e890b588ef2cb844c92f6ddd0d56e797bb39b7e2: parse, validate, and deserialize a JSON request body into a typed value (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: parse, validate, and deserialize a JSON request body into a typed value func ParseRequestBody[T any](c *gin.Context) (T, error) { var zero T @@ -288,7 +309,7 @@ func checkDuplicateJSONKeys(jsonBytes []byte) error { } // checkDuplicateKeysInDecoder recursively checks for duplicate keys in JSON -// SEM@e890b588ef2cb844c92f6ddd0d56e797bb39b7e2: recursively detect duplicate keys in a streaming JSON decoder (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: detect duplicate object keys recursively in a streaming JSON decoder (pure) func checkDuplicateKeysInDecoder(dec *json.Decoder, path string) error { // Read opening token t, err := dec.Token() @@ -366,7 +387,7 @@ func IsUserAdministrator(c *gin.Context) (bool, error) { } // RequestError represents an error that should be returned as an HTTP response -// SEM@ccde596a38d5a3032cf965f5fbc2a4ffb144e534: structured HTTP error carrying status code, machine code, and human message (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: structured HTTP error carrying status code, machine code, and human message (pure) type RequestError struct { Status int Code errcode.Code @@ -392,7 +413,7 @@ func (e *RequestError) Error() string { } // HandleRequestError sends an appropriate HTTP error response -// SEM@5e107bce8eca9a7b10483bef568d3497a8b76f93: dispatch an HTTP error response for a request error with appropriate headers (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: dispatch an HTTP error response for a request error with appropriate headers func HandleRequestError(c *gin.Context, err error) { var reqErr *RequestError if errors.As(err, &reqErr) { @@ -480,7 +501,7 @@ func HandleRequestError(c *gin.Context, err error) { } // InvalidInputError creates a RequestError for validation failures -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: build a 400 RequestError for input validation failures (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 400 request error for input validation failures (pure) func InvalidInputError(message string) *RequestError { return &RequestError{ Status: http.StatusBadRequest, @@ -490,7 +511,7 @@ func InvalidInputError(message string) *RequestError { } // InvalidIDError creates a RequestError for invalid ID formats -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: build a 400 RequestError for invalid resource ID format (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 400 request error for an invalid resource ID format (pure) func InvalidIDError(message string) *RequestError { return &RequestError{ Status: http.StatusBadRequest, @@ -500,7 +521,7 @@ func InvalidIDError(message string) *RequestError { } // NotFoundError creates a RequestError for resource not found -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: build a 404 RequestError for a missing resource (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 404 request error for a missing resource (pure) func NotFoundError(message string) *RequestError { return &RequestError{ Status: http.StatusNotFound, @@ -510,7 +531,7 @@ func NotFoundError(message string) *RequestError { } // ServerError creates a RequestError for internal server errors -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: build a 500 RequestError for an internal server error (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 500 request error for an internal server failure (pure) func ServerError(message string) *RequestError { return &RequestError{ Status: http.StatusInternalServerError, @@ -520,7 +541,7 @@ func ServerError(message string) *RequestError { } // ForbiddenError creates a RequestError for forbidden access -// SEM@c9dfddf1e0b3e1f0e3423564ea4d4a997e4fdc45: build a 403 RequestError for forbidden access (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 403 request error for forbidden access (pure) func ForbiddenError(message string) *RequestError { return &RequestError{ Status: http.StatusForbidden, @@ -531,7 +552,7 @@ func ForbiddenError(message string) *RequestError { // NotAcceptableError creates a RequestError for content negotiation failures // (no offered response media type matches the request's Accept header). -// SEM@29f63eb500c26288d0d3fe23737adf6fd94bdf9c: build a 406 request error for an unsatisfiable Accept header (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 406 request error for an unsatisfiable Accept header (pure) func NotAcceptableError(message string) *RequestError { return &RequestError{ Status: http.StatusNotAcceptable, @@ -540,7 +561,7 @@ func NotAcceptableError(message string) *RequestError { } } -// SEM@420d8bdd24035796662ee4234e3bfaa6ba1a73bf: build a 401 RequestError for unauthenticated access (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 401 request error for unauthenticated access (pure) func UnauthorizedError(message string) *RequestError { return &RequestError{ Status: http.StatusUnauthorized, @@ -550,7 +571,7 @@ func UnauthorizedError(message string) *RequestError { } // ConflictError creates a RequestError for resource conflicts -// SEM@8559837d482fde8e2f7e1a9ea5e99d2bb2414141: build a 409 RequestError for a resource conflict (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 409 request error for a resource conflict (pure) func ConflictError(message string) *RequestError { return &RequestError{ Status: http.StatusConflict, @@ -562,7 +583,7 @@ func ConflictError(message string) *RequestError { // NotImplementedError creates a RequestError for features not implemented (501) // Use for features that are defined in the API but not yet implemented, // or when a particular provider doesn't support a feature. -// SEM@93f28e44afc91d0a7917b5dc1aaed9a52b00529a: build a 501 RequestError for an unimplemented feature (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 501 request error for an unimplemented feature (pure) func NotImplementedError(message string) *RequestError { return &RequestError{ Status: http.StatusNotImplemented, @@ -573,7 +594,7 @@ func NotImplementedError(message string) *RequestError { // ServiceUnavailableError creates a RequestError for temporarily unavailable services (503) // Use when a dependent service (database, Redis, external provider) is temporarily unavailable. -// SEM@93f28e44afc91d0a7917b5dc1aaed9a52b00529a: build a 503 RequestError for a temporarily unavailable dependency (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 503 request error for a temporarily unavailable dependency (pure) func ServiceUnavailableError(message string) *RequestError { return &RequestError{ Status: http.StatusServiceUnavailable, @@ -738,7 +759,7 @@ func WriteErrorToRequestError(err error, serverErrorMsg string) *RequestError { } // NotFoundErrorWithDetails creates a RequestError for resource not found with additional context -// SEM@3d0d5a8cf02fa74fad102f0f99c2b936a164bbea: build a 404 RequestError with structured diagnostic context (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 404 request error with structured diagnostic context (pure) func NotFoundErrorWithDetails(message string, code errcode.Code, context map[string]any, suggestion string) *RequestError { return &RequestError{ Status: http.StatusNotFound, @@ -753,7 +774,7 @@ func NotFoundErrorWithDetails(message string, code errcode.Code, context map[str } // ServerErrorWithDetails creates a RequestError for internal server errors with additional context -// SEM@3d0d5a8cf02fa74fad102f0f99c2b936a164bbea: build a 500 RequestError with structured diagnostic context (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 500 request error with structured diagnostic context (pure) func ServerErrorWithDetails(message string, code errcode.Code, context map[string]any, suggestion string) *RequestError { return &RequestError{ Status: http.StatusInternalServerError, @@ -768,7 +789,7 @@ func ServerErrorWithDetails(message string, code errcode.Code, context map[strin } // InvalidInputErrorWithDetails creates a RequestError for validation failures with additional context -// SEM@3d0d5a8cf02fa74fad102f0f99c2b936a164bbea: build a 400 RequestError with structured diagnostic context (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a 400 request error with structured diagnostic context (pure) func InvalidInputErrorWithDetails(message string, code errcode.Code, context map[string]any, suggestion string) *RequestError { return &RequestError{ Status: http.StatusBadRequest, diff --git a/api/request_utils_test.go b/api/request_utils_test.go index 625848b2..314d7cb1 100644 --- a/api/request_utils_test.go +++ b/api/request_utils_test.go @@ -878,3 +878,43 @@ func TestValidatePaginationParamsUsesInvalidInput(t *testing.T) { assert.Equal(t, errcode.InvalidInput, ValidatePaginationParams(&neg, nil).Code) assert.Equal(t, errcode.InvalidInput, ValidatePaginationParams(nil, &neg).Code) } + +func TestValidatePatchOperationPaths(t *testing.T) { + tests := []struct { + name string + ops []PatchOperation + wantErr bool + }{ + {"normal replace", []PatchOperation{{Op: "replace", Path: "/name", Value: "x"}}, false}, + {"move with pointer from", []PatchOperation{{Op: "move", Path: "/a", From: "/b"}}, false}, + {"root path replace", []PatchOperation{{Op: "replace", Path: "", Value: map[string]any{"owner": "x"}}}, true}, + {"path without leading slash", []PatchOperation{{Op: "replace", Path: "name", Value: "x"}}, true}, + {"second op is root", []PatchOperation{{Op: "replace", Path: "/name", Value: "x"}, {Op: "add", Path: ""}}, true}, + {"move with empty from", []PatchOperation{{Op: "move", Path: "/a", From: ""}}, true}, + {"copy with bad from", []PatchOperation{{Op: "copy", Path: "/a", From: "b"}}, true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + reqErr := ValidatePatchOperationPaths(tt.ops) + if !tt.wantErr { + assert.Nil(t, reqErr) + return + } + require.NotNil(t, reqErr) + assert.Equal(t, http.StatusBadRequest, reqErr.Status) + assert.Equal(t, errcode.InvalidInput, reqErr.Code) + }) + } +} + +func TestParsePatchRequestRejectsRootPath(t *testing.T) { + gin.SetMode(gin.TestMode) + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Request = httptest.NewRequest("PATCH", "/test", strings.NewReader(`[{"op":"replace","path":"","value":{"owner":"x"}}]`)) + _, err := ParsePatchRequest(c) + var reqErr *RequestError + require.ErrorAs(t, err, &reqErr) + assert.Equal(t, http.StatusBadRequest, reqErr.Status) + assert.Equal(t, errcode.InvalidInput, reqErr.Code) +} diff --git a/api/settings_service.go b/api/settings_service.go index 96fb4c58..0e063a8a 100644 --- a/api/settings_service.go +++ b/api/settings_service.go @@ -497,9 +497,10 @@ func (s *SettingsService) ListByPrefix(ctx context.Context, prefix string) ([]mo // settingSemanticValidators is the single key -> validator map applied by Set, // so semantic checks on specific settings are enforced for every writer that // goes through Set (the admin API) rather than per handler. Writers that -// bypass Set, such as dbtool (cmd/dbtool/config.go) and raw DB writes, are not -// covered here; the startup check catches their values at the next boot. The -// validators mirror the startup checks in config.ValidateTimmyConfig (#1102). +// bypass Set (raw DB writes) are not covered here; the startup check catches +// their values at the next boot. dbtool reuses this map through +// ValidateSettingSemantics so its direct writes obey the same rules (#1108). +// The validators mirror the startup checks in config.ValidateTimmyConfig (#1102). var settingSemanticValidators = map[string]func(value string, productionMode bool) error{ "timmy.dump_extracted_text_to_note": func(value string, productionMode bool) error { enabled, err := strconv.ParseBool(value) @@ -515,16 +516,31 @@ var settingSemanticValidators = map[string]func(value string, productionMode boo "timmy.llm_provider": func(value string, _ bool) error { return config.TimmyConfig{LLMProvider: value}.ValidateLLMProvider() }, + "timmy.llm_max_tokens": func(value string, _ bool) error { + n, err := strconv.Atoi(value) + if err != nil { + return fmt.Errorf("timmy.llm_max_tokens: value is not a valid integer") + } + return config.TimmyConfig{LLMMaxTokens: n}.ValidateLLMMaxTokens() + }, } -// validateSettingSemantics applies the per-key validator for the setting, if any. -// SEM@57a0ccb18013f0ed5d8a8631da478fae012e3c67: validate a setting value against its key-specific semantic rules (pure) -func (s *SettingsService) validateSettingSemantics(setting *models.SystemSetting) error { - validate, ok := settingSemanticValidators[string(setting.SettingKey)] +// ValidateSettingSemantics applies the per-key semantic validator for key, if +// any; keys without a validator pass. Exported so writers that bypass +// SettingsService.Set (cmd/dbtool) enforce the same rules (#1108). +// SEM@05d35fa239ce471ca0d0d0c324c69e93e1c8c21c: validate a setting value against its key-specific semantic rules (pure) +func ValidateSettingSemantics(key, value string, productionMode bool) error { + validate, ok := settingSemanticValidators[key] if !ok { return nil } - return validate(string(setting.Value), s.isProductionMode()) + return validate(value, productionMode) +} + +// validateSettingSemantics applies the per-key validator for the setting, if any. +// SEM@05d35fa239ce471ca0d0d0c324c69e93e1c8c21c: validate a system setting's value using the service's production-mode semantic rules (pure) +func (s *SettingsService) validateSettingSemantics(setting *models.SystemSetting) error { + return ValidateSettingSemantics(string(setting.SettingKey), string(setting.Value), s.isProductionMode()) } // Set creates or updates a setting diff --git a/api/settings_service_test.go b/api/settings_service_test.go index a4e356c0..aa3daedc 100644 --- a/api/settings_service_test.go +++ b/api/settings_service_test.go @@ -1205,6 +1205,26 @@ func TestSettingsService_SetValidatesTimmyKeys(t *testing.T) { }) } + t.Run("negative llm_max_tokens rejected", func(t *testing.T) { + t.Setenv("TMI_BUILD_MODE", "dev") + svc := NewSettingsService(nil, nil) + err := svc.Set(context.Background(), mk("timmy.llm_max_tokens", "-1", models.SystemSettingTypeInt)) + require.Error(t, err) + assert.Contains(t, err.Error(), "timmy.llm_max_tokens") + }) + + for _, v := range []string{"0", "4096"} { + t.Run("llm_max_tokens accepts "+v, func(t *testing.T) { + t.Setenv("TMI_BUILD_MODE", "dev") + svc := NewSettingsService(setupSettingsTestDB(t), nil) + require.NoError(t, svc.Set(context.Background(), mk("timmy.llm_max_tokens", v, models.SystemSettingTypeInt))) + }) + } + + t.Run("llm_max_tokens validator fails closed on unparseable value", func(t *testing.T) { + require.Error(t, settingSemanticValidators["timmy.llm_max_tokens"]("abc", false)) + }) + t.Run("llm_provider validator accepts empty", func(t *testing.T) { // Set itself rejects empty strings for all string settings (use DELETE); // the provider validator must not be what rejects them. diff --git a/api/survey_handlers.go b/api/survey_handlers.go index 198edce5..73ad512a 100644 --- a/api/survey_handlers.go +++ b/api/survey_handlers.go @@ -110,7 +110,7 @@ func (s *Server) ListAdminSurveys(c *gin.Context, params ListAdminSurveysParams) // CreateAdminSurvey creates a new survey. // POST /admin/surveys -// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: store a new survey template and emit a webhook event (mutates shared state) +// SEM@7f98676d5cf378435fc7478542365dfd50fba318: store a new survey template and emit a webhook event (mutates shared state) func (s *Server) CreateAdminSurvey(c *gin.Context) { logger := slogging.Get() ctx := c.Request.Context() @@ -135,6 +135,11 @@ func (s *Server) CreateAdminSurvey(c *gin.Context) { return } + if err := validateSurveyStatus(req.Status); err != nil { + HandleRequestError(c, err) + return + } + // Validate survey_json has a pages array if err := validateSurveyJSON(req.SurveyJson); err != nil { HandleRequestError(c, InvalidInputError(err.Error())) @@ -227,7 +232,7 @@ func (s *Server) GetAdminSurvey(c *gin.Context, surveyId SurveyId) { // UpdateAdminSurvey fully updates a survey. // PUT /admin/surveys/{survey_id} -// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: fully replace a non-archived survey and emit a webhook event (mutates shared state) +// SEM@7f98676d5cf378435fc7478542365dfd50fba318: fully replace a non-archived survey and emit a webhook event (mutates shared state) func (s *Server) UpdateAdminSurvey(c *gin.Context, surveyId SurveyId) { logger := slogging.Get() ctx := c.Request.Context() @@ -267,6 +272,11 @@ func (s *Server) UpdateAdminSurvey(c *gin.Context, surveyId SurveyId) { return } + if err := validateSurveyStatus(req.Status); err != nil { + HandleRequestError(c, err) + return + } + // Validate survey_json has a pages array if err := validateSurveyJSON(req.SurveyJson); err != nil { HandleRequestError(c, InvalidInputError(err.Error())) @@ -341,7 +351,7 @@ func (s *Server) UpdateAdminSurvey(c *gin.Context, surveyId SurveyId) { // PatchAdminSurvey partially updates a survey. // PATCH /admin/surveys/{survey_id} -// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: partially update a non-archived survey via JSON Patch and emit a webhook event (mutates shared state) +// SEM@a7d2f8aeb90bc354bf081e462f3579fabb8503fe: partially update a non-archived survey via JSON Patch and emit a webhook event (mutates shared state) func (s *Server) PatchAdminSurvey(c *gin.Context, surveyId SurveyId) { logger := slogging.Get() ctx := c.Request.Context() @@ -385,16 +395,11 @@ func (s *Server) PatchAdminSurvey(c *gin.Context, surveyId SurveyId) { "/id", "/created_at", "/modified_at", "/created_by", } - for _, op := range operations { - for _, prohibitedPath := range prohibitedPaths { - if op.Path == prohibitedPath { - fieldName := strings.TrimPrefix(prohibitedPath, "/") - HandleRequestError(c, InvalidInputError(fmt.Sprintf( - "Field '%s' is not allowed in PATCH requests", - fieldName))) - return - } - } + if p, found := FindProhibitedPatchPath(operations, prohibitedPaths); found { + HandleRequestError(c, InvalidInputError(fmt.Sprintf( + "Field '%s' is not allowed in PATCH requests", + strings.TrimPrefix(p, "/")))) + return } // Apply patch operations to the existing survey @@ -872,7 +877,7 @@ func validateIntakeStatusTarget(status string) error { // PatchIntakeSurveyResponse partially updates a survey response. // PATCH /intake/survey_responses/{response_id} // Supports status transitions: draft->submitted, needs_revision->submitted -// SEM@fea6b3be63afa09c0668f3eaa2f51f933c5e05f1: apply a JSON Patch to a draft or needs-revision survey response, allowing only draft or submitted status targets (mutates DB) +// SEM@2a1432a9123ec75f66c846ef9aa32f0a1c7bbab1: apply a JSON Patch to a draft or needs-revision survey response, allowing only draft or submitted status targets (mutates DB) func (s *Server) PatchIntakeSurveyResponse(c *gin.Context, surveyResponseId SurveyResponseId, _ PatchIntakeSurveyResponseParams) { logger := slogging.Get() ctx := c.Request.Context() @@ -905,21 +910,13 @@ func (s *Server) PatchIntakeSurveyResponse(c *gin.Context, surveyResponseId Surv } // Check for status change in operations - hasStatusChange := false - for _, op := range operations { - if op.Path == PatchPathStatus { - hasStatusChange = true - } - for _, prohibitedPath := range prohibitedPaths { - if op.Path == prohibitedPath { - fieldName := strings.TrimPrefix(prohibitedPath, "/") - HandleRequestError(c, InvalidInputError(fmt.Sprintf( - "Field '%s' is not allowed in PATCH requests", - fieldName))) - return - } - } + if p, found := FindProhibitedPatchPath(operations, prohibitedPaths); found { + HandleRequestError(c, InvalidInputError(fmt.Sprintf( + "Field '%s' is not allowed in PATCH requests", + strings.TrimPrefix(p, "/")))) + return } + hasStatusChange := patchChangesStatus(operations) // Apply patch operations patched, err := ApplyPatchOperations(*existing, operations) @@ -930,6 +927,11 @@ func (s *Server) PatchIntakeSurveyResponse(c *gin.Context, surveyResponseId Surv patched.Id = &surveyResponseId + if hasStatusChange && patched.Status == nil { + HandleRequestError(c, InvalidInputError("Field 'status' cannot be removed")) + return + } + // Validate a status transition BEFORE the CAS-guarded write below, even // though the actual status write happens after it. Both failure modes // here (unknown status value, missing revision_notes) are pure checks @@ -1071,7 +1073,7 @@ func (s *Server) DeleteIntakeSurveyResponse(c *gin.Context, surveyResponseId Sur // ListTriageSurveyResponses returns survey responses for triage. // GET /triage/survey_responses -// SEM@49259ca96d8bf22bf9c7a384c528d9a39bebe16d: list survey responses scoped to the caller's reviewer groups by confidentiality (reads DB) +// SEM@2af088d4f39f8fea02f01623d3a2442cf14e0927: list survey responses scoped to reviewer groups and confidentiality filter (reads DB) func (s *Server) ListTriageSurveyResponses(c *gin.Context, params ListTriageSurveyResponsesParams) { logger := slogging.Get() ctx := c.Request.Context() @@ -1119,11 +1121,23 @@ func (s *Server) ListTriageSurveyResponses(c *gin.Context, params ListTriageSurv }) return } - if confidential != nil { + // The is_confidential parameter only narrows the reviewer scope (#1106); + // a value the scope excludes yields an empty page, never a wider one. + effective, empty := intersectConfidentialScope(confidential, params.IsConfidential) + if empty { + c.JSON(http.StatusOK, ListSurveyResponsesResponse{ + SurveyResponses: []SurveyResponseListItem{}, + Total: 0, + Limit: limit, + Offset: offset, + }) + return + } + if effective != nil { if filters == nil { filters = &SurveyResponseFilters{} } - filters.IsConfidential = confidential + filters.IsConfidential = effective } items, total, err := GlobalSurveyResponseStore.List(ctx, limit, offset, filters) @@ -1144,6 +1158,21 @@ func (s *Server) ListTriageSurveyResponses(c *gin.Context, params ListTriageSurv }) } +// intersectConfidentialScope combines the caller's reviewer scope with the +// is_confidential query parameter. A nil input means "no restriction"; empty is +// true when the two disagree, so the result set is necessarily empty. +// SEM@2af088d4f39f8fea02f01623d3a2442cf14e0927: intersect reviewer confidentiality scope with a requested confidentiality filter (pure) +func intersectConfidentialScope(scope, param *bool) (effective *bool, empty bool) { + switch { + case scope == nil: + return param, false + case param == nil || *param == *scope: + return scope, false + default: + return nil, true + } +} + // GetTriageSurveyResponse returns a specific survey response for triage. // GET /triage/survey_responses/{response_id} // SEM@49259ca96d8bf22bf9c7a384c528d9a39bebe16d: fetch a survey response for a caller in the matching triage reviewer group (reads DB) @@ -1158,7 +1187,7 @@ func (s *Server) GetTriageSurveyResponse(c *gin.Context, surveyResponseId Survey // PatchTriageSurveyResponse partially updates a survey response for triage. // PATCH /triage/survey_responses/{response_id} // Supports status transitions: submitted->ready_for_review, submitted->needs_revision, ready_for_review->needs_revision -// SEM@49259ca96d8bf22bf9c7a384c528d9a39bebe16d: apply a JSON Patch to a survey response's triage status for a matching triage reviewer (mutates DB) +// SEM@2a1432a9123ec75f66c846ef9aa32f0a1c7bbab1: apply a JSON Patch to a survey response's triage status for a matching triage reviewer (mutates DB) func (s *Server) PatchTriageSurveyResponse(c *gin.Context, surveyResponseId SurveyResponseId) { logger := slogging.Get() ctx := c.Request.Context() @@ -1186,21 +1215,13 @@ func (s *Server) PatchTriageSurveyResponse(c *gin.Context, surveyResponseId Surv "/survey_version", "/is_confidential", "/survey_json", "/ui_state", } - hasStatusChange := false - for _, op := range operations { - if op.Path == PatchPathStatus { - hasStatusChange = true - } - for _, prohibitedPath := range prohibitedPaths { - if op.Path == prohibitedPath { - fieldName := strings.TrimPrefix(prohibitedPath, "/") - HandleRequestError(c, InvalidInputError(fmt.Sprintf( - "Field '%s' is not allowed in PATCH requests", - fieldName))) - return - } - } + if p, found := FindProhibitedPatchPath(operations, prohibitedPaths); found { + HandleRequestError(c, InvalidInputError(fmt.Sprintf( + "Field '%s' is not allowed in PATCH requests", + strings.TrimPrefix(p, "/")))) + return } + hasStatusChange := patchChangesStatus(operations) // Apply patch operations patched, err := ApplyPatchOperations(*existing, operations) @@ -1209,6 +1230,11 @@ func (s *Server) PatchTriageSurveyResponse(c *gin.Context, surveyResponseId Surv return } + if hasStatusChange && patched.Status == nil { + HandleRequestError(c, InvalidInputError("Field 'status' cannot be removed")) + return + } + // Handle status transition if status was changed if hasStatusChange && patched.Status != nil && *patched.Status != *existing.Status { newStatus := *patched.Status @@ -1607,7 +1633,7 @@ func (s *Server) CreateThreatModelFromSurveyResponse(c *gin.Context, surveyRespo // templates table at the handler boundary so that fuzzer-induced inputs // produce a clean 400 instead of bouncing off the database as 500. // Mirrors gorm tags on api/models/survey_models.go: SurveyTemplate. -// SEM@d79355f5eb3a2b2254ea6aa04da1cd81a55a4297: validate a patched survey against column-level constraints; return 400-class error (pure) +// SEM@8d2dcafcad63defc5e493d1177c845268338ee2b: validate a patched survey against column-level constraints (pure) func validatePatchedSurvey(s *Survey) *RequestError { if s == nil { return InvalidInputError("survey is required") @@ -1634,15 +1660,23 @@ func validatePatchedSurvey(s *Survey) *RequestError { if len(s.Version) > maxVersionLen { return InvalidInputError(fmt.Sprintf("version exceeds maximum length of %d characters", maxVersionLen)) } - if s.Status != nil { - switch *s.Status { - case SurveyStatusActive, SurveyStatusInactive, SurveyStatusArchived: - default: - return InvalidInputError(fmt.Sprintf("status must be one of %s, %s, %s", - SurveyStatusActive, SurveyStatusInactive, SurveyStatusArchived)) - } + return validateSurveyStatus(s.Status) +} + +// validateSurveyStatus rejects a survey status outside the closed set (nil is allowed). +// Shared by POST, PUT and PATCH /admin/surveys; the column is size:20. +// SEM@8d2dcafcad63defc5e493d1177c845268338ee2b: validate a survey status against the allowed set (pure) +func validateSurveyStatus(status *string) *RequestError { + if status == nil { + return nil + } + switch *status { + case SurveyStatusActive, SurveyStatusInactive, SurveyStatusArchived: + return nil + default: + return InvalidInputError(fmt.Sprintf("status must be one of %s, %s, %s", + SurveyStatusActive, SurveyStatusInactive, SurveyStatusArchived)) } - return nil } // isDuplicateConstraintError checks if an error is a database unique constraint violation. @@ -1711,3 +1745,15 @@ func validateSurveyJSON(surveyJSON map[string]any) error { return nil } + +// patchChangesStatus reports whether any operation writes /status; a move +// also removes its source, so moving /status away counts. +// SEM@d30ebe3b866d5558268f5a280963e91e27c1dedd: detect whether JSON Patch operations write or remove the status field (pure) +func patchChangesStatus(operations []PatchOperation) bool { + for _, op := range operations { + if op.Path == PatchPathStatus || (op.Op == string(Move) && op.From == PatchPathStatus) { + return true + } + } + return false +} diff --git a/api/survey_status_admin_validation_test.go b/api/survey_status_admin_validation_test.go new file mode 100644 index 00000000..e61fde07 --- /dev/null +++ b/api/survey_status_admin_validation_test.go @@ -0,0 +1,137 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// Issue #1104: POST/PUT /admin/surveys must reject an unknown status with a +// 400 naming the field before any store write. +func TestCreateAdminSurvey_RejectsInvalidStatus(t *testing.T) { + gin.SetMode(gin.TestMode) + store := newMockSurveyStore() + saveSurveyStores(t, store, nil) + + for _, status := range []string{"bogus", strings.Repeat("x", 21), strings.Repeat("x", 128), "ACTIVE", ""} { + body, _ := json.Marshal(SurveyBase{Name: "S", Version: "v1", Status: &status, SurveyJson: validSurveyJSON()}) + c, w := CreateTestGinContextWithBody("POST", "/admin/surveys", "application/json", body) + TestUsers.Owner.SetContext(c) + + (&Server{}).CreateAdminSurvey(c) + + require.Equal(t, http.StatusBadRequest, w.Code, "status=%q body=%s", status, w.Body.String()) + assert.Contains(t, w.Body.String(), "status") + assert.Contains(t, w.Body.String(), "invalid_input") + } +} + +func TestCreateAdminSurvey_AcceptsNilAndValidStatus(t *testing.T) { + gin.SetMode(gin.TestMode) + store := newMockSurveyStore() + saveSurveyStores(t, store, nil) + + for _, status := range []*string{nil, strPtr(SurveyStatusActive), strPtr(SurveyStatusInactive), strPtr(SurveyStatusArchived)} { + body, _ := json.Marshal(SurveyBase{Name: "S", Version: "v1", Status: status, SurveyJson: validSurveyJSON()}) + c, w := CreateTestGinContextWithBody("POST", "/admin/surveys", "application/json", body) + TestUsers.Owner.SetContext(c) + + (&Server{}).CreateAdminSurvey(c) + + assert.Equal(t, http.StatusCreated, w.Code, "body=%s", w.Body.String()) + } +} + +func TestUpdateAdminSurvey_RejectsInvalidStatus(t *testing.T) { + gin.SetMode(gin.TestMode) + store := newMockSurveyStore() + saveSurveyStores(t, store, nil) + surveyID := seedSurvey(store, "Original", "v1", SurveyStatusActive) + + for _, status := range []string{"bogus", strings.Repeat("x", 21), strings.Repeat("x", 128), ""} { + body, _ := json.Marshal(SurveyBase{Name: "S", Version: "v2", Status: &status, SurveyJson: validSurveyJSON()}) + c, w := CreateTestGinContextWithBody("PUT", "/admin/surveys/"+surveyID.String(), "application/json", body) + TestUsers.Owner.SetContext(c) + + (&Server{}).UpdateAdminSurvey(c, surveyID) + + require.Equal(t, http.StatusBadRequest, w.Code, "status=%q body=%s", status, w.Body.String()) + assert.Contains(t, w.Body.String(), "status") + assert.Contains(t, w.Body.String(), "invalid_input") + } +} + +func TestValidateSurveyStatus(t *testing.T) { + assert.Nil(t, validateSurveyStatus(nil)) + for _, ok := range []string{SurveyStatusActive, SurveyStatusInactive, SurveyStatusArchived} { + assert.Nil(t, validateSurveyStatus(&ok), ok) + } + for _, bad := range []string{"", "bogus", "Active", " active"} { + assert.NotNil(t, validateSurveyStatus(&bad), bad) + } +} + +// TestSurveyBaseStatusSpecEnum confirms the OpenAPI request validator enforces the +// status enum on POST /admin/surveys while still accepting null and omission. +func TestSurveyBaseStatusSpecEnum(t *testing.T) { + gin.SetMode(gin.TestMode) + validator, err := SetupOpenAPIValidation() + require.NoError(t, err) + router := gin.New() + router.Use(validator) + router.POST("/admin/surveys", func(c *gin.Context) { c.Status(http.StatusCreated) }) + + cases := []struct { + name string + status string + want int + }{ + {"omitted", ``, http.StatusCreated}, + {"null", `,"status":null`, http.StatusCreated}, + {"active", `,"status":"active"`, http.StatusCreated}, + {"archived", `,"status":"archived"`, http.StatusCreated}, + {"unknown", `,"status":"bogus"`, http.StatusBadRequest}, + {"too long", `,"status":"` + strings.Repeat("x", 100) + `"`, http.StatusBadRequest}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + body := `{"name":"S","version":"v1","survey_json":{"pages":[]}` + tc.status + `}` + req := httptest.NewRequest(http.MethodPost, "/admin/surveys", strings.NewReader(body)) + req.Header.Set("Content-Type", "application/json") + w := httptest.NewRecorder() + router.ServeHTTP(w, req) + assert.Equal(t, tc.want, w.Code, "body=%s", w.Body.String()) + }) + } +} + +// TestSurveyStatusQueryParamSpecEnum confirms GET /admin/surveys?status= is +// enum-checked by the OpenAPI request validator. +func TestSurveyStatusQueryParamSpecEnum(t *testing.T) { + gin.SetMode(gin.TestMode) + validator, err := SetupOpenAPIValidation() + require.NoError(t, err) + router := gin.New() + router.Use(validator) + router.GET("/admin/surveys", func(c *gin.Context) { c.Status(http.StatusOK) }) + + cases := map[string]int{ + "active": http.StatusOK, + "inactive": http.StatusOK, + "archived": http.StatusOK, + "bogus": http.StatusBadRequest, + strings.Repeat("x", 100): http.StatusBadRequest, + } + for status, want := range cases { + req := httptest.NewRequest(http.MethodGet, "/admin/surveys?status="+status, nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, req) + assert.Equal(t, want, w.Code, "status=%q body=%s", status, w.Body.String()) + } +} diff --git a/api/survey_triage_access_test.go b/api/survey_triage_access_test.go index 5bc4c723..2c4b9fa3 100644 --- a/api/survey_triage_access_test.go +++ b/api/survey_triage_access_test.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "net/http/httptest" "testing" "github.com/gin-gonic/gin" @@ -358,3 +359,84 @@ func TestValidateIntakeStatusTarget(t *testing.T) { assert.Error(t, validateIntakeStatusTarget(ResponseStatusReviewCreated)) assert.Error(t, validateIntakeStatusTarget("bogus")) } + +// Tests for #1106: the documented is_confidential query parameter narrows the +// triage list but never widens the reviewer-group scope from #1100. +func TestTriageList_IsConfidentialParamIntersectsScope(t *testing.T) { + f := newTriageFixture(t) + yes, no := true, false + + tests := []struct { + name string + user TestUserIdentity + param *bool + expect []uuid.UUID + }{ + {"sr absent", f.sr, nil, []uuid.UUID{f.normalID}}, + {"sr true", f.sr, &yes, []uuid.UUID{}}, + {"sr false", f.sr, &no, []uuid.UUID{f.normalID}}, + {"cpr absent", f.cpr, nil, []uuid.UUID{f.confID}}, + {"cpr true", f.cpr, &yes, []uuid.UUID{f.confID}}, + {"cpr false", f.cpr, &no, []uuid.UUID{}}, + {"both absent", f.both, nil, []uuid.UUID{f.normalID, f.confID}}, + {"both true", f.both, &yes, []uuid.UUID{f.confID}}, + {"both false", f.both, &no, []uuid.UUID{f.normalID}}, + {"non-reviewer true", f.alice, &yes, []uuid.UUID{}}, + {"non-reviewer false", f.alice, &no, []uuid.UUID{}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c, w := CreateTestGinContext("GET", "/triage/survey_responses") + tt.user.SetContext(c) + f.server.ListTriageSurveyResponses(c, ListTriageSurveyResponsesParams{IsConfidential: tt.param}) + require.Equal(t, http.StatusOK, w.Code, w.Body.String()) + var resp ListSurveyResponsesResponse + require.NoError(t, json.Unmarshal(w.Body.Bytes(), &resp)) + ids := []uuid.UUID{} + for _, it := range resp.SurveyResponses { + ids = append(ids, *it.Id) + } + assert.ElementsMatch(t, tt.expect, ids) + assert.Equal(t, len(tt.expect), resp.Total) + }) + } +} + +func TestIntersectConfidentialScope(t *testing.T) { + yes, no := true, false + eff, empty := intersectConfidentialScope(nil, nil) + assert.Nil(t, eff) + assert.False(t, empty) + eff, empty = intersectConfidentialScope(nil, &yes) + assert.Equal(t, &yes, eff) + assert.False(t, empty) + eff, empty = intersectConfidentialScope(&no, nil) + assert.Equal(t, &no, eff) + assert.False(t, empty) + eff, empty = intersectConfidentialScope(&no, &no) + assert.Equal(t, &no, eff) + assert.False(t, empty) + _, empty = intersectConfidentialScope(&no, &yes) + assert.True(t, empty) + _, empty = intersectConfidentialScope(&yes, &no) + assert.True(t, empty) +} + +// A non-boolean is_confidential is rejected by the generated binder before the +// handler runs. +func TestTriageList_InvalidIsConfidentialIs400(t *testing.T) { + f := newTriageFixture(t) + router := gin.New() + router.Use(func(c *gin.Context) { + f.sr.SetContext(c) + c.Next() + }) + RegisterHandlers(router, f.server) + + for _, v := range []string{"maybe", "2", ""} { + w := httptest.NewRecorder() + req := httptest.NewRequest(http.MethodGet, "/triage/survey_responses?is_confidential="+v, nil) + router.ServeHTTP(w, req) + assert.Equal(t, http.StatusBadRequest, w.Code, "value %q: %s", v, w.Body.String()) + } +} diff --git a/api/team_handlers.go b/api/team_handlers.go index 120e421a..70145432 100644 --- a/api/team_handlers.go +++ b/api/team_handlers.go @@ -282,7 +282,7 @@ func (s *Server) UpdateTeam(c *gin.Context, teamId openapi_types.UUID, _ UpdateT // PatchTeam partially updates a team via JSON Patch. // Requires team membership or admin. // PATCH /teams/{team_id} -// SEM@15f223d3629a108c4549d8bb619851c44a5d4b18: partially update a team via JSON Patch, requiring membership or admin role with optimistic locking (writes DB) +// SEM@a7d2f8aeb90bc354bf081e462f3579fabb8503fe: partially update a team via JSON Patch, requiring membership or admin role with optimistic locking (writes DB) func (s *Server) PatchTeam(c *gin.Context, teamId openapi_types.UUID, _ PatchTeamParams) { logger := slogging.Get() ctx := c.Request.Context() @@ -317,13 +317,9 @@ func (s *Server) PatchTeam(c *gin.Context, teamId openapi_types.UUID, _ PatchTea // Validate prohibited fields prohibitedPaths := []string{"/id", "/created_at", "/modified_at", "/created_by", "/modified_by"} - for _, op := range operations { - for _, p := range prohibitedPaths { - if op.Path == p { - HandleRequestError(c, InvalidInputError("Field '"+strings.TrimPrefix(p, "/")+"' is not allowed in PATCH requests")) - return - } - } + if p, found := FindProhibitedPatchPath(operations, prohibitedPaths); found { + HandleRequestError(c, InvalidInputError("Field '"+strings.TrimPrefix(p, "/")+"' is not allowed in PATCH requests")) + return } // Get existing team diff --git a/api/team_note_handlers.go b/api/team_note_handlers.go index 906e1062..919198a9 100644 --- a/api/team_note_handlers.go +++ b/api/team_note_handlers.go @@ -21,7 +21,7 @@ import ( // // `action` completes "You must be a team member or administrator to // team notes". -// SEM@05417b57fbfa7034ef7d976eb80805a7f8621447: authorize a caller against a team, writing 404/403/500 as appropriate (reads DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: authorize a caller against a team, writing 404/403/500 as appropriate (reads DB) func requireTeamMemberOrAdmin( c *gin.Context, ctx context.Context, teamID, userUUID, action string, ) bool { @@ -127,7 +127,7 @@ func (s *Server) ListTeamNotes(c *gin.Context, teamId openapi_types.UUID, params // CreateTeamNote creates a new note for a team. // POST /teams/{team_id}/notes -// SEM@05417b57fbfa7034ef7d976eb80805a7f8621447: build a team note, enforcing sharable-field privilege rules (mutates shared state) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: build a team note, enforcing sharable-field privilege rules (mutates shared state) func (s *Server) CreateTeamNote(c *gin.Context, teamId openapi_types.UUID) { logger := slogging.Get() ctx := c.Request.Context() @@ -196,7 +196,7 @@ func (s *Server) CreateTeamNote(c *gin.Context, teamId openapi_types.UUID) { // GetTeamNote returns a specific team note. // GET /teams/{team_id}/notes/{team_note_id} -// SEM@05417b57fbfa7034ef7d976eb80805a7f8621447: fetch a team note, hiding non-sharable notes from unprivileged users (reads DB) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: fetch a team note, hiding non-sharable notes from unprivileged users (reads DB) func (s *Server) GetTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNoteId TeamNoteId) { ctx := c.Request.Context() @@ -230,7 +230,7 @@ func (s *Server) GetTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNote // UpdateTeamNote replaces a team note. // PUT /teams/{team_id}/notes/{team_note_id} -// SEM@05417b57fbfa7034ef7d976eb80805a7f8621447: replace a team note, enforcing sharable-field and visibility privilege rules (mutates shared state) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: replace a team note, enforcing sharable-field and visibility privilege rules (mutates shared state) func (s *Server) UpdateTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNoteId TeamNoteId) { logger := slogging.Get() ctx := c.Request.Context() @@ -314,7 +314,7 @@ func (s *Server) UpdateTeamNote(c *gin.Context, teamId openapi_types.UUID, teamN // PatchTeamNote partially updates a team note using JSON Patch. // PATCH /teams/{team_id}/notes/{team_note_id} -// SEM@d276bf5e1126f3d0a1dcda0c73c3a265feffa704: apply JSON Patch to a team note, sanitizing the patched fields and enforcing sharable-field and visibility privilege rules (mutates shared state) +// SEM@d30ebe3b866d5558268f5a280963e91e27c1dedd: apply JSON Patch to a team note, sanitizing the patched fields and enforcing sharable-field and visibility privilege rules (mutates shared state) func (s *Server) PatchTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNoteId TeamNoteId) { logger := slogging.Get() ctx := c.Request.Context() @@ -355,14 +355,12 @@ func (s *Server) PatchTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNo // Non-privileged users cannot patch the sharable field if !privileged { - for _, op := range operations { - if op.Path == "/sharable" { - c.JSON(http.StatusForbidden, Error{ - Error: ErrorError(errcode.Forbidden), - ErrorDescription: "Only administrators and security reviewers can modify the sharable field", - }) - return - } + if _, touches := FindProhibitedPatchPath(operations, []string{"/sharable"}); touches { + c.JSON(http.StatusForbidden, Error{ + Error: ErrorError(errcode.Forbidden), + ErrorDescription: "Only administrators and security reviewers can modify the sharable field", + }) + return } } @@ -380,7 +378,7 @@ func (s *Server) PatchTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNo // DeleteTeamNote deletes a team note. // DELETE /teams/{team_id}/notes/{team_note_id} -// SEM@05417b57fbfa7034ef7d976eb80805a7f8621447: delete a team note, hiding non-sharable notes from unprivileged users (mutates shared state) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: delete a team note, hiding non-sharable notes from unprivileged users (mutates shared state) func (s *Server) DeleteTeamNote(c *gin.Context, teamId openapi_types.UUID, teamNoteId TeamNoteId) { logger := slogging.Get() ctx := c.Request.Context() diff --git a/api/threat_model_diagram_handlers.go b/api/threat_model_diagram_handlers.go index 0b02b584..48e5fe79 100644 --- a/api/threat_model_diagram_handlers.go +++ b/api/threat_model_diagram_handlers.go @@ -389,7 +389,7 @@ func (h *ThreatModelDiagramHandler) UpdateDiagram(c *gin.Context, threatModelId, } // PatchDiagram partially updates a diagram within a threat model -// SEM@1524e7cb61267e6446a36c10c9608588c60f51b5: update a diagram by applying JSON Patch operations with optimistic locking; reject active sessions (reads DB) +// SEM@40d527743ae56474b63b0a5f7d5f397c797e4d33: update a diagram by applying JSON Patch operations with optimistic locking; reject active sessions (reads DB) func (h *ThreatModelDiagramHandler) PatchDiagram(c *gin.Context, threatModelId, diagramId string) { // Similar to UpdateDiagram but with JSON Patch operations // For brevity, this implementation is simplified @@ -456,6 +456,11 @@ func (h *ThreatModelDiagramHandler) PatchDiagram(c *gin.Context, threatModelId, return } + if reqErr := ValidatePatchOperationPaths(operations); reqErr != nil { + HandleRequestError(c, reqErr) + return + } + // Reject writes to read-only paths (e.g. /alias, /id, /created_at) if reqErr := ValidatePatchProhibitedPaths(operations); reqErr != nil { HandleRequestError(c, reqErr) @@ -602,7 +607,7 @@ func (h *ThreatModelDiagramHandler) DeleteDiagram(c *gin.Context, threatModelId, } // GetDiagramCollaborate gets collaboration session status for a diagram within a threat model -// SEM@1524e7cb61267e6446a36c10c9608588c60f51b5: fetch the active collaboration session status for a diagram (reads DB) +// SEM@d67a318629578c88fb0b3e00dbc5e4da3a0f5fd6: fetch the active collaboration session status for a diagram (reads DB) func (h *ThreatModelDiagramHandler) GetDiagramCollaborate(c *gin.Context, threatModelId, diagramId string) { // AuthzMiddleware (#365) has already enforced ownership=reader on this // route. Identity is still pulled from the JWT for the participant-list diff --git a/api/threat_sub_resource_handlers.go b/api/threat_sub_resource_handlers.go index 11bbbc22..9a2d732c 100644 --- a/api/threat_sub_resource_handlers.go +++ b/api/threat_sub_resource_handlers.go @@ -879,7 +879,7 @@ func (h *ThreatSubResourceHandler) BulkUpdateThreats(c *gin.Context) { // BulkPatchThreats applies JSON patch operations to multiple threats // PATCH /threat_models/{threat_model_id}/threats/bulk -// SEM@52df980c1d7491dbcef92922d2b1574b07e802a8: apply JSON patch operations to multiple threats, authorizing each (mutates DB) +// SEM@e92145ccb20292d695dc5d2f767278b6fc18e4f3: update multiple threats by applying JSON Patch operations, authorizing each (mutates DB) func (h *ThreatSubResourceHandler) BulkPatchThreats(c *gin.Context) { logger := slogging.GetContextLogger(c) logger.Debug("BulkPatchThreats - applying patch operations to multiple threats") @@ -924,15 +924,25 @@ func (h *ThreatSubResourceHandler) BulkPatchThreats(c *gin.Context) { logger.Debug("Bulk patching %d threats (user: %s)", len(bulkPatchRequest.Patches), user.Email) - // Apply patches to each threat - updatedThreats := make([]Threat, 0, len(bulkPatchRequest.Patches)) - for _, patch := range bulkPatchRequest.Patches { + // Validate every entry before applying any, so a rejected entry never + // leaves earlier entries committed. + for i := range bulkPatchRequest.Patches { + patch := &bulkPatchRequest.Patches[i] // Validate threat ID (a request-body field, so a failure is invalid_input) if _, err := ParseUUID(patch.ID); err != nil { HandleRequestError(c, InvalidInputError(fmt.Sprintf("Invalid threat ID format: %s", patch.ID))) return } + if reqErr := ValidatePatchOperationPaths(patch.Operations); reqErr != nil { + HandleRequestError(c, reqErr) + return + } + if reqErr := ValidatePatchProhibitedPaths(patch.Operations); reqErr != nil { + HandleRequestError(c, reqErr) + return + } + // Validate patch authorization if err := ValidatePatchAuthorization(patch.Operations, userRole); err != nil { HandleRequestError(c, ForbiddenError("Insufficient permissions for requested patch operations")) @@ -945,7 +955,11 @@ func (h *ThreatSubResourceHandler) BulkPatchThreats(c *gin.Context) { HandleRequestError(c, err) return } + } + // Apply patches to each threat + updatedThreats := make([]Threat, 0, len(bulkPatchRequest.Patches)) + for _, patch := range bulkPatchRequest.Patches { // Apply patch. Classify the error rather than calling everything a // server fault: ApplyPatchOperations returns a *RequestError carrying // 400 for a patch document the client got wrong (malformed JSON diff --git a/api/threat_sub_resource_handlers_test.go b/api/threat_sub_resource_handlers_test.go index 7418fc74..c6768d5d 100644 --- a/api/threat_sub_resource_handlers_test.go +++ b/api/threat_sub_resource_handlers_test.go @@ -650,10 +650,7 @@ func TestPatchThreat(t *testing.T) { }, } - // Expect the store to be called with invalid operations and return an error - // Handler preserves RequestError status codes (400 for InvalidInputError) - mockStore.On("Get", mock.Anything, threatID).Return((*Threat)(nil), nil) - mockStore.On("Patch", mock.Anything, threatModelID, threatID, mock.AnythingOfType("[]api.PatchOperation")).Return(nil, InvalidInputError("Invalid patch operation: path is required")) + // The shared patch parser rejects the missing path with 400 before any store call body, _ := json.Marshal(invalidPatchOps) req := httptest.NewRequest("PATCH", "/threat_models/"+threatModelID+"/threats/"+threatID, bytes.NewBuffer(body)) @@ -663,7 +660,9 @@ func TestPatchThreat(t *testing.T) { r.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) - mockStore.AssertExpectations(t) + assert.Contains(t, w.Body.String(), "invalid_input") + mockStore.AssertNotCalled(t, "Get", mock.Anything, mock.Anything) + mockStore.AssertNotCalled(t, "Patch", mock.Anything, mock.Anything, mock.Anything, mock.Anything) }) } diff --git a/api/ticket_store.go b/api/ticket_store.go index 5395b4f1..761c554a 100644 --- a/api/ticket_store.go +++ b/api/ticket_store.go @@ -14,7 +14,7 @@ import ( // TicketClaims is the identity bound to a WebSocket ticket. TokenHash and // CredentialID identify the token that minted the ticket so the upgrade can be // refused after that token or its client credential is revoked (#869). -// SEM@c161adfd8ba839441ccd825e818d342a09c63849: hold identity and revocation handle bound to a WebSocket upgrade ticket (pure) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: hold identity, group memberships and revocation handle bound to a WebSocket upgrade ticket (pure) type TicketClaims struct { UserID string `json:"user_id"` Provider string `json:"provider"` @@ -22,6 +22,10 @@ type TicketClaims struct { SessionID string `json:"session_id"` TokenHash string `json:"token_hash,omitempty"` CredentialID string `json:"credential_id,omitempty"` + // Groups are the minting token's group claims, frozen at issue time so the + // ticket-authenticated upgrade can make group-aware access checks. Absent + // (nil) on tickets issued before this field existed, which fails closed. + Groups []string `json:"groups,omitempty"` } // TicketStore manages short-lived, single-use WebSocket authentication tickets. diff --git a/api/ticket_store_test.go b/api/ticket_store_test.go index 94cc7caf..c0d8c29b 100644 --- a/api/ticket_store_test.go +++ b/api/ticket_store_test.go @@ -2,6 +2,8 @@ package api import ( "context" + "encoding/json" + "reflect" "testing" "time" ) @@ -13,7 +15,7 @@ func TestInMemoryTicketStore_IssueAndValidate(t *testing.T) { defer store.Close() ctx := context.Background() - in := TicketClaims{UserID: "user123", Provider: "tmi", InternalUUID: "uuid-abc", SessionID: "session456", TokenHash: "h1", CredentialID: "c1"} + in := TicketClaims{UserID: "user123", Provider: "tmi", InternalUUID: "uuid-abc", SessionID: "session456", TokenHash: "h1", CredentialID: "c1", Groups: []string{"g1", "g2"}} ticket, err := store.IssueTicket(ctx, in, 30*time.Second) if err != nil { t.Fatalf("IssueTicket failed: %v", err) @@ -26,7 +28,7 @@ func TestInMemoryTicketStore_IssueAndValidate(t *testing.T) { if err != nil { t.Fatalf("ValidateTicket failed: %v", err) } - if out != in { + if !reflect.DeepEqual(out, in) { t.Errorf("claims round-trip mismatch: got %+v, want %+v", out, in) } } @@ -82,3 +84,28 @@ func TestRedisTicketStore_ImplementsInterface(t *testing.T) { // Compile-time check that RedisTicketStore implements TicketStore var _ TicketStore = (*RedisTicketStore)(nil) } + +// #1107: groups survive the JSON encoding used by the Redis store, and a ticket +// issued before the field existed decodes to no groups (fail closed). +func TestTicketClaims_GroupsJSONRoundTrip(t *testing.T) { + in := TicketClaims{UserID: "u", Provider: "tmi", SessionID: "s", Groups: []string{"g1", "g2"}} + data, err := json.Marshal(in) + if err != nil { + t.Fatalf("marshal: %v", err) + } + var out TicketClaims + if err := json.Unmarshal(data, &out); err != nil { + t.Fatalf("unmarshal: %v", err) + } + if !reflect.DeepEqual(out.Groups, in.Groups) { + t.Errorf("groups = %v, want %v", out.Groups, in.Groups) + } + + var legacy TicketClaims + if err := json.Unmarshal([]byte(`{"user_id":"u","provider":"tmi","session_id":"s"}`), &legacy); err != nil { + t.Fatalf("unmarshal legacy: %v", err) + } + if len(legacy.Groups) != 0 { + t.Errorf("legacy ticket groups = %v, want empty", legacy.Groups) + } +} diff --git a/api/websocket.go b/api/websocket.go index a033172d..7cd5c836 100644 --- a/api/websocket.go +++ b/api/websocket.go @@ -132,7 +132,7 @@ type HistoryEntry struct { } // WebSocketClient represents a connected client -// SEM@a9626140ff4ccb3bf8ae4b474024684bd7063b72: connected WebSocket participant holding user identity, connection, and outbound message channel +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: connected WebSocket participant holding user identity, group memberships, connection, and outbound message channel type WebSocketClient struct { // Hub reference Hub *WebSocketHub @@ -150,6 +150,10 @@ type WebSocketClient struct { UserProvider string // Internal UUID from users table (system-assigned) InternalUUID string + // Groups are the user's group claims, captured at connect time. They are + // frozen for the socket's lifetime, like JWT claims on REST requests; the + // heartbeat re-check (checkReadPermission) still observes ACL changes. + Groups []string // Buffered channel of outbound messages Send chan []byte // Last activity timestamp @@ -687,7 +691,7 @@ func (h *OperationHistory) cleanupOldEntries() { } // GetActiveSessions returns all active collaboration sessions -// SEM@ab27b1c7ef336f1860c29d6f19f34f84adfc5b02: list all active collaboration sessions with participants and metadata (reads DB) +// SEM@9cae882d37d446fa1e16af883a2f1ef7d166fbb9: list active collaboration sessions the caller may access, with participants and metadata (reads DB) func (h *WebSocketHub) GetActiveSessions() []CollaborationSession { h.mu.RLock() defer h.mu.RUnlock() @@ -714,7 +718,7 @@ func (h *WebSocketHub) GetActiveSessions() []CollaborationSession { } for client := range session.Clients { - participant := convertClientToParticipant(nil, client, session, tm) + participant := convertClientToParticipant(client, session, tm) if participant != nil { participants = append(participants, *participant) } @@ -757,8 +761,8 @@ func (h *WebSocketHub) GetActiveSessions() []CollaborationSession { } // convertClientToParticipant converts a WebSocket client to a Participant -// SEM@1ee903740fbfd71dacb8286ffc539a07887a60ad: convert a WebSocket client to a Participant, matching identity by provider ID or internal UUID (reads DB) -func convertClientToParticipant(c *gin.Context, client *WebSocketClient, _ *DiagramSession, tm *ThreatModel) *Participant { +// SEM@9cae882d37d446fa1e16af883a2f1ef7d166fbb9: convert a WebSocket client to a Participant with its resolved session permission (reads DB) +func convertClientToParticipant(client *WebSocketClient, _ *DiagramSession, tm *ThreatModel) *Participant { // Get user's session permissions using existing auth system var permissions ParticipantPermissions if tm != nil { @@ -769,7 +773,7 @@ func convertClientToParticipant(c *gin.Context, client *WebSocketClient, _ *Diag ProviderID: client.UserID, Email: client.UserEmail, } - permsPtr := getSessionPermissionsForUser(c, permUser, tm) + permsPtr := getSessionPermissionsForUser(permUser, client.Groups, tm) if permsPtr == nil { // User is unauthorized return nil @@ -794,33 +798,19 @@ func convertClientToParticipant(c *gin.Context, client *WebSocketClient, _ *Diag } // getSessionPermissionsForUser determines session permissions using the existing auth system. -// SEM@17f6e77aac81a016d5aee8d2d0d0f06e671a4a2e: resolve a user's session permissions against a threat model's ACL (reads DB) -func getSessionPermissionsForUser(c *gin.Context, user ResolvedUser, tm *ThreatModel) *ParticipantPermissions { - // Use the existing AccessCheck system to determine permissions +// The caller supplies the user's own groups (a connected client's frozen groups, or the +// requester's request-context groups) so group-based grants are honored. +// SEM@9cae882d37d446fa1e16af883a2f1ef7d166fbb9: resolve a user's session permissions against a threat model's ACL, honoring group grants (pure) +func getSessionPermissionsForUser(user ResolvedUser, groups []string, tm *ThreatModel) *ParticipantPermissions { // Check for writer/resource owner access first (highest permission) - var hasWriterAccess bool - var err error - if c != nil { - // Use context-aware check that includes provider ID, groups, etc. - hasWriterAccess, err = CheckResourceAccessFromContext(c, user, tm, RoleWriter) - } else { - // Fallback to basic check when context not available - hasWriterAccess, err = CheckResourceAccess(user.Email, tm, RoleWriter) - } + hasWriterAccess, err := CheckResourceAccessWithGroups(user, groups, tm, RoleWriter) if err == nil && hasWriterAccess { permissions := ParticipantPermissionsWriter return &permissions } // Check for reader access (lowest permission that grants session access) - var hasReaderAccess bool - if c != nil { - // Use context-aware check that includes provider ID, groups, etc. - hasReaderAccess, err = CheckResourceAccessFromContext(c, user, tm, RoleReader) - } else { - // Fallback to basic check when context not available - hasReaderAccess, err = CheckResourceAccess(user.Email, tm, RoleReader) - } + hasReaderAccess, err := CheckResourceAccessWithGroups(user, groups, tm, RoleReader) if err == nil && hasReaderAccess { permissions := ParticipantPermissionsReader return &permissions @@ -838,7 +828,7 @@ var participantEmailPattern = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9. // Group authorization entries have no user representation and are skipped. Permissions for // users who are not connected come from the static authorization role map (owner/writer -> // writer, reader -> reader), so roles elevated through group membership are not reflected. -// SEM@1ee903740fbfd71dacb8286ffc539a07887a60ad: build session participants from authorized users and connected clients (reads DB) +// SEM@9cae882d37d446fa1e16af883a2f1ef7d166fbb9: build session participants from ACL-authorized users, groups and connected clients (reads DB) func buildSessionParticipants(c *gin.Context, session *DiagramSession, tm *ThreatModel, requester ResolvedUser) []Participant { logger := slogging.Get() participants := make([]Participant, 0, len(session.Clients)+1) @@ -854,7 +844,7 @@ func buildSessionParticipants(c *gin.Context, session *DiagramSession, tm *Threa // Connected clients first, so their live display name and activity time win. for client := range session.Clients { - participant := convertClientToParticipant(c, client, session, tm) + participant := convertClientToParticipant(client, session, tm) if participant == nil { logger.Debug("Session %s: connected client user_id=%s has no access to threat model %s, omitting from participants", session.ID, client.UserID, session.ThreatModelID) @@ -918,7 +908,11 @@ func buildSessionParticipants(c *gin.Context, session *DiagramSession, tm *Threa // The requester was authorized by the handler, possibly via a group entry or the // "everyone" pseudo-group; list them with their effective permission. if !requester.IsEmpty() && !alreadyListed(requester) { - if perm := getSessionPermissionsForUser(c, requester, tm); perm != nil { + var requesterGroups []string + if c != nil { + _, _, _, requesterGroups = GetUserAuthFieldsForAccessCheck(c) + } + if perm := getSessionPermissionsForUser(requester, requesterGroups, tm); perm != nil { add(requester, *perm) } else { logger.Warn("Session %s: requester user_id=%s has no resolvable permission on threat model %s, omitting from participants", @@ -1122,7 +1116,7 @@ func (h *WebSocketHub) getThreatModelIdForDiagram(diagramID string) openapi_type // validateWebSocketDiagramAccessWithFlexibleMatching validates that a user has at least reader access to a diagram // using flexible user identifier matching (email, provider_user_id, or internal_uuid) // This is critical for WebSocket security to prevent unauthorized access to collaboration sessions -// SEM@1524e7cb61267e6446a36c10c9608588c60f51b5: authorize WebSocket access to a diagram using flexible identity matching; deny without reader role (reads DB) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: authorize WebSocket access to a diagram by user or group identity matching; deny without reader role (reads DB) func (h *WebSocketHub) validateWebSocketDiagramAccessWithFlexibleMatching(userInfo *UserInfo, threatModelID string, diagramID string) bool { // Safety check: if ThreatModelStore is not initialized (e.g., in tests), deny access if ThreatModelStore == nil { @@ -1167,10 +1161,10 @@ func (h *WebSocketHub) validateWebSocketDiagramAccessWithFlexibleMatching(userIn Email: userInfo.UserEmail, } hasAccess, err := CheckResourceAccessWithGroups( - wsUser, // user - nil, // groups (not available in WebSocket context) - tm, // resource - RoleReader, // requiredRole + wsUser, // user + userInfo.Groups, // groups + tm, // resource + RoleReader, // requiredRole ) if err != nil { // If there's an error checking access, deny access @@ -1548,7 +1542,7 @@ func (s *DiagramSession) Run() { } // validateWebSocketRequest validates the basic request parameters and returns user info -// SEM@7fa07f774e8f6d45ba5fd95cc267d32f11f2e2a4: validate WebSocket path parameters and extract the authenticated user ID from context (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: validate WebSocket path parameters and extract the authenticated user identity and groups from context (pure) func (h *WebSocketHub) validateWebSocketRequest(c *gin.Context) (threatModelID, diagramID, userIDStr string, err error) { // Get threat model ID and diagram ID from path threatModelID = c.Param("threat_model_id") @@ -1602,7 +1596,7 @@ func (h *WebSocketHub) validateWebSocketRequest(c *gin.Context) (threatModelID, } // HandleWS handles WebSocket connections -// SEM@a7d1b052bb879606eca59fea8d7f7bac57531eeb: handle a WebSocket connection request: authorize, upgrade, and register the client (mutates shared state) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: handle a WebSocket connection request: authorize, upgrade, and register the client (mutates shared state) func (h *WebSocketHub) HandleWS(c *gin.Context) { // Validate request and get parameters threatModelID, diagramID, _, err := h.validateWebSocketRequest(c) @@ -1704,6 +1698,7 @@ func (h *WebSocketHub) HandleWS(c *gin.Context) { UserEmail: userInfo.UserEmail, UserProvider: userInfo.UserProvider, InternalUUID: userInfo.InternalUUID, + Groups: userInfo.Groups, Send: make(chan []byte, 256), LastActivity: time.Now().UTC(), JWTExpiry: userInfo.TokenExpiry, @@ -2312,7 +2307,7 @@ func (s *DiagramSession) processRedoRequest(client *WebSocketClient, message []b // Helper methods // handlePresenterDisconnection handles when the current presenter leaves the session -// SEM@ab27b1c7ef336f1860c29d6f19f34f84adfc5b02: reassign the presenter role when the current presenter disconnects (mutates shared state) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: reassign the presenter role when the current presenter disconnects (mutates shared state) func (s *DiagramSession) handlePresenterDisconnection(disconnectedUserID string) { s.mu.Lock() defer s.mu.Unlock() @@ -2347,10 +2342,10 @@ func (s *DiagramSession) handlePresenterDisconnection(disconnectedUserID string) for client := range s.Clients { clientUser := ResolvedUserFromWebSocketClient(client) hasWriteAccess, err := CheckResourceAccessWithGroups( - clientUser, // user - nil, // groups (not available in client) - tm, // resource - RoleWriter, // requiredRole + clientUser, // user + client.Groups, // groups + tm, // resource + RoleWriter, // requiredRole ) if err == nil && hasWriteAccess { newPresenter = &clientUser @@ -2621,7 +2616,7 @@ func (s *DiagramSession) broadcastParticipantsUpdate() { // checkMutationPermission checks if user can perform mutations // Uses flexible user identifier matching (email, provider_user_id, or internal_uuid) -// SEM@17f6e77aac81a016d5aee8d2d0d0f06e671a4a2e: validate that the client holds writer access to the session's threat model (reads DB) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: validate that the client holds writer access, directly or via group, to the session's threat model (reads DB) func (s *DiagramSession) checkMutationPermission(client *WebSocketClient) bool { // Anonymous users cannot perform mutations if client == nil || client.UserID == "" { @@ -2647,10 +2642,10 @@ func (s *DiagramSession) checkMutationPermission(client *WebSocketClient) bool { Email: client.UserEmail, } hasWriteAccess, err := CheckResourceAccessWithGroups( - clientUser, // user - nil, // groups (not available in client) - tm, // resource - RoleWriter, // requiredRole + clientUser, // user + client.Groups, // groups + tm, // resource + RoleWriter, // requiredRole ) if err != nil { // If there's an error checking access, deny for safety @@ -2666,7 +2661,7 @@ func (s *DiagramSession) checkMutationPermission(client *WebSocketClient) bool { // called from the WritePump heartbeat so that a user whose role is revoked // mid-session stops receiving broadcast diagram content instead of keeping // read access until disconnect or JWT expiry. -// SEM@d056a3ea026249d40d05ab6af7f092a043f72c7a: validate that the client still holds reader access to the session's threat model (reads DB) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: validate that the client still holds reader access, directly or via group, to the session's threat model (reads DB) func (s *DiagramSession) checkReadPermission(client *WebSocketClient) bool { // Anonymous users cannot hold read access if client == nil || client.UserID == "" { @@ -2695,10 +2690,10 @@ func (s *DiagramSession) checkReadPermission(client *WebSocketClient) bool { // Full resolved identity (includes InternalUUID) for SamePrincipal matching clientUser := ResolvedUserFromWebSocketClient(client) hasReadAccess, err := CheckResourceAccessWithGroups( - clientUser, // user - nil, // groups (not available in WebSocket context; same as the connect-time check) - tm, // resource - RoleReader, // requiredRole + clientUser, // user + client.Groups, // groups + tm, // resource + RoleReader, // requiredRole ) if err != nil { // If there's an error checking access, deny for safety diff --git a/api/websocket_group_access_test.go b/api/websocket_group_access_test.go new file mode 100644 index 00000000..1a991839 --- /dev/null +++ b/api/websocket_group_access_test.go @@ -0,0 +1,162 @@ +package api + +import ( + "context" + "testing" + "time" + + "github.com/google/uuid" + openapi_types "github.com/oapi-codegen/runtime/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// createGroupACLThreatModel stores a threat model whose only non-owner grants +// are group grants (no direct user grant for the test users), and returns it. +func createGroupACLThreatModel(t *testing.T, diagramID string) ThreatModel { + t.Helper() + InitTestFixtures() + + ownerEmail := "owner@example.com" + diagUUID := uuid.MustParse(diagramID) + diagrams := []DfdDiagram{{Id: &diagUUID, Name: "d"}} + + now := time.Now().UTC() + tm := ThreatModel{ + Name: "Group ACL TM", + Owner: User{ + PrincipalType: UserPrincipalTypeUser, + Provider: "test-idp", + ProviderId: ownerEmail, + Email: openapi_types.Email(ownerEmail), + }, + Authorization: &[]Authorization{ + {PrincipalType: AuthorizationPrincipalTypeUser, Provider: "test-idp", ProviderId: ownerEmail, Role: "owner"}, + {PrincipalType: AuthorizationPrincipalTypeGroup, Provider: "test-idp", ProviderId: "writers-group", Role: "writer"}, + {PrincipalType: AuthorizationPrincipalTypeGroup, Provider: "test-idp", ProviderId: "readers-group", Role: "reader"}, + }, + Diagrams: &diagrams, + CreatedAt: &now, + ModifiedAt: &now, + } + created, err := ThreatModelStore.Create(context.Background(), tm, func(tm ThreatModel, id string) ThreatModel { + uid, _ := ParseUUID(id) + tm.Id = &uid + return tm + }) + require.NoError(t, err) + return created +} + +// #1107: WebSocket authorization must honor group-based grants like REST does. +func TestWebSocketGroupBasedAccess(t *testing.T) { + diagramID := uuid.New().String() + tm := createGroupACLThreatModel(t, diagramID) + tmID := tm.Id.String() + + session, _ := createTestSession(t, tmID) + + newClient := func(id string, groups []string) *WebSocketClient { + c := addClientToSession(t, session, id, id, id, "test-idp") + c.Groups = groups + return c + } + + writer := newClient("gw@example.com", []string{"writers-group"}) + reader := newClient("gr@example.com", []string{"readers-group"}) + nogroup := newClient("ng@example.com", nil) + other := newClient("og@example.com", []string{"unrelated-group"}) + + t.Run("mutation", func(t *testing.T) { + assert.True(t, session.checkMutationPermission(writer), "group-only writer can mutate") + assert.False(t, session.checkMutationPermission(reader), "group-only reader cannot mutate") + assert.False(t, session.checkMutationPermission(nogroup), "user without groups is denied") + assert.False(t, session.checkMutationPermission(other), "user in an unrelated group is denied") + }) + + t.Run("heartbeat_read", func(t *testing.T) { + assert.True(t, session.checkReadPermission(writer), "group-only writer retains read") + assert.True(t, session.checkReadPermission(reader), "group-only reader retains read") + assert.False(t, session.checkReadPermission(nogroup), "user without groups is denied") + assert.False(t, session.checkReadPermission(other), "user in an unrelated group is denied") + }) + + t.Run("connect_time", func(t *testing.T) { + hub := NewWebSocketHubForTests() + info := func(id string, groups []string) *UserInfo { + return &UserInfo{UserID: id, UserEmail: id, UserProvider: "test-idp", Groups: groups} + } + assert.True(t, hub.validateWebSocketDiagramAccessWithFlexibleMatching(info("gr@example.com", []string{"readers-group"}), tmID, diagramID)) + assert.True(t, hub.validateWebSocketDiagramAccessWithFlexibleMatching(info("gw@example.com", []string{"writers-group"}), tmID, diagramID)) + assert.False(t, hub.validateWebSocketDiagramAccessWithFlexibleMatching(info("ng@example.com", nil), tmID, diagramID)) + assert.False(t, hub.validateWebSocketDiagramAccessWithFlexibleMatching(info("og@example.com", []string{"unrelated-group"}), tmID, diagramID)) + }) + + t.Run("presenter_reassignment", func(t *testing.T) { + // Host has left; the only remaining clients are a group-only reader and + // a group-only writer, so the writer must become presenter. + s, host := createTestSession(t, tmID) + s.mu.Lock() + delete(s.Clients, host) + s.mu.Unlock() + r := addClientToSession(t, s, "gr2@example.com", "gr2@example.com", "r", "test-idp") + r.Groups = []string{"readers-group"} + w := addClientToSession(t, s, "gw2@example.com", "gw2@example.com", "w", "test-idp") + w.Groups = []string{"writers-group"} + + s.handlePresenterDisconnection("someone-else") + + require.NotNil(t, s.CurrentPresenter) + assert.Equal(t, "gw2@example.com", s.CurrentPresenter.ProviderID) + }) +} + +// #1107: UserInfo extraction carries the userGroups context value. +func TestExtractUserInfo_Groups(t *testing.T) { + ex := &UserInfoExtractor{} + + c, _ := CreateTestGinContext("GET", "/ws/diagrams/x") + SetFullUserContext(c, "u@example.com", "u-id", "", "test-idp", []string{"g1"}) + info, err := ex.ExtractUserInfo(c) + require.NoError(t, err) + assert.Equal(t, []string{"g1"}, info.Groups) + + c2, _ := CreateTestGinContext("GET", "/ws/diagrams/x") + SetFullUserContext(c2, "u@example.com", "u-id", "", "test-idp", nil) + info, err = ex.ExtractUserInfo(c2) + require.NoError(t, err) + assert.Empty(t, info.Groups) +} + +// #1107: a participant's permission is resolved with that participant's own +// groups, not the (possibly group-less) requester's. +func TestBuildSessionParticipants_UsesParticipantGroups(t *testing.T) { + tm := createGroupACLThreatModel(t, uuid.New().String()) + session, _ := createTestSession(t, tm.Id.String()) + w := addClientToSession(t, session, "gw@example.com", "gw@example.com", "GW", "test-idp") + w.Groups = []string{"writers-group"} + + // Requester has no groups in context (nil gin context). + got := buildSessionParticipants(nil, session, &tm, ResolvedUser{}) + perms := map[string]ParticipantPermissions{} + for _, p := range got { + perms[string(p.User.Email)] = p.Permissions + } + assert.Equal(t, ParticipantPermissionsWriter, perms["gw@example.com"]) + + // GetActiveSessions (no request context) resolves the same way. + hub := NewWebSocketHubForTests() + hub.mu.Lock() + hub.Diagrams[session.DiagramID] = session + hub.mu.Unlock() + found := false + for _, cs := range hub.GetActiveSessions() { + for _, p := range cs.Participants { + if string(p.User.Email) == "gw@example.com" { + found = true + assert.Equal(t, ParticipantPermissionsWriter, p.Permissions) + } + } + } + assert.True(t, found, "group-only writer must be listed by GetActiveSessions") +} diff --git a/api/websocket_validation.go b/api/websocket_validation.go index 4f88a1c9..db40f8f0 100644 --- a/api/websocket_validation.go +++ b/api/websocket_validation.go @@ -14,7 +14,7 @@ import ( type UserInfoExtractor struct{} // UserInfo represents extracted user information -// SEM@a9626140ff4ccb3bf8ae4b474024684bd7063b72: value object holding authenticated user identity and JWT expiry for a WebSocket session +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: value object holding authenticated user identity, group memberships and JWT expiry for a WebSocket session type UserInfo struct { UserID string UserName string @@ -26,10 +26,13 @@ type UserInfo struct { // context value populated by the JWT middleware. Zero when the // caller is not JWT-authenticated (e.g., test fixtures). TokenExpiry time.Time + // Groups are the caller's group claims from the "userGroups" gin context + // value (JWT claim, or the minting token's claims for a ticket upgrade). + Groups []string } // ExtractUserInfo extracts user information from the gin context -// SEM@a9626140ff4ccb3bf8ae4b474024684bd7063b72: extract and validate user identity fields from the Gin context, returning an error if the user ID is absent (pure) +// SEM@9cae882d37d446fa1e16af883a2f1ef7d166fbb9: extract user identity and group fields from the Gin context, returning an error if the user ID is absent (pure) func (u *UserInfoExtractor) ExtractUserInfo(c *gin.Context) (*UserInfo, error) { // Get user ID from context (required) userIDStr := "" @@ -92,6 +95,12 @@ func (u *UserInfoExtractor) ExtractUserInfo(c *gin.Context) (*UserInfo, error) { } } + // Get group claims from context (optional; empty fails closed for group grants). + var groups []string + if g, exists := c.Get("userGroups"); exists { + groups, _ = g.([]string) + } + return &UserInfo{ UserID: userIDStr, UserName: userNameStr, @@ -99,6 +108,7 @@ func (u *UserInfoExtractor) ExtractUserInfo(c *gin.Context) (*UserInfo, error) { UserProvider: userProviderStr, InternalUUID: internalUUIDStr, TokenExpiry: tokenExpiry, + Groups: groups, }, nil } diff --git a/api/ws_ticket_handler.go b/api/ws_ticket_handler.go index 89487554..10f6389f 100644 --- a/api/ws_ticket_handler.go +++ b/api/ws_ticket_handler.go @@ -12,7 +12,7 @@ import ( const wsTicketTTL = 30 * time.Second // GetWsTicket issues a short-lived WebSocket authentication ticket. -// SEM@c161adfd8ba839441ccd825e818d342a09c63849: issue a short-lived WebSocket ticket bound to the caller's session token +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: issue a short-lived WebSocket ticket carrying the caller's identity and groups, bound to their session token func (s *Server) GetWsTicket(c *gin.Context, params GetWsTicketParams) { logger := slogging.GetContextLogger(c) @@ -62,6 +62,8 @@ func (s *Server) GetWsTicket(c *gin.Context, params GetWsTicketParams) { // Bind the ticket to the issuing token so the upgrade is refused once that // token or its client credential is revoked (#869). + // Groups are frozen into the ticket, as JWT claims are for REST requests. + _, _, _, groups := GetUserAuthFieldsForAccessCheck(c) claims := TicketClaims{ UserID: user.ProviderID, Provider: c.GetString("userProvider"), @@ -69,6 +71,7 @@ func (s *Server) GetWsTicket(c *gin.Context, params GetWsTicketParams) { SessionID: sessionID, TokenHash: c.GetString("authTokenHash"), CredentialID: c.GetString("serviceAccountCredentialID"), + Groups: groups, } ticket, err := s.ticketStore.IssueTicket(c.Request.Context(), claims, wsTicketTTL) if err != nil { diff --git a/api/ws_ticket_handler_test.go b/api/ws_ticket_handler_test.go index 69104159..a081c045 100644 --- a/api/ws_ticket_handler_test.go +++ b/api/ws_ticket_handler_test.go @@ -186,3 +186,24 @@ func TestGetWsTicket_UnauthorizedUser(t *testing.T) { // User without access should get 404 (not 403, to avoid revealing resource existence) assert.Equal(t, http.StatusNotFound, w.Code, "Should return 404 for user without access") } + +// #1107: the minted ticket carries the caller's group claims so the WebSocket +// upgrade can make group-aware access checks. +func TestGetWsTicket_RecordsGroups(t *testing.T) { + gin.SetMode(gin.TestMode) + + server, sessionID, _ := setupWsTicketTestServer(t, TestFixtures.OwnerUser) + + c, w := CreateTestGinContext("GET", "/ws/ticket?session_id="+sessionID) + SetFullUserContext(c, TestFixtures.OwnerUser, TestFixtures.OwnerUser, uuid.New().String(), "test", []string{"dev-team", "ops"}) + + server.GetWsTicket(c, GetWsTicketParams{SessionId: uuid.MustParse(sessionID)}) + require.Equal(t, http.StatusOK, w.Code) + + var resp WsTicketResponse + require.NoError(t, json.Unmarshal(w.Body.Bytes(), &resp)) + + claims, err := server.ticketStore.ValidateTicket(c.Request.Context(), resp.Ticket) + require.NoError(t, err) + assert.Equal(t, []string{"dev-team", "ops"}, claims.Groups) +} diff --git a/cmd/dbtool/config.go b/cmd/dbtool/config.go index 00876115..0fb8be18 100644 --- a/cmd/dbtool/config.go +++ b/cmd/dbtool/config.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/ericfitz/tmi/api" "github.com/ericfitz/tmi/api/models" "github.com/ericfitz/tmi/internal/config" "github.com/ericfitz/tmi/internal/crypto" @@ -31,7 +32,7 @@ import ( // preserves comments, key ordering, and value types verbatim — none of // which the *-migrated.yml writer below does. // -// SEM@05517d8cb7bfbe65374f23c29bbc9bd51efe97e2: seed database settings from a config source file, with overwrite and dry-run options +// SEM@a52965b8a5c28f217fc1f0f36b23ed5134d78b67: seed database settings from a config file, validating values, with overwrite and dry-run options func runConfigSeed(db *testdb.TestDB, inputFile, outputFile string, overwrite, dryRun, emitLegacyMigratedYAML bool) error { log := slogging.Get() @@ -65,6 +66,14 @@ func runConfigSeed(db *testdb.TestDB, inputFile, outputFile string, overwrite, d log.Info(" Bootstrap (stay in file): %d settings", len(bootstrapSettings)) log.Info(" Operational (move to database): %d settings", len(operationalSettings)) + // Validate every value first (#1108): dbtool bypasses SettingsService.Set, + // so apply its semantic validators here and write nothing if any fails. + // Runs before the dry-run exit so --dry-run reports the same failures. + productionMode := settingsProductionMode(cfg.Auth.BuildMode) + if err := validateSettingValues(operationalSettings, productionMode); err != nil { + return err + } + if dryRun { log.Info("") log.Info("[DRY RUN] Bootstrap settings (would stay in config file):") @@ -207,6 +216,38 @@ func runConfigSeed(db *testdb.TestDB, inputFile, outputFile string, overwrite, d return nil } +// settingsProductionMode reports whether dbtool is writing for a production +// build: the source file's auth.build_mode, else TMI_BUILD_MODE (the same +// fallback SettingsService.isProductionMode uses). +// SEM@05d35fa239ce471ca0d0d0c324c69e93e1c8c21c: report whether settings are written for a production build (pure) +func settingsProductionMode(sourceBuildMode string) bool { + if sourceBuildMode != "" { + return sourceBuildMode == "production" + } + return os.Getenv("TMI_BUILD_MODE") == "production" +} + +// validateSettingValues applies api.ValidateSettingSemantics to every +// non-empty setting (empty values are skipped on write) and returns one error +// listing each rejected key. Validator messages may echo the rejected value; +// no validated key is secret (see settingSemanticValidators in api). +// SEM@c116c8d3a54fc80f8636bc97da64a579f17a94ca: validate settings against server semantic rules, naming every rejected key (pure) +func validateSettingValues(settings []config.MigratableSetting, productionMode bool) error { + var problems []string + for _, s := range settings { + if s.Value == "" { + continue + } + if err := api.ValidateSettingSemantics(s.Key, s.Value, productionMode); err != nil { + problems = append(problems, err.Error()) + } + } + if len(problems) == 0 { + return nil + } + return fmt.Errorf("refusing to write invalid settings (validation failed before any write; fix the source and re-run): %s", strings.Join(problems, "; ")) +} + // rejectEncryptedSource fails when the settings source holds any ENC:-prefixed // value. Such a file is a stale snapshot taken before --export-config decrypted // every encrypted setting (#1033): its ciphertext cannot unmarshal into typed diff --git a/cmd/dbtool/data.go b/cmd/dbtool/data.go index d951b51c..2e75144f 100644 --- a/cmd/dbtool/data.go +++ b/cmd/dbtool/data.go @@ -7,12 +7,37 @@ import ( "path/filepath" "strings" + "github.com/ericfitz/tmi/api" "github.com/ericfitz/tmi/api/seed" "github.com/ericfitz/tmi/internal/slogging" "github.com/ericfitz/tmi/test/testdb" ) -// SEM@541d27268f750bac24e7c22a2fc48f78b990d9a7: load a seed file and apply entries via DB or API, acting as per-entry users (reads DB) +// validateSeedSettings applies the server's semantic setting validators to +// every setting entry in the seed list, naming each rejected key. +// SEM@c116c8d3a54fc80f8636bc97da64a579f17a94ca: validate seed setting entries against server semantic rules before seeding (pure) +func validateSeedSettings(entries []SeedEntry) error { + var problems []string + for _, entry := range entries { + if entry.Kind != kindSetting { + continue + } + key, _ := entry.Data["key"].(string) + value, _ := entry.Data["value"].(string) + if key == "" || value == "" { + continue + } + if err := api.ValidateSettingSemantics(key, value, settingsProductionMode("")); err != nil { + problems = append(problems, err.Error()) + } + } + if len(problems) == 0 { + return nil + } + return fmt.Errorf("refusing to seed invalid settings (validation failed before any write; fix the seed file and re-run): %s", strings.Join(problems, "; ")) +} + +// SEM@05d35fa239ce471ca0d0d0c324c69e93e1c8c21c: load a seed file, validate settings, and apply entries via DB or API as per-entry users (reads DB) func runDataSeed(db *testdb.TestDB, inputFile, serverURL, user, provider string, dryRun bool) error { log := slogging.Get() @@ -25,6 +50,12 @@ func runDataSeed(db *testdb.TestDB, inputFile, serverURL, user, provider string, log.Info(" Format version: %s", seedFile.FormatVersion) log.Info(" Seeds: %d entries", len(seedFile.Seeds)) + // Reject invalid setting entries before any write so a bad entry cannot + // leave the earlier entries applied (#1108). + if err := validateSeedSettings(seedFile.Seeds); err != nil { + return err + } + if err := seed.SeedDatabase(db.DB()); err != nil { return fmt.Errorf("failed to seed system data: %w", err) } diff --git a/cmd/dbtool/data_db.go b/cmd/dbtool/data_db.go index 27266e24..44ad91c9 100644 --- a/cmd/dbtool/data_db.go +++ b/cmd/dbtool/data_db.go @@ -179,7 +179,7 @@ func setQuotas(db *testdb.TestDB, userInternalUUID string, quota map[string]any) return nil } -// SEM@05517d8cb7bfbe65374f23c29bbc9bd51efe97e2: store a system setting with explicit origin, skipping empty values (writes DB) +// SEM@05d35fa239ce471ca0d0d0c324c69e93e1c8c21c: store a system setting with explicit origin after semantic validation, skipping empty values (writes DB) func seedSetting(db *testdb.TestDB, entry SeedEntry) (*SeedResult, error) { log := slogging.Get() @@ -203,6 +203,12 @@ func seedSetting(db *testdb.TestDB, entry SeedEntry) (*SeedResult, error) { return nil, nil } + // seedSetting bypasses SettingsService.Set, so apply its semantic + // validators before any write (#1108). + if err := api.ValidateSettingSemantics(key, value, settingsProductionMode("")); err != nil { + return nil, fmt.Errorf("invalid setting %s: %w", key, err) + } + description, _ := entry.Data["description"].(string) // origin is stamped explicit: a hand-authored seed entry is an operator diff --git a/cmd/dbtool/reference.go b/cmd/dbtool/reference.go index a2a41511..6ddc665e 100644 --- a/cmd/dbtool/reference.go +++ b/cmd/dbtool/reference.go @@ -103,18 +103,21 @@ func writeJSONReference(path string, refs RefMap, serverURL, user, provider stri return os.WriteFile(path, data, 0o600) } -// SEM@c621b4252e4c12e9977f08f9d2233e5751fccb02: serialize seeded resource IDs to a CATS-compatible YAML parameter reference file (writes file) +// SEM@3f6bbfeb4674fdaa5885dfc24c251bc03bfecef0: serialize seeded resource IDs to a CATS-compatible YAML parameter reference file (writes file) func writeYAMLReference(path string, refs RefMap, user, provider string) error { if err := os.MkdirAll(filepath.Dir(path), 0o750); err != nil { return fmt.Errorf("failed to create output directory: %w", err) } tmID := findRefByName(refs, tmRef(realThreatModelName), "threat_model") - threatID := findRefByKind(refs, "threat") - diagramID := findRefByKind(refs, "diagram") - documentID := findRefByKind(refs, "document") - assetID := findRefByKind(refs, "asset") - noteID := findRefByKind(refs, "note") + // Threat-model children are looked up by name, not kind: each has a + // throwaway sibling (#1115) so a kind lookup could return the decoy, which + // the anchor DELETE consumes, leaving every nested path on a dead fixture. + threatID := findRefByName(refs, childRef("threat", realThreatModelName, realThreatName), "threat") + diagramID := findRefByName(refs, childRef("diagram", realThreatModelName, realDiagramName), "diagram") + documentID := findRefByName(refs, childRef("document", realThreatModelName, realDocumentName), "document") + assetID := findRefByName(refs, childRef("asset", realThreatModelName, realAssetName), "asset") + noteID := findRefByName(refs, childRef("note", realThreatModelName, realNoteName), "note") // Index 0 explicitly, for the same reason as survey-response:0 below: team // notes are seeded positionally and findRefByKind ranges over a map, so once // the #608 decoy note exists this could return either one — and the decoy is @@ -129,7 +132,7 @@ func writeYAMLReference(path string, refs RefMap, user, provider string) error { if triageNoteID == nilUUID { triageNoteID = "0" } - repoID := findRefByKind(refs, "repository") + repoID := findRefByName(refs, childRef("repo", realThreatModelName, realRepositoryName), "repository") // By name, not by kind: the #608 decoy webhook makes a map-ranging lookup // nondeterministic, and returning the decoy here would leave the real // subscription unfuzzed while the decoy absorbed both roles. @@ -137,7 +140,7 @@ func writeYAMLReference(path string, refs RefMap, user, provider string) error { deliveryID := findRefByKind(refs, "webhook_test_delivery") addonID := findRefByKind(refs, "addon") credID := findRefByKind(refs, "client_credential") - surveyID := findRefByKind(refs, "survey") + surveyID := findRefByName(refs, surveyRef(realSurveyName), "survey") // Index 0 explicitly: survey responses are seeded positionally and // findRefByKind ranges over a map, so with the #608 decoy present it // could return either one — and the decoy is the one DELETE consumes. @@ -201,6 +204,27 @@ func writeYAMLReference(path string, refs RefMap, user, provider string) error { // run 20260728T062255Z deleted a user at test 13815 and fuzzed // .../client_credentials immediately after. {"/admin/users/{user_id}", "user_id", findRefByName(refs, userRef("cats-decoy"), "")}, + // Children of the real threat model (#1115). Run 20261018T072650Z deleted + // the seeded diagram at test 202 (DELETE sorts before every nested + // diagram path) and fuzzed ~16,000 requests against a dead fixture. Each + // of these has a DELETE on its own path plus nested metadata/restore/ + // audit_trail paths, so each needs a throwaway of its own. The decoys + // hang off the REAL threat model, because only the exact + // /threat_models/{threat_model_id} anchor is overridden. + {"/threat_models/{threat_model_id}/diagrams/{diagram_id}", "diagram_id", + findRefByName(refs, childRef("diagram", realThreatModelName, throwawayDiagramName), "")}, + {"/threat_models/{threat_model_id}/threats/{threat_id}", "threat_id", + findRefByName(refs, childRef("threat", realThreatModelName, throwawayThreatName), "")}, + {"/threat_models/{threat_model_id}/documents/{document_id}", "document_id", + findRefByName(refs, childRef("document", realThreatModelName, throwawayDocumentName), "")}, + {"/threat_models/{threat_model_id}/assets/{asset_id}", "asset_id", + findRefByName(refs, childRef("asset", realThreatModelName, throwawayAssetName), "")}, + {"/threat_models/{threat_model_id}/notes/{note_id}", "note_id", + findRefByName(refs, childRef("note", realThreatModelName, throwawayNoteName), "")}, + {"/threat_models/{threat_model_id}/repositories/{repository_id}", "repository_id", + findRefByName(refs, childRef("repo", realThreatModelName, throwawayRepositoryName), "")}, + {"/admin/surveys/{survey_id}", "survey_id", + findRefByName(refs, surveyRef(throwawaySurveyName), "")}, // Survey responses are seeded positionally; index 1 is the decoy. {"/intake/survey_responses/{survey_response_id}", "survey_response_id", findRefByName(refs, "survey-response:1", "")}, @@ -434,7 +458,7 @@ all: ) } -// SEM@0: resolved seeded ids the fixture manifest is built from (pure) +// SEM@ab7ea33a868b16fca968f4640659ee8149524a1e: hold resolved seeded resource IDs used to build the fixture manifest (pure) type fixtureIDs struct { threatModelID, threatID, diagramID, documentID, assetID, noteID string feedbackID, repositoryID string @@ -444,7 +468,7 @@ type fixtureIDs struct { webhookID, deliveryID string } -// SEM@0: one seeded fixture the campaign depends on, plus how to check it is still alive (pure) +// SEM@ab7ea33a868b16fca968f4640659ee8149524a1e: describe one seeded fixture and how to verify it still exists (pure) type referenceFixture struct { // Key is the refData key CATS substitutes this id into. Key string `json:"key"` @@ -462,7 +486,7 @@ type referenceFixture struct { Decoyed bool `json:"decoyed"` } -// SEM@0: fixture manifest file structure listing verifiable and unverifiable seeded fixtures (pure) +// SEM@ab7ea33a868b16fca968f4640659ee8149524a1e: hold the fixture integrity manifest of verifiable and unverifiable seeded fixtures (pure) type fixtureManifest struct { Version string `json:"version"` CreatedAt string `json:"created_at"` @@ -474,7 +498,7 @@ type fixtureManifest struct { Unverifiable map[string]string `json:"unverifiable"` } -// SEM@0: serialize the seeded-fixture integrity manifest consumed by the CATS runner gates (mutates shared state) +// SEM@3f6bbfeb4674fdaa5885dfc24c251bc03bfecef0: serialize the seeded-fixture integrity manifest consumed by the CATS runner gates (writes file) func writeFixtureManifest(path string, ids fixtureIDs) error { tm := ids.threatModelID // Anchors that writeYAMLReference emits a decoy override for. Keep in step @@ -488,6 +512,15 @@ func writeFixtureManifest(path string, ids fixtureIDs) error { "/intake/survey_responses/{survey_response_id}": true, "/teams/{team_id}/notes/{team_note_id}": true, "/admin/webhooks/subscriptions/{webhook_id}": true, + + "/admin/surveys/{survey_id}": true, + + "/threat_models/{threat_model_id}/diagrams/{diagram_id}": true, + "/threat_models/{threat_model_id}/threats/{threat_id}": true, + "/threat_models/{threat_model_id}/documents/{document_id}": true, + "/threat_models/{threat_model_id}/assets/{asset_id}": true, + "/threat_models/{threat_model_id}/notes/{note_id}": true, + "/threat_models/{threat_model_id}/repositories/{repository_id}": true, } candidates := []referenceFixture{ @@ -580,6 +613,31 @@ const ( realProjectName = "CATS Test Project" realGroupName = "CATS Test Group" realThreatModelName = "CATS Test Threat Model" + + // Children of the real threat model that have a DELETE on their own path + // and nested paths beneath it (#1115). Each real fixture is looked up by + // name, never by kind, because the throwaway of the same kind makes a + // map-ranging lookup nondeterministic. + realDiagramName = "CATS Test Diagram" + realThreatName = "CATS Test Threat" + realDocumentName = "CATS Test Document" + realAssetName = "CATS Test Asset" + realNoteName = "CATS Test Note" + realRepositoryName = "CATS Test Repository" + + throwawayDiagramName = "CATS Throwaway Diagram" + throwawayThreatName = "CATS Throwaway Threat" + throwawayDocumentName = "CATS Throwaway Document" + throwawayAssetName = "CATS Throwaway Asset" + throwawayNoteName = "CATS Throwaway Note" + throwawayRepositoryName = "CATS Throwaway Repository" + + // Survey decoy (#1115). A separate survey with no responses: the existing + // "CATS Decoy Survey" carries the survey_response decoy, and /admin/surveys + // sorts before /intake/survey_responses, so deleting it would cascade the + // response decoy away. + realSurveyName = "CATS Test Survey" + throwawaySurveyName = "CATS Throwaway Survey" ) // findRefByName returns a seeded id by its exact seed ref, falling back to the diff --git a/cmd/dbtool/reference_fixtures_test.go b/cmd/dbtool/reference_fixtures_test.go index 006c9f08..70b9c033 100644 --- a/cmd/dbtool/reference_fixtures_test.go +++ b/cmd/dbtool/reference_fixtures_test.go @@ -4,7 +4,10 @@ import ( "encoding/json" "os" "path/filepath" + "strings" "testing" + + "gopkg.in/yaml.v3" ) // readManifest writes a manifest for `ids` into a temp dir and parses it back. @@ -88,8 +91,14 @@ func TestFixtureManifestMarksDecoyedAnchors(t *testing.T) { // an ordinary DELETE took the only seeded record and the run went INVALID. // They now get decoys of their own. "team_note_id": true, "webhook_id": true, - // Nested fixtures with no decoy. - "threat_id": false, "note_id": false, "survey_id": false, + // Threat-model children with nested paths (metadata, restore, audit_trail) + // and a DELETE on their own path (#1115): CATS walks lexical order, so an + // undecoyed DELETE runs before every nested path and leaves them all on a + // deleted fixture. + "diagram_id": true, "threat_id": true, "document_id": true, + "asset_id": true, "note_id": true, "repository_id": true, + // /admin/surveys/{survey_id} has nested paths and a DELETE (#1115). + "survey_id": true, } for _, f := range m.Fixtures { want, tracked := decoyed[f.Key] @@ -127,3 +136,156 @@ func TestFixtureManifestExcludesUnseededIDs(t *testing.T) { } } } + +// childFixtures lists the threat-model children that get a real fixture plus a +// throwaway decoy (#1115): the kind, the seed ref builder for each name, the +// exact CATS anchor path, and the refData parameter name. +var childFixtures = []struct { + kind, param, path string + realName, decoyName string + ref func(name string) string +}{ + {"diagram", "diagram_id", "/threat_models/{threat_model_id}/diagrams/{diagram_id}", + realDiagramName, throwawayDiagramName, + func(n string) string { return childRef("diagram", realThreatModelName, n) }}, + {"threat", "threat_id", "/threat_models/{threat_model_id}/threats/{threat_id}", + realThreatName, throwawayThreatName, + func(n string) string { return childRef("threat", realThreatModelName, n) }}, + {"document", "document_id", "/threat_models/{threat_model_id}/documents/{document_id}", + realDocumentName, throwawayDocumentName, + func(n string) string { return childRef("document", realThreatModelName, n) }}, + {"asset", "asset_id", "/threat_models/{threat_model_id}/assets/{asset_id}", + realAssetName, throwawayAssetName, + func(n string) string { return childRef("asset", realThreatModelName, n) }}, + {"note", "note_id", "/threat_models/{threat_model_id}/notes/{note_id}", + realNoteName, throwawayNoteName, + func(n string) string { return childRef("note", realThreatModelName, n) }}, + {"repository", "repository_id", "/threat_models/{threat_model_id}/repositories/{repository_id}", + realRepositoryName, throwawayRepositoryName, + func(n string) string { return childRef("repo", realThreatModelName, n) }}, +} + +// With two instances of a kind seeded, the global refData id must still be the +// REAL fixture (findRefByKind ranges over a map and would pick either), and the +// exact anchor path must be overridden with the decoy (#1115). +func TestWriteYAMLReferenceDecoysThreatModelChildren(t *testing.T) { + refs := RefMap{ + tmRef(realThreatModelName): {Kind: "threat_model", ID: "tm-real"}, + tmRef(throwawayThreatModelName): {Kind: "threat_model", ID: "tm-decoy"}, + } + for _, c := range childFixtures { + refs[c.ref(c.realName)] = &SeedResult{Kind: c.kind, ID: c.kind + "-real"} + refs[c.ref(c.decoyName)] = &SeedResult{Kind: c.kind, ID: c.kind + "-decoy"} + } + + // Map iteration order is random per range; repeat so a kind-based lookup + // cannot pass by luck. + for i := 0; i < 40; i++ { + path := filepath.Join(t.TempDir(), "cats-test-data.yml") + if err := writeYAMLReference(path, refs, "charlie", "tmi"); err != nil { + t.Fatalf("writeYAMLReference: %v", err) + } + data, err := os.ReadFile(path) // #nosec G304 -- test-controlled temp path + if err != nil { + t.Fatalf("read refData: %v", err) + } + var doc map[string]map[string]any + if err := yaml.Unmarshal(data, &doc); err != nil { + t.Fatalf("parse refData: %v", err) + } + for _, c := range childFixtures { + if got := doc["all"][c.param]; got != c.kind+"-real" { + t.Fatalf("all.%s = %v, want %s-real (global id must be the real fixture)", c.param, got, c.kind) + } + sec, ok := doc[c.path] + if !ok { + t.Fatalf("no decoy section for %s", c.path) + } + if got := sec[c.param]; got != c.kind+"-decoy" { + t.Fatalf("%s: %s = %v, want %s-decoy", c.path, c.param, got, c.kind) + } + } + } +} + +// The checked-in CATS seed must define a real and a throwaway instance of every +// decoyed child kind under the real threat model, with the names the reference +// writer resolves them by (#1115). +func TestCatsSeedDefinesChildDecoys(t *testing.T) { + seedFile, err := loadSeedFile("../../test/seeds/cats-seed-data.json") + if err != nil { + t.Fatalf("loadSeedFile: %v", err) + } + have := map[string]bool{} + for _, e := range seedFile.Seeds { + have[e.Ref] = true + } + for _, c := range childFixtures { + for _, name := range []string{c.realName, c.decoyName} { + if ref := c.ref(name); !have[ref] { + t.Errorf("seed lacks %s %q (ref %q)", c.kind, name, ref) + } + } + } +} + +// survey_id has the same failure class as the threat-model children: DELETE on +// /admin/surveys/{survey_id} sorts before its nested paths. The decoy must be a +// survey of its own, never the one that carries the survey_response decoy. +func TestWriteYAMLReferenceDecoysSurvey(t *testing.T) { + refs := RefMap{ + surveyRef(realSurveyName): {Kind: "survey", ID: "sv-real"}, + surveyRef("CATS Decoy Survey"): {Kind: "survey", ID: "sv-responses-decoy"}, + surveyRef(throwawaySurveyName): {Kind: "survey", ID: "sv-decoy"}, + } + for i := 0; i < 40; i++ { + path := filepath.Join(t.TempDir(), "cats-test-data.yml") + if err := writeYAMLReference(path, refs, "charlie", "tmi"); err != nil { + t.Fatalf("writeYAMLReference: %v", err) + } + data, err := os.ReadFile(path) // #nosec G304 -- test-controlled temp path + if err != nil { + t.Fatalf("read refData: %v", err) + } + var doc map[string]map[string]any + if err := yaml.Unmarshal(data, &doc); err != nil { + t.Fatalf("parse refData: %v", err) + } + if got := doc["all"]["survey_id"]; got != "sv-real" { + t.Fatalf("all.survey_id = %v, want sv-real", got) + } + if got := doc["/admin/surveys/{survey_id}"]["survey_id"]; got != "sv-decoy" { + t.Fatalf("survey anchor = %v, want sv-decoy", got) + } + } +} + +// Every ref a seed entry points at (target_ref and the *_ref fields) must +// resolve to an entry defined EARLIER in the file, because the seeder resolves +// them in order against the refs created so far. Renaming a fixture used to +// break a metadata target only at live-seed time (#1115). Pure and offline. +func TestCatsSeedRefsAllResolve(t *testing.T) { + seedFile, err := loadSeedFile("../../test/seeds/cats-seed-data.json") + if err != nil { + t.Fatalf("loadSeedFile: %v", err) + } + defined := map[string]bool{} + for i, e := range seedFile.Seeds { + for field, v := range e.Data { + if field != "target_ref" && !strings.HasSuffix(field, "_ref") { + continue + } + ref, ok := v.(string) + if !ok || ref == "" { + continue + } + if !defined[ref] { + t.Errorf("seed entry %d (kind=%s, ref=%q): %s %q is not defined by an earlier entry", + i, e.Kind, e.Ref, field, ref) + } + } + if e.Ref != "" { + defined[e.Ref] = true + } + } +} diff --git a/cmd/dbtool/setting_validation_test.go b/cmd/dbtool/setting_validation_test.go new file mode 100644 index 00000000..fb153d3d --- /dev/null +++ b/cmd/dbtool/setting_validation_test.go @@ -0,0 +1,145 @@ +package main + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "github.com/ericfitz/tmi/api/models" +) + +// TestRunConfigSeed_RejectsInvalidTimmySetting pins #1108: --import-config must +// apply the settings service's semantic validators before writing, and write +// nothing (not even the valid sibling settings) when one value is invalid. +func TestRunConfigSeed_RejectsInvalidTimmySetting(t *testing.T) { + db, _ := newExportTestDB(t) + + inputPath := filepath.Join(t.TempDir(), "settings.yml") + yamlContent := "operator:\n name: \"Eric\"\ntimmy:\n llm_provider: \"bogus\"\n" + if err := os.WriteFile(inputPath, []byte(yamlContent), 0o600); err != nil { + t.Fatal(err) + } + + err := runConfigSeed(db, inputPath, "", true, false, false) + if err == nil { + t.Fatal("runConfigSeed: expected error for invalid timmy.llm_provider, got nil") + } + if !strings.Contains(err.Error(), "timmy.llm_provider") { + t.Errorf("error should name the offending key, got: %v", err) + } + + var n int64 + if cErr := db.DB().Model(&models.SystemSetting{}).Count(&n).Error; cErr != nil { + t.Fatal(cErr) + } + if n != 0 { + t.Errorf("system_settings has %d rows after rejected import, want 0 (nothing partial)", n) + } +} + +// TestRunConfigSeed_AcceptsValidTimmySetting guards against over-rejection. +func TestRunConfigSeed_AcceptsValidTimmySetting(t *testing.T) { + db, _ := newExportTestDB(t) + + inputPath := filepath.Join(t.TempDir(), "settings.yml") + if err := os.WriteFile(inputPath, []byte("timmy:\n llm_provider: \"openai\"\n"), 0o600); err != nil { + t.Fatal(err) + } + if err := runConfigSeed(db, inputPath, "", true, false, false); err != nil { + t.Fatalf("runConfigSeed: %v", err) + } + var s models.SystemSetting + if err := db.DB().Where("setting_key = ?", "timmy.llm_provider").First(&s).Error; err != nil { + t.Fatalf("expected timmy.llm_provider row: %v", err) + } +} + +// TestSeedSetting_RejectsInvalidTimmySetting covers the hand-authored seed path. +func TestSeedSetting_RejectsInvalidTimmySetting(t *testing.T) { + db, _ := newExportTestDB(t) + + entry := SeedEntry{Kind: kindSetting, Ref: "r", Data: map[string]any{ + "key": "timmy.llm_provider", "value": "bogus", "type": "string", + }} + _, err := seedSetting(db, entry) + if err == nil { + t.Fatal("seedSetting: expected error for invalid timmy.llm_provider, got nil") + } + if !strings.Contains(err.Error(), "timmy.llm_provider") { + t.Errorf("error should name the offending key, got: %v", err) + } + var n int64 + if cErr := db.DB().Model(&models.SystemSetting{}).Count(&n).Error; cErr != nil { + t.Fatal(cErr) + } + if n != 0 { + t.Errorf("system_settings has %d rows after rejected seed, want 0", n) + } +} + +// TestSeedSetting_ProductionRejectsDumpFlag checks the build-mode-dependent +// validator is evaluated against TMI_BUILD_MODE. +func TestSeedSetting_ProductionRejectsDumpFlag(t *testing.T) { + db, _ := newExportTestDB(t) + t.Setenv("TMI_BUILD_MODE", "production") + + entry := SeedEntry{Kind: kindSetting, Ref: "r", Data: map[string]any{ + "key": "timmy.dump_extracted_text_to_note", "value": "true", "type": "bool", + }} + if _, err := seedSetting(db, entry); err == nil { + t.Fatal("seedSetting: expected error enabling dump flag in production, got nil") + } +} + +// TestValidateSeedSettings_RejectsBadEntryAmongValid pins the whole-list +// pre-pass: one invalid setting entry fails the batch and names its key. +func TestValidateSeedSettings_RejectsBadEntryAmongValid(t *testing.T) { + entries := []SeedEntry{ + {Kind: kindSetting, Data: map[string]any{"key": "operator.name", "value": "x", "type": "string"}}, + {Kind: kindSetting, Data: map[string]any{"key": "timmy.llm_provider", "value": "bogus", "type": "string"}}, + {Kind: kindUser, Data: map[string]any{"key": "timmy.llm_provider", "value": "bogus"}}, + } + err := validateSeedSettings(entries) + if err == nil || !strings.Contains(err.Error(), "timmy.llm_provider") { + t.Fatalf("expected error naming timmy.llm_provider, got %v", err) + } + if err := validateSeedSettings(entries[:1]); err != nil { + t.Errorf("valid entries rejected: %v", err) + } +} + +// TestRunConfigSeed_RejectsNegativeMaxTokens covers timmy.llm_max_tokens, the +// third key the startup Timmy check validates. +func TestRunConfigSeed_RejectsNegativeMaxTokens(t *testing.T) { + db, _ := newExportTestDB(t) + inputPath := filepath.Join(t.TempDir(), "settings.yml") + if err := os.WriteFile(inputPath, []byte("timmy:\n llm_max_tokens: -3\n"), 0o600); err != nil { + t.Fatal(err) + } + err := runConfigSeed(db, inputPath, "", true, false, false) + if err == nil || !strings.Contains(err.Error(), "timmy.llm_max_tokens") { + t.Fatalf("expected error naming timmy.llm_max_tokens, got %v", err) + } +} + +// TestRunConfigSeed_DryRunRejectsInvalid pins that --dry-run reports validation +// failures (non-zero) and writes nothing. +func TestRunConfigSeed_DryRunRejectsInvalid(t *testing.T) { + db, _ := newExportTestDB(t) + inputPath := filepath.Join(t.TempDir(), "settings.yml") + if err := os.WriteFile(inputPath, []byte("timmy:\n llm_provider: \"bogus\"\n"), 0o600); err != nil { + t.Fatal(err) + } + err := runConfigSeed(db, inputPath, "", true, true, false) + if err == nil || !strings.Contains(err.Error(), "timmy.llm_provider") { + t.Fatalf("dry-run: expected error naming timmy.llm_provider, got %v", err) + } + var n int64 + if cErr := db.DB().Model(&models.SystemSetting{}).Count(&n).Error; cErr != nil { + t.Fatal(cErr) + } + if n != 0 { + t.Errorf("dry-run wrote %d rows, want 0", n) + } +} diff --git a/cmd/server/jwt_auth.go b/cmd/server/jwt_auth.go index acc259c2..0d0836aa 100644 --- a/cmd/server/jwt_auth.go +++ b/cmd/server/jwt_auth.go @@ -429,7 +429,7 @@ func NewTicketValidator(ticketStore api.TicketStore, authHandlers *auth.Handlers } // ValidateTicket validates a WebSocket ticket and populates user context. -// SEM@c161adfd8ba839441ccd825e818d342a09c63849: authenticate a WebSocket ticket and populate request identity from it (reads DB) +// SEM@8f024ae72bf58934840386d79ff0d425d3d3d426: authenticate a WebSocket ticket and populate request identity and groups from it (reads DB) func (v *TicketValidator) ValidateTicket(c *gin.Context, ticketStr string) error { logger := slogging.GetContextLogger(c) @@ -457,6 +457,10 @@ func (v *TicketValidator) ValidateTicket(c *gin.Context, ticketStr string) error // Revocation handles of the token that minted the ticket (#869); consumed // by checkRevocation after the ticket is accepted. c.Set("authTokenHash", claims.TokenHash) + // Group claims of the minting token, so group grants apply to the upgrade (#1107). + if len(claims.Groups) > 0 { + c.Set("userGroups", claims.Groups) + } if claims.CredentialID != "" { c.Set("isServiceAccount", true) c.Set("serviceAccountCredentialID", claims.CredentialID) @@ -578,7 +582,7 @@ func NewJWTAuthenticator(cfg *config.Config, tokenBlacklist *auth.TokenBlacklist // unreachable. The latter fails closed (the request is refused rather than // admitted unchecked), but it is a dependency outage, not a bug in handling // this request, so it gets a Retry-After rather than 500. See issue #660. -// SEM@24d835d0aa601cdfaea187838ff139f49228ea26: convert a revocation-check error into a 401 or retryable 503 auth error (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: convert a revocation-check error into a 401 or retryable 503 auth error (pure) func revocationAuthError(logger slogging.SimpleLogger, err error) *AuthError { if strings.Contains(err.Error(), "revoked") { // Use generic error message to avoid leaking implementation details @@ -598,7 +602,7 @@ func revocationAuthError(logger slogging.SimpleLogger, err error) *AuthError { } // AuthenticateRequest performs the complete JWT authentication process -// SEM@a7d1b052bb879606eca59fea8d7f7bac57531eeb: authenticate a request via bearer JWT or WebSocket ticket and enforce revocation +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: authenticate a request via bearer JWT or WebSocket ticket and enforce token revocation func (a *JWTAuthenticator) AuthenticateRequest(c *gin.Context) error { logger := slogging.GetContextLogger(c) @@ -833,7 +837,7 @@ func extractAuthTime(claims jwt.MapClaims) *time.Time { } // AuthError represents an authentication error -// SEM@7383e0ea99036c9a251ff7eefa5cb784ea3829a8: structured auth error carrying an OAuth error code and HTTP status code (pure) +// SEM@db94db3c8118cffb5220bf9a44c2fde0ada20427: structured auth error carrying an OAuth error code and HTTP status code (pure) type AuthError struct { Code errcode.Code Description string diff --git a/cmd/server/jwt_auth_ticket_test.go b/cmd/server/jwt_auth_ticket_test.go index 7d07efd1..c18ad5e9 100644 --- a/cmd/server/jwt_auth_ticket_test.go +++ b/cmd/server/jwt_auth_ticket_test.go @@ -25,6 +25,7 @@ type mockTicketStore struct { sessionID string tokenHash string credentialID string + groups []string err error } @@ -38,7 +39,7 @@ func (m *mockTicketStore) ValidateTicket(_ context.Context, _ string) (api.Ticke } return api.TicketClaims{ UserID: m.userID, Provider: m.provider, InternalUUID: m.internalUUID, SessionID: m.sessionID, - TokenHash: m.tokenHash, CredentialID: m.credentialID, + TokenHash: m.tokenHash, CredentialID: m.credentialID, Groups: m.groups, }, nil } @@ -250,3 +251,32 @@ func TestCheckRevocation_TicketHandles(t *testing.T) { // Verify that the mockTicketStore implements the TicketStore interface at compile time var _ api.TicketStore = (*mockTicketStore)(nil) + +// #1107: the ticket path must expose the minting token's group claims as +// userGroups so group-based grants apply to the WebSocket upgrade. +func TestTicketValidator_SetsUserGroups(t *testing.T) { + gin.SetMode(gin.TestMode) + + run := func(groups []string) *gin.Context { + store := &mockTicketStore{userID: "user123", provider: "tmi", sessionID: "session-abc", groups: groups} + validator := &TicketValidator{ticketStore: store} + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + c.Request, _ = http.NewRequest(http.MethodGet, "/ws/diagrams/123?ticket=tok", nil) + _ = validator.ValidateTicket(c, "tok") // user lookup fails (no DB); context is set before it + return c + } + + c := run([]string{"g1", "g2"}) + got, ok := c.Get("userGroups") + if !ok { + t.Fatal("userGroups not set for a ticket carrying groups") + } + if g, _ := got.([]string); len(g) != 2 || g[0] != "g1" || g[1] != "g2" { + t.Fatalf("userGroups = %v, want [g1 g2]", got) + } + + if _, ok := run(nil).Get("userGroups"); ok { + t.Fatal("userGroups must not be set for a ticket without groups") + } +} diff --git a/scripts/cats-check-fixtures.py b/scripts/cats-check-fixtures.py index 24ca6bf4..9b5ccab3 100644 --- a/scripts/cats-check-fixtures.py +++ b/scripts/cats-check-fixtures.py @@ -13,20 +13,25 @@ what `?` means in a URL — so this cannot be closed server-side. What it can be is *visible*. Run as the plugin's `post_run` hook, this probes -each anchor the reference file names and prints the casualties, so a run whose -nested coverage was quietly truncated says so instead of looking clean. It -never fails the run: the campaign is already over by the time it executes, and -the run-validity gates own the pass/fail decision. +each fixture and prints the casualties, so a run whose nested coverage was +quietly truncated says so instead of looking clean. The fixture list comes from +the manifest dbtool writes beside the reference file (cats-fixtures.json, +#608/#1115), which names every seeded fixture with its verify URL; the built-in +ANCHORS table is only a fallback for runs seeded before the manifest existed. +It never fails the run: the campaign is already over by the time it executes, +and the run-validity gates own the pass/fail decision. """ from __future__ import annotations import argparse +import json import os import subprocess import sys import urllib.error import urllib.request +from collections.abc import Callable from pathlib import Path import yaml @@ -44,6 +49,60 @@ } +class ManifestError(Exception): + """The fixture manifest exists but cannot be used.""" + + +def load_manifest(path: Path) -> list[tuple[str, str]]: + """Return (key, verify_url) for every fixture in the manifest. + + Raises ManifestError on anything malformed: silently falling back to the + built-in table would hide exactly the fixtures this report exists to show. + """ + try: + doc = json.loads(path.read_text()) + except (OSError, ValueError) as exc: + raise ManifestError(f"cannot read {path}: {exc}") from exc + fixtures = doc.get("fixtures") if isinstance(doc, dict) else None + if not isinstance(fixtures, list): + raise ManifestError(f"{path}: missing 'fixtures' list") + targets = [] + for i, f in enumerate(fixtures): + key = f.get("key") if isinstance(f, dict) else None + url = f.get("verify_url") if isinstance(f, dict) else None + if not isinstance(key, str) or not isinstance(url, str) or not key or not url.startswith("/"): + raise ManifestError(f"{path}: fixtures[{i}] needs string 'key' and a server-relative 'verify_url'") + targets.append((key, url)) + return targets + + +def anchor_targets(globals_: dict) -> list[tuple[str, str]]: + """Fallback: (key, path) for the ANCHORS the reference file names.""" + targets = [] + for key, template in ANCHORS.items(): + rid = globals_.get(key) + if not rid or str(rid).startswith("00000000-"): + continue + targets.append((key, template.format(id=rid))) + return targets + + +def classify( + server: str, token: str, targets: list[tuple[str, str]], + probe_fn: Callable[[str, str, str], int] | None = None, +) -> tuple[list[tuple[str, str, int]], list[tuple[str, str, int]]]: + """Split targets into (casualties, survivors) by probing each one.""" + probe_fn = probe_fn or probe + casualties, survivors = [], [] + for key, path in targets: + status = probe_fn(server, path, token) + # 404/410 means gone. 401/403 means we cannot tell, which is not a + # casualty - reporting it as one would cry wolf on every permissions + # quirk. 0 means the probe itself failed. + (casualties if status in (404, 410) else survivors).append((key, path, status)) + return casualties, survivors + + def probe(server: str, path: str, token: str) -> int: """Return the HTTP status for a GET, or 0 if the request never completed.""" req = urllib.request.Request(server.rstrip("/") + path, method="GET") @@ -60,6 +119,7 @@ def probe(server: str, path: str, token: str) -> int: def main() -> int: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--ref-data", help="path to cats-test-data.yml") + parser.add_argument("--fixtures", help="path to cats-fixtures.json (the fixture manifest)") parser.add_argument("--server", help="base URL (defaults to $CATS_SERVER)") parser.add_argument( "--token-cmd", @@ -72,17 +132,27 @@ def main() -> int: print("cats-check-fixtures: no --server and no CATS_SERVER; skipping", file=sys.stderr) return 0 - ref_data = Path(args.ref_data or - Path(os.environ.get("CATS_RESULTS_DIR", "test/results/cats")) / "cats-test-data.yml") - if not ref_data.is_file(): - print(f"cats-check-fixtures: {ref_data} not found; skipping", file=sys.stderr) - return 0 - - try: - data = yaml.safe_load(ref_data.read_text()) or {} - except (OSError, yaml.YAMLError) as exc: - print(f"cats-check-fixtures: cannot read {ref_data}: {exc}", file=sys.stderr) - return 0 + results_dir = Path(os.environ.get("CATS_RESULTS_DIR", "test/results/cats")) + manifest = Path(args.fixtures or results_dir / "cats-fixtures.json") + targets: list[tuple[str, str]] + if manifest.is_file(): + try: + targets = load_manifest(manifest) + except ManifestError as exc: + print(f"cats-check-fixtures: {exc}", file=sys.stderr) + return 0 + else: + ref_data = Path(args.ref_data or results_dir / "cats-test-data.yml") + if not ref_data.is_file(): + print(f"cats-check-fixtures: neither {manifest} nor {ref_data} found; skipping", + file=sys.stderr) + return 0 + try: + data = yaml.safe_load(ref_data.read_text()) or {} + except (OSError, yaml.YAMLError) as exc: + print(f"cats-check-fixtures: cannot read {ref_data}: {exc}", file=sys.stderr) + return 0 + targets = anchor_targets(data.get("all") or {}) # shell=True is for the OPERATOR's own token command (same trust model as # the cats plugin's hooks — it needs pipes, quoting and env expansion), but @@ -98,18 +168,7 @@ def main() -> int: print("cats-check-fixtures: could not mint a token; skipping", file=sys.stderr) return 0 - globals_ = data.get("all") or {} - casualties, survivors = [], [] - for key, template in ANCHORS.items(): - rid = globals_.get(key) - if not rid or str(rid).startswith("00000000-"): - continue - path = template.format(id=rid) - status = probe(server, path, token) - # 404/410 means gone. 401/403 means we cannot tell, which is not a - # casualty — reporting it as one would cry wolf on every permissions - # quirk. 0 means the probe itself failed. - (casualties if status in (404, 410) else survivors).append((key, path, status)) + casualties, survivors = classify(server, token, targets) print() print("Seeded fixture survival (#608):") @@ -120,7 +179,7 @@ def main() -> int: if casualties: print() - print(f"{len(casualties)} seeded anchor(s) did not survive the campaign. Every path " + print(f"{len(casualties)} seeded fixture(s) did not survive the campaign. Every path " "nested under them was fuzzed against a 404 from the point of deletion " "onward, so per-path conclusions for those families are unreliable. " "Re-seed before analysing them. See issue #608.") diff --git a/scripts/test_cats_check_fixtures.py b/scripts/test_cats_check_fixtures.py new file mode 100644 index 00000000..5ca49a0b --- /dev/null +++ b/scripts/test_cats_check_fixtures.py @@ -0,0 +1,70 @@ +"""Tests for cats-check-fixtures.py. Run: uv run --with pytest --with pyyaml pytest scripts/test_cats_check_fixtures.py""" + +import importlib.util +import json +from pathlib import Path + +import pytest + +_spec = importlib.util.spec_from_file_location( + "cats_check_fixtures", Path(__file__).with_name("cats-check-fixtures.py")) +mod = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(mod) + + +def write(tmp_path, doc): + p = tmp_path / "cats-fixtures.json" + p.write_text(doc if isinstance(doc, str) else json.dumps(doc)) + return p + + +def test_manifest_present_probes_every_key(tmp_path): + p = write(tmp_path, {"fixtures": [ + {"key": "diagram_id", "verify_url": "/threat_models/t/diagrams/d"}, + {"key": "survey_id", "verify_url": "/admin/surveys/s"}, + {"key": "threat_model_id", "verify_url": "/threat_models/t"}, + ]}) + targets = mod.load_manifest(p) + seen = [] + statuses = {"/threat_models/t/diagrams/d": 404, "/admin/surveys/s": 403, "/threat_models/t": 200} + + def stub(server, path, token): + seen.append(path) + return statuses[path] + + casualties, survivors = mod.classify("http://x", "tok", targets, stub) + assert [k for k, _ in targets] == ["diagram_id", "survey_id", "threat_model_id"] + assert sorted(seen) == sorted(statuses) + assert [c[0] for c in casualties] == ["diagram_id"] # 404 is a casualty + assert [s[0] for s in survivors] == ["survey_id", "threat_model_id"] # 403 is not + + +def test_gone_410_is_casualty_and_zero_is_not(): + c, s = mod.classify("h", "t", [("a", "/a"), ("b", "/b")], lambda *_: 410 if _[1] == "/a" else 0) + assert [x[0] for x in c] == ["a"] and [x[0] for x in s] == ["b"] + + +def test_manifest_missing_falls_back_to_anchors(): + targets = mod.anchor_targets({"threat_model_id": "abc", "team_id": "00000000-0000-0000-0000-000000000000", + "diagram_id": "ignored"}) + assert targets == [("threat_model_id", "/threat_models/abc")] + + +@pytest.mark.parametrize("doc", [ + "not json", + "[]", + {"nofixtures": 1}, + {"fixtures": [{"key": "k"}]}, + {"fixtures": [{"key": "k", "verify_url": "http://abs/"}]}, + {"fixtures": ["str"]}, +]) +def test_malformed_manifest_fails_clearly(tmp_path, doc): + with pytest.raises(mod.ManifestError): + mod.load_manifest(write(tmp_path, doc)) + + +def test_main_reports_malformed_manifest_and_does_not_fail_run(tmp_path, monkeypatch, capsys): + p = write(tmp_path, "garbage") + monkeypatch.setattr("sys.argv", ["x", "--server", "http://x", "--fixtures", str(p)]) + assert mod.main() == 0 + assert "cats-check-fixtures:" in capsys.readouterr().err diff --git a/test/cats/false-positives.yaml b/test/cats/false-positives.yaml index 892efa4f..bd7f5f35 100644 --- a/test/cats/false-positives.yaml +++ b/test/cats/false-positives.yaml @@ -52,13 +52,13 @@ rules: # transport-layer failure is categorically not an application-layer # finding, so no application rule may claim these records under # first-match-wins. - # rule 1 of 103: + # rule 1 of 104: - id: CONNECTION_ERROR_999 why: Response codes 953/999 are CATS/network-layer issues (connection refused, no real HTTP response received), not API bugs. when: response_code: { in: [953, 999] } - # rule 2 of 103: Rate Limit False Positives (429) + # rule 2 of 104: Rate Limit False Positives (429) # Rate limiting is infrastructure protection, not API behavior. - id: RATE_LIMIT_429 why: Rate limiting is infrastructure protection, not API behavior. @@ -69,7 +69,7 @@ rules: # header (every other header fuzzer explicitly preserves authentication # headers). A 401/403 when credentials were deliberately removed is the # correct security outcome. Any other 401/403 must surface. (#583) - # rule 3 of 103: + # rule 3 of 104: - id: AUTH_BYPASS_401_403 why: BypassAuthentication deliberately strips the Authorization header, so a 401/403 rejection is the correct security outcome; CATS preserves auth headers in every other fuzzer, so no other fuzzer legitimately triggers auth failures. when: @@ -80,7 +80,7 @@ rules: # chars, bidirectional overrides, Hangul fillers, Zalgo text, control # chars, and similar malformed/adversarial input. Returning 400 for these # is correct security behavior, not a bug. - # rule 4 of 103: + # rule 4 of 104: - id: VALIDATION_400 why: TMI's security hardening middleware correctly rejects malformed/adversarial input (unicode abuse, injection payloads, overflow values, malformed JSON) with 400. when: @@ -133,7 +133,7 @@ rules: # NOTE: legacy also checked response.responseBody against # legitimate_not_found_messages, which CATS never emits (dead branch); # only the result_details check (which reads the same message list) is live. - # rule 5 of 103: + # rule 5 of 104: - id: NOT_FOUND_404 why: Fuzzers that substitute random/invalid resource IDs correctly get 404 from fully-implemented endpoints. when: @@ -200,7 +200,7 @@ rules: # InsecureDirectObjectReferences replaces ID fields with alternative # values. Admin endpoints (and the admin-only DELETE /addons/{id}) grant # full access regardless of which ID is used, so this is expected. - # rule 6 of 103: + # rule 6 of 104: - id: IDOR_ADMIN why: Admin endpoints (and admin-only DELETE /addons/{id}) grant full access regardless of which ID is substituted, so IDOR probing them is expected to "succeed". when: @@ -217,7 +217,7 @@ rules: # those IDs. Since the replacement resource is also owned by the same # user, success is expected — ownership is enforced via # WHERE owner_uuid = ? in all queries. - # rule 7 of 103: + # rule 7 of 104: - id: IDOR_SAME_OWNER why: /me/ endpoints are single-user scoped; a substituted ID that also belongs to the same authenticated user is a same-owner access, not an IDOR — ownership is enforced via WHERE owner_uuid = ? in all queries. when: @@ -227,7 +227,7 @@ rules: response_code: { in: [200, 204] } # Returning 400/405 for unsupported HTTP methods is correct behavior. - # rule 8 of 103: + # rule 8 of 104: - id: HTTP_METHODS why: Returning 400/405 for unsupported HTTP methods is correct behavior. when: @@ -239,7 +239,7 @@ rules: # returning "400 Bad Request" as text/plain rather than JSON. The spec # allows text/plain as an alternative for 400, but CATS may not recognize # it (charset suffix, or only checking the first content type). - # rule 9 of 103: + # rule 9 of 104: - id: CONTENT_TYPE_GO_HTTP why: Go's net/http layer can reject a malformed request before Gin middleware runs, returning text/plain "400 Bad Request" instead of JSON — expected HTTP behavior, not a bug. when: @@ -254,7 +254,7 @@ rules: # that's not XSS, which requires HTML context. NoSQL/command injection # "potential" findings are storage, not execution. NoSQL syntax has no # effect on TMI's PostgreSQL backend. - # rule 10 of 103: + # rule 10 of 104: - id: INJECTION_JSON_API why: For a JSON API, storing and echoing user-supplied data as JSON is not XSS (which needs HTML context); NoSQL injection syntax has no effect on TMI's PostgreSQL backend. when: @@ -279,7 +279,7 @@ rules: # code (953/999) ahead of CONNECTION_ERROR_999 — on the current corpus this # guard is a no-op now that CONNECTION_ERROR_999 sits at rule 1, but it's # cheap defense-in-depth against a future reorder. - # rule 11 of 103: + # rule 11 of 104: - id: XSS_QUERY_PARAMS why: TMI returns JSON, not HTML, so XSS requires no exploitable context; GET-only query-parameter payloads and "warn"-level (accepted, not reflected-as-HTML) results are never exploitable. Restricted to real HTTP status codes (#586) so it can never claim a synthetic CATS code like 953/999. when: @@ -291,7 +291,7 @@ rules: # These fuzzers send malformed/unusual headers and expect success. # Returning 400 for invalid headers is correct input validation. - # rule 12 of 103: + # rule 12 of 104: - id: HEADER_VALIDATION_400 why: Returning 400 for malformed/unusual headers (bad Accept-Language, invalid Content-Type, header flooding, duplicate/extra headers) is correct input validation. when: @@ -316,7 +316,7 @@ rules: # Ported as a single condition; the engine's `contains` is # case-insensitive, so this matches exactly the same records as the # original OR. - # rule 13 of 103: + # rule 13 of 104: - id: STRING_BOUNDARY_OPTIONAL why: CATS expects 4XX for an empty string on an optional field, but an optional field accepting an empty value and returning 2XX is correct. when: @@ -329,7 +329,7 @@ rules: # For LIST endpoints, returning 200 with an empty array is correct REST # behavior — the fuzzer expects 404/410, but a list endpoint should # return 200 with empty results. - # rule 14 of 103: + # rule 14 of 104: - id: DELETED_RESOURCE_LIST why: LIST endpoints correctly return 200 with an empty array after the listed resource is deleted, rather than 404/410. when: @@ -355,7 +355,7 @@ rules: # 7009) accept form-urlencoded data. When the request Content-Type is # form-urlencoded, the server correctly handles the form data — the # fuzzers are testing the wrong content type. - # rule 15 of 103: + # rule 15 of 104: - id: FORM_URLENCODED_JSON_TEST why: JSON-body fuzzers (MalformedJson, DuplicateKeysFields, RandomDummyInvalidJsonBody) test the wrong content type against endpoints that legitimately accept form-urlencoded data (e.g. /oauth2/revoke per RFC 7009). when: @@ -367,7 +367,7 @@ rules: # 200 with a challenge string, the second (with challenge) confirms # deletion. Fuzzers that send DELETE /me without the challenge parameter # correctly get 400 "Invalid or expired challenge". - # rule 16 of 103: + # rule 16 of 104: - id: DELETE_ME_CHALLENGE why: DELETE /me requires a two-step challenge flow; any 400 without the challenge parameter correctly enforces that flow. when: @@ -382,7 +382,7 @@ rules: # NOTE: legacy also checked response.responseBody for the same # "parameter ... doesn't match the regular expression" message, which # CATS never emits (dead branch). - # rule 17 of 103: + # rule 17 of 104: - id: PATH_PARAM_VALIDATION why: CATS test parameter names (e.g. "cats-test-key") contain hyphens that some OpenAPI path-parameter regex patterns disallow; 400 is correct validation. when: @@ -397,7 +397,7 @@ rules: # NOTE: legacy also checked response.responseBody for the same "property # ... is missing" / "is required" messages (2 places), which CATS never # emits (dead branches); only the json_body.error_description checks are live. - # rule 18 of 103: + # rule 18 of 104: - id: EMPTY_BODY_REQUIRED_FIELDS why: EmptyJsonBody sends {} against endpoints with documented required fields; 400 for a missing required property is correct. when: @@ -411,7 +411,7 @@ rules: # EmptyJsonBody uses random UUIDs that don't exist in the database — 404 # is correct and unrelated to the empty body itself. - # rule 19 of 103: + # rule 19 of 104: - id: EMPTY_JSON_BODY_NOT_FOUND why: EmptyJsonBody's random UUIDs don't exist in the database; 404 Not Found is correct and unrelated to the empty request body. when: @@ -438,7 +438,7 @@ rules: # no-op check, kept only for behavioral equivalence with the ported # Python. See test/cats/rule-baseline.json and # docs/superpowers/plans/2026-07-26-cats-rule-migration-report.md. - # rule 20 of 103: + # rule 20 of 104: - id: STRING_BOUNDARY_EMPTY_PATH why: In practice this rule fires whenever StringFieldsLeftBoundary gets response_code 200 or 405 — the url any_of below is inert (see comment above), so it does not actually gate on an empty path segment despite the historical framing. when: @@ -454,7 +454,7 @@ rules: # body — sending one correctly returns 400. # NOTE: legacy also checked response.responseBody for "does not accept a # request body", which CATS never emits (dead branch). - # rule 21 of 103: + # rule 21 of 104: - id: NO_BODY_ENDPOINT why: Endpoints that don't accept a request body (e.g. /admin/settings/migrate) correctly return 400 when a fuzzer sends one anyway. when: @@ -462,7 +462,7 @@ rules: json_body.error_description: contains: "does not accept a request body" - # rule 22 of 103: Survey endpoint validation false positives (400) + # rule 22 of 104: Survey endpoint validation false positives (400) # Survey POST/PUT correctly rejects malformed survey_json, status, etc. - id: SURVEY_VALIDATION_400 why: Survey POST/PUT correctly rejects malformed survey_json, status, and other fuzzed fields with 400. @@ -479,7 +479,7 @@ rules: - request body has an error # Deleting a survey with existing responses correctly returns 409. - # rule 23 of 103: + # rule 23 of 104: - id: SURVEY_DELETE_CONFLICT_409 why: Deleting a survey that has existing responses correctly returns 409 Conflict (referential integrity). when: @@ -488,7 +488,7 @@ rules: contains: /admin/surveys/ method: DELETE - # rule 24 of 103: JSON Patch validation false positives (400) + # rule 24 of 104: JSON Patch validation false positives (400) # PATCH endpoints correctly reject malformed/empty JSON Patch operations. - id: JSONPATCH_INVALID_400 why: PATCH endpoints correctly reject malformed or inapplicable JSON Patch documents with 400, matched on the server's actual rejection rather than the status code alone. @@ -507,7 +507,7 @@ rules: - multiple errors encountered - Duplicate metadata key found - # rule 25 of 103: Survey response endpoint validation false positives (400) + # rule 25 of 104: Survey response endpoint validation false positives (400) # Survey response POST/PUT correctly rejects fuzzed input. - id: SURVEY_RESPONSE_VALIDATION_400 why: Survey response POST/PUT correctly rejects fuzzed input with 400. @@ -522,7 +522,7 @@ rules: - Referenced resource not found - request body has an error - # rule 26 of 103: Bulk metadata validation false positives (400) + # rule 26 of 104: Bulk metadata validation false positives (400) # Bulk metadata endpoints correctly reject malformed payloads. - id: METADATA_BULK_VALIDATION_400 why: Bulk metadata endpoints correctly reject malformed payloads with 400. @@ -541,7 +541,7 @@ rules: # (details is nullable); OAuth endpoints may return just 'error' per RFC # 6749 5.2; and Go's HTTP layer's text/plain "400 Bad Request" gets # parsed by CATS as {"notAJson": "400 Bad Request"}. - # rule 27 of 103: + # rule 27 of 104: - id: SCHEMA_MISMATCH_VALID_ERROR why: CATS warns "Not matching response schema" but the response is actually a valid Error (error+error_description, an RFC 6749 5.2 error-only OAuth response, or Go's text/plain 400 parsed by CATS as notAJson). when: @@ -564,7 +564,7 @@ rules: # and echoes the invalid value in the error description — the server # never attempts to connect to the URL; the "reflection" is only in the # validation error text. - # rule 28 of 103: + # rule 28 of 104: - id: SSRF_VALIDATION_400 why: The OpenAPI validation middleware echoes an SSRF payload back in a 400 error description without ever attempting to connect to it — reflection in a validation message is not SSRF. when: @@ -573,7 +573,7 @@ rules: # ExamplesFields sends the OpenAPI example survey, which collides with # seed data already in the database — 409 Conflict is correct. - # rule 29 of 103: + # rule 29 of 104: - id: SURVEY_EXAMPLES_CONFLICT_409 why: The OpenAPI example survey sent by ExamplesFields collides with pre-seeded survey data; 409 Conflict is correct. when: @@ -585,7 +585,7 @@ rules: # CATS seeding creates metadata entries; a valid POST to # /admin/surveys/{id}/metadata correctly returns 409 because the metadata # key already exists from seeding. - # rule 30 of 103: + # rule 30 of 104: - id: SURVEY_METADATA_CONFLICT_409 why: CATS seed data already created the survey metadata key being POSTed; 409 Conflict is correct, not a bug. when: @@ -596,7 +596,7 @@ rules: # EmptyJsonArrayBody sends [] to bulk endpoints — an empty array means # "no operations to perform", so 200 is correct. - # rule 31 of 103: + # rule 31 of 104: - id: EMPTY_ARRAY_BODY_200 why: An empty JSON array body to a bulk endpoint means "no operations to perform"; 200 is the correct no-op response. when: @@ -611,7 +611,7 @@ rules: # NOTE: legacy also assigned response.responseBody in this block but # never referenced it in a condition — an unused local, not a dead check, # so there is nothing to omit here. - # rule 32 of 103: + # rule 32 of 104: - id: ADDON_PARAMETER_VALIDATION_400 why: CATS cannot generate valid discriminated-union AddonParameter data (fields for every `type` variant are generated simultaneously); the server correctly rejects the resulting invalid combinations with 400. when: @@ -630,7 +630,7 @@ rules: - metadata_key - "parameter '" - # rule 33 of 103: RFC 7009 Section 2.1: the token revocation endpoint SHOULD return 200 + # rule 33 of 104: RFC 7009 Section 2.1: the token revocation endpoint SHOULD return 200 # even for invalid/malformed tokens. String boundary and large string # fuzzers flag this as an error because they expect 4xx for bad input, # but 200 is the RFC-compliant behavior. @@ -650,7 +650,7 @@ rules: # values in client_id, client_secret, or token fields correctly return # 200 — there is no valid token to revoke, so the server responds with # success per the RFC. - # rule 34 of 103: + # rule 34 of 104: - id: REVOKE_TYPE_COERCION_RFC7009 why: "RFC 7009 requires 200 even for malformed tokens; type-coerced numeric/boolean values in client_id/client_secret/token correctly return 200 since there's no valid token to revoke." when: @@ -662,7 +662,7 @@ rules: # Go's HTTP framework returns 200 for HEAD requests (mirroring GET/POST), # and the revoke endpoint's permissive error handling per RFC 7009 means # it gracefully handles unexpected methods. - # rule 35 of 103: + # rule 35 of 104: - id: REVOKE_HTTP_METHODS_RFC7009 why: Go's HTTP framework returns 200 for HEAD (mirroring GET/POST), and RFC 7009's permissive error handling means undocumented methods on /oauth2/revoke are handled gracefully. when: @@ -674,7 +674,7 @@ rules: # POST /admin/users/automation returns 409 when the automation account # already exists from CATS seed data. - # rule 36 of 103: + # rule 36 of 104: - id: AUTOMATION_ACCOUNT_CONFLICT_409 why: POST /admin/users/automation correctly returns 409 when the automation account already exists from CATS seed data. when: @@ -685,7 +685,7 @@ rules: # RFC 7662 requires introspection to return HTTP 200 with # {"active":false} for any invalid, expired, or unrecognizable token. - # rule 37 of 103: + # rule 37 of 104: - id: INTROSPECT_RFC7662 why: "RFC 7662 2.2 requires introspection to return HTTP 200 with {\"active\":false} for any invalid/expired/unrecognizable token; CATS expects 4xx for fuzzed input." when: @@ -697,7 +697,7 @@ rules: # These endpoints require valid OAuth parameters (code, state, # refresh_token, client_id, etc.) that CATS cannot generate — 400 is # correct validation, not a bug. - # rule 38 of 103: + # rule 38 of 104: - id: OAUTH_TOKEN_VALIDATION_400 why: /oauth2/token, /oauth2/callback, and /oauth2/refresh require valid OAuth parameters CATS cannot generate; 400 is correct validation. when: @@ -705,7 +705,7 @@ rules: response_code: 400 path: { in: [/oauth2/token, /oauth2/callback, /oauth2/refresh] } - # rule 39 of 103: /oauth2/token returns 401 invalid_client per RFC 6749 5.2 when + # rule 39 of 104: /oauth2/token returns 401 invalid_client per RFC 6749 5.2 when # client credentials don't authenticate. IterateThroughEnumValuesFields # iterates grant_type=client_credentials with synthetic client_id/secret; # the server correctly rejects unknown clients with 401 invalid_client. @@ -723,7 +723,7 @@ rules: # Go's encoding/json decoder converts JSON numbers to Go string fields. # This is defined, safe behavior — the number becomes a string like # "9223372036854775807". No privilege escalation or data corruption occurs. - # rule 40 of 103: + # rule 40 of 104: - id: TYPE_COERCION_STRING why: Go's encoding/json decoder safely converts a JSON number into a Go string field; defined behavior with no privilege escalation or data corruption. when: @@ -733,7 +733,7 @@ rules: # The webhook delivery endpoint uses dual auth (HMAC or JWT). When auth # is bypassed or headers are empty/spaces, the delivery is not found. - # rule 41 of 103: + # rule 41 of 104: - id: WEBHOOK_DELIVERY_AUTH_404 why: /webhook-deliveries/{id} uses dual HMAC-or-JWT auth; bypassed or empty/whitespace auth headers correctly resolve to "delivery not found" (404). when: @@ -744,7 +744,7 @@ rules: # EmptyBody -> 404 (subscription not found with empty body), # MaxLengthExactValues -> 400 (OpenAPI validation rejects oversized event_type). - # rule 42 of 103: + # rule 42 of 104: - id: WEBHOOK_TEST_VALIDATION why: The webhook subscription test endpoint correctly returns 404 for EmptyBody (subscription not found) and 400 for MaxLengthExactValues (oversized event_type rejected by OpenAPI validation). when: @@ -755,7 +755,7 @@ rules: # CATS authenticates as charlie (admin) and tries to delete charlie's own # user account. The self-deletion guard correctly returns 409 Conflict. - # rule 43 of 103: + # rule 43 of 104: - id: SELF_DELETION_409 why: CATS authenticates as the admin user (charlie) and attempts to delete that same account; the self-deletion guard correctly returns 409 Conflict. when: @@ -770,7 +770,7 @@ rules: # HTTP method (e.g. GET on a DELETE-only collection item). 405 IS a 4XX # response and correct REST behavior — it tells the client the method is # not allowed on that resource. - # rule 44 of 103: + # rule 44 of 104: - id: CHECK_DELETED_405 why: CheckDeletedResourcesNotAvailable expects 404, but a 405 (method not allowed on an existing path) is still a correct 4XX REST response, not a bug. when: @@ -778,7 +778,7 @@ rules: response_code: 405 fuzzer: CheckDeletedResourcesNotAvailable - # rule 45 of 103: /admin/audit/* query-parameter validation false positives (400) (#494) + # rule 45 of 104: /admin/audit/* query-parameter validation false positives (400) (#494) # The admin audit list endpoints take opaque query params (cursor, # actor_email, around, created_after/before). Injection/boundary fuzzers # send malformed values that the OpenAPI validation middleware correctly @@ -798,7 +798,7 @@ rules: - Invalid pagination cursor - request body has an error - # rule 46 of 103: Step-up re-authentication 401 (#583) + # rule 46 of 104: Step-up re-authentication 401 (#583) # Sensitive operations (identity link start, admin user transfer, # credential deletion) require recent re-authentication via the step-up # middleware; CATS's seeded token can never satisfy that requirement. @@ -809,7 +809,7 @@ rules: json_body.error: equals: insufficient_user_authentication - # rule 47 of 103: Automation-only endpoints 403 (#583) + # rule 47 of 104: Automation-only endpoints 403 (#583) # /automation/* endpoints are restricted to automation service accounts; # the CATS identity is an interactive admin, so 403 is the intended # authorization outcome. @@ -820,7 +820,7 @@ rules: path: { starts_with: /automation/ } json_body.error: { equals: forbidden } - # rule 48 of 103: Admin client-credentials automation-account gate 403 (#583) + # rule 48 of 104: Admin client-credentials automation-account gate 403 (#583) # Admin client-credentials management is only available for automation # accounts; the seeded target user is a normal user, so 403 is the # intended outcome. @@ -832,7 +832,7 @@ rules: json_body.error_description: contains: only available for automation accounts - # rule 49 of 103: Team/project uri field is stored, never fetched (#608 run 20260730T174620Z) + # rule 49 of 104: Team/project uri field is stored, never fetched (#608 run 20260730T174620Z) # SSRFInUrlFields sets uri to an internal address and flags the echo in the # response body. Teams and projects only persist and serialize that field # (team_store_gorm.go:954) -- nothing dereferences it. Deliberately scoped to @@ -849,7 +849,7 @@ rules: # rule 50: "unauthorized" is an error code, not leaked internals (run 20260730T174620Z) # All 39 hits are /saml/providers/{idp}/users returning the standard 401 body. # CATS's leak heuristic matched the word "unauthorized" in it. - # rule 50 of 103: + # rule 50 of 104: - id: AUTH_ERROR_CODE_IS_NOT_A_DETAILS_LEAK why: CATS flags the keyword "unauthorized" as a possible error-details leak, but that is the RFC 6749 error code itself and the body is the generic {"error":"unauthorized","error_description":"Authentication required"}. No internals are disclosed. when: @@ -863,7 +863,7 @@ rules: # "engineering_lead". Requiring the unevaluated payload is what keeps this rule # honest: if a template engine ever does evaluate it, the body carries the # computed value instead, the rule stops matching, and the finding surfaces. - # rule 51 of 103: + # rule 51 of 104: - id: SSTI_PAYLOAD_REFLECTED_NOT_EVALUATED why: The SSTI payload comes back verbatim, so no template engine evaluated it. CATS matches its "engine" keyword against our own seeded member role engineering_lead. Requiring the unevaluated payload in the body keeps a genuine evaluation (which would show the computed value instead) surfacing. when: @@ -884,7 +884,7 @@ rules: # bucket today, but silently accepting an undeclared field on a # privilege-bearing endpoint is exactly the case worth hearing about, so it # must not be swept up by this rule later. - # rule 52 of 103: + # rule 52 of 104: - id: UNDECLARED_FIELD_DROPPED_NOT_BOUND why: TMI ignores unknown request fields rather than binding them, so MassAssignment's injected fields are dropped, not assigned. Verified on run 20260730T174620Z - 0 of 661 responses echoed the injected field. Excludes /admin/ so silent acceptance on privilege-bearing endpoints still surfaces. when: @@ -898,14 +898,14 @@ rules: # path still surfaces. CATS expects 2xx from these fuzzers because it does not # model nested schema constraints or resource state. - # rule 53 of 103: + # rule 53 of 104: - id: NESTED_SCHEMA_VALIDATION_400 why: The fuzzer mangled a nested object (color_palette colour pattern, cvss score range, diagram cells) and the server rejected it against the schema. A 400 is correct; CATS expected 2xx because it does not model nested constraints. when: response_code: 400 json_body.error_description: { contains: 'multiple errors encountered: Error at "/' } - # rule 54 of 103: + # rule 54 of 104: - id: SCREENSHOT_BASE64_INVALID_400 why: The fuzzer corrupted the base64 screenshot payload and the server rejected it. A 400 is the correct response to undecodable base64. when: @@ -917,35 +917,35 @@ rules: # api/safe_http_client.go then dials the validated IP rather than re-resolving, # so the lookup cannot be raced. Refusing a host it cannot resolve is the # control working, not a finding. - # rule 55 of 103: + # rule 55 of 104: - id: SSRF_URI_VALIDATION_REJECTS_UNRESOLVABLE_400 why: The URI validator refuses a host it cannot resolve, which is the SSRF protection working (api/ssrf_validator.go resolves and checks every IP against the blocklist). The fuzzer supplies random hostnames, so a 400 is correct. when: response_code: 400 json_body.error_description: { contains: "invalid uri: cannot resolve hostname" } - # rule 56 of 103: + # rule 56 of 104: - id: PAGINATION_CURSOR_INVALID_400 why: The fuzzer corrupted an opaque pagination cursor; rejecting it with 400 is correct. when: response_code: 400 json_body.error_description: { contains: "Invalid pagination cursor" } - # rule 57 of 103: + # rule 57 of 104: - id: METADATA_KEY_CONFLICT_409 why: The fuzzer reuses one metadata key across repeated requests, so the second write is a genuine conflict. 409 is the correct optimistic-concurrency outcome. when: response_code: 409 json_body.error_description: { contains: "Metadata key already exists" } - # rule 58 of 103: + # rule 58 of 104: - id: RESTORE_NON_DELETED_ENTITY_409 why: Restore only applies to a soft-deleted entity; calling it on a live one is a state conflict, and 409 is correct. when: response_code: 409 json_body.error_description: { contains: "not in a deleted state" } - # rule 59 of 103: + # rule 59 of 104: - id: SURVEY_THREAT_MODEL_ALREADY_CREATED_409 why: A survey response yields at most one threat model; a second creation attempt is a genuine conflict and 409 is correct. when: @@ -957,7 +957,7 @@ rules: # the only content type its 200 declares. CATS wraps the non-JSON body in a # notAJson envelope and then reports it does not match "the corresponding # schema" -- there is no application/json schema for it to match. - # rule 60 of 103: + # rule 60 of 104: - id: SSE_STREAM_VALIDATED_AS_JSON_SCHEMA why: "The endpoint streams text/event-stream exactly as the spec declares, and declares no application/json schema. CATS wraps the non-JSON body in a notAJson envelope and then reports it does not match a JSON schema that does not exist." when: @@ -969,7 +969,7 @@ rules: # returned HTML-escaped. Verified across all 20 findings in the run: zero # responses expanded an entity (no XXE_TEST_SUCCESS, no /etc/* content) -- # the payload comes back as "]>&test;". - # rule 61 of 103: + # rule 61 of 104: - id: XXE_NOTES_CONTENT_NOT_PARSED why: "Note content is stored as an opaque, HTML-escaped string and never parsed as XML. All 20 findings in run 20260730T220551Z returned the payload escaped with no entity expansion." when: @@ -980,7 +980,7 @@ rules: # CATS treats a field named like `*_enabled` as privileged. `timmy_enabled` # is a documented, non-readOnly property of TeamProjectNoteBase and AssetBase, # so a client is supposed to be able to set it and see it echoed back. - # rule 62 of 103: + # rule 62 of 104: - id: MASS_ASSIGNMENT_DECLARED_WRITABLE_FIELD why: "timmy_enabled is a declared, non-readOnly property in the spec; the client is meant to set it. CATS flags it only because the name pattern looks privilege-like." when: @@ -992,7 +992,7 @@ rules: # the non-JSON body in a notAJson envelope, then runs its echo heuristic over # the raw stream text -- there is no JSON object whose fields could have been # mass-assigned. - # rule 63 of 103: + # rule 63 of 104: - id: MASS_ASSIGNMENT_SSE_STREAM_ENVELOPE why: "The endpoint streams text/event-stream as the spec declares. CATS wraps it in a notAJson envelope and runs a field-echo heuristic over stream text, where no assignable JSON object exists." when: @@ -1004,7 +1004,7 @@ rules: # response is an empty page (total 0) -- the filter matched no rows, so no # other user's data was disclosed. Scoped to total==0 so a response that # actually leaks rows still surfaces. - # rule 64 of 103: + # rule 64 of 104: - id: IDOR_EMPTY_RESULT_SET why: "The list endpoint returned an empty page (total 0) for the substituted id, so nothing was disclosed. Scoped to total==0 so any response that actually returns rows is still reported." when: @@ -1015,7 +1015,7 @@ rules: # POST /threat_models/{id}/feedback rejects target_field unless # target_type=threat_classification. That constraint is not expressible in # the schema, so CATS generates combinations the server correctly refuses. - # rule 65 of 103: + # rule 65 of 104: - id: FEEDBACK_TARGET_FIELD_CROSS_FIELD_400 why: "target_field is only valid with target_type=threat_classification -- a cross-field rule not expressible in OpenAPI. The 400 is the server correctly rejecting a combination CATS cannot know is invalid." when: @@ -1032,7 +1032,7 @@ rules: # only -- zero mangle a required field, so this never hides a required-field # validation bypass. RE-VERIFY that property before keeping this rule if the # request models change (a mangled required field must still yield 400). - # rule 66 of 103: + # rule 66 of 104: - id: WHITESPACE_FIELD_NAMES_IGNORED_2XX why: "A field name with injected whitespace is an unknown key, which the decoder ignores; TMI declares no additionalProperties:false so the 2xx is the documented contract. Verified all 29 findings mangled only optional fields -- no required field was bypassed." when: @@ -1042,7 +1042,7 @@ rules: # rule 67: POST to an existing singleton resource # /me/preferences is a per-user singleton; POST creates and PUT updates. Once # the fuzzing identity has preferences, every later POST is correctly a 409. - # rule 67 of 103: + # rule 67 of 104: - id: PREFERENCES_ALREADY_EXIST_409 why: "/me/preferences is a per-user singleton: POST creates, PUT updates. After the first successful POST every subsequent one is correctly a conflict." when: @@ -1055,7 +1055,7 @@ rules: # holding arbitrary objects are the design. The server still enforces the 1KB # size, the 20-client cap and the ^[a-zA-Z0-9_-]{1,64}$ key pattern in # api/user_preferences_handlers.go, so this is not unbounded storage. - # rule 68 of 103: + # rule 68 of 104: - id: PREFERENCES_FREEFORM_JSON_ECHO why: "UserPreferences declares free-form per-client objects, so echoing an arbitrary JSON payload is correct. Size, client-count and key-pattern limits are still enforced server-side." when: @@ -1066,7 +1066,7 @@ rules: # rule 69: restore of a threat model that is not deleted # Supersedes the wording in the older "not in a deleted state" rule, which no # longer matches -- the server now answers "Threat model is not deleted". - # rule 69 of 103: + # rule 69 of 104: - id: THREAT_MODEL_RESTORE_NOT_DELETED_409 why: "Restoring a threat model that was never deleted is correctly a conflict. The existing 'not in a deleted state' rule no longer matches the server's current wording." when: @@ -1081,7 +1081,7 @@ rules: # answering 404 for an unknown provider and 403 for a known one would turn # this endpoint into a provider-existence oracle. This only became reachable # in 1.6.4; before #650 the route returned 401 to everyone. - # rule 70 of 103: + # rule 70 of 104: - id: SAML_USERS_CROSS_PROVIDER_403 why: "Cross-provider SAML user listing is correctly 403, and deliberately does not distinguish a nonexistent provider from a foreign one -- 404 here would leak which providers exist. RandomResources expects 404." when: @@ -1095,7 +1095,7 @@ rules: # openapi3filter rejected a fuzzed request that violates the OpenAPI request # schema (bad enum in /type, wrong query-param value, etc.). 400 is documented # on these operations; the rejection is correct. - # rule 71 of 103: + # rule 71 of 104: - id: OPENAPI3FILTER_REQUEST_VALIDATION_400 why: "openapi3filter rejected a request that violates the OpenAPI request schema (bad enum/type/query param). 400 documented; correct validation. Input-mutation fuzzers expect 2xx." when: @@ -1104,7 +1104,7 @@ rules: # A threat-model authorization array with duplicate subjects is correctly # rejected. 400 documented; HappyPath/boundary fuzzers built duplicates. - # rule 72 of 103: + # rule 72 of 104: - id: DUPLICATE_AUTHZ_SUBJECT_400 why: "Server correctly rejects an authorization array with duplicate subjects. 400 documented; fuzzers built duplicate subjects and expected 2xx." when: @@ -1113,7 +1113,7 @@ rules: # Conditionally-required field enforcement (target_field required when # target_type=threat_classification). RemoveFields dropped the field. - # rule 73 of 103: + # rule 73 of 104: - id: CONDITIONAL_REQUIRED_FIELD_400 why: "Server correctly enforces a conditionally-required field. 400 documented; RemoveFields dropped the field and expected 2xx." when: @@ -1122,7 +1122,7 @@ rules: # A survey response not in draft/needs_revision is immutable; update attempts # correctly conflict. 409 documented. - # rule 74 of 103: + # rule 74 of 104: - id: SURVEY_RESPONSE_STATUS_LOCKED_409 why: "A survey response outside draft/needs_revision is correctly immutable; update attempts conflict. 409 documented." when: @@ -1130,7 +1130,7 @@ rules: json_body.error_description: { contains: "Can only update responses in draft or needs_revision" } # Bulk create with an example id that already exists is correctly a conflict. - # rule 75 of 103: + # rule 75 of 104: - id: BULK_RESOURCE_ALREADY_EXISTS_409 why: "Creating a resource whose id already exists is correctly a conflict. 409 documented; ExamplesFields reused a seeded id." when: @@ -1141,7 +1141,7 @@ rules: # additionalProperties:false-under-allOf and oneOf/discriminator (issue #674). # Verified conformant three ways on exactly these paths. Scoped to 2xx so the # /oauth2/authorize 404 (different cause) is not matched here. - # rule 76 of 103: + # rule 76 of 104: - id: RESPONSE_SCHEMA_COMPOSITION_FP_674 why: "Response body conforms; CATS' validator mishandles additionalProperties:false-under-allOf and oneOf/discriminator (issue #674). Verified conformant on these paths (webhook delivery GETs re-checked with openapi-schema-validator OAS30, run 20260926T222641Z)." when: @@ -1159,7 +1159,7 @@ rules: # /oauth2/authorize correctly redirects to the client callback; the 404 + HTML # body is emitted by the (non-running) callback stub, not TMI. - # rule 77 of 103: + # rule 77 of 104: - id: OAUTH_AUTHORIZE_CALLBACK_404_FP why: "The 404/HTML is from the client callback stub reached via redirect, not TMI. /oauth2/authorize redirected correctly." when: @@ -1169,7 +1169,7 @@ rules: # Body-optional action endpoints (collaborate, chat/sessions, rollback) ignore # a garbage request body and succeed. - # rule 78 of 103: + # rule 78 of 104: - id: INVALID_JSON_IGNORED_ON_ACTION_2XX why: "Body-optional action endpoints ignore a garbage request body and succeed; 2xx is correct." when: @@ -1184,7 +1184,7 @@ rules: # Injected template expression is stored/echoed verbatim (response still # contains raw ${...}); no evaluation. A real evaluated SSTI would not echo the # literal ${ and stays surfaced. - # rule 79 of 103: + # rule 79 of 104: - id: SSTI_TEMPLATE_STORED_VERBATIM_FP why: "Template payload stored/echoed verbatim (response contains raw ${...}); no evaluation. A real evaluated SSTI would not contain the literal ${ and is not matched." when: @@ -1193,7 +1193,7 @@ rules: response_body: { contains: "${" } # An empty request body on a write is correctly rejected with 400. - # rule 80 of 103: + # rule 80 of 104: - id: EMPTY_BODY_REJECTED_400 why: "A write with an empty body is correctly rejected with 400; EmptyBody fuzzer expects 2xx." when: @@ -1202,7 +1202,7 @@ rules: # The diagram fixture was not actually deleted during the run (returns 200 to # the model GET later), so its metadata correctly returns 200. - # rule 81 of 103: + # rule 81 of 104: - id: DELETED_CHECK_LIVE_DIAGRAM_METADATA_200 why: "Diagram fixture was not actually deleted (returns 200 to model GET later); its metadata correctly returns 200. Delete precondition unmet." when: @@ -1214,7 +1214,7 @@ rules: # TMI accepts and ignores unknown extra fields (request schemas are not # additionalProperties:false); a 2xx from NewFields is correct. - # rule 82 of 103: + # rule 82 of 104: - id: UNKNOWN_FIELDS_ACCEPTED_2XX why: "TMI accepts and ignores unknown extra fields; a 2xx from NewFields is correct permissive behavior, not a defect." when: @@ -1223,7 +1223,7 @@ rules: # String `format` is an annotation, not enforced on free-text fields; accepting # a wrong-format value with 2xx is by design. - # rule 83 of 103: + # rule 83 of 104: - id: STRING_FORMAT_NOT_ENFORCED_2XX why: "String format is advisory on free-text fields; accepting a wrong-format value with 2xx is by design." when: @@ -1235,7 +1235,7 @@ rules: # Free-text fields have no maxLength; accepting very large (unicode) strings # with 2xx is by design. - # rule 84 of 103: + # rule 84 of 104: - id: LARGE_STRINGS_ACCEPTED_2XX why: "Free-text fields are unbounded by design; accepting very large strings with 2xx is correct." when: @@ -1246,7 +1246,7 @@ rules: - VeryLargeUnicodeStringsInFields # Zero-width characters in header values are tolerated; a 2xx is correct. - # rule 85 of 103: + # rule 85 of 104: - id: ZEROWIDTH_HEADER_TOLERATED_2XX why: "Zero-width characters in header values are tolerated; a 2xx is correct, not a defect." when: @@ -1254,7 +1254,7 @@ rules: fuzzer: { equals: ZeroWidthCharsInValuesHeaders } # Homoglyph characters in a free-text (non-strict-enum) field are accepted. - # rule 86 of 103: + # rule 86 of 104: - id: HOMOGLYPH_FIELD_ACCEPTED_2XX why: "Homoglyph characters in a free-text field are accepted with 2xx; the targeted field is not a strict enum." when: @@ -1262,7 +1262,7 @@ rules: fuzzer: { equals: HomoglyphEnumFields } # A dummy well-formed request on a no-required-body endpoint succeeds. - # rule 87 of 103: + # rule 87 of 104: - id: DUMMY_REQUEST_ACCEPTED_2XX why: "A dummy well-formed request on an endpoint without required-body fields succeeds; 2xx is correct." when: @@ -1271,7 +1271,7 @@ rules: # PATCH bodies may only touch a field allowlist; a JSON-Patch op targeting a # disallowed/garbage field path is correctly rejected with 400. - # rule 88 of 103: + # rule 88 of 104: - id: PATCH_FIELD_NOT_ALLOWED_400 why: "PATCH enforces a field allowlist; a JSON-Patch op on a disallowed/garbage field path is correctly rejected. 400 documented; fuzzers sent mangled JSON Pointers." when: @@ -1280,7 +1280,7 @@ rules: # Feedback cross-field rule: false_positive_reason is only valid when # target_type=threat; other combinations are correctly rejected with 400. - # rule 89 of 103: + # rule 89 of 104: - id: FEEDBACK_CROSS_FIELD_TARGET_TYPE_400 why: "Feedback cross-field validation (false_positive_reason valid only for target_type=threat) correctly rejects invalid combinations. 400 documented." when: @@ -1291,7 +1291,7 @@ rules: # which CATS cannot generate; 401 "Invalid webhook signature" is the # documented correct rejection. Coverage gap (a signing hook) tracked # separately. - # rule 90 of 103: + # rule 90 of 104: - id: WEBHOOK_SIGNATURE_401 why: "Webhook-delivery endpoints require an HMAC signature CATS cannot generate; 401 'Invalid webhook signature' is the documented correct rejection (run 20260820T034449Z cluster 1)." when: @@ -1302,7 +1302,7 @@ rules: # POST .../test on an operator-pinned subscription is deliberately refused; # 403 documented, behavior unit-pinned. Real coverage restored by the # non-pinned per-path refData override. - # rule 91 of 103: + # rule 91 of 104: - id: PINNED_SUBSCRIPTION_TEST_403 why: "Refusing test deliveries on operator-pinned subscriptions is deliberate, unit-pinned behavior; 403 documented (run 20260820T034449Z cluster 2)." when: @@ -1312,7 +1312,7 @@ rules: # Header/field fuzzers replay the run's shared base body; after the first # 201 creates the group, every replay gets the documented duplicate 409. - # rule 92 of 103: + # rule 92 of 104: - id: ADMIN_GROUPS_DUPLICATE_409 why: "Header/field fuzzers replay the same base body; after the first 201 the duplicate-group rejection is the documented correct response (run 20260820T034449Z cluster 3)." when: @@ -1323,7 +1323,7 @@ rules: # create_threat_model is one-shot: the first success transitions the survey # response out of ready_for_review, later calls correctly 409. - # rule 93 of 103: + # rule 93 of 104: - id: SURVEY_RESPONSE_ONE_SHOT_409 why: "create_threat_model is one-shot per survey response; after the first success the status-guard 409 is the documented correct response (run 20260820T034449Z cluster 4)." when: @@ -1333,7 +1333,7 @@ rules: # offset has minimum:0 and no documented maximum; an empty page for a # beyond-the-end offset is conformant pagination. - # rule 94 of 103: + # rule 94 of 104: - id: SAML_USERS_HUGE_OFFSET_200 why: "offset has no documented maximum; an empty result page for an out-of-range offset is correct pagination, 200 documented (run 20260820T034449Z cluster 6)." when: @@ -1344,7 +1344,7 @@ rules: # addon_id on a client credential / automation user requires direct_write; # CATS fills addon_id without direct_write=true, so the cross-field 400 is # correct (documented). - # rule 95 of 103: + # rule 95 of 104: - id: ADDON_ID_REQUIRES_DIRECT_WRITE_400 why: "addon_id without direct_write is a documented cross-field 400; CATS' generated body sets addon_id alone (run 20260926T222641Z)." when: @@ -1355,7 +1355,7 @@ rules: # The seeded webhook delivery is already terminal (delivered/failed), so a # cancel correctly conflicts. 409 documented. - # rule 96 of 103: + # rule 96 of 104: - id: WEBHOOK_DELIVERY_CANCEL_TERMINAL_409 why: "The seeded delivery is already terminal; cancelling it is correctly a documented 409 (run 20260926T222641Z)." when: @@ -1366,7 +1366,7 @@ rules: # false_positive_reason is only valid with sentiment=down; RemoveFields drops # sentiment-dependent fields and trips the documented cross-field 400. - # rule 97 of 103: + # rule 97 of 104: - id: FEEDBACK_FP_REASON_REQUIRES_DOWN_400 why: "false_positive_reason with sentiment!=down is a documented cross-field 400 (run 20260926T222641Z)." when: @@ -1377,7 +1377,7 @@ rules: # The server ignores malformed or missing optional headers on this GET and # serves the delivery; a 200 is harmless and conformant. - # rule 98 of 103: + # rule 98 of 104: - id: WEBHOOK_DELIVERY_GET_IGNORES_BAD_HEADERS_200 why: "Malformed/missing optional headers are ignored on GET /webhook-deliveries/{delivery_id}; the 200 is conformant and leaks nothing (run 20260926T222641Z)." when: @@ -1390,7 +1390,7 @@ rules: # (survey_json, answers, the UserPreferences root) in its response-schema # check; CATS 13.8.0 scored the same responses `success`, and a strict # OpenAPI 3.0 validator finds 0 errors in the bodies. - # rule 99 of 103: + # rule 99 of 104: - id: FREEFORM_OBJECT_SCHEMA_WARN why: "CATS 14.0.0 flags valid free-form additionalProperties:true content (survey_json, answers, UserPreferences) as a response-schema mismatch; bodies validate under OAS 3.0 (run 20261008T002516Z)." when: @@ -1409,7 +1409,7 @@ rules: # CATS fills the threats list's score_* and created_*/modified_* filters # with random values and sometimes sends an inverted (empty) range; since # #1063 the server correctly rejects it with a documented 400 invalid_input. - # rule 100 of 103: + # rule 100 of 104: - id: THREATS_LIST_EMPTY_RANGE_400 why: "Random score/date bounds sometimes form an empty range; since #1063 that is a documented 400 invalid_input (run 20261008T195714Z)." when: @@ -1421,7 +1421,7 @@ rules: # CATS generates JSON Patch documents with random `path` values; since #1074 # threat-model note PATCH rejects paths outside the patchable fields with a # documented 400 instead of silently ignoring them. - # rule 101 of 103: + # rule 101 of 104: - id: NOTE_PATCH_NON_PATCHABLE_PATH_400 why: "Random JSON Patch paths are not patchable note fields; since #1074 that is a documented 400 invalid_input (run 20261008T195714Z)." when: @@ -1432,7 +1432,7 @@ rules: # CATS reuses the same example group for every create, so after the first # success each POST is a documented 409 conflict (details.code duplicate_group). - # rule 102 of 103: + # rule 102 of 104: - id: ADMIN_GROUPS_CREATE_DUPLICATE_409 why: "CATS re-sends the same example group; creating it again is a documented 409 conflict (run 20261008T195714Z)." when: @@ -1443,7 +1443,7 @@ rules: # After fuzzing, the seeded audit entry's version snapshot has been pruned, # so a rollback is a documented 410 gone. - # rule 103 of 103: + # rule 103 of 104: - id: AUDIT_ROLLBACK_SNAPSHOT_PRUNED_410 why: "The seeded entry's version snapshot is pruned by the time rollback is fuzzed; that is a documented 410 gone (run 20261008T195714Z)." when: @@ -1451,3 +1451,15 @@ rules: method: POST contract_path: { equals: "/threat_models/{threat_model_id}/audit_trail/{entry_id}/rollback" } json_body.error_description: { contains: "version snapshot has been pruned" } + + # request_access re-sends an access request only for a document in + # pending_access; the seeded document is accessible, so every fuzzed POST is + # the documented 409 conflict. + # rule 104 of 104: + - id: DOCUMENT_REQUEST_ACCESS_NOT_PENDING_409 + why: "The seeded document is not in pending_access, so re-requesting access is a documented 409 conflict (run 20261018T090326Z)." + when: + response_code: 409 + method: POST + contract_path: { equals: "/threat_models/{threat_model_id}/documents/{document_id}/request_access" } + json_body.error_description: { contains: "Only pending_access documents can have access requested" } diff --git a/test/integration/workflows/user_api_rate_limit_test.go b/test/integration/workflows/user_api_rate_limit_test.go new file mode 100644 index 00000000..ebab1669 --- /dev/null +++ b/test/integration/workflows/user_api_rate_limit_test.go @@ -0,0 +1,115 @@ +package workflows + +import ( + "encoding/json" + "fmt" + "os" + "strconv" + "testing" + + "github.com/ericfitz/tmi/test/integration/framework" +) + +// TestUserAPIRateLimiting_Integration verifies the per-user API rate limiter +// on authenticated REST routes (#1103): a fresh user's quota is lowered by an +// admin, then the user's requests are counted and rejected with 429 once over +// the limit. +// Requires: running TMI server + Redis AND rate limiting enabled at the server +// (TMI_TEST_ENABLE_RATE_LIMITING=true); skips otherwise. +func TestUserAPIRateLimiting_Integration(t *testing.T) { + if os.Getenv("INTEGRATION_TESTS") != "true" { + t.Skip("Skipping integration test (set INTEGRATION_TESTS=true to run)") + } + + serverURL := os.Getenv("TMI_SERVER_URL") + if serverURL == "" { + serverURL = "http://localhost:8080" + } + + if !framework.IsRateLimitingActive(serverURL) { + t.Skip("Rate limiting is not active on the server; skipping per-user rate-limit assertions") + } + + const quota = 5 + _ = framework.ClearRateLimits() + + userID := framework.UniqueUserID() + userTokens, err := framework.AuthenticateUser(userID) + framework.AssertNoError(t, err, "AuthenticateUser failed") + userClient, err := framework.NewClient(serverURL, userTokens, framework.WithValidation(false)) + framework.AssertNoError(t, err, "Failed to create user client") + + adminTokens, err := framework.AuthenticateAdmin() + framework.AssertNoError(t, err, "AuthenticateAdmin failed") + adminClient, err := framework.NewClient(serverURL, adminTokens, framework.WithValidation(false)) + framework.AssertNoError(t, err, "Failed to create admin client") + + db, err := framework.NewDevDatabase() + framework.AssertNoError(t, err, "Failed to open database") + defer db.Close() + userUUID, err := db.QueryString(fmt.Sprintf( + "SELECT internal_uuid FROM users WHERE provider_user_id = '%s' AND provider = 'tmi' FETCH FIRST 1 ROWS ONLY", userID)) + if err != nil || userUUID == "" { + t.Fatalf("Could not look up internal UUID for %s (err=%v)", userID, err) + } + + quotaPath := "/admin/quotas/users/" + userUUID + resp, err := adminClient.Do(framework.Request{ + Method: "PUT", + Path: quotaPath, + Body: map[string]interface{}{"max_requests_per_minute": quota}, + }) + framework.AssertNoError(t, err, "PUT user quota failed") + if resp.StatusCode != 200 && resp.StatusCode != 201 { + t.Fatalf("Expected 200/201 setting quota, got %d; body: %s", resp.StatusCode, string(resp.Body)) + } + t.Cleanup(func() { + _, _ = adminClient.Do(framework.Request{Method: "DELETE", Path: quotaPath}) + _ = framework.ClearRateLimits() + }) + _ = framework.ClearRateLimits() + + prevRemaining := -1 + var limited bool + for i := 1; i <= quota+1; i++ { + resp, err := userClient.Do(framework.Request{Method: "GET", Path: "/threat_models"}) + framework.AssertNoError(t, err, fmt.Sprintf("Request %d failed", i)) + + if got := resp.Headers.Get("X-RateLimit-Limit"); got != strconv.Itoa(quota) { + t.Fatalf("Request %d: X-RateLimit-Limit = %q, want %d", i, got, quota) + } + remaining, convErr := strconv.Atoi(resp.Headers.Get("X-RateLimit-Remaining")) + framework.AssertNoError(t, convErr, "X-RateLimit-Remaining not an integer") + if resp.StatusCode == 429 { + limited = true + // The exhausted window reports 0 remaining, the same as the last allowed request. + if remaining != 0 { + t.Errorf("Request %d: X-RateLimit-Remaining on 429 = %d, want 0", i, remaining) + } + if i <= quota { + t.Errorf("Request %d was rate limited before the quota of %d was used", i, quota) + } + if resp.Headers.Get("Retry-After") == "" { + t.Error("Missing Retry-After header on 429 response") + } + var body struct { + Error string `json:"error"` + } + framework.AssertNoError(t, json.Unmarshal(resp.Body, &body), "decode 429 body") + if body.Error != "rate_limit_exceeded" { + t.Errorf("429 error = %q, want rate_limit_exceeded", body.Error) + } + break + } + if resp.StatusCode != 200 { + t.Fatalf("Request %d: expected 200, got %d; body: %s", i, resp.StatusCode, string(resp.Body)) + } + if prevRemaining >= 0 && remaining >= prevRemaining { + t.Errorf("Request %d: X-RateLimit-Remaining %d did not decrease from %d", i, remaining, prevRemaining) + } + prevRemaining = remaining + } + if !limited { + t.Fatalf("No 429 after %d requests with a quota of %d", quota+1, quota) + } +} diff --git a/test/seeds/cats-seed-data.json b/test/seeds/cats-seed-data.json index 06e12acc..629e9a3a 100644 --- a/test/seeds/cats-seed-data.json +++ b/test/seeds/cats-seed-data.json @@ -106,12 +106,26 @@ "severity": "high", "priority": "high", "status": "identified" + }, + { + "name": "CATS Throwaway Threat", + "description": "Throwaway threat consumed by DELETE fuzzing so the real fixture survives", + "threat_type": [ + "Tampering" + ], + "severity": "high", + "priority": "high", + "status": "identified" } ], "diagrams": [ { "name": "CATS Test Diagram", "type": "DFD-1.0.0" + }, + { + "name": "CATS Throwaway Diagram", + "type": "DFD-1.0.0" } ], "documents": [ @@ -119,6 +133,11 @@ "name": "CATS Test Document", "uri": "https://example.com/cats-test-document.pdf", "description": "Test document for CATS fuzzing" + }, + { + "name": "CATS Throwaway Document", + "uri": "https://example.com/cats-throwaway-document.pdf", + "description": "Throwaway document consumed by DELETE fuzzing" } ], "assets": [ @@ -126,17 +145,31 @@ "name": "CATS Test Asset", "description": "Test asset for CATS fuzzing", "type": "software" + }, + { + "name": "CATS Throwaway Asset", + "description": "Throwaway asset consumed by DELETE fuzzing", + "type": "software" } ], "notes": [ { "name": "CATS Test Note", "content": "CATS test note for comprehensive API fuzzing" + }, + { + "name": "CATS Throwaway Note", + "content": "Throwaway note consumed by DELETE fuzzing" } ], "repositories": [ { - "uri": "https://github.com/example/cats-test-repo" + "uri": "https://github.com/example/cats-test-repo", + "name": "CATS Test Repository" + }, + { + "name": "CATS Throwaway Repository", + "uri": "https://github.com/example/cats-throwaway-repo" } ], "feedback": [ @@ -201,6 +234,29 @@ "settings": { "allow_threat_model_linking": true } + }, + { + "name": "CATS Throwaway Survey", + "description": "Throwaway survey consumed by DELETE fuzzing; has no responses", + "version": "1.0", + "status": "active", + "survey_json": { + "pages": [ + { + "name": "page1", + "elements": [ + { + "type": "text", + "name": "project_name", + "title": "Project Name" + } + ] + } + ] + }, + "settings": { + "allow_threat_model_linking": true + } } ], "survey_responses": [ @@ -324,7 +380,7 @@ "value": "cats-test-value" }, { - "target": "repo:cats-test-threat-model:", + "target": "repo:cats-test-threat-model:cats-test-repository", "target_kind": "repository", "key": "cats-test-key", "value": "cats-test-value"