annotate libervia/backend/plugins/plugin_misc_remote_control.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 0d7bb4df2343
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Libervia: an XMPP client
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2024 Jérôme Poisson (goffi@goffi.org)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 from twisted.internet import defer
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from twisted.words.protocols.jabber import jid
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.words.xish import domish
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from wokkel import disco, iwokkel
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from zope.interface import implementer
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
25
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from libervia.backend.core import exceptions
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from libervia.backend.core.constants import Const as C
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from libervia.backend.core.core_types import SatXMPPEntity
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from libervia.backend.core.i18n import D_, _
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from libervia.backend.core.log import getLogger
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from libervia.backend.tools import xml_tools
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from libervia.backend.tools.common import data_format
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from .plugin_xep_0166 import BaseApplicationHandler
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
35
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 log = getLogger(__name__)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
37
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 NS_REMOTE_CONTROL = "urn:xmpp:jingle:apps:remote-control:0"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
39
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 PLUGIN_INFO = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 C.PI_NAME: "Jingle Remove Control",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 C.PI_IMPORT_NAME: "RemoteControl",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_TYPE: C.PLUG_TYPE_MISC,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_PROTOCOLS: [],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_DEPENDENCIES: ["XEP-0166", "XEP-0167"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 C.PI_MAIN: "RemoteControl",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 C.PI_HANDLER: "yes",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 C.PI_DESCRIPTION: _("""Remote control devices with Jingle."""),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 class RemoteControl(BaseApplicationHandler):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 def __init__(self, host):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 log.info(f'Plugin "{PLUGIN_INFO[C.PI_NAME]}" initialization')
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 self.host = host
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 # FIXME: to be removed once host is accessible from global var
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 self._j = host.plugins["XEP-0166"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 # We need higher priority than XEP-0167 application, as we have a RemoteControl
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 # session and not a call one when this application is used.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 self._j.register_application(NS_REMOTE_CONTROL, self, priority=1000)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 self._rtp = host.plugins["XEP-0167"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 host.register_namespace("remote-control", NS_REMOTE_CONTROL)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 host.bridge.add_method(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 "remote_control_start",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 ".plugin",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 in_sign="sss",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 out_sign="s",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 method=self._remote_control_start,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 async_=True,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
72
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 def get_handler(self, client):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 return RemoteControl_handler()
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
75
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 # bridge methods
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
77
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 def _remote_control_start(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 peer_jid_s: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 extra_s: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 profile: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 ) -> defer.Deferred[str]:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 client = self.host.get_client(profile)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 extra = data_format.deserialise(extra_s)
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
86 d = defer.ensureDeferred(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
87 self.remote_control_start(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
88 client,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
89 jid.JID(peer_jid_s),
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
90 extra,
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
91 )
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
92 )
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 d.addCallback(data_format.serialise)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 return d
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
95
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 async def remote_control_start(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
97 self, client: SatXMPPEntity, peer_jid: jid.JID, extra: dict
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 ) -> dict:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 """Start a remote control session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
100
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 @param peer_jid: destinee jid
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 @return: progress id
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 if not extra:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
105 raise exceptions.DataError('"extra" must be set.')
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 # webrtc is always used for remote control
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 extra["webrtc"] = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 content = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 "app_ns": NS_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 # XXX: for now only unidirectional device exist, but future extensions mays be
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 # bidirectional, and which case "senders" would be set to "both"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 "senders": self._j.ROLE_INITIATOR,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 "app_kwargs": {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 "extra": extra,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 },
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 call_data = content["app_kwargs"]["extra"]["call_data"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 except KeyError:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 raise exceptions.DataError('"call_data" must be set in "extra".')
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
121
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 metadata = self._rtp.parse_call_data(call_data)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 application_data = call_data["application"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 except KeyError:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
126 raise exceptions.DataError('"call_data" must have an application media.')
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 content["transport_data"] = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 "sctp-port": metadata["sctp-port"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 "max-message-size": metadata.get("max-message-size", 65536),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 "local_ice_data": {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 "ufrag": metadata["ice-ufrag"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 "pwd": metadata["ice-pwd"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 "candidates": application_data.pop("ice-candidates"),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 "fingerprint": application_data.pop("fingerprint", {}),
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
136 },
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 name = application_data.get("id")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 if name:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 content["name"] = name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 except KeyError as e:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 raise exceptions.DataError(f"Mandatory key is missing: {e}")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 contents = [content]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 contents.extend(self._rtp.get_contents(call_data, metadata))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 session_id = await self._j.initiate(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 client,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 peer_jid,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 contents,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 call_type=C.META_SUBTYPE_CALL_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 metadata=metadata,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 peer_metadata={},
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 return {"session_id": session_id}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
154
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 # jingle callbacks
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
156
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 def _get_confirm_msg(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 peer_jid: jid.JID,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 ) -> tuple[bool, str, str]:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 """Get confirmation message to display to user.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
163
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 This is the message to show when a remote-control request is received."""
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 if client.roster and peer_jid.userhostJID() not in client.roster:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 is_in_roster = False
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 confirm_msg = D_(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 "Somebody not in your contact list ({peer_jid}) wants to control "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 "remotely this device. Accepting this will give full control of your "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 " device to this person, and leak your presence and probably your IP "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 "address. Do not accept if you don't trust this person!\n"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 "Do you accept?"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 ).format(peer_jid=peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 confirm_title = D_("Remote Control Request From an Unknown Contact")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 is_in_roster = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 confirm_msg = D_(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 "{peer_jid} wants to control your device. Accepting will give full "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 "control of your device, like if they were in front of your computer. "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 "Only accept if you absolute trust this person.\n"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 "Do you accept?"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 ).format(peer_jid=peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 confirm_title = D_("Remote Control Request.")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
184
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 return (is_in_roster, confirm_msg, confirm_title)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
186
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 async def jingle_preflight(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 self, client: SatXMPPEntity, session: dict, description_elt: domish.Element
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 """Perform preflight checks for an incoming call session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
191
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 Check if the calls is audio only or audio/video, then, prompts the user for
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 confirmation.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
194
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 @param description_elt: The description element. It's parent attribute is used to
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 determine check siblings to see if it's an audio only or audio/video call.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
199
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 @raises exceptions.CancelError: If the user doesn't accept the incoming call.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 session_id = session["id"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 peer_jid = session["peer_jid"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
204
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
205 is_in_roster, confirm_msg, confirm_title = self._get_confirm_msg(client, peer_jid)
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 if is_in_roster:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
207 action_type = C.META_TYPE_CONFIRM
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
208 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
209 action_type = C.META_TYPE_NOT_IN_ROSTER_LEAK
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
210
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 action_extra = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 "type": action_type,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
213 "session_id": session_id,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 "from_jid": peer_jid.full(),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
215 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 action_extra["subtype"] = C.META_TYPE_REMOTE_CONTROL
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 accepted = await xml_tools.defer_confirm(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 self.host,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 confirm_msg,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 confirm_title,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 profile=client.profile,
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
222 action_extra=action_extra,
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
224 if accepted:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 session["pre_accepted"] = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 return accepted
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
227
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 async def jingle_preflight_info(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 info_type: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 info_data: dict | None = None,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 pass
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
236
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 async def jingle_preflight_cancel(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 self, client: SatXMPPEntity, session: dict, cancel_error: exceptions.CancelError
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
240 """The remote control has been rejected"""
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 def jingle_session_init(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
243 self, client: SatXMPPEntity, session: dict, content_name: str, extra: dict
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 ) -> domish.Element:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 """Initializes a jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
246
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 @param content_name: Name of the content.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 @param extra: Extra data.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 @return: <description> element.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 desc_elt = domish.Element((NS_REMOTE_CONTROL, "description"))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 devices = extra.get("devices") or {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 for name, data in devices.items():
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 device_elt = desc_elt.addElement((NS_REMOTE_CONTROL, "device"))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 device_elt["type"] = name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 return desc_elt
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
259
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 async def jingle_request_confirmation(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 action: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 desc_elt: domish.Element,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 ) -> bool:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 """Requests confirmation from the user for a Jingle session's incoming call.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
269
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 This method checks the content type of the Jingle session (audio or video)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 based on the session's contents. Confirmation is requested only for the first
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 content; subsequent contents are automatically accepted. This means, in practice,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 that the call confirmation is prompted only once for both audio and video
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
274 contents.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
275
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 @param action: The action type associated with the Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 @param content_name: Name of the content being checked.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
280 @param desc_elt: The description element associated with the content.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
281
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
282 @return: True if the call is accepted by the user, False otherwise.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
283 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
284 content_data = session["contents"][content_name]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 role = session["role"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
286
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
287 if role == self._j.ROLE_INITIATOR:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 raise NotImplementedError
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 return True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 elif role == self._j.ROLE_RESPONDER:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 # We are the controlled entity.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
292 return await self._remote_control_request_conf(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
293 client, session, content_data, content_name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
295 else:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
296 raise exceptions.InternalError(f"Invalid role {role!r}")
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
297
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
298 async def _remote_control_request_conf(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
299 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 content_data: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 ) -> bool:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 """Handle user permission."""
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 peer_jid = session["peer_jid"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 pre_accepted = session.get("pre_accepted", False)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 __, confirm_msg, confirm_title = self._get_confirm_msg(client, peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 contents = session["contents"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 action_extra = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
311 "pre_accepted": pre_accepted,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 "type": C.META_TYPE_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 "devices": content_data["application_data"]["devices"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 "session_id": session["id"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 "from_jid": peer_jid.full(),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 for name, content in contents.items():
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
318 if name == content_name:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 continue
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 if content["application"].namespace == self._rtp.namespace:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 media = content["application_data"]["media"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 action_extra.setdefault("screenshare", {})[media] = {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
323
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 return await xml_tools.defer_confirm(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 self.host,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 confirm_msg,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 confirm_title,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 profile=client.profile,
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4241
diff changeset
329 action_extra=action_extra,
4241
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
330 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
331
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 async def jingle_handler(self, client, action, session, content_name, desc_elt):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 content_data = session["contents"][content_name]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
334 application_data = content_data["application_data"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
335 if action == self._j.A_PREPARE_CONFIRMATION:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 devices = application_data["devices"] = {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
337 for device_elt in desc_elt.elements(NS_REMOTE_CONTROL, "device"):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 device_type = device_elt.attributes["type"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
340 except KeyError:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 log.warning(f"Invalide device element: {device_elt.toXml()}")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 # The dict holds data for current type of devices. For now it is unused
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 # has the spec doesn't define any device data, but it may be used by
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 # future extensions.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 devices[device_type] = {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
347 elif action == self._j.A_SESSION_INITIATE:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
348 # FIXME: for now we automatically accept keyboard, mouse and wheel and nothing
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 # else. Must actually reflect user choices and local devices.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
350 to_remove = []
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 for device_elt in desc_elt.elements(NS_REMOTE_CONTROL, "device"):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
352 if device_elt.getAttribute("type") not in ("keyboard", "wheel", "mouse"):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 to_remove.append(device_elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
354 for elt in to_remove:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
355 elt.parent.children.remove(elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
356
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
357 return desc_elt
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
358
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 def jingle_terminate(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 action: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
363 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 reason_elt: domish.Element,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
366 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 reason, text = self._j.parse_reason_elt(reason_elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 data = {"reason": reason}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 if text:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
370 data["text"] = text
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
371 self.host.bridge.call_ended(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 session["id"], data_format.serialise(data), client.profile
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
373 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
374
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
375
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 @implementer(iwokkel.IDisco)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 class RemoteControl_handler(XMPPHandler):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
378 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 return [disco.DiscoFeature(NS_REMOTE_CONTROL)]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
380
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
382 return []