Repository navigation
Commit 18de8ea
committed
fix(purchase): gate scheduler/SQS on typed web source constant (follow-up to #1456)
executableByScheduler gated on the bare literal exec.Source == "web", but
web-originated executions are persisted with Source = common.PurchaseSourceWeb
("cudly-web"). The literal never matched, so a pending/notified web row on a
plan with AutoPurchase=true could be auto-executed by the cron sweep and the
SQS execute_purchase path WITHOUT the required token-link human approval -- a
fail-open on a money path (CodeRabbit CRITICAL thread on #1456, left unaddressed).
Fix:
- manager.go: compare against the typed common.PurchaseSourceWeb constant, not
a stringly-typed literal (repo enum convention).
- manager_test.go / messages_test.go: the prior regression tests set
Source: "web" (matching the buggy gate) and relied on
AssertNotCalled("GetPurchasePlan"); the mock's default GetPurchasePlan stub
does not record the call, so those tests could never detect the bypass. Use
the real persisted value and assert the invariant via a GetPurchasePlanFn
sentinel: web rows must short-circuit before the AutoPurchase plan fetch.
Verified the tests FAIL on the buggy literal and PASS on the fix.1 parent 5c267c5 commit 18de8ea
3 files changed
Lines changed: 43 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
494 | 495 | | |
495 | 496 | | |
496 | 497 | | |
497 | | - | |
498 | | - | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
499 | 501 | | |
500 | 502 | | |
501 | 503 | | |
502 | 504 | | |
503 | 505 | | |
504 | 506 | | |
505 | 507 | | |
506 | | - | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
507 | 513 | | |
508 | 514 | | |
509 | 515 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
386 | 386 | | |
387 | 387 | | |
388 | 388 | | |
389 | | - | |
390 | | - | |
391 | | - | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
392 | 395 | | |
393 | 396 | | |
394 | 397 | | |
| |||
400 | 403 | | |
401 | 404 | | |
402 | 405 | | |
403 | | - | |
| 406 | + | |
404 | 407 | | |
405 | 408 | | |
406 | 409 | | |
407 | 410 | | |
408 | 411 | | |
409 | 412 | | |
410 | | - | |
411 | | - | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
412 | 424 | | |
413 | 425 | | |
414 | 426 | | |
| |||
421 | 433 | | |
422 | 434 | | |
423 | 435 | | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
424 | 439 | | |
425 | 440 | | |
426 | | - | |
427 | 441 | | |
428 | 442 | | |
429 | 443 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| |||
118 | 119 | | |
119 | 120 | | |
120 | 121 | | |
121 | | - | |
| 122 | + | |
122 | 123 | | |
123 | 124 | | |
124 | | - | |
125 | | - | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
126 | 134 | | |
127 | 135 | | |
128 | 136 | | |
129 | 137 | | |
130 | | - | |
| 138 | + | |
| 139 | + | |
131 | 140 | | |
132 | 141 | | |
133 | 142 | | |
| |||
0 commit comments