Story: Guard the curve-snapshot reads

Table of Contents

This page documents a story in Sprint 27. It captures the goal, current status, acceptance criteria, and the tasks that compose it.

1. Goal

The curve-snapshot reads answer only a caller that holds the read permission, and the permission is seeded, so a signed-in member cannot read every tenant's curve points.

2. Status

Field Value
State DONE
Parent sprint Sprint 27
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-10-09

3. Acceptance

  • curve_snapshot_handler checks marketdata::curve_snapshots:read.
  • The permission is seeded in the IAM permission catalogue.

4. Tasks

Task State Start End Description
         

5. Decisions

6. Out of scope

7. Promoted from capture

Captured 2026-10-06 in the product backlog; promoted preserving the UUID.

7.1. What

curve_snapshot_handler checked no permission and no curve-snapshot read code was seeded in iam_permissions_populate.sql, so any authenticated caller could read every tenant's curve points. The republish and compute handlers did check marketdata::curve_bootstrap:republish and :compute, so this was an oversight on the read side.

7.2. Resolution

The defect was closed before the capture was promoted. projects/ores.marketdata/service/include/ores.marketdata.service/messaging/curve_snapshot_handler.hpp checks marketdata::curve_snapshots:read at :81-85 and :121-125, and projects/ores.sql/populate/iam/iam_permissions_populate.sql:1519 seeds it. The story is closed on that evidence and carries no tasks, because no work was left to do when it was promoted.

8. Result

Nothing was built under this story. It exists so the capture that found the defect has a story to close against, and so the sprint does not carry a defect record in the inbox after the defect is gone.

Both acceptance criteria were already met when the capture was promoted:

  • curve_snapshot_handler.hpp checks marketdata::curve_snapshots:read at :81-85 and :121-125.
  • iam_permissions_populate.sql:1519 seeds the code.

The evidence is the story's own ** Resolution above, which the marketdata-curves story's What the tree has moved since the earlier passes section recorded first. No task was opened, because the work the capture asked for was done.

The capture doc/agile/product_backlog/inbox/curve-snapshot-reads-are-unauthenticated.org was removed when the story was promoted, so the inbox no longer offers work that is finished.

Emacs 29.3 (Org mode 9.6.15)