22 HocuspocusProvider ,
33 HocuspocusProviderWebsocket ,
44} from '@hocuspocus/provider' ;
5+ import { v1 as uuidv1 , v4 as uuidv4 } from 'uuid' ;
56import WebSocket from 'ws' ;
67
78const port = 5559 ;
@@ -52,9 +53,9 @@ describe('Server Tests', () => {
5253
5354 test ( 'WebSocket connection with bad origin should be closed' , ( ) => {
5455 const { promise, done } = promiseDone ( ) ;
55-
56+ const room = uuidv4 ( ) ;
5657 const ws = new WebSocket (
57- `ws://localhost:${ port } /collaboration/ws/?room=test- room` ,
58+ `ws://localhost:${ port } /collaboration/ws/?room=${ room } ` ,
5859 {
5960 headers : {
6061 Origin : 'http://bad-origin.com' ,
@@ -72,9 +73,9 @@ describe('Server Tests', () => {
7273
7374 test ( 'WebSocket connection without cookies header should be closed' , ( ) => {
7475 const { promise, done } = promiseDone ( ) ;
75-
76+ const room = uuidv4 ( ) ;
7677 const ws = new WebSocket (
77- `ws://localhost:${ port } /collaboration/ws/?room=test- room` ,
78+ `ws://localhost:${ port } /collaboration/ws/?room=${ room } ` ,
7879 {
7980 headers : {
8081 Origin : origin ,
@@ -92,25 +93,96 @@ describe('Server Tests', () => {
9293
9394 test ( 'WebSocket connection not allowed if room not matching provider name' , ( ) => {
9495 const { promise, done } = promiseDone ( ) ;
95-
96+ const room = uuidv4 ( ) ;
9697 const wsHocus = new HocuspocusProviderWebsocket ( {
97- url : `ws://localhost:${ portWS } /?room=my-test ` ,
98+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
9899 WebSocketPolyfill : WebSocket ,
99100 maxAttempts : 1 ,
100101 quiet : true ,
101102 } ) ;
102103
104+ const providerName = uuidv4 ( ) ;
103105 const provider = new HocuspocusProvider ( {
104106 websocketProvider : wsHocus ,
105- name : 'hocuspocus-test' ,
107+ name : providerName ,
106108 broadcast : false ,
107109 quiet : true ,
108110 preserveConnection : false ,
109111 onClose : ( data ) => {
110112 expect ( console . error ) . toHaveBeenCalledWith (
111113 'Invalid room name - Probable hacking attempt:' ,
112- 'hocuspocus-test' ,
113- 'my-test' ,
114+ providerName ,
115+ room ,
116+ ) ;
117+
118+ wsHocus . stopConnectionAttempt ( ) ;
119+ expect ( data . event . reason ) . toBe ( 'Forbidden' ) ;
120+ wsHocus . webSocket ?. close ( ) ;
121+ wsHocus . disconnect ( ) ;
122+ provider . destroy ( ) ;
123+ wsHocus . destroy ( ) ;
124+ done ( ) ;
125+ } ,
126+ } ) ;
127+
128+ return promise ;
129+ } ) ;
130+
131+ test ( 'WebSocket connection not allowed if room is not a valid uuid v4' , ( ) => {
132+ const { promise, done } = promiseDone ( ) ;
133+ const room = uuidv1 ( ) ;
134+ const wsHocus = new HocuspocusProviderWebsocket ( {
135+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
136+ WebSocketPolyfill : WebSocket ,
137+ maxAttempts : 1 ,
138+ quiet : true ,
139+ } ) ;
140+
141+ const provider = new HocuspocusProvider ( {
142+ websocketProvider : wsHocus ,
143+ name : room ,
144+ broadcast : false ,
145+ quiet : true ,
146+ preserveConnection : false ,
147+ onClose : ( data ) => {
148+ expect ( console . error ) . toHaveBeenCalledWith (
149+ 'Room name is not a valid uuid:' ,
150+ room ,
151+ ) ;
152+
153+ wsHocus . stopConnectionAttempt ( ) ;
154+ expect ( data . event . reason ) . toBe ( 'Forbidden' ) ;
155+ wsHocus . webSocket ?. close ( ) ;
156+ wsHocus . disconnect ( ) ;
157+ provider . destroy ( ) ;
158+ wsHocus . destroy ( ) ;
159+ done ( ) ;
160+ } ,
161+ } ) ;
162+
163+ return promise ;
164+ } ) ;
165+
166+ test ( 'WebSocket connection not allowed if room is not a valid uuid' , ( ) => {
167+ const { promise, done } = promiseDone ( ) ;
168+ const room = 'not-a-valid-uuid' ;
169+ const wsHocus = new HocuspocusProviderWebsocket ( {
170+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
171+ WebSocketPolyfill : WebSocket ,
172+ maxAttempts : 1 ,
173+ quiet : true ,
174+ } ) ;
175+
176+ const provider = new HocuspocusProvider ( {
177+ websocketProvider : wsHocus ,
178+ name : room ,
179+ broadcast : false ,
180+ quiet : true ,
181+ preserveConnection : false ,
182+ onClose : ( data ) => {
183+ expect ( console . error ) . toHaveBeenCalledWith (
184+ 'Room name is not a valid uuid:' ,
185+ room ,
114186 ) ;
115187
116188 wsHocus . stopConnectionAttempt ( ) ;
@@ -131,16 +203,17 @@ describe('Server Tests', () => {
131203
132204 mockDocFetch . mockRejectedValue ( '' ) ;
133205
206+ const room = uuidv4 ( ) ;
134207 const wsHocus = new HocuspocusProviderWebsocket ( {
135- url : `ws://localhost:${ portWS } /?room=my-test ` ,
208+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
136209 WebSocketPolyfill : WebSocket ,
137210 maxAttempts : 1 ,
138211 quiet : true ,
139212 } ) ;
140213
141214 const provider = new HocuspocusProvider ( {
142215 websocketProvider : wsHocus ,
143- name : 'my-test' ,
216+ name : room ,
144217 broadcast : false ,
145218 quiet : true ,
146219 preserveConnection : false ,
@@ -167,29 +240,30 @@ describe('Server Tests', () => {
167240 test ( 'WebSocket connection fails if user do not have correct retrieve ability' , ( ) => {
168241 const { promise, done } = promiseDone ( ) ;
169242
243+ const room = uuidv4 ( ) ;
170244 mockDocFetch . mockResolvedValue ( {
171245 abilities : {
172246 retrieve : false ,
173247 } ,
174248 } ) ;
175249
176250 const wsHocus = new HocuspocusProviderWebsocket ( {
177- url : `ws://localhost:${ portWS } /?room=my-test ` ,
251+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
178252 WebSocketPolyfill : WebSocket ,
179253 maxAttempts : 1 ,
180254 quiet : true ,
181255 } ) ;
182256
183257 const provider = new HocuspocusProvider ( {
184258 websocketProvider : wsHocus ,
185- name : 'my-test' ,
259+ name : room ,
186260 broadcast : false ,
187261 quiet : true ,
188262 preserveConnection : false ,
189263 onClose : ( data ) => {
190264 expect ( console . error ) . toHaveBeenCalledWith (
191265 'onConnect: Unauthorized to retrieve this document' ,
192- 'my-test' ,
266+ room ,
193267 ) ;
194268
195269 wsHocus . stopConnectionAttempt ( ) ;
@@ -217,19 +291,20 @@ describe('Server Tests', () => {
217291 } ,
218292 } ) ;
219293
294+ const room = uuidv4 ( ) ;
220295 const wsHocus = new HocuspocusProviderWebsocket ( {
221- url : `ws://localhost:${ portWS } /?room=hocuspocus-test ` ,
296+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
222297 WebSocketPolyfill : WebSocket ,
223298 } ) ;
224299
225300 const provider = new HocuspocusProvider ( {
226301 websocketProvider : wsHocus ,
227- name : 'hocuspocus-test' ,
302+ name : room ,
228303 broadcast : false ,
229304 quiet : true ,
230305 onConnect : ( ) => {
231306 void hocusPocusServer
232- . openDirectConnection ( 'hocuspocus-test' )
307+ . openDirectConnection ( room )
233308 . then ( ( connection ) => {
234309 connection . document ?. getConnections ( ) . forEach ( ( connection ) => {
235310 expect ( connection . readOnly ) . toBe ( ! canEdit ) ;
@@ -262,29 +337,28 @@ describe('Server Tests', () => {
262337 id : 'test-user-id' ,
263338 } ) ;
264339
340+ const room = uuidv4 ( ) ;
265341 const wsHocus = new HocuspocusProviderWebsocket ( {
266- url : `ws://localhost:${ portWS } /?room=hocuspocus-test ` ,
342+ url : `ws://localhost:${ portWS } /?room=${ room } ` ,
267343 WebSocketPolyfill : WebSocket ,
268344 } ) ;
269345
270346 const provider = new HocuspocusProvider ( {
271347 websocketProvider : wsHocus ,
272- name : 'hocuspocus-test' ,
348+ name : room ,
273349 broadcast : false ,
274350 quiet : true ,
275351 onConnect : ( ) => {
276- void hocusPocusServer
277- . openDirectConnection ( 'hocuspocus-test' )
278- . then ( ( connection ) => {
279- connection . document ?. getConnections ( ) . forEach ( ( connection ) => {
280- expect ( connection . context . userId ) . toBe ( 'test-user-id' ) ;
281- } ) ;
282-
283- void connection . disconnect ( ) ;
284- provider . destroy ( ) ;
285- wsHocus . destroy ( ) ;
286- done ( ) ;
352+ void hocusPocusServer . openDirectConnection ( room ) . then ( ( connection ) => {
353+ connection . document ?. getConnections ( ) . forEach ( ( connection ) => {
354+ expect ( connection . context . userId ) . toBe ( 'test-user-id' ) ;
287355 } ) ;
356+
357+ void connection . disconnect ( ) ;
358+ provider . destroy ( ) ;
359+ wsHocus . destroy ( ) ;
360+ done ( ) ;
361+ } ) ;
288362 } ,
289363 } ) ;
290364
0 commit comments