Comparison

spec/scansion/muc_show_offline.scs @ 10687:8c2c5b4fde32

MUC: Support for broadcasting unavailable presence for affiliated offline users Activated when muc#roomconfig_presencebroadcast includes the "none" role.
author Matthew Wild <mwild1@gmail.com>
date Thu, 12 Mar 2020 16:01:31 +0000
child 10759:817f1d6b499e
comparison
equal deleted inserted replaced
10686:ac3ec4f2b124 10687:8c2c5b4fde32
1 # MUC: Room registration and presence broadcast of unavailable members
2
3 [Client] Romeo
4 jid: user@localhost
5 password: password
6
7 [Client] Juliet
8 jid: user2@localhost
9 password: password
10
11 [Client] Rosaline
12 jid: user3@localhost
13 password: password
14
15 -----
16
17 Romeo connects
18
19 Romeo sends:
20 <presence to="room@conference.localhost/Romeo">
21 <x xmlns="http://jabber.org/protocol/muc"/>
22 </presence>
23
24 Romeo receives:
25 <presence from='room@conference.localhost/Romeo'>
26 <x xmlns='http://jabber.org/protocol/muc#user'>
27 <status code='201'/>
28 <item jid="${Romeo's full JID}" affiliation='owner' role='moderator'/>
29 <status code='110'/>
30 </x>
31 </presence>
32
33 Romeo receives:
34 <message type='groupchat' from='room@conference.localhost'><subject/></message>
35
36 # Submit config form
37 Romeo sends:
38 <iq id='config1' to='room@conference.localhost' type='set'>
39 <query xmlns='http://jabber.org/protocol/muc#owner'>
40 <x xmlns='jabber:x:data' type='submit'>
41 <field var='FORM_TYPE'>
42 <value>http://jabber.org/protocol/muc#roomconfig</value>
43 </field>
44 <field var='muc#roomconfig_presencebroadcast'>
45 <value>none</value>
46 <value>participant</value>
47 <value>moderator</value>
48 </field>
49 </x>
50 </query>
51 </iq>
52
53 Romeo receives:
54 <iq id="config1" from="room@conference.localhost" type="result">
55 </iq>
56
57 Romeo sends:
58 <iq id='member1' to='room@conference.localhost' type='set'>
59 <query xmlns='http://jabber.org/protocol/muc#admin'>
60 <item affiliation='member' jid="${Juliet's JID}" />
61 </query>
62 </iq>
63
64 Romeo receives:
65 <message from='room@conference.localhost'>
66 <x xmlns='http://jabber.org/protocol/muc#user'>
67 <item jid="${Juliet's JID}" affiliation='member' />
68 </x>
69 </message>
70
71 Romeo receives:
72 <iq from='room@conference.localhost' id='member1' type='result'/>
73
74 # Juliet connects, and joins the room
75 Juliet connects
76
77 Juliet sends:
78 <presence to="room@conference.localhost/Juliet">
79 <x xmlns="http://jabber.org/protocol/muc"/>
80 </presence>
81
82 Juliet receives:
83 <presence from="room@conference.localhost/Romeo" />
84
85 Juliet receives:
86 <presence from="room@conference.localhost/Juliet" />
87
88 Juliet receives:
89 <message type='groupchat' from='room@conference.localhost'><subject/></message>
90
91 Romeo receives:
92 <presence from="room@conference.localhost/Juliet" />
93
94 # Juliet retrieves the registration form
95
96 Juliet sends:
97 <iq id='jw81b36f' to='room@conference.localhost' type='get'>
98 <query xmlns='jabber:iq:register'/>
99 </iq>
100
101 Juliet receives:
102 <iq type='result' from='room@conference.localhost' id='jw81b36f'>
103 <query xmlns='jabber:iq:register'>
104 <x type='form' xmlns='jabber:x:data'>
105 <field type='hidden' var='FORM_TYPE'>
106 <value>http://jabber.org/protocol/muc#register</value>
107 </field>
108 <field type='text-single' label='Nickname' var='muc#register_roomnick'>
109 <required/>
110 </field>
111 </x>
112 </query>
113 </iq>
114
115 Juliet sends:
116 <iq id='nv71va54' to='room@conference.localhost' type='set'>
117 <query xmlns='jabber:iq:register'>
118 <x xmlns='jabber:x:data' type='submit'>
119 <field var='FORM_TYPE'>
120 <value>http://jabber.org/protocol/muc#register</value>
121 </field>
122 <field var='muc#register_roomnick'>
123 <value>Juliet</value>
124 </field>
125 </x>
126 </query>
127 </iq>
128
129 Juliet receives:
130 <presence from='room@conference.localhost/Juliet'>
131 <x xmlns='http://jabber.org/protocol/muc#user'>
132 <item affiliation='member' jid="${Juliet's full JID}" role='participant'/>
133 <status code='110'/>
134 </x>
135 </presence>
136
137 Juliet receives:
138 <iq type='result' from='room@conference.localhost' id='nv71va54'/>
139
140 # Juliet discovers her reserved nick
141
142 Juliet sends:
143 <iq id='getnick1' to='room@conference.localhost' type='get'>
144 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item'/>
145 </iq>
146
147 Juliet receives:
148 <iq type='result' from='room@conference.localhost' id='getnick1'>
149 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item'>
150 <identity category='conference' name='Juliet' type='text'/>
151 </query>
152 </iq>
153
154 # Juliet leaves the room:
155
156 Juliet sends:
157 <presence type="unavailable" to="room@conference.localhost/Juliet" />
158
159 Juliet receives:
160 <presence type='unavailable' from='room@conference.localhost/Juliet'>
161 <x xmlns='http://jabber.org/protocol/muc#user'>
162 <item jid="${Juliet's full JID}" affiliation='member' role='none'/>
163 <status code='110'/>
164 </x>
165 </presence>
166
167 Romeo receives:
168 <presence from='room@conference.localhost/Juliet'>
169 <x xmlns='http://jabber.org/protocol/muc#user'>
170 <item jid="${Juliet's full JID}" affiliation='member' role='participant'/>
171 </x>
172 </presence>
173
174 # Rosaline connect and tries to join the room as Juliet
175
176 Rosaline connects
177
178 Rosaline sends:
179 <presence to="room@conference.localhost/Juliet">
180 <x xmlns="http://jabber.org/protocol/muc"/>
181 </presence>
182
183 Rosaline receives:
184 <presence type='error' from='room@conference.localhost/Juliet'>
185 <error type='cancel' by='room@conference.localhost'>
186 <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
187 </error>
188 <x xmlns='http://jabber.org/protocol/muc'/>
189 </presence>
190
191 # In a heated moment, Juliet unregisters from the room
192
193 Juliet sends:
194 <iq type='set' to='room@conference.localhost' id='unreg1'>
195 <query xmlns='jabber:iq:register'>
196 <remove/>
197 </query>
198 </iq>
199
200 Juliet receives:
201 <iq type='result' from='room@conference.localhost' id='unreg1'/>
202
203 # Romeo is notified of Juliet's sad decision
204
205 Romeo receives:
206 <message from='room@conference.localhost'>
207 <x xmlns='http://jabber.org/protocol/muc#user' scansion:strict='true'>
208 <item jid="${Juliet's JID}" />
209 </x>
210 </message>
211
212 # Rosaline attempts once more to sneak into the room, disguised as Juliet
213
214 Rosaline sends:
215 <presence to="room@conference.localhost/Juliet">
216 <x xmlns="http://jabber.org/protocol/muc"/>
217 </presence>
218
219 Rosaline receives:
220 <presence from='room@conference.localhost/Romeo'>
221 <x xmlns='http://jabber.org/protocol/muc#user'>
222 <item affiliation='owner' role='moderator'/>
223 </x>
224 </presence>
225
226 Rosaline receives:
227 <presence from='room@conference.localhost/Juliet'>
228 <x xmlns='http://jabber.org/protocol/muc#user'>
229 <item affiliation='none' jid="${Rosaline's full JID}" role='participant'/>
230 <status code='110'/>
231 </x>
232 </presence>
233
234 Romeo receives:
235 <presence from='room@conference.localhost/Juliet'>
236 <x xmlns='http://jabber.org/protocol/muc#user'>
237 <item affiliation='none' jid="${Rosaline's full JID}" role='participant'/>
238 </x>
239 </presence>
240
241 # On discovering the ruse, Romeo restores Juliet's nick and status within the room
242
243 Romeo sends:
244 <iq id='member1' to='room@conference.localhost' type='set'>
245 <query xmlns='http://jabber.org/protocol/muc#admin'>
246 <item affiliation='member' jid="${Juliet's JID}" nick='Juliet' />
247 </query>
248 </iq>
249
250 # Rosaline is evicted from the room
251
252 Romeo receives:
253 <presence from='room@conference.localhost/Juliet' type='unavailable'>
254 <x xmlns='http://jabber.org/protocol/muc#user'>
255 <status code='307'/>
256 <item affiliation='none' role='none' jid="${Rosaline's full JID}">
257 <reason>This nickname is reserved</reason>
258 </item>
259 </x>
260 </presence>
261
262 # An out-of-room affiliation change is received for Juliet
263
264 Romeo receives:
265 <message from='room@conference.localhost'>
266 <x xmlns='http://jabber.org/protocol/muc#user'>
267 <item jid="${Juliet's JID}" affiliation='member' />
268 </x>
269 </message>
270
271 Romeo receives:
272 <iq type='result' id='member1' from='room@conference.localhost' />
273
274 Rosaline receives:
275 <presence type='unavailable' from='room@conference.localhost/Juliet'>
276 <x xmlns='http://jabber.org/protocol/muc#user'>
277 <status code='307'/>
278 <item affiliation='none' jid="${Rosaline's full JID}" role='none'>
279 <reason>This nickname is reserved</reason>
280 </item>
281 <status code='110'/>
282 </x>
283 </presence>
284
285 # Rosaline, frustrated, attempts to get back into the room...
286
287 Rosaline sends:
288 <presence to="room@conference.localhost/Juliet">
289 <x xmlns="http://jabber.org/protocol/muc"/>
290 </presence>
291
292 # ...but once again, is denied
293
294 Rosaline receives:
295 <presence type='error' from='room@conference.localhost/Juliet'>
296 <error type='cancel' by='room@conference.localhost'>
297 <conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
298 </error>
299 <x xmlns='http://jabber.org/protocol/muc'/>
300 </presence>
301
302 # Juliet, however, quietly joins the room with success
303
304 Juliet sends:
305 <presence to="room@conference.localhost/Juliet">
306 <x xmlns="http://jabber.org/protocol/muc"/>
307 </presence>
308
309 Juliet receives:
310 <presence from="room@conference.localhost/Romeo" />
311
312 Juliet receives:
313 <presence from="room@conference.localhost/Juliet" />
314
315 Juliet receives:
316 <message type='groupchat' from='room@conference.localhost'><subject/></message>
317
318 Romeo receives:
319 <presence from="room@conference.localhost/Juliet" />
320
321 # Romeo checks whether he has reserved his own nick yet
322
323 Romeo sends:
324 <iq id='getnick1' to='room@conference.localhost' type='get'>
325 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item'/>
326 </iq>
327
328 # But no nick is returned, as he hasn't registered yet!
329
330 Romeo receives:
331 <iq type='result' from='room@conference.localhost' id='getnick1'>
332 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item' scansion:strict='true' />
333 </iq>
334
335 # Romeo updates his own registration
336
337 Romeo sends:
338 <iq id='jw81b36f' to='room@conference.localhost' type='get'>
339 <query xmlns='jabber:iq:register'/>
340 </iq>
341
342 Romeo receives:
343 <iq type='result' from='room@conference.localhost' id='jw81b36f'>
344 <query xmlns='jabber:iq:register'>
345 <x type='form' xmlns='jabber:x:data'>
346 <field type='hidden' var='FORM_TYPE'>
347 <value>http://jabber.org/protocol/muc#register</value>
348 </field>
349 <field type='text-single' label='Nickname' var='muc#register_roomnick'>
350 <required/>
351 </field>
352 </x>
353 </query>
354 </iq>
355
356 Romeo sends:
357 <iq id='nv71va54' to='room@conference.localhost' type='set'>
358 <query xmlns='jabber:iq:register'>
359 <x xmlns='jabber:x:data' type='submit'>
360 <field var='FORM_TYPE'>
361 <value>http://jabber.org/protocol/muc#register</value>
362 </field>
363 <field var='muc#register_roomnick'>
364 <value>Romeo</value>
365 </field>
366 </x>
367 </query>
368 </iq>
369
370 Romeo receives:
371 <presence from='room@conference.localhost/Romeo'>
372 <x xmlns='http://jabber.org/protocol/muc#user'>
373 <item affiliation='owner' jid="${Romeo's full JID}" role='moderator'/>
374 <status code='110'/>
375 </x>
376 </presence>
377
378 Romeo receives:
379 <iq type='result' from='room@conference.localhost' id='nv71va54'/>
380
381 Juliet receives:
382 <presence from='room@conference.localhost/Romeo'>
383 <x xmlns='http://jabber.org/protocol/muc#user'>
384 <item role='moderator' xmlns='http://jabber.org/protocol/muc#user' affiliation='owner'/>
385 </x>
386 </presence>
387
388 # Romeo discovers his reserved nick
389
390 Romeo sends:
391 <iq id='getnick1' to='room@conference.localhost' type='get'>
392 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item'/>
393 </iq>
394
395 Romeo receives:
396 <iq type='result' from='room@conference.localhost' id='getnick1'>
397 <query xmlns='http://jabber.org/protocol/disco#info' node='x-roomuser-item'>
398 <identity category='conference' name='Romeo' type='text'/>
399 </query>
400 </iq>
401
402 # To check the status of the room is as expected, Romeo requests the member list
403
404 Romeo sends:
405 <iq id='member3' to='room@conference.localhost' type='get'>
406 <query xmlns='http://jabber.org/protocol/muc#admin'>
407 <item affiliation='member'/>
408 </query>
409 </iq>
410
411 Romeo receives:
412 <iq from='room@conference.localhost' type='result' id='member3'>
413 <query xmlns='http://jabber.org/protocol/muc#admin'>
414 <item jid="${Juliet's JID}" affiliation='member' nick='Juliet'/>
415 </query>
416 </iq>
417
418 Juliet sends:
419 <presence type="unavailable" to="room@conference.localhost/Juliet" />
420
421 Juliet receives:
422 <presence from='room@conference.localhost/Juliet' type='unavailable' />
423
424 Romeo receives:
425 <presence type='unavailable' from='room@conference.localhost/Juliet' />
426
427 # Rosaline joins as herself
428
429 Rosaline sends:
430 <presence to="room@conference.localhost/Rosaline">
431 <x xmlns="http://jabber.org/protocol/muc"/>
432 </presence>
433
434 Rosaline receives:
435 <presence from="room@conference.localhost/Romeo" />
436
437 Rosaline receives:
438 <presence from='room@conference.localhost/Juliet' type='unavailable'>
439 <x xmlns='http://jabber.org/protocol/muc#user'>
440 <item affiliation='member' role='none' nick='Juliet' xmlns='http://jabber.org/protocol/muc#user'/>
441 </x>
442 </presence>
443
444 Rosaline receives:
445 <presence from="room@conference.localhost/Rosaline" />
446
447 Rosaline receives:
448 <message type='groupchat' from='room@conference.localhost'><subject/></message>
449
450 Romeo receives:
451 <presence from='room@conference.localhost/Rosaline'>
452 <x xmlns='http://jabber.org/protocol/muc#user'>
453 <item jid="${Rosaline's full JID}" affiliation='none' role='participant'/>
454 </x>
455 </presence>
456
457 # Rosaline tries to register her own nickname, but unaffiliated
458 # registration is disabled by default
459
460 Rosaline sends:
461 <iq id='reg990' to='room@conference.localhost' type='get'>
462 <query xmlns='jabber:iq:register'/>
463 </iq>
464
465 Rosaline receives:
466 <iq type='error' from='room@conference.localhost' id='reg990'>
467 <error type='auth'>
468 <registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
469 </error>
470 </iq>
471
472 Rosaline sends:
473 <iq id='reg991' to='room@conference.localhost' type='set'>
474 <query xmlns='jabber:iq:register'>
475 <x xmlns='jabber:x:data' type='submit'>
476 <field var='FORM_TYPE'>
477 <value>http://jabber.org/protocol/muc#register</value>
478 </field>
479 <field var='muc#register_roomnick'>
480 <value>Romeo</value>
481 </field>
482 </x>
483 </query>
484 </iq>
485
486 Rosaline receives:
487 <iq id='reg991' type='error'>
488 <error type='auth'>
489 <registration-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
490 </error>
491 </iq>
492
493 # Romeo reserves her nickname for her
494
495 Romeo sends:
496 <iq id='member2' to='room@conference.localhost' type='set'>
497 <query xmlns='http://jabber.org/protocol/muc#admin'>
498 <item affiliation='member' jid="${Rosaline's JID}" nick='Rosaline' />
499 </query>
500 </iq>
501
502 Romeo receives:
503 <presence from='room@conference.localhost/Rosaline'>
504 <x xmlns='http://jabber.org/protocol/muc#user'>
505 <item affiliation='member' role='participant' jid="${Rosaline's full JID}">
506 <actor jid="${Romeo's full JID}" nick='Romeo'/>
507 </item>
508 </x>
509 </presence>
510
511 Romeo receives:
512 <iq type='result' id='member2' from='room@conference.localhost' />
513
514 Rosaline receives:
515 <presence from='room@conference.localhost/Rosaline'>
516 <x xmlns='http://jabber.org/protocol/muc#user'>
517 <item affiliation='member' role='participant' jid="${Rosaline's full JID}">
518 <actor nick='Romeo' />
519 </item>
520 <status xmlns='http://jabber.org/protocol/muc#user' code='110'/>
521 </x>
522 </presence>
523
524 # Romeo sets their their own nickname via admin query (see #1273)
525 Romeo sends:
526 <iq to="room@conference.localhost" id="reserve" type="set">
527 <query xmlns="http://jabber.org/protocol/muc#admin">
528 <item nick="Romeo" affiliation="owner" jid="${Romeo's JID}"/>
529 </query>
530 </iq>
531
532 Romeo receives:
533 <presence from="room@conference.localhost/Romeo">
534 <x xmlns="http://jabber.org/protocol/muc#user">
535 <item xmlns="http://jabber.org/protocol/muc#user" role="moderator" jid="${Romeo's full JID}" affiliation="owner">
536 <actor xmlns="http://jabber.org/protocol/muc#user" nick="Romeo"/>
537 </item>
538 <status xmlns="http://jabber.org/protocol/muc#user" code="110"/>
539 </x>
540 </presence>
541
542 Romeo receives:
543 <iq from="room@conference.localhost" id="reserve" type="result"/>
544