forked from xsf/xeps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxep-0483.xml
418 lines (417 loc) · 23.4 KB
/
xep-0483.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
<!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep xmlns="">
<header>
<title>HTTP Online Meetings</title>
<abstract>This specification defines a protocol extension to request URLs from an external HTTP entity usable to initiate and invite participants to an online meeting.</abstract>
&LEGALNOTICE;
<number>0483</number>
<status>Experimental</status>
<type>Standards Track</type>
<sig>Standards</sig>
<approver>Council</approver>
<dependencies/>
<supersedes/>
<supersededby/>
<shortname>http_online-meetings</shortname>
<author>
<firstname>Dele</firstname>
<surname>Olajide</surname>
<email>[email protected]</email>
<jid>[email protected]</jid>
</author>
<author>
<firstname>Guus</firstname>
<surname>der Kinderen</surname>
<email>[email protected]</email>
<jid>[email protected]</jid>
</author>
<revision>
<version>0.2.0</version>
<date>2023-12-12</date>
<initials>do</initials>
<remark>
<ul>
<li>Use XEP-0482 to send the meeting link to another party</li>
</ul>
</remark>
</revision>
<revision>
<version>0.1.0</version>
<date>2023-12-11</date>
<initials>XEP Editor: kis</initials>
<remark>
<ul>
<li>Promoted to Experimental.</li>
</ul>
</remark>
</revision>
<revision>
<version>0.0.3</version>
<date>2023-09-12</date>
<initials>gdk</initials>
<remark>
<ul>
<li>Modified wording of abstract.</li>
<li>Specified distribution of URL / add meeting invitation</li>
<li>Differentiate between Meeting service providers that are integrated with XMPP server, and those that are not.</li>
<li>Differentiate between URL to create and join meeting</li>
<li>Replaced textual references with XML entities</li>
<li>Introduced distinct namespaces for create and invite, retaining type-specific namespaces for feature discovery</li>
<li>Introduced Meeting Service type registry</li>
<li>Removed CORS-related implementation note</li>
<li>Meeting ID in request now optional</li>
<li>Add optional 'desc' in the meeting request.</li>
<li>Moved IQ child elements into a wrapper, renamed 'create' element to 'initiate'</li>
<li>Add fall-back body element to invite message stanza.</li>
<li>Removed dependency on XEP-0066.</li>
</ul>
</remark>
</revision>
<revision>
<version>0.0.2</version>
<date>2023-08-22</date>
<initials>do</initials>
<remark>
<ul>
<li>Remove base URL attribute.</li>
<li>Add support for a web-based protocol handler in OOB data result.</li>
</ul>
</remark>
</revision>
<revision>
<version>0.0.1</version>
<date>2023-08-21</date>
<initials>do</initials>
<remark>
<ul>
<li>Initial version.</li>
</ul>
</remark>
</revision>
</header>
<section1 topic="Introduction" anchor="intro">
<p>XMPP protocol extensions already defines a method for initiating peer-to-peer media sessions such as &xep0166; however due to its very nature of being peer-to-peer it presents a few challenges in scenarios with online meetings that depend on a central Selective Forwarding Unit (SFU) or a Multipoint Control Unit (MCU) to host the meeting..</p>
<p>Using a web browser to manually request a meeting URL from an HTTP server and sharing the link has been a workaround for this for a long time now. While users have a variety of services to choose from, the downside of this manual approach is that an XMPP client can not automate this process on behalf of the user since these services don’t share a common API.</p>
<p>This XEP defines an approach to request initiation of an online meeting via an HTTP server and receive a URL can be used to join and invite others to the meeting. It has two main features:</p>
<ol>
<li>An IQ-based protocol to request a meeting link from a server.</li>
<li>An element that can be added to a message stanza for sending the received meeting link to another party</li>
</ol>
<p>
The second feature is achieved by using &xep0482;, which describes
call invites using Jingle and external URIs. The XEP mentions how a web URLs can be used as external URI to join a call. For completeness, an example is repeated here to explicitly show how meeting invitations should be sent to invitees.
</p>
<p>
&xep0482; has other call mangement features, like announcing call join and
leave on the XMPP side. These are relevant for online meetings when the website behind the URL is opened
in a frame or similar inside the XMPP client. The meeting host xmpp client can track meeting participants and know when users leave the meeting without having to depend on APIs provided by the meeting service provider which may present cross-domain challenges.
For completeness, examples are also repeated in this XEP to explicity show their application for online meeting invitations.
</p>
</section1>
<section1 topic="Requirements" anchor="reqs">
<ul>
<li>Be as easy to implement as possible. This is grounded on the idea that most programming languages already have HTTP libraries available.</li>
<li>Usable with Meeting service providers that have no XMPP integration.</li>
<li>Anyone who knows the URL SHOULD be able to access it.</li>
</ul>
</section1>
<section1 topic="Discovering Support" anchor="disco">
<section2 topic="Meeting Initiation" anchor="disco-initiation">
<p>An entity advertises support for meeting initiation, as specified by this protocol, by including the "urn:xmpp:http:online-meetings:initiate:0" namespace, as well as "urn:xmpp:http:online-meetings#xxxxxx" (where xxxxx is the name of the supported meeting service) namespaces in its service discovery information features as specified in &xep0030; or section 6.3 of &xep0115;.</p>
<p>A user’s server SHOULD include itself as a services provider for this protocol in its service discovery items.</p>
<example caption="Client sends service discovery request to server"><![CDATA[
<iq from='[email protected]/garden'
to='montague.tld'
id='disco_01'
type='get'>
<query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>]]></example>
<example caption="Server replies to service discovery request and reports capability to initiate online meetings for Jitsi and Galene"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='disco_01'
type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity
category='server'
type='im'
name='Openfire Server'/>
<feature var='urn:xmpp:http:online-meetings:initiate:0'/>
<feature var='urn:xmpp:http:online-meetings#jitsi'/>
<feature var='urn:xmpp:http:online-meetings#galene'/>
</query>
</iq>]]></example>
</section2>
<section2 topic="Invitation" anchor="disco-server">
<p>If an entity supports receiving meeting invitations as specified by this protocol, it advertises support by including the "urn:xmpp:http:online-meetings:invite:0" in its service discovery information features as specified in &xep0030; or section 6.3 of &xep0115;. Support for specific meeting services can be specified by including the corresponding "urn:xmpp:http:online-meetings#xxxxxx" namespaces.</p>
<example caption="Client sends service discovery request to invitee"><![CDATA[
<iq from='[email protected]/garden'
to='[email protected]/balcony'
id='disco_02'
type='get'>
<query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>]]></example>
<example caption="Client replies to service discovery request and reports capability to accept invitations for online meeting for Jitsi."><![CDATA[
<iq from='[email protected]/balcony'
to='[email protected]/garden'
id='disco_02'
type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
<identity
category='client'
type='im'
name='Spark'/>
<feature var='urn:xmpp:http:online-meetings:invite:0'/>
<feature var='urn:xmpp:http:online-meetings#jitsi'/>
</query>
</iq>]]></example>
<p>In order for an application to determine whether an entity supports this protocol, where possible it SHOULD use the dynamic, presence-based profile of service discovery defined in &xep0115;. However, if an application has not received entity capabilities information from an entity, it SHOULD use explicit service discovery instead.</p>
</section2>
</section1>
<section1 topic="Requesting a Meeting" anchor="request">
<p>A client requests an online new meeting to be initiated by sending an IQ-get to the server containing a <query> child element qualified by the 'urn:xmpp:http:online-meetings:invite:0' namespace.</p>
<p>This 'query' MUST include the type attribute specifying the Meeting Service type, which SHOULD be registered as described in the <link url="#registrar-type">Meeting Service Type Registry</link> section of this document.</p>
<example caption="Client requests the server to initiate a new online meeting."><![CDATA[
<iq from='[email protected]/garden'
to='montague.tld'
id='initiate_01'
type='get'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'/>
</iq>]]></example>
<p>If the requesting entity desires to (re)initiate a meeting with a specific identifier, the optional 'id' attribute can be used to specify the identity of the online meeting requested. When the provided value cannot be used, for example when it does not match the format used by a meeting provider, or a meeting with that particular value is already in use, the server SHOULD return an error.</p>
<example caption="Client requests a URL for a meeting with a specific ID from the server"><![CDATA[
<iq from='[email protected]/garden'
to='montague.tld'
id='initiate_02'
type='get'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'
id='my_meeting'/>
</iq>]]></example>
<p>An optional 'desc' child element can be used to assign a human-readable description to the meeting. The server MAY use this value when configuring the online meeting with the service provider, and SHOULD use this value in its response, but otherwise treat this as an opaque value.</p>
<example caption="Client uses the optional 'desc' when requesting a meeting to be initiated."><![CDATA[
<iq from='[email protected]/garden'
to='montague.tld'
id='initiate_03'
type='get'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'>
<desc>Meeting room for Open Standards discussion</desc>
</query>
</iq>]]></example>
<p>The XMPP server responds with one or two child elements: a 'initiate' element that contains a URL to be used to create and configure the meeting, and an 'invite' element as specified by &xep0482; to invite others into the meeting.</p>
<p>In the URLs that it returns, the server MAY specify a web-based protocol handler if available and registered by the user. Otherwise, standard HTTPS protocol will be specified. In any case, the fully resolved URL provided by the host MUST provide Transport Layer Security (&rfc5246;). The HTTPS URL MUST adhere to &rfc3986;. Non ASCII characters MUST be percent-encoded.</p>
<example caption="The server responds with an out of band URI specifying a registered jitsi web-based protocol handler"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_03'
type='result'>
<query xmlns='urn:xmpp:http:online-meetings:0'>
<initiate type='jitsi'>
<url>web+jitsi:OpenStandardsMuchGreatness</url>
<desc>Meeting room for Open Standards discussion</desc>
</initiate>
<invite xmlns='urn:xmpp:call-invites:0'>
<external uri='web+jitsi:OpenStandardsMuchGreatness' />
<meeting xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'
desc='Meeting room for Open Standards discussion' />
</invite>
</query>
</iq>]]></example>
<example caption="The server responds with an out of band URI using standard HTTPS"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_03'
type='result'>
<query xmlns='urn:xmpp:http:online-meetings:0'>
<initiate type='jitsi'>
<url>https://meet.jit.si/OpenStandardsMuchGreatness</url>
<desc>Meeting room for Open Standards discussion</desc>
</initiate>
<invite xmlns='urn:xmpp:call-invites:0'>
<external uri='https://meet.jit.si/OpenStandardsMuchGreatness' />
<meeting xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'
desc='Meeting room for Open Standards discussion' />
</invite>
</query>
</iq>]]></example>
<p>The XMPP server MAY be tightly integrated with the Meeting Provider and facilitate registration, configuration and association of a web-based protocol handler, but the protocol to implement such integration is out of scope of this document.</p>
<p>If the XMPP server is tightly integrated with the Meeting Provider, and no other data is needed for a meeting to be initiated, the XMPP server MAY initiate a meeting on behalf of the requester and leave out the 'initiate' element from the response. Note that a server SHOULD include a 'initiate' URL in its response if it cannot initiate a meeting on behalf of the requesting entity, even if it knows that no additional data is needed for a meeting to be automatically initiated upon joining the meeting URL. Inclusion of the 'initiate' element signals that the requesting entity may need join the meeting as the first participant, in order to be assigned 'creator' or 'moderator' privileges.</p>
</section1>
<section1 topic="Error conditions" anchor="errors">
<p>Instead of providing the client with a URL the server MAY respond with an error if the request fails. In addition, the HTTP entity MAY inform the requester about the reason for the failure.</p>
<example caption="Alternative response by the server if the meeting initiation request includes unsupported type"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_01'
type='error'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'/>
<error type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>The 'jitsi' meeting service provider type is not supported.</text>
</error>
</iq>]]></example>
<example caption="Alternative response by the server if the meeting initiation request fails due to meeting ID collision"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_02'
type='error'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'
id='my-meeting'/>
<error type='modify'>
<not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Meeting is in use</text>
</error>
</iq>]]></example>
<p>For any other type of error the service SHOULD respond with appropriate error types to indicate temporary or permanent errors.</p>
<p>For temporary errors such as exceeding a personal quota the service MAY include a <retry/> element qualified by the 'urn:xmpp:http:online-meetings:0' namespace as a child of the <error/> element. The retry element MUST include an attribute 'stamp' which indicates the time at which the requesting entity may try again. The format of the timestamp MUST adhere to the date-time format specified in &xep0082; and MUST be expressed in UTC.</p>
<example caption="Alternative response by the server to indicate a temporary error after the client exceeded a quota"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_01'
type='error'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'/>
<error type='wait'>
<resource-constraint xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Quota reached. You can only request 5 meetings a day</text>
<retry xmlns='urn:xmpp:http:online-meetings:0' stamp='2017-12-03T23:42:05Z'/>
</error>
</iq>]]></example>
<example caption="Alternative response by the server to indicate an auth error to a client that is not allowed to initiate an online meeting"><![CDATA[
<iq from='montague.tld'
to='[email protected]/garden'
id='initiate_01'
type='error'>
<query xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'/>
<error type='auth'>
<forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<text xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Only premium members are allowed to initiate meetings</text>
</error>
</iq>]]></example>
</section1>
<section1 topic="Meeting Invitation" anchor="meeting-invitation">
<p>After the requesting entity has successfully initiated a meeting, it MAY invite other entities to join the meeting using the 'invite' element it received to propose the meeting</p>
<p>To allow users of clients that do not support &xep0482; to receive the invitation, a &xep0066; element and/or a 'body' element containing the meeting details MAY be included.</p>
<p>There is no further XMPP communication required between the server and the requesting entity for participants to join the meeting. The actual online meeting engagement with the provided URL is out of scope of this document.</p>
<section2 topic="Proposing a meeting" anchor="meeting-proposal">
<p>
Invitees are sent a message containing an <invite> element in the urn:xmpp:call-invites:0
namespace. For online meetings, the audio video attributes should default to "true".
</p><p>
The <invite> element contains sub-elements <external> and <meeting> to provide the meeting URL and the identity of the meeting service provider.
</p> <example caption="User sends meeting invitation"><![CDATA[
<message
id='invite_01'
from='[email protected]/garden'
to='[email protected]/balcony'>
<invite xmlns='urn:xmpp:call-invites:0'>
<external uri='https://meet.jit.si/OpenStandardsMuchGreatness' />
<meeting xmlns='urn:xmpp:http:online-meetings:0'
type='jitsi'
desc='Meeting room for Open Standards discussion' />
</invite>
<x xmlns='jabber:x:oob'>
<url>https://meet.jit.si/OpenStandardsMuchGreatness</url>
<desc>Meeting room for Open Standards discussion</desc>
</x>
<body>You are invited to join 'Meeting room for Open Standards discussion' at https://meet.jit.si/OpenStandardsMuchGreatness</body>
</message>]]></example>
</section2>
<section2 topic="Retracting a meeting invitation" anchor="meeting-retraction">
<p>
A meeting invitation can be retracted by sending a message containing a <retract> element with an 'id' attribute
containing the id of the invite message qualified by the urn:xmpp:call-invites:0 namespace.
</p>
<example caption="Retracting a meeting"><![CDATA[
<message to='[email protected]/balcony'>
<retract id='invite_01' xmlns='urn:xmpp:call-invites:0' />
</message>]]></example>
</section2>
<section2 topic="Accepting a meeting invitation" anchor="meeting-acceptance">
<p>
A meeting invitation can be accepted by sending a message containing an <accept> element with an 'id' attribute
containing the id of the invite message and qualified by the urn:xmpp:call-invites:0 namespace.
The <external> and <meeting> elements from the invitation are placed in the <accept> element as specified in &xep0482;.
</p>
<example caption="Accepting a meeting invitation"><![CDATA[
<message to='[email protected]/garden'>
<accept id='invite_01' xmlns='urn:xmpp:call-invites:0'>
<external uri='https://meet.jit.si/OpenStandardsMuchGreatness' />
<meeting type='jitsi' desc='Meeting room for Open Standards discussion' />
</accept>
</message>]]></example>
<p>
After the <accept> was sent, the accepting client handles the URI. The exact behaviour of opening the URI is implementation specific and can be determined from the type attribute of the <meeting> element.
</p>
</section2>
<section2 topic="Rejection a meeting invitation" anchor="meeting-rejection">
<p>
A meeting invitation can be rejected by sending a message containing a <reject> element with an 'id' attribute
containing the id of the invite message and qualified by the urn:xmpp:call-invites:0 namespace.
</p>
<example caption="Rejecting a meeting invitation"><![CDATA[
<message to='[email protected]/garden'>
<reject id='invite_01' xmlns='urn:xmpp:call-invites:0' />
</message>]]></example>
</section2>
<section2 topic="Leaving a meeting" anchor="meeting-exit">
<p>
When a meeting participant leaves a meeting, it sends a message containing a <left> element with an 'id' attribute
containing the id of the invite message and qualified by the urn:xmpp:call-invites:0 namespace.
</p>
<example caption="Leaving a meeting"><![CDATA[
<message to='[email protected]/garden'>
<left id='invite_01' xmlns='urn:xmpp:call-invites:0' />
</message>]]></example>
</section2>
</section1>
<section1 topic="Implementation Notes" anchor="impl">
<p>The server SHOULD choose an appropriate timeout for the validity of the URL. Since there is no reason for a client to wait between requesting the URL and joining the meeting via the URL before dispatching invitations, relatively low timeout values of around 300s are RECOMMENDED.</p>
</section1>
<section1 topic="Security Considerations" anchor="security">
<section2 topic="General" anchor="general">
<ul>
<li>Service implementors SHOULD use long randomized parts in their URLs making it impossible to guess the location of arbitrary meeting url.</li>
<li>Implementors should keep in mind, that without additional end-to-end-encryption, online meetings may not be secure. Client implementors are advised to either use this only for semi public meetings (for example meetings hosted on a public MUC) or implement appropriate end-to-end encryption.</li>
<li>Joining an HTTP Online Meeting will leak the client’s IP address to the HTTP service. The HTTP service might not be the same service as the XMPP service the client is currently connected to.</li>
</ul>
</section2>
</section1>
<section1 topic="IANA Considerations" anchor="iana">
<p>This document requires no interaction with the &IANA;</p>
</section1>
<section1 topic="XMPP Registrar Considerations" anchor="registrar">
<section2 topic="Protocol Namespaces" anchor="registrar-ns">
<p>This specification defines the following XML namespaces:</p>
<ul>
<li>urn:xmpp:http:online-meetings:0</li>
<li>urn:xmpp:http:online-meetings:initiate:0</li>
<li>urn:xmpp:http:online-meetings:invite:0</li>
<li>urn:xmpp:http:online-meetings#jitsi</li>
<li>urn:xmpp:http:online-meetings#galene</li>
</ul>
<p>Upon advancement of this specification from a status of Experimental to a status of Draft, the ®ISTRAR; shall add the foregoing namespace to the registry located at &NAMESPACES;, as described in Section 4 of &xep0053;.</p>
</section2>
<section2 topic="Meeting Serviced Type Registry" anchor="registrar-type">
<p>The XMPP Registrar maintains a registry of Meeting provider types at TBD.</p>
</section2>
</section1>
<section1 topic="XML Schema" anchor="schema">
<code><![CDATA[
<xml version="1.0" encoding="utf8">
<!-- TBD -->
]]></code>
</section1>
</xep>