File

spec/scansion/muc_presence_probe.scs @ 13439:1e229d710a3c

util.signal: Add support for signalfd(2) on Linux signalfd allows handling signal events using the same method as sockets, via file descriptors. Thus all signal dispatch can go through the same main event loop as everything else, removing need for thread-scary signal handling where execution would just jump to the signal handler regardless of the state of Lua, and needing to keep track of Lua states/threads.
author Kim Alvefur <zash@zash.se>
date Sat, 24 Feb 2024 00:05:29 +0100
parent 11246:ab189e707705
line wrap: on
line source

# #1535 Let MUCs respond to presence probes

[Client] Romeo
	jid: user@localhost
	password: password

[Client] Juliet
	jid: user2@localhost
	password: password

[Client] Mercutio
	jid: user3@localhost
	password: password

-----

Romeo connects

# Romeo joins the MUC

Romeo sends:
	<presence to="room@conference.localhost/Romeo">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Romeo receives:
	<presence from='room@conference.localhost/Romeo'>
		<x xmlns='http://jabber.org/protocol/muc#user'>
			<status code='201'/>
			<item jid="${Romeo's full JID}" affiliation='owner' role='moderator'/>
			<status code='110'/>
		</x>
	</presence>

Romeo receives:
	<message type='groupchat' from='room@conference.localhost'><subject/></message>

# Disable presences for non-mods
Romeo sends:
	<iq id='config1' to='room@conference.localhost' type='set'>
		<query xmlns='http://jabber.org/protocol/muc#owner'>
			<x xmlns='jabber:x:data' type='submit'>
				<field var='FORM_TYPE'>
					<value>http://jabber.org/protocol/muc#roomconfig</value>
				</field>
				<field var='muc#roomconfig_presencebroadcast'>
					<value>moderator</value>
				</field>
			</x>
		</query>
	</iq>

Romeo receives:
	<iq id="config1" from="room@conference.localhost" type="result">
	</iq>

# Romeo probes himself

Romeo sends:
	<presence to="room@conference.localhost/Romeo" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Romeo receives:
	<presence from='room@conference.localhost/Romeo'>
		<x xmlns='http://jabber.org/protocol/muc#user'>
			<item jid="${Romeo's full JID}" affiliation='owner' role='moderator'/>
		</x>
	</presence>

# Juliet tries to probe Romeo before joining the room

Juliet connects

Juliet sends:
	<presence to="room@conference.localhost/Romeo" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Juliet receives:
	<presence from="room@conference.localhost/Romeo" type="error">
		<error type="cancel">
			<not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
		</error>
	</presence>

# Juliet tries to probe Mercutio (who's not in the MUC) before joining the room

Juliet sends:
	<presence to="room@conference.localhost/Mercutio" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Juliet receives:
	<presence from="room@conference.localhost/Mercutio" type="error">
		<error type="cancel">
			<not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
		</error>
	</presence>

# Juliet joins the room

Juliet sends:
	<presence to="room@conference.localhost/Juliet">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Juliet receives:
	<presence from="room@conference.localhost/Romeo" />

Juliet receives:
	<presence from="room@conference.localhost/Juliet" />

# Romeo probes Juliet

Romeo sends:
	<presence to="room@conference.localhost/Juliet" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Romeo receives:
	<presence from='room@conference.localhost/Juliet'>
		<x xmlns='http://jabber.org/protocol/muc#user'>
			<item jid="${Juliet's full JID}" affiliation='none' role='participant'/>
		</x>
	</presence>


# Mercutio tries to probe himself in a MUC before joining

Mercutio connects

Mercutio sends:
	<presence to="room@conference.localhost/Mercutio" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Mercutio receives:
	<presence from="room@conference.localhost/Mercutio" type="error">
		<error type="cancel">
			<not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
		</error>
	</presence>


# Romeo makes Mercutio a member and registers his nickname

Romeo sends:
	<iq id='member1' to='room@conference.localhost' type='set'>
		<query xmlns='http://jabber.org/protocol/muc#admin'>
			<item affiliation='member' jid="${Mercutio's JID}" nick="Mercutio"/>
		</query>
	</iq>

Romeo receives:
	<message from='room@conference.localhost'>
		<x xmlns='http://jabber.org/protocol/muc#user'>
			<item jid="${Mercutio's JID}" affiliation='member' />
		</x>
	</message>

Romeo receives:
	<iq from='room@conference.localhost' id='member1' type='result'/>


# Romeo probes Mercutio, even though he's unavailable

Romeo sends:
	<presence to="room@conference.localhost/Mercutio" type="probe">
		<x xmlns="http://jabber.org/protocol/muc"/>
	</presence>

Romeo receives:
	<presence from='room@conference.localhost/Mercutio' type="unavailable">
		<x xmlns='http://jabber.org/protocol/muc#user'>
			<item nick="Mercutio" affiliation='member' role='none' jid="${Mercutio's JID}" />
		</x>
	</presence>