Skip to content

Commit 7523bda

Browse files
authored
Merge pull request #249 from Optic00/codex/v2-asset-creator-privacy
fix: omit creator email from v2 asset responses
2 parents 337bd53 + 7663811 commit 7523bda

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

internal/restapi/v2/assets.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,10 @@ func registerAssetCRUDRoutes(builder *routeBuilder, app *services.AssetApplicati
488488
return nil, Pagination{}, 0, err
489489
}
490490
items, total, err := app.ListAssets(user.ID, setID, repository.AssetListFilter{AssetTypeID: r.URL.Query().Get("type_id"), CategoryID: r.URL.Query().Get("category_id"), IncludeSubcategories: r.URL.Query().Get("include_subcategories") != "false", StatusID: r.URL.Query().Get("status_id"), Search: r.URL.Query().Get("search"), Limit: page.PageSize, Offset: page.Offset}, r.URL.Query().Get("ql"))
491+
// ListAssets returns a newly allocated result slice for this request.
492+
for i := range items {
493+
items[i].CreatorEmail = ""
494+
}
491495
return items, page, total, assetError(err)
492496
})
493497
builder.JSON(http.MethodPost, collection, http.StatusCreated, false, AuthAuthenticated, []string{"assets:write"}, func(r *http.Request, input assetInput) (*models.Asset, error) {
@@ -496,15 +500,15 @@ func registerAssetCRUDRoutes(builder *routeBuilder, app *services.AssetApplicati
496500
return nil, err
497501
}
498502
result, err := app.CreateAsset(user.ID, setID, auditActor(r, user), assetMutation(input))
499-
return result, assetError(err)
503+
return assetWithoutCreatorEmail(result), assetError(err)
500504
})
501505
builder.Read(item, AuthAuthenticated, []string{"assets:read"}, func(r *http.Request) (*models.Asset, error) {
502506
user, id, err := assetTarget(r, "asset_id")
503507
if err != nil {
504508
return nil, err
505509
}
506510
result, err := app.GetAsset(user.ID, id)
507-
return result, assetError(err)
511+
return assetWithoutCreatorEmail(result), assetError(err)
508512
})
509513
builder.JSON(http.MethodPatch, item, http.StatusOK, true, AuthAuthenticated, []string{"assets:write"}, func(r *http.Request, input assetPatchInput) (*models.Asset, error) {
510514
user, id, err := assetTarget(r, "asset_id")
@@ -516,7 +520,7 @@ func registerAssetCRUDRoutes(builder *routeBuilder, app *services.AssetApplicati
516520
return nil, err
517521
}
518522
result, err := app.UpdateAsset(user.ID, id, auditActor(r, user), patch)
519-
return result, assetError(err)
523+
return assetWithoutCreatorEmail(result), assetError(err)
520524
})
521525
builder.Command(http.MethodDelete, item, AuthAuthenticated, []string{"assets:delete"}, func(r *http.Request) error {
522526
user, id, err := assetTarget(r, "asset_id")
@@ -575,6 +579,19 @@ func registerAssetCRUDRoutes(builder *routeBuilder, app *services.AssetApplicati
575579
})
576580
}
577581

582+
// Asset access does not authorize disclosure of user email addresses. Match
583+
// the v1 asset contract: callers needing an email must use the user API and its
584+
// separate permissions. Copy the model so response redaction cannot affect
585+
// service-owned state; the public and session mounts share this representation.
586+
func assetWithoutCreatorEmail(asset *models.Asset) *models.Asset {
587+
if asset == nil {
588+
return nil
589+
}
590+
result := *asset
591+
result.CreatorEmail = ""
592+
return &result
593+
}
594+
578595
func assetMutation(input assetInput) services.AssetMutationInput {
579596
return services.AssetMutationInput{AssetTypeID: input.AssetTypeID, CategoryID: input.CategoryID, StatusID: input.StatusID, Title: input.Title, Description: input.Description, AssetTag: input.AssetTag, CustomFieldValues: input.CustomFieldValues}
580597
}

0 commit comments

Comments
 (0)