1- import { ContextMetadataKey , EventKinds } from '../constants/base'
21import cluster from 'cluster'
2+ import { ContextMetadataKey } from '../constants/base'
33import { EventEmitter } from 'stream'
44import { IncomingMessage as IncomingHttpMessage } from 'http'
55import { randomBytes } from 'crypto'
@@ -22,7 +22,6 @@ import { messageSchema } from '../schemas/message-schema'
2222import { Settings } from '../@types/settings'
2323import { SocketAddress } from 'net'
2424
25-
2625const debug = createLogger ( 'web-socket-adapter' )
2726const debugHeartbeat = debug . extend ( 'heartbeat' )
2827
@@ -99,7 +98,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
9998 this . subscriptions . set ( subscriptionId , filters )
10099 }
101100
102- public setNewAuthChallenge ( ) {
101+ public setNewAuthChallenge ( ) : string {
103102 const challenge = randomBytes ( 16 ) . toString ( 'hex' )
104103 this . authChallenge = {
105104 createdAt : new Date ( ) ,
@@ -182,33 +181,8 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
182181 const message = attemptValidation ( messageSchema ) ( JSON . parse ( raw . toString ( 'utf8' ) ) )
183182 debug ( 'recv client msg: %o' , message )
184183
185- if (
186- ! this . authenticated
187- && message [ 1 ] . kind !== EventKinds . AUTH
188- && this . settings ( ) . authentication . enabled
189- ) {
190- switch ( message [ 0 ] ) {
191- case MessageType . REQ : {
192- const challenge = this . setNewAuthChallenge ( )
193- this . sendMessage ( createAuthMessage ( challenge ) )
194- return
195- }
196-
197- case MessageType . EVENT : {
198- const challenge = this . setNewAuthChallenge ( )
199- this . sendMessage ( createCommandResult ( message [ 1 ] . id , false , 'rejected: unauthorized' ) )
200- this . sendMessage ( createAuthMessage ( challenge ) )
201- return
202- }
203-
204- default : {
205- const challenge = this . setNewAuthChallenge ( )
206- this . sendMessage ( createCommandResult ( message [ 1 ] . id , false , 'rejected: unauthorized' ) )
207- this . sendMessage ( createAuthMessage ( challenge ) )
208- return
209- }
210- }
211- }
184+ const requiresAuthentication = this . isAuthenticationRequired ( message )
185+ if ( requiresAuthentication ) return
212186
213187 message [ ContextMetadataKey ] = {
214188 remoteAddress : this . clientAddress ,
@@ -322,4 +296,37 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
322296 this . removeAllListeners ( )
323297 this . client . removeAllListeners ( )
324298 }
299+
300+ private isAuthenticationRequired ( message ) : boolean {
301+ if (
302+ ! this . authenticated
303+ && message [ 0 ] !== MessageType . AUTH
304+ && message [ 0 ] !== MessageType . CLOSE
305+ && this . settings ( ) . authentication . enabled
306+ ) {
307+ switch ( message [ 0 ] ) {
308+ case MessageType . REQ : {
309+ const challenge = this . setNewAuthChallenge ( )
310+ this . sendMessage ( createAuthMessage ( challenge ) )
311+ return true
312+ }
313+
314+ case MessageType . EVENT : {
315+ const challenge = this . setNewAuthChallenge ( )
316+ this . sendMessage ( createCommandResult ( message [ 1 ] . id , false , 'rejected: unauthorized' ) )
317+ this . sendMessage ( createAuthMessage ( challenge ) )
318+ return true
319+ }
320+
321+ default : {
322+ const challenge = this . setNewAuthChallenge ( )
323+ this . sendMessage ( createCommandResult ( message [ 1 ] . id , false , 'rejected: unauthorized' ) )
324+ this . sendMessage ( createAuthMessage ( challenge ) )
325+ return true
326+ }
327+ }
328+ }
329+
330+ return false
331+ }
325332}
0 commit comments