Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_misc_remote_control.py @ 4277:b4b4ea8c5c87
plugin XEP-0167: Let use a `call_setup_cb` method in session:
when set, the `call_setup_cb` method will be used instead of calling the `call_setup`
bridge signal. This will be useful to incoming `Conferences` component to handle the
signaling internally.
rel 445
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 05 Jul 2024 17:18:37 +0200 |
parents | 0d7bb4df2343 |
children |
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 [] |