annotate libervia/backend/plugins/plugin_misc_remote_control.py @ 4241:898db6daf0d0

core: Jingle Remote Control implementation: This is an implementation of the protoXEP that will be submitted to XSF. It handle establishment of a remote control session, and the management of A/V calls with XEP-0167. rel 436
author Goffi <goffi@goffi.org>
date Sat, 11 May 2024 13:52:43 +0200
parents
children 0d7bb4df2343
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
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 class RemoteControl(BaseApplicationHandler):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 def __init__(self, host):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 log.info(f'Plugin "{PLUGIN_INFO[C.PI_NAME]}" initialization')
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 self.host = host
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 # FIXME: to be removed once host is accessible from global var
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 self._j = host.plugins["XEP-0166"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 # 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
61 # session and not a call one when this application is used.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 self._j.register_application(NS_REMOTE_CONTROL, self, priority=1000)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 self._rtp = host.plugins["XEP-0167"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 host.register_namespace("remote-control", NS_REMOTE_CONTROL)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 host.bridge.add_method(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 "remote_control_start",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 ".plugin",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 in_sign="sss",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 out_sign="s",
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 method=self._remote_control_start,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 async_=True,
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
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 def get_handler(self, client):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 return RemoteControl_handler()
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
76
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 # bridge methods
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
78
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 def _remote_control_start(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 peer_jid_s: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 extra_s: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 profile: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 ) -> defer.Deferred[str]:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 client = self.host.get_client(profile)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 extra = data_format.deserialise(extra_s)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 d = defer.ensureDeferred(self.remote_control_start(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 client,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 jid.JID(peer_jid_s),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 extra,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 ))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 d.addCallback(data_format.serialise)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 return d
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
94
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 async def remote_control_start(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 peer_jid: jid.JID,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 extra: dict
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 ) -> dict:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 """Start a remote control session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
102
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 @param peer_jid: destinee jid
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 @return: progress id
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 if not extra:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 raise exceptions.DataError(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 '"extra" must be set.'
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 # webrtc is always used for remote control
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 extra["webrtc"] = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 content = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 "app_ns": NS_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 # 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
115 # bidirectional, and which case "senders" would be set to "both"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 "senders": self._j.ROLE_INITIATOR,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 "app_kwargs": {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 "extra": extra,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 },
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 call_data = content["app_kwargs"]["extra"]["call_data"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 except KeyError:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 raise exceptions.DataError('"call_data" must be set in "extra".')
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
125
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 metadata = self._rtp.parse_call_data(call_data)
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 application_data = call_data["application"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 except KeyError:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 raise exceptions.DataError(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 '"call_data" must have an application media.'
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 content["transport_data"] = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 "sctp-port": metadata["sctp-port"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 "max-message-size": metadata.get("max-message-size", 65536),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 "local_ice_data": {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 "ufrag": metadata["ice-ufrag"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 "pwd": metadata["ice-pwd"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 "candidates": application_data.pop("ice-candidates"),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 "fingerprint": application_data.pop("fingerprint", {}),
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 }
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 name = application_data.get("id")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 if name:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 content["name"] = name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 except KeyError as e:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 raise exceptions.DataError(f"Mandatory key is missing: {e}")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 contents = [content]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 contents.extend(self._rtp.get_contents(call_data, metadata))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 session_id = await self._j.initiate(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 client,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 peer_jid,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 contents,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 call_type=C.META_SUBTYPE_CALL_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 metadata=metadata,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 peer_metadata={},
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 return {"session_id": session_id}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
160
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 # jingle callbacks
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
162
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 def _get_confirm_msg(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 peer_jid: jid.JID,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 ) -> tuple[bool, str, str]:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 """Get confirmation message to display to user.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
169
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 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
171 if client.roster and peer_jid.userhostJID() not in client.roster:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 is_in_roster = False
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 confirm_msg = D_(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 "Somebody not in your contact list ({peer_jid}) wants to control "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 "remotely this device. Accepting this will give full control of your "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 " 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
177 "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
178 "Do you accept?"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 ).format(peer_jid=peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 confirm_title = D_("Remote Control Request From an Unknown Contact")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 is_in_roster = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 confirm_msg = D_(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 "{peer_jid} wants to control your device. Accepting will give full "
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 "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
186 "Only accept if you absolute trust this person.\n"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 "Do you accept?"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 ).format(peer_jid=peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 confirm_title = D_("Remote Control Request.")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
190
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 return (is_in_roster, confirm_msg, confirm_title)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 async def jingle_preflight(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 self, client: SatXMPPEntity, session: dict, description_elt: domish.Element
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 """Perform preflight checks for an incoming call session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
197
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 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
199 confirmation.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
200
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 @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
204 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
205
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 @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
207 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
208 session_id = session["id"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
209 peer_jid = session["peer_jid"]
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 is_in_roster, confirm_msg, confirm_title = self._get_confirm_msg(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 client, peer_jid
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
213 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 if is_in_roster:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
215 action_type = C.META_TYPE_CONFIRM
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 action_type = C.META_TYPE_NOT_IN_ROSTER_LEAK
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
218
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 action_extra = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 "type": action_type,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 "session_id": session_id,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
222 "from_jid": peer_jid.full(),
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 action_extra["subtype"] = C.META_TYPE_REMOTE_CONTROL
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 accepted = await xml_tools.defer_confirm(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 self.host,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
227 confirm_msg,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 confirm_title,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 profile=client.profile,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 action_extra=action_extra
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 if accepted:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 session["pre_accepted"] = True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 return accepted
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
235
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
236 async def jingle_preflight_info(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
240 info_type: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 info_data: dict | None = None,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 pass
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
244
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 async def jingle_preflight_cancel(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 self, client: SatXMPPEntity, session: dict, cancel_error: exceptions.CancelError
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 """The remote control has been rejected"""
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
249
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 def jingle_session_init(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 extra: dict
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 ) -> domish.Element:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 """Initializes a jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
258
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 @param content_name: Name of the content.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 @param extra: Extra data.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 @return: <description> element.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 desc_elt = domish.Element((NS_REMOTE_CONTROL, "description"))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 devices = extra.get("devices") or {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 for name, data in devices.items():
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 device_elt = desc_elt.addElement((NS_REMOTE_CONTROL, "device"))
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 device_elt["type"] = name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 return desc_elt
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
271
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 async def jingle_request_confirmation(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
274 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 action: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 desc_elt: domish.Element,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 ) -> bool:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
280 """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
281
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
282 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
283 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
284 content; subsequent contents are automatically accepted. This means, in practice,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 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
286 contents.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
287
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 @param client: The client instance.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 @param action: The action type associated with the Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 @param session: Jingle session.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 @param content_name: Name of the content being checked.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
292 @param desc_elt: The description element associated with the content.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
293
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 @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
295 """
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
296 content_data = session["contents"][content_name]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
297 role = session["role"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
298
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
299 if role == self._j.ROLE_INITIATOR:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 raise NotImplementedError
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 return True
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 elif role == self._j.ROLE_RESPONDER:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 # We are the controlled entity.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 return await self._remote_control_request_conf(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 client, session, content_data, content_name
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 raise exceptions.InternalError(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 f"Invalid role {role!r}"
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
311
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 async def _remote_control_request_conf(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 content_data: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
318 ) -> bool:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 """Handle user permission."""
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 peer_jid = session["peer_jid"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 pre_accepted = session.get("pre_accepted", False)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 __, confirm_msg, confirm_title = self._get_confirm_msg(client, peer_jid)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
323 contents = session["contents"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 action_extra = {
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 "pre_accepted": pre_accepted,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 "type": C.META_TYPE_REMOTE_CONTROL,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 "devices": content_data["application_data"]["devices"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 "session_id": session["id"],
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
329 "from_jid": peer_jid.full(),
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 for name, content in contents.items():
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 if name == content_name:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 continue
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
334 if content["application"].namespace == self._rtp.namespace:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
335 media = content["application_data"]["media"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 action_extra.setdefault("screenshare", {})[media] = {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
337
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 return await xml_tools.defer_confirm(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 self.host,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
340 confirm_msg,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 confirm_title,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 profile=client.profile,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 action_extra=action_extra
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
345
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 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
347 content_data = session["contents"][content_name]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
348 application_data = content_data["application_data"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 if action == self._j.A_PREPARE_CONFIRMATION:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
350 devices = application_data["devices"] = {}
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 try:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 device_type = device_elt.attributes["type"]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
354 except KeyError:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
355 log.warning(f"Invalide device element: {device_elt.toXml()}")
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 else:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
357 # 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
358 # 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
359 # future extensions.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 devices[device_type] = {}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 elif action == self._j.A_SESSION_INITIATE:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 # 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
363 # else. Must actually reflect user choices and local devices.
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 to_remove = []
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 for device_elt in desc_elt.elements(NS_REMOTE_CONTROL, "device"):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
366 if device_elt.getAttribute("type") not in ("keyboard", "wheel", "mouse"):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 to_remove.append(device_elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 for elt in to_remove:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 elt.parent.children.remove(elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
370
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
371 return desc_elt
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
372
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
373 def jingle_terminate(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
374 self,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
375 client: SatXMPPEntity,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 action: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 session: dict,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
378 content_name: str,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 reason_elt: domish.Element,
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
380 ) -> None:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 reason, text = self._j.parse_reason_elt(reason_elt)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
382 data = {"reason": reason}
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
383 if text:
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
384 data["text"] = text
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
385 self.host.bridge.call_ended(
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
386 session["id"], data_format.serialise(data), client.profile
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
387 )
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
388
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
389
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
390 @implementer(iwokkel.IDisco)
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
391 class RemoteControl_handler(XMPPHandler):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
392 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
393 return [disco.DiscoFeature(NS_REMOTE_CONTROL)]
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
394
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
395 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
898db6daf0d0 core: Jingle Remote Control implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
396 return []