Software /
code /
prosody
File
spec/scansion/muc_presence_probe.scs @ 11592:64cfa396bb84
net.server_epoll: Fix reporting of socket connect timeout
If the underlying TCP connection times out before the write timeout
kicks in, end up here with err="timeout", which the following code
treats as a minor issue.
Then, due to epoll apparently returning the EPOLLOUT (writable) event
too, we go on and try to write to the socket (commonly stream headers).
This fails because the socket is closed, which becomes the error
returned up the stack to the rest of Prosody.
This also trips the 'onconnect' signal, which has effects on various
things, such as the net.connect state machine. Probably undesirable
effects.
With this, we instead return "connection timeout", like server_event,
and destroy the connection handle properly. And then nothing else
happens because the connection has been destroyed.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 07 Jun 2021 17:37:14 +0200 |
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>