@@ -119,20 +119,31 @@ app.post('/api/container/start', requireAuth, async (req, res) => {
119119
120120// --- WebSocket : logs en temps réel ---
121121
122+ const wsTokens = new Map ( ) ;
123+
124+ app . get ( '/api/ws-token' , requireAuth , ( _req , res ) => {
125+ const token = Math . random ( ) . toString ( 36 ) . slice ( 2 ) + Math . random ( ) . toString ( 36 ) . slice ( 2 ) ;
126+ wsTokens . set ( token , Date . now ( ) + 30_000 ) ;
127+ res . json ( { token } ) ;
128+ } ) ;
129+
122130const server = createServer ( app ) ;
123131const wss = new WebSocketServer ( { noServer : true } ) ;
124132
125133server . on ( 'upgrade' , ( req , socket , head ) => {
126- const mockRes = { writeHead : ( ) => { } , end : ( ) => { } , getHeader : ( ) => null , setHeader : ( ) => { } } ;
127- sessionMiddleware ( req , mockRes , ( ) => {
128- if ( ! req . session . authenticated ) {
129- socket . write ( 'HTTP/1.1 401 Unauthorized\r\n\r\n' ) ;
130- socket . destroy ( ) ;
131- return ;
132- }
133- wss . handleUpgrade ( req , socket , head , ( ws ) => {
134- wss . emit ( 'connection' , ws , req ) ;
135- } ) ;
134+ const url = new URL ( req . url , 'http://localhost' ) ;
135+ const token = url . searchParams . get ( 'token' ) ;
136+ const expiry = token && wsTokens . get ( token ) ;
137+
138+ if ( ! expiry || Date . now ( ) > expiry ) {
139+ socket . write ( 'HTTP/1.1 401 Unauthorized\r\n\r\n' ) ;
140+ socket . destroy ( ) ;
141+ return ;
142+ }
143+ wsTokens . delete ( token ) ;
144+
145+ wss . handleUpgrade ( req , socket , head , ( ws ) => {
146+ wss . emit ( 'connection' , ws , req ) ;
136147 } ) ;
137148} ) ;
138149
0 commit comments