Commit faca52a
committed
studio: username/password login gate — all routes protected
serve.py grows an Auth helper: SHADOWLM_PASSWORD (+ SHADOWLM_USER, default admin)
enables a login that mints HMAC-signed, 12h bearer tokens (key=sha256(password),
no server-side session store, survives restarts, unforgeable without the pw).
New public routes GET /v1/auth (UI asks if login is needed) and POST /v1/login
(credentials -> token); every other /v1 route requires a valid bearer — the
signed token or the legacy SHADOWLM_API_KEY. Auth stays OFF when nothing is set.
Frontend: App splits into a gate -> Login screen -> Studio shell. The token is
stored as the existing slm_api_key bearer, so all api() calls carry it untouched;
a 401 anywhere clears it and bounces back to login. Sign-out button added.
7 Auth unit tests (login, token roundtrip, forgery/tamper/expiry rejection,
legacy api-key, disabled-by-default).1 parent c4f7586 commit faca52a
9 files changed
Lines changed: 296 additions & 35 deletions
File tree
- frontend/src
- shadowlm
- _static
- assets
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | | - | |
| 5 | + | |
| 6 | + | |
5 | 7 | | |
6 | | - | |
7 | | - | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
8 | 13 | | |
9 | 14 | | |
10 | 15 | | |
| |||
31 | 36 | | |
32 | 37 | | |
33 | 38 | | |
| 39 | + | |
34 | 40 | | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
35 | 144 | | |
36 | 145 | | |
37 | 146 | | |
38 | 147 | | |
39 | | - | |
40 | 148 | | |
41 | 149 | | |
42 | 150 | | |
| |||
92 | 200 | | |
93 | 201 | | |
94 | 202 | | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | 203 | | |
100 | 204 | | |
101 | 205 | | |
| |||
108 | 212 | | |
109 | 213 | | |
110 | 214 | | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
111 | 222 | | |
112 | 223 | | |
113 | 224 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
| 77 | + | |
77 | 78 | | |
78 | 79 | | |
79 | 80 | | |
80 | 81 | | |
81 | 82 | | |
82 | 83 | | |
83 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
84 | 90 | | |
85 | 91 | | |
86 | 92 | | |
87 | 93 | | |
88 | 94 | | |
89 | 95 | | |
90 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
91 | 117 | | |
92 | 118 | | |
93 | 119 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
This file was deleted.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
This file was deleted.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
9 | | - | |
| 8 | + | |
| 9 | + | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
| 20 | + | |
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
| |||
502 | 504 | | |
503 | 505 | | |
504 | 506 | | |
505 | | - | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
| 532 | + | |
| 533 | + | |
| 534 | + | |
| 535 | + | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
506 | 565 | | |
507 | 566 | | |
508 | 567 | | |
| |||
522 | 581 | | |
523 | 582 | | |
524 | 583 | | |
525 | | - | |
| 584 | + | |
526 | 585 | | |
527 | 586 | | |
528 | | - | |
| 587 | + | |
529 | 588 | | |
530 | | - | |
| 589 | + | |
531 | 590 | | |
532 | 591 | | |
533 | 592 | | |
| |||
570 | 629 | | |
571 | 630 | | |
572 | 631 | | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
573 | 635 | | |
574 | 636 | | |
575 | 637 | | |
| |||
650 | 712 | | |
651 | 713 | | |
652 | 714 | | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
653 | 724 | | |
654 | 725 | | |
655 | | - | |
656 | 726 | | |
657 | 727 | | |
658 | 728 | | |
| |||
759 | 829 | | |
760 | 830 | | |
761 | 831 | | |
762 | | - | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
763 | 835 | | |
764 | 836 | | |
765 | 837 | | |
766 | 838 | | |
767 | 839 | | |
768 | | - | |
| 840 | + | |
769 | 841 | | |
770 | 842 | | |
771 | 843 | | |
772 | | - | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
773 | 847 | | |
774 | | - | |
| 848 | + | |
775 | 849 | | |
776 | 850 | | |
777 | 851 | | |
| |||
0 commit comments