From cb264bbaaa78e748c669b2259b7d5bd321986a8d Mon Sep 17 00:00:00 2001 From: Brian Krabach Date: Wed, 1 Apr 2026 08:17:28 -0700 Subject: [PATCH] feat: postMessage auth token relay for cross-origin federation login - Backend: AuthMiddleware.dispatch() checks X-Muxplex-Token header after cookie auth, allowing cross-origin federation requests to authenticate using a session token sent as a header instead of a SameSite=Strict cookie. - Backend: GET /api/auth/token endpoint returns the current session token for authenticated requests. Used by login popups to relay the token back to the opener window via postMessage. - Frontend (app.js): api() injects X-Muxplex-Token header for cross-origin requests when a token is stored in localStorage under muxplex.federation_tokens keyed by origin. - Frontend (app.js): storeFederationToken() helper stores tokens. window.addEventListener('message') handler catches muxplex-auth-token postMessages and stores the token, then retriggers a poll so the auth_required source transitions to authenticated immediately. - Frontend (app.js): _saveRemoteInstances() prunes stale tokens for URLs no longer in the remote instances list. - Frontend (index.html): Popup relay script fetches /api/auth/token and sends the token to window.opener via postMessage when loaded as a login popup (window.opener present). Tests added: test_auth.py: X-Muxplex-Token header authenticates / invalid rejected test_api.py: GET /api/auth/token returns token / 401 when unauthed test_app.mjs: api() header injection, storeFederationToken storage, index.html popup script presence --- muxplex/__pycache__/__main__.cpython-313.pyc | Bin 0 -> 282 bytes muxplex/__pycache__/auth.cpython-313.pyc | Bin 8937 -> 9238 bytes muxplex/__pycache__/cli.cpython-313.pyc | Bin 28223 -> 30757 bytes muxplex/__pycache__/main.cpython-313.pyc | Bin 29087 -> 32143 bytes muxplex/__pycache__/service.cpython-313.pyc | Bin 0 -> 10039 bytes muxplex/__pycache__/settings.cpython-313.pyc | Bin 3017 -> 3094 bytes muxplex/__pycache__/ttyd.cpython-313.pyc | Bin 5790 -> 8131 bytes muxplex/auth.py | 6 ++ muxplex/frontend/app.js | 64 +++++++++++++ muxplex/frontend/index.html | 20 +++++ muxplex/frontend/tests/test_app.mjs | 85 ++++++++++++++++++ muxplex/main.py | 15 +++- .../test_api.cpython-313-pytest-9.0.2.pyc | Bin 148586 -> 152921 bytes .../test_auth.cpython-313-pytest-9.0.2.pyc | Bin 60713 -> 63434 bytes .../test_cli.cpython-313-pytest-9.0.2.pyc | Bin 79885 -> 90997 bytes ..._frontend_css.cpython-313-pytest-9.0.2.pyc | Bin 335800 -> 345020 bytes .../test_readme.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 6622 bytes .../test_service.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 56541 bytes ...test_settings.cpython-313-pytest-9.0.2.pyc | Bin 29401 -> 44226 bytes .../test_ttyd.cpython-313-pytest-9.0.2.pyc | Bin 24015 -> 30480 bytes ...test_ws_proxy.cpython-313-pytest-9.0.2.pyc | Bin 24710 -> 30427 bytes muxplex/tests/test_api.py | 24 +++++ muxplex/tests/test_auth.py | 24 +++++ 23 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 muxplex/__pycache__/__main__.cpython-313.pyc create mode 100644 muxplex/__pycache__/service.cpython-313.pyc create mode 100644 muxplex/tests/__pycache__/test_readme.cpython-313-pytest-9.0.2.pyc create mode 100644 muxplex/tests/__pycache__/test_service.cpython-313-pytest-9.0.2.pyc diff --git a/muxplex/__pycache__/__main__.cpython-313.pyc b/muxplex/__pycache__/__main__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7797b034b65e59b91bb8b2a7af082500c6a63fb0 GIT binary patch literal 282 zcmey&%ge<81c6Ibj=u41RO~zX+ zxrv#1ewxg;*yH0<@{{A^Z*fEQ=_Ti67BK@=tz`HNQhdu!KO;XkRX?dHyC^X!FHZOojY52;C_DJ-}#>JJ?CD|m%aDe z%p0P}Au=YT3nwN$FU&V2!v_YT9wC>N>>vs$QFrx`6mqW}K@g&_*$=Qu7PmRWbVrv9 z`>l3--PvPfHHcFGd_&UERY{x*EXfWq;Go<<8#E*ClLNFdX~ef=N5E8i+X#)&;MD;x ziMj%t`K|1}hTq9?zD(olK;tzbM&Vb^a7Ns+8?Tv@{2mhO6%a~=OKGi4vy?JbC>8lX zZ`EvCd5o$;CbW-A2!xRMSY)=y116OCL7qc?lnRzoM$}8r=|f(WINFbdCfbYop@Hs) zfIaut#ewybWi)(xWOVRUdNh3Q%*k}_{kDq$B5rqAi-JBeaO8Npw=X?}&%0|`{onfV zggZtl6#nF1XmokUGPg4YIk+eX^P$Eix#^0q%F8R3s_elhsfVfOHHDUr#g>kOrE}5J zxm>w3dts?EQjjBgYXm=2K4;niNi|~w*mylBbbH%P~AP^nPR%wkU_0RBK za)isxYAsArpqiN}I;`tDP;JcA?l?`F>3UElW;z;ol4gbnRc2;{Vl%rP)Cy*HN1P$f zo9eit?)RWM22_QaV`-IWQ`|_bc^l}Iij<42C{h8kXx_uAA$q==($@q**CDcRuGPZ< ztl)(ADcr=ryyNy7wmExj4UzJ)`1PwFA*<6Dnbi| zie5y-%Sf&0Azr;n5Iu-CvDScyo=VT&yj88IUYtpYWMIDc-v9oYc`$3i&kM0XhM@sp z_cy-Wc$|C{duS_D1mK$9Y}i9+=v6~>#j5Ddjrb&*6thxKsfQ||a+0~`C~J?zF~oL8 za#n~c6bNLo=P4f*{d0AtqLe3k(jaNLZ@eu7++3z_$O_0)g;05z$Vm(rj@5lgSTe9+}Z6-s-2 zUvZ&2+4qNGfloLFDJWg7K|xMI4V9c+!_2|vokJQnpN%ddMw#s#XO|q0@F9S$IC*IY z*&F98`@@?1_9Di?gIP-xyJQf;Nk83o(Q{_**EtDuCaZ$flt`;@r1t4 lXJ5<~%pynj%>rh=$0z;*kBbQ|{{swjd>sG) diff --git a/muxplex/__pycache__/cli.cpython-313.pyc b/muxplex/__pycache__/cli.cpython-313.pyc index 47da95b7f3ffa33f91274955e9db852e17aab701..dadcb0b7356fb2658459e6b1145f7b48c7cca485 100644 GIT binary patch delta 12294 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 delta 9790 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 M#vNl>9bM@E08F>U6aWAK diff --git a/muxplex/__pycache__/main.cpython-313.pyc b/muxplex/__pycache__/main.cpython-313.pyc index 36cab23a26f813f7900e4576abcdd83cc1b76178..5d3d63802fd3cc957ce19ae9cc51ea0e435c3c91 100644 GIT binary patch delta 8624 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 delta 5649 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 O{V#U@=hqw|ACl*Y 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 delta 566 zcmZusziZo25Pp&sOO`DENMc8ERidN;<0VPKL%}A{rO^3J1%q%UVXN4ZImv}A$zCWl z2+}~HdzUU=`VVv{UApz5p&h!FmbQ57)H|o8OCP*@ci(;QyYDWnw_EL{Y3dBmuQ%_) zzQ)*RD*hhhPqKV{-u55JTs>r5<0Y=+Yw$AW=7A2{pfu2VrHy1>9hAB@|FYt5`sd@ebQtKuiAwuvY-DAXx5vnSflT?^BE&7V(aNv8k~RmEul zqrit6+iUS zyz08cD2mfz8pctA8Y_F`3~0_v1~lY)C#^q?{rMy~h8|)PQ*h~vY+~Fwuxzp35?kBi ph9kCb3cDw)me^>BoxZSle>RMk{GQdG?Jt=j$v^DuqtR7J_BT5>hpzwt diff --git a/muxplex/__pycache__/ttyd.cpython-313.pyc b/muxplex/__pycache__/ttyd.cpython-313.pyc index eb1eaf18fc4eb54c0332ff8fd2c68496aaf6fad3..3b8e870f07e3fe585957aede267e3197d7e62a7e 100644 GIT binary patch literal 8131 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 delta 2223 zcmZ8jU2Gf25#GH!lE>rmj(?(lOi?RJwaf}~;z(*DC9>jJwCuE%W1i$bh=D|lXPFko zWA-RJYS2n>i^fm_$jUjX8X$om@{m3o2#^AOaBb%yPiEDE&c#4~(1+wDU?K)-8ldRx zQH+Ehz}cDEnQvxicV~Hb{M`X%*YB4QeCIYk&hLh|lr~)0>ic0((6Gk;*!8@dx(Uj- z)5;riZ0k2+kC<^MP=>P}_eHpLi*?KuIh_%QIfj7HFm8<0mvLugP3!|P> z(Me3F`KXdn!9sQ<;s0R`Brqv}q z=FY*A7O^!g{ftL(Wc^o)2NGxoX+m?&WM4TOZ33p-tiQK*2n5Y`Sby-vw|?pMx(8sg zh?@#gp24FbgtF(*9&YUaacAS-!;v@S2&Z{0+jj`>A&T4#w&HRt_Opr&a2h{?3DR6I zNsC-JnsxS+`Fl_n(t=EyU?}Z)wC;Iy!SXJmF}@33#NZdQF8dEPFn@3W6Rfy{R!y+k zm{pg1y-)HNaZ+6Q8)yB||BN-PoUyJcr@iDWi5_w_n=j{!i{zp~C72;i-?BmUm-FSLgjk;i2G^u) zp+FY0rf!l8I@s!@feNk=dWPxe=dchJ~4B)8_NVvh8JHb7lSI zvh6aQO1%!OnO`hs z3${l)GdZ0~|I`-B`DNW!U(l(On^A0FdiKf$@mQUboXwZ=Ia_4wfnd7H(zkvtj<0!H z#JO^LHAlNZ$IiAn3RmTGw2taWklbGNbya*_RbO|-*Zok9)C9rR@<<8Z9H@qpl~8gg z)L#u9tAvj2ga&t%q3e82cDo{vL}}Br;km)zIQP0*4N)nh2w^WND9 z>d-F2-jFQ^Ydnnq`G-ipHGctBymlxxj^FK{h@(4FYYL+~-6x`;`O{Oasl({5+7A5P zBlvu3Ot_ou1mT{@rtif&Cyw*?p5_=oh8cgH2mU_pO7-yf3De(CV8-`2`on?LD1ZM) z4nKk!KPsfgZ~r-RnLENZ^!I2ND59(d*#T#>4O+UCEjISN2h_TiYdzDY0_U{N^RW9) z+dSB5IOtnX!Ak<2L=!aEENimPH|uV4%{N1HYaUIUIpA#taElde3rqX0tEoz8-Vyl> z(xgk!tgqlV`6-vonycJIO{=Uc4*N8pCXaB?{Q}?5gqz&{xS!VyPDiZy_P&sB2KOQn zO-(qh&7ZxAt#{h5->!8i*b-uW5x5&}vz#+l%Fd`$IyG%g#iG1SJFH*Fh>MDVZ@m{A zOvQk4?qQOn?18cc*2$c^L`b8;l3B`L-K*^|m|TIM`4$l8KJ}tdyEWcl3xs5w?U|d)84GiBv;#~iv!m>l zqHR`B{KaL3v8+YV$AQ?My$)gv7Yw7|+-%CWnm)z|ON@3il3>I+8sam{MsB5`AE)D> zgCl^muxplex +
diff --git a/muxplex/frontend/tests/test_app.mjs b/muxplex/frontend/tests/test_app.mjs index 809f5d4..396cd74 100644 --- a/muxplex/frontend/tests/test_app.mjs +++ b/muxplex/frontend/tests/test_app.mjs @@ -4068,3 +4068,88 @@ test('HTML Sessions panel hidden sessions field appears after bell sound', () => assert.ok(hiddenIdx > bellSoundIdx, 'hidden sessions must appear after bell sound (i.e., near the end)'); }); +// --------------------------------------------------------------------------- +// Federation auth token relay tests (postMessage / X-Muxplex-Token) +// --------------------------------------------------------------------------- + +test('api() includes X-Muxplex-Token header when token exists in localStorage for that origin', async () => { + // Store a fake token for https://remote.example.com + const tokens = { 'https://remote.example.com': 'fake-token-abc123' }; + localStorage.setItem('muxplex.federation_tokens', JSON.stringify(tokens)); + + const calls = []; + globalThis.fetch = (url, opts) => { + calls.push({ url, opts }); + return Promise.resolve({ ok: true, status: 200, json: async () => ([]) }); + }; + + await app.api('GET', '/api/sessions', undefined, 'https://remote.example.com'); + + assert.strictEqual(calls.length, 1); + assert.ok(calls[0].opts.headers['X-Muxplex-Token'] === 'fake-token-abc123', + 'X-Muxplex-Token header must be set to the stored token'); + + // Cleanup + localStorage.removeItem('muxplex.federation_tokens'); +}); + +test('api() does not include X-Muxplex-Token header when no token for that origin', async () => { + // Ensure no tokens stored + localStorage.removeItem('muxplex.federation_tokens'); + + const calls = []; + globalThis.fetch = (url, opts) => { + calls.push({ url, opts }); + return Promise.resolve({ ok: true, status: 200, json: async () => ([]) }); + }; + + await app.api('GET', '/api/sessions', undefined, 'https://remote.example.com'); + + assert.strictEqual(calls.length, 1); + assert.ok(!calls[0].opts.headers['X-Muxplex-Token'], + 'X-Muxplex-Token header must NOT be present when no token stored'); +}); + +test('api() does not include X-Muxplex-Token header for local (no baseUrl) requests', async () => { + // Store a token for some origin, make sure it does not bleed into local requests + const tokens = { 'https://remote.example.com': 'fake-token-abc123' }; + localStorage.setItem('muxplex.federation_tokens', JSON.stringify(tokens)); + + const calls = []; + globalThis.fetch = (url, opts) => { + calls.push({ url, opts }); + return Promise.resolve({ ok: true, status: 200, json: async () => ([]) }); + }; + + await app.api('GET', '/api/sessions'); + + assert.strictEqual(calls.length, 1); + assert.ok(!calls[0].opts.headers['X-Muxplex-Token'], + 'X-Muxplex-Token header must NOT be present for local requests'); + + // Cleanup + localStorage.removeItem('muxplex.federation_tokens'); +}); + +test('postMessage muxplex-auth-token event stores token in localStorage', () => { + // Simulate receiving a postMessage event + localStorage.removeItem('muxplex.federation_tokens'); + + // Find and invoke the message event listener registered by app.js + // The app registers on window.addEventListener('message', ...) in DOMContentLoaded + // We need to directly call storeFederationToken helper or simulate via the listener. + // Since bindStaticEventListeners or DOMContentLoaded registered a 'message' listener on window, + // we call storeFederationToken directly if exported, or test via the exported API. + const result = app.storeFederationToken('https://remote.host.com', 'relay-token-xyz'); + + const stored = JSON.parse(localStorage.getItem('muxplex.federation_tokens') || '{}'); + assert.strictEqual(stored['https://remote.host.com'], 'relay-token-xyz', + 'storeFederationToken must store token keyed by origin in muxplex.federation_tokens'); +}); + +test('index.html contains popup federation auth relay script', () => { + const source = fs.readFileSync(new URL('../index.html', import.meta.url), 'utf8'); + assert.ok(source.includes('window.opener'), 'index.html must contain window.opener check for federation popup relay'); + assert.ok(source.includes('muxplex-auth-token'), 'index.html must post muxplex-auth-token message type'); + assert.ok(source.includes('/api/auth/token'), 'index.html popup script must fetch /api/auth/token'); +}); diff --git a/muxplex/main.py b/muxplex/main.py index 23b32a0..a5b9c7c 100644 --- a/muxplex/main.py +++ b/muxplex/main.py @@ -28,7 +28,7 @@ from fastapi import FastAPI, Form, HTTPException, Request, WebSocket from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from pydantic import BaseModel, field_validator -from starlette.responses import RedirectResponse +from starlette.responses import JSONResponse, RedirectResponse from starlette.middleware.cors import CORSMiddleware from muxplex.auth import ( @@ -733,6 +733,19 @@ async def logout() -> RedirectResponse: return response +@app.get("/api/auth/token") +async def get_auth_token(request: Request): + """Return the current session token for federation relay. + + Only accessible when already authenticated (via cookie or localhost bypass). + Used by the login popup to relay the token back to the opener window via postMessage. + """ + cookie = request.cookies.get("muxplex_session") + if cookie and verify_session_cookie(_auth_secret, cookie, _auth_ttl): + return {"token": cookie} + return JSONResponse({"error": "not authenticated"}, status_code=401) + + @app.get("/auth/mode") async def auth_mode_endpoint(): """Return the current auth mode and running username.""" diff --git a/muxplex/tests/__pycache__/test_api.cpython-313-pytest-9.0.2.pyc b/muxplex/tests/__pycache__/test_api.cpython-313-pytest-9.0.2.pyc index 5e91309aa8318653bca6db40ba20228f4e7a5001..581c7910b6fc89217b84146e907a99bc2596fdb4 100644 GIT binary patch delta 6214 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 delta 4441 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 VB|Xm5k%Gs08j`)1q$XCS$zO;o&jA1c delta 664 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 literal 79885 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 diff --git a/muxplex/tests/__pycache__/test_readme.cpython-313-pytest-9.0.2.pyc b/muxplex/tests/__pycache__/test_readme.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79b90b043256640ef50cf00282d21191735b592a GIT binary patch literal 6622 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 literal 0 HcmV?d00001 diff --git a/muxplex/tests/__pycache__/test_settings.cpython-313-pytest-9.0.2.pyc b/muxplex/tests/__pycache__/test_settings.cpython-313-pytest-9.0.2.pyc index 7f1374a13dcc71fb81088c03b8c3914af94b1953..99c82498e7522ae8242a4fd496cbd7a91238db4f 100644 GIT binary patch delta 6150 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 bq+6br*=WPldMk)S1+@EFOF3;I(Zc@#L@Lx| delta 103 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 LSjbMIT)O`c?VCBk delta 2260 zcma)-T})eL7{~YW(Uumv(ehC~Ds>yQN5Hnj33NkP=9o}c7%;LdWTh)*I}Y0Vo`Qq8 zL56V?KQ?@f8be4-Bw1r(GEbrx8jV*bdf|;X9`(W-FO73|Uitn{u~1~JC+RQmdCv2^ z@AL6KPw)Q8e*BVIAC{Gw_lf81%J*`pVb$tjf2_LSWtFR64HsQ5kgC)t*w-c|tG|_; zXO<_0B0mTmQhO|R#u{j}^fPu+HJ15{t7QLA;!6!a*8+8blR~y$!znBq=|fwv5qoHb z$$3A}#@*ueA8SNWVm#$)^d#pyB!zp(Y_F{xfKd>58t4FgnDl<51TuJ<0iSX161}i>}+FY)t*#E*Bm6pI;XofimnO74S@4^pT^&a0rr8+HbG4 z>^RjW73-(+3qpklvZqZY_)H|##*b5V%`wZkkdKL<^2I(XFKbelYwj0#&I>`BE!YsB zPf}d6qKDchLd9n3O%DcXyxz6*SZlgCbK;0Kh9#R)%mxHB~;c_z$EO>F9Nz} zVXP*A2#^38fqrUnJ1l3g90EKv=x%a{utd~3Rd`mohSEqj-VB8nT60S~U0c))ihMa9 znbwRWeWyoH4WHq!Wo#N?vjpfaWn9N=6qp1mfE&OqpbHoQMuBqz+l%Sr#~?lqED9(# z0s1!Rpk6z%FW`BqIePM)@D_%;BwyPieUo?94xDR8?yrQA5&gX3JL47L3f-v2c(EwU; zJDxmqIXH6k`P^J)=N=B+t&#P+yp@WrO!%^yNSpGyx>Pwj#M0{2=uM^?6V{>@_`gsR zPo!EStx0(@)Vs$lq7#ZIu*3BOk1pVD4qLJg^LzAz5;A-u&i{3v+K@WJ>TZj*bWk&f z!;^_G4ImA`DW0UEIfwakv1H<>tPr2OWqDXz%1$%Ab^Zl- C70&?x diff --git a/muxplex/tests/__pycache__/test_ws_proxy.cpython-313-pytest-9.0.2.pyc b/muxplex/tests/__pycache__/test_ws_proxy.cpython-313-pytest-9.0.2.pyc index adeed34c8caed203e9ae6ad21083379778c43d45..3fbc3f3a07be2f8e69e2e6ad484f20c77d0d4618 100644 GIT binary patch delta 7251 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 delta 2860 zcmb7`32a+c7KZa2+lif|NgP_Bq#?AF8M8Fb)}*v9(3GVK3NRB$i#jsT&Py=Ze(rfM z8>MyFT6PGBRuB+@vP~Ekfh8!*h=u}U5vA^B2gkW80hYKZizV9H9k9|1hK-HG1!uyU!J@&Yr7n zD$*?ePw}f-F#DKqyXHMX%;`iPD4BOa94~3n8nYjjJmsor6{X|V(`h5s6LirMzH;O&U$*o3u0djq*ooPL?j{VP2TD`Ye}7wY5|!4{GPzDh9>SU-?AwnJ{$A*vZNb zC76gXlv?>uffYwDh1dqbj5>gJ;5?w4p9>uCZHCy){|zj0L(E2w-{Lva@mgj-#f%A; zQAePeoKmrjMEm0jJD#!}Z^9H~i+!_>3RFgVO-kxA zhkB8?ffvj=uF6AES&37EaXC$hFPt^IEZ378vXJBTZJuGV8_7Odzso&)Uum6fP%@s< z6Lo`D=NI>t!{_^4;V|F5u)7?K4*?B86T4a#N1e(+BWjtkOAR{`GgB!eW;>n%J<)GC z?wHwQP(r4sBwzw*U=5H0EWj2__#7=pBO*CkB!AiUd{fJiXR|2Avi{Z&-P%d~uO;&` zYo();E*H`|AOnm5R{$G;je=l+3L$%eIv@mG3tR`df$M=AfE$5BuenGqnr`Cj!%IDP z$e0JRZ-rBCerJBd?-Vad=*ei0zLc+8);#lR(SGd_d^b|?`k7RP7p&#imURd37g16g z=`N3Pd03iYB$vSVib(efo-g3D+U96|+}qZafz?DI^+0I=y@Gu+^0KTYXwfy&87wE2 zwsT?C2w<0v&yrIWv5g^{0_eos^ERxa@{>sA1*x8nh5gN#$u(#Z(mg*~O*8=g5O6y% z&h5)j_B<|PHhbOjQ{CDahnIz_?v@SBwOL+oi&TLcE7m#+12mXtWeW*QlDt(VF3Q4zXB7$uQyQ1yEH&L8~?#Rt2U}LfWWc~@;>D)ojL!;jO0;InKI2_aOl`ew*&<8zt&R-N`%O~K;u14=GB79oF z`?_|xC((z9?mj=|`VAXt;agYD=j|&46<^B8{EhIQl@022%Z;Xjca<0fOQ(wysVi*i zkg8owQ&WT9yujRo_aPklH$Y>q>YzB*%8xg$s`I`fjlBig7gmiIXi6!5CCn$9MWr%t+gDGexIi4ljKH9oFp>8bh&MHT4=qCRy}(0XL*Ov=FaPKcns7 zg=-=gDtGV27_|_UIjW+?F-0*x8>Cj*6objZyr-|EDc2t^0mo-wOorYQPxU$Ov*os? zTtN8$YmUsQ^if`(N~vkGDR)z#90V(KG1!Cm{SVW-?0Wfc_*s56&^NHbEs?7SQ>8$~ zZnr4PNNw%ku#wH*PK!O?i(H+3pZu=CeEN$toZO7=1VZ-Tc8xUmRtKf zG7BIgp{YpVczP42ZaeO%X(n>vDC&(5+5Kct5JoB|;UdC!5N!tT03HWWzG)kPGfy}g pgsdT~kY)o_K&3#g{iNB$} when request has a valid session cookie.""" + response = client.get("/api/auth/token") + assert response.status_code == 200 + data = response.json() + assert "token" in data + assert isinstance(data["token"], str) + assert len(data["token"]) > 0 + + +def test_get_auth_token_returns_401_when_not_authenticated(monkeypatch): + """GET /api/auth/token returns 401 when request has no valid session cookie.""" + monkeypatch.setenv("MUXPLEX_PASSWORD", "test-password") + with TestClient(app, base_url="http://192.168.1.1") as c: + # No cookie set — endpoint must return 401 with application/json accept + response = c.get("/api/auth/token", headers={"Accept": "application/json"}) + assert response.status_code == 401 diff --git a/muxplex/tests/test_auth.py b/muxplex/tests/test_auth.py index 2a9f591..a000854 100644 --- a/muxplex/tests/test_auth.py +++ b/muxplex/tests/test_auth.py @@ -460,3 +460,27 @@ def test_middleware_instance_info_path_excluded(): client = TestClient(app, base_url="http://192.168.1.1") response = client.get("/api/instance-info") assert response.status_code == 200 + + +# --------------------------------------------------------------------------- +# X-Muxplex-Token header auth (cross-origin federation) +# --------------------------------------------------------------------------- + + +def test_middleware_valid_token_header_passes(): + """Non-localhost request with a valid X-Muxplex-Token header passes through.""" + app = _make_test_app() + token = create_session_cookie("test-secret", ttl_seconds=3600) + client = TestClient(app, base_url="http://192.168.1.1") + response = client.get("/protected", headers={"X-Muxplex-Token": token}) + assert response.status_code == 200 + assert response.text == "OK" + + +def test_middleware_invalid_token_header_falls_through_to_redirect(): + """Non-localhost request with an invalid X-Muxplex-Token header falls through to redirect.""" + app = _make_test_app() + client = TestClient(app, base_url="http://192.168.1.1", follow_redirects=False) + response = client.get("/protected", headers={"X-Muxplex-Token": "bad.token.value"}) + # Invalid token: should NOT pass auth, falls through to redirect or 401 + assert response.status_code in (307, 401)