@@ -386,7 +386,12 @@ module.exports = (io, middlewares) => {
386386 }
387387 }
388388
389- async function joinRoom ( room , cb , spectating ) {
389+ async function joinRoom (
390+ room ,
391+ cb ,
392+ spectating ,
393+ { password, reauthorizeOnRecovery = false } = { } ,
394+ ) {
390395 if ( socket . roomId ) {
391396 if ( String ( socket . roomId ) === String ( room . _id ) ) {
392397 socket . room = socket . room || room ;
@@ -449,6 +454,41 @@ module.exports = (io, middlewares) => {
449454 message : 'Room no longer exists' ,
450455 } ) ;
451456 }
457+ if ( reauthorizeOnRecovery ) {
458+ const rejectRecoveryJoin = ( error ) => {
459+ socket . leave ( room . accessCode ) ;
460+ socket . leave ( encodeUserRoom ( socket . userId , room . _id ) ) ;
461+ delete socket . room ;
462+ delete socket . roomId ;
463+ return cb ( error ) ;
464+ } ;
465+ const userKey = socket . userId . toString ( ) ;
466+ if ( ! isRoomTypeEnabled ( currentRoom . type ) ) {
467+ return rejectRecoveryJoin ( {
468+ statusCode : 403 ,
469+ message : 'Grand Prix rooms are disabled' ,
470+ } ) ;
471+ }
472+ if ( currentRoom . private && ( ! password || ! ( await currentRoom . authenticate ( password ) ) ) ) {
473+ return rejectRecoveryJoin ( {
474+ statusCode : 403 ,
475+ message : 'Invalid password' ,
476+ } ) ;
477+ }
478+ if ( currentRoom . banned . get ( userKey ) ) {
479+ return rejectRecoveryJoin ( {
480+ statusCode : 401 ,
481+ message : 'Banned' ,
482+ banned : true ,
483+ } ) ;
484+ }
485+ if ( currentRoom . requireRevealedIdentity && ! socket . user . showWCAID ) {
486+ return rejectRecoveryJoin ( {
487+ statusCode : 403 ,
488+ message : 'Must be showing WCA Identity to join room.' ,
489+ } ) ;
490+ }
491+ }
452492 const r = await currentRoom . addUser ( socket . user , spectating , sendAdminUpdate ) ;
453493 if ( ! r ) {
454494 const fencedRoom = await currentRoom . advancePresenceRevision ( socket . userId ) ;
@@ -564,7 +604,10 @@ module.exports = (io, middlewares) => {
564604 } , room ) ;
565605 }
566606
567- return await joinRoom ( room , acknowledgment , spectating ) ;
607+ return await joinRoom ( room , acknowledgment , spectating , {
608+ password,
609+ reauthorizeOnRecovery : true ,
610+ } ) ;
568611 } catch ( e ) {
569612 logger . error ( e ) ;
570613 return rejectJoin ( 'internal_error' , {
0 commit comments