Compare commits
1
Commits
8a13fb527e
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
528eaafb18 |
@@ -60,24 +60,33 @@ only for permitted operators.
|
|||||||
|
|
||||||
### Requirement: Saving requires a live gate and an OTP
|
### Requirement: Saving requires a live gate and an OTP
|
||||||
Saving a cropped picture (`/cropper/profile/picture`) SHALL verify the crop
|
Saving a cropped picture (`/cropper/profile/picture`) SHALL verify the crop
|
||||||
permission live (bypassing the cache) and SHALL require an OTP from the
|
permission live (bypassing the cache) and SHALL authenticate the operator with
|
||||||
operator, forwarding the session phone as the validating identity together
|
the session's PocketBase token, sent to a2loft as a bearer credential; no OTP
|
||||||
with the OTP and the picture's domain to a2loft. A denied or OTP-less save
|
SHALL be collected or forwarded. The picture's domain SHALL come from a2loft's
|
||||||
SHALL not reach a2loft.
|
own record for the upload (`dims/picture/{uploadId}` → `domainCode`), falling
|
||||||
|
back to the queue item's label, and SHALL match a path-safe pattern before it
|
||||||
|
is used in the request. A denied save SHALL not reach a2loft.
|
||||||
|
|
||||||
#### Scenario: Successful save
|
#### Scenario: Successful save
|
||||||
- **WHEN** a permitted operator saves with an OTP
|
- **WHEN** a permitted operator saves
|
||||||
- **THEN** the route verifies the live gate and forwards the picture to
|
- **THEN** the route verifies the live gate and forwards the picture to
|
||||||
a2loft with the session phone, OTP, and picture domain
|
a2loft with the session token as a bearer credential and the profile's
|
||||||
|
resolved domain
|
||||||
|
|
||||||
#### Scenario: Denied save does not reach a2loft
|
#### Scenario: Denied save does not reach a2loft
|
||||||
- **WHEN** the live crop check denies, or the OTP is missing
|
- **WHEN** the live crop check denies, or the request carries no message body
|
||||||
- **THEN** the route answers 403/400 and makes no a2loft call
|
- **THEN** the route answers 403/400 and makes no a2loft call
|
||||||
|
|
||||||
|
#### Scenario: Unsafe domain values are refused
|
||||||
|
- **WHEN** neither a2loft's record nor the queue label yields a path-safe
|
||||||
|
domain
|
||||||
|
- **THEN** the save is refused with 400 and a2loft is not contacted
|
||||||
|
|
||||||
### Requirement: Unified login — no separate artist login
|
### Requirement: Unified login — no separate artist login
|
||||||
The cropper SHALL NOT implement its own login. The operator's identity comes
|
The cropper SHALL NOT implement its own login. The operator's identity comes
|
||||||
from the YOUreka session (phone prefilled), the picture's metadata carries the
|
from the YOUreka session and is presented to a2loft as the session's PocketBase
|
||||||
domain, and the only credential the operator supplies is the save-time OTP.
|
token; the picture's own metadata carries the domain. The cropper collects no
|
||||||
|
other credential — there is no save-time OTP.
|
||||||
|
|
||||||
#### Scenario: Phone prefilled from the session
|
#### Scenario: Phone prefilled from the session
|
||||||
- **WHEN** a signed-in operator opens the cropper
|
- **WHEN** a signed-in operator opens the cropper
|
||||||
|
|||||||
Reference in New Issue
Block a user