annotate libervia/backend/plugins/plugin_xep_0298.py @ 4351:6a0a081485b8

plugin autocrypt: Autocrypt protocol implementation: Implementation of autocrypt: `autocrypt` header is checked, and if present and no public key is known for the peer, the key is imported. `autocrypt` header is also added to outgoing message (only if an email gateway is detected). For the moment, the JID is use as identifier, but the real email used by gateway should be used in the future. rel 456
author Goffi <goffi@goffi.org>
date Fri, 28 Feb 2025 09:23:35 +0100
parents a0ed5c976bf8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Libervia plugin to handle events
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # Copyright (C) 2009-2022 Jérôme Poisson (goffi@goffi.org)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from urllib.parse import quote, unquote
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from twisted.words.protocols.jabber import jid
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.words.xish import domish
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
23 from libervia.backend.core.core_types import SatXMPPEntity
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from libervia.backend.core.i18n import _
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from libervia.backend.core.constants import Const as C
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from libervia.backend.core.log import getLogger
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from wokkel import disco, iwokkel
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from zope.interface import implementer
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
31 from libervia.backend.plugins.plugin_xep_0166 import XEP_0166
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
32
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 log = getLogger(__name__)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
34
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
35
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 PLUGIN_INFO = {
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 C.PI_NAME: "Events",
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 C.PI_IMPORT_NAME: "XEP-0298",
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 C.PI_TYPE: "XEP",
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 C.PI_MODES: C.PLUG_MODE_BOTH,
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 C.PI_PROTOCOLS: [],
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
42 C.PI_DEPENDENCIES: ["XEP-0167"],
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_MAIN: "XEP_0298",
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_HANDLER: "yes",
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_DESCRIPTION: _(
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 "Delivering Conference Information to Jingle Participants (Coin). This plugin "
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 "is used to associate metadata about uses an call states in multi-party calls."
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 ),
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 }
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 NS_COIN = "urn:xmpp:coin:1"
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 NS_CONFERENCE_INFO = "urn:ietf:params:xml:ns:conference-info"
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 class XEP_0298:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 namespace = NS_COIN
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 def __init__(self, host):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 self.host = host
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
61 self._j: XEP_0166 = host.plugins["XEP-0166"]
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
62 host.trigger.add(
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
63 "XEP-0167_jingle_session_init", self._jingle_session_init_trigger
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
64 )
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
65 host.trigger.add("XEP-0167_jingle_handler", self._jingle_handler_trigger)
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 def get_handler(self, client):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 return CoinHandler(self)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
70 def _jingle_session_init_trigger(
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
71 self,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
72 client: SatXMPPEntity,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
73 session: dict,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
74 content_name: str,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
75 media: str,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
76 media_data: dict,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
77 desc_elt: domish.Element,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
78 ) -> None:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
79 """Check for the presence of "user" metadata, and add relevant elements."""
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
80 if client.profile == "conferences":
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
81 if content_name != next(iter(session["contents"].keys())):
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
82 # We only apply metadata for the first content, as it is global.
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
83 return
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
84 try:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
85 user = session["metadata"]["user"]
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
86 except KeyError:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
87 return
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
88 jingle_elt = session["jingle_elt"]
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
89 conference_info_elt = self.add_conference_info(jingle_elt, True)
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
90 self.add_user(conference_info_elt, user)
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
91
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
92 async def _jingle_handler_trigger(
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
93 self,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
94 client: SatXMPPEntity,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
95 action: str,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
96 session: dict,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
97 content_name: str,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
98 desc_elt: domish.Element,
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
99 ) -> None:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
100 # this is a session metadata, so we only generate it on the first content
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
101 if action == self._j.A_PREPARE_CONFIRMATION and content_name == next(
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
102 iter(session["contents"])
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
103 ):
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
104 jingle_elt = session["jingle_elt"]
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
105 infos = self.parse(jingle_elt)
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
106 try:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
107 user = infos["info"]["users"][0]
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
108 except (KeyError, IndexError):
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
109 pass
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
110 else:
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
111 session.setdefault("metadata", {})["peer_user"] = user
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
112
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 def add_conference_info(
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 self, jingle_elt: domish.Element, is_focus: bool = False, **kwargs
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 ) -> domish.Element:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 """Create and return a <conference_info> element
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
117
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 @param jingle_elt: parent element
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 @param kwargs: attributes of the element.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 @return: created <conference-info> element.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 """
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 conference_info_elt = jingle_elt.addElement(
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 (NS_CONFERENCE_INFO, "conference-info"),
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 )
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 if is_focus:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 conference_info_elt["isfocus"] = C.BOOL_TRUE
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 conference_info_elt.attributes.update(kwargs)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 return conference_info_elt
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
129
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 def add_user(
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 self, conference_info_elt: domish.Element, entity: jid.JID
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 ) -> domish.Element:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 """Add an user to a cconference info element.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
134
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 If the parent <users> doesn't exist, it will be created.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 @param conference_info_elt: <conference-info> element where the <user> element
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 need to be added
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 @param entity: XMPP JID to use as entity.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 @return: created <user> element.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 """
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 try:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 users_elt = next(conference_info_elt.elements(NS_CONFERENCE_INFO, "users"))
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 except StopIteration:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 users_elt = conference_info_elt.addElement("users")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 user_elt = users_elt.addElement("user")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 user_elt["entity"] = f"xmpp:{quote(entity.userhost())}"
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 return user_elt
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
149
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 def parse(self, jingle_elt: domish.Element) -> dict:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 """Parse a Jingle element and return a dictionary with conference info if present.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 @param jingle_elt: Jingle element to parse.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 @return: Dictionary with "info" key if conference info is found.
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 """
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 try:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 conference_info_elt = next(
4294
a0ed5c976bf8 component conferences, plugin XEP-0167, XEP-0298: add stream user metadata:
Goffi <goffi@goffi.org>
parents: 4292
diff changeset
158 jingle_elt.elements(NS_CONFERENCE_INFO, "conference-info")
4292
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 )
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 except StopIteration:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 return {}
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
162
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 users = []
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 try:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 users_elt = next(conference_info_elt.elements(NS_CONFERENCE_INFO, "users"))
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 for user_elt in users_elt.elements(NS_CONFERENCE_INFO, "user"):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 entity = user_elt.getAttribute("entity")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 if entity.startswith("xmpp:"):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 try:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 entity = jid.JID(unquote(entity[5:]))
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 users.append(entity)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 except Exception as e:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 log.warning(f"Failed to parse entity {entity!r}: {e}")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 else:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 log.warning(f"Ignoring non-XMPP entity {entity!r}")
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 except StopIteration:
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 pass
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
178
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 return {"info": {"users": users}}
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
180
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
181
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 @implementer(iwokkel.IDisco)
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 class CoinHandler(XMPPHandler):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
184
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 def __init__(self, plugin_parent):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 self.plugin_parent = plugin_parent
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
187
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 return [
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 disco.DiscoFeature(NS_COIN),
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 ]
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
dd0891d0b22b plugin XEP-0298: Delivering Conference Information to Jingle Participants (Coin) implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 return []