@@ -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+
578595func 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