Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0050.py @ 3728:b15644cae50d
component AP gateway: JID/node ⟺ AP outbox conversion:
- convert a combination of JID and optional pubsub node to AP actor handle (see
`getJIDAndNode` for details) and vice versa
- the gateway now provides a Pubsub service
- retrieve pubsub node and convert it to AP collection, AP pagination is converted to RSM
- do the opposite: convert AP collection to pubsub and handle RSM request. Due to
ActivityStream collection pagination limitations, some RSM request produce inefficient
requests, but caching should be used most of the time in the future and avoid the
problem.
- set specific name to HTTP Server
- new `local_only` setting (`True` by default) to indicate if the gateway can request or
not XMPP Pubsub nodes from other servers
- disco info now specifies important features such as Pubsub RSM, and nodes metadata
ticket 363
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 25 Jan 2022 17:54:06 +0100 |
parents | fad3b3ffa8fe |
children | 6c93a18b6250 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
3368
e86b71b1aa31
core: minor typos, docstring/comments update
Goffi <goffi@goffi.org>
parents:
3315
diff
changeset
|
3 # SàT plugin for Ad-Hoc Commands (XEP-0050) |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
19 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
20 from collections import namedtuple |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
21 from uuid import uuid4 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
22 from typing import List, Optional |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
23 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
24 from zope.interface import implementer |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from twisted.words.protocols.jabber import jid |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
26 from twisted.words.protocols import jabber |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
27 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.words.xish import domish |
941
c6d8fc63b1db
core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
29 from twisted.internet import defer |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
30 from wokkel import disco, iwokkel, data_form |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
31 from sat.core.i18n import _, D_ |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
32 from sat.core.constants import Const as C |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
33 from sat.core.log import getLogger |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
34 from sat.core.xmpp import SatXMPPEntity |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 from sat.core import exceptions |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
36 from sat.memory.memory import Sessions |
3529
698579bedd6f
component file sharing (plugin management): new command to get available quota/used space.
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
37 from sat.tools import xml_tools, utils |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
38 from sat.tools.common import data_format |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
41 log = getLogger(__name__) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 IQ_SET = '/iq[@type="set"]' |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 NS_COMMANDS = "http://jabber.org/protocol/commands" |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 ID_CMD_LIST = disco.DiscoIdentity("automation", "command-list") |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 ID_CMD_NODE = disco.DiscoIdentity("automation", "command-node") |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 CMD_REQUEST = IQ_SET + '/command[@xmlns="' + NS_COMMANDS + '"]' |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
50 SHOWS = { |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
51 "default": _("Online"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
52 "away": _("Away"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
53 "chat": _("Free for chat"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
54 "dnd": _("Do not disturb"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
55 "xa": _("Left"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
56 "disconnect": _("Disconnect"), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
57 } |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
60 C.PI_NAME: "Ad-Hoc Commands", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
61 C.PI_IMPORT_NAME: "XEP-0050", |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
62 C.PI_MODES: C.PLUG_MODE_BOTH, |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
63 C.PI_TYPE: "XEP", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
64 C.PI_PROTOCOLS: ["XEP-0050"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
65 C.PI_MAIN: "XEP_0050", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
66 C.PI_HANDLER: "yes", |
3028 | 67 C.PI_DESCRIPTION: _("""Implementation of Ad-Hoc Commands"""), |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 } |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 class AdHocError(Exception): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 def __init__(self, error_const): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 """ Error to be used from callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 @param error_const: one of XEP_0050.ERROR |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 """ |
1517
4eca4f5e21ec
plugin XEP-0050: minor parentheses removal
Goffi <goffi@goffi.org>
parents:
1505
diff
changeset
|
76 assert error_const in XEP_0050.ERROR |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 self.callback_error = error_const |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
79 |
3028 | 80 @implementer(iwokkel.IDisco) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 class AdHocCommand(XMPPHandler): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
83 def __init__(self, callback, label, node, features, timeout, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
84 allowed_jids, allowed_groups, allowed_magics, forbidden_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
85 forbidden_groups): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
86 XMPPHandler.__init__(self) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 self.callback = callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self.label = label |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 self.node = node |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 self.features = [disco.DiscoFeature(feature) for feature in features] |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
91 ( |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
92 self.allowed_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
93 self.allowed_groups, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
94 self.allowed_magics, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
95 self.forbidden_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
96 self.forbidden_groups, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
97 ) = ( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
98 allowed_jids, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
99 allowed_groups, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
100 allowed_magics, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
101 forbidden_jids, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
102 forbidden_groups, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
103 ) |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
104 self.sessions = Sessions(timeout=timeout) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
106 @property |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
107 def client(self): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
108 return self.parent |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
109 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 def getName(self, xml_lang=None): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 return self.label |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 def isAuthorised(self, requestor): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
114 if "@ALL@" in self.allowed_magics: |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 return True |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 forbidden = set(self.forbidden_jids) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 for group in self.forbidden_groups: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 forbidden.update(self.client.roster.getJidsFromGroup(group)) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 if requestor.userhostJID() in forbidden: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 return False |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 allowed = set(self.allowed_jids) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 for group in self.allowed_groups: |
821
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
123 try: |
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
124 allowed.update(self.client.roster.getJidsFromGroup(group)) |
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
125 except exceptions.UnknownGroupError: |
3028 | 126 log.warning(_("The groups [{group}] is unknown for profile [{profile}])") |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
127 .format(group=group, profile=self.client.profile)) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 if requestor.userhostJID() in allowed: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 return True |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 return False |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
132 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
133 if ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
134 nodeIdentifier != NS_COMMANDS |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
135 ): # FIXME: we should manage other disco nodes here |
1494
74ddb4cc2ff9
plugin XEP-0050: return disco for commands only on commands namespace
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
136 return [] |
941
c6d8fc63b1db
core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
137 # identities = [ID_CMD_LIST if self.node == NS_COMMANDS else ID_CMD_NODE] # FIXME |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 return [disco.DiscoFeature(NS_COMMANDS)] + self.features |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
140 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 return [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 def _sendAnswer(self, callback_data, session_id, request): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 """ Send result of the command |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
145 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 @param callback_data: tuple (payload, status, actions, note) with: |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
147 - payload (domish.Element, None) usualy containing data form |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 - status: current status, see XEP_0050.STATUS |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
149 - actions(list[str], None): list of allowed actions (see XEP_0050.ACTION). |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
150 First action is the default one. Default to EXECUTE |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
151 - note(tuple[str, unicode]): optional additional note: either None or a |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
152 tuple with (note type, human readable string), "note type" being in |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
153 XEP_0050.NOTE |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 @param session_id: current session id |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 @param request: original request (domish.Element) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 @return: deferred |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 """ |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 payload, status, actions, note = callback_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
159 assert isinstance(payload, domish.Element) or payload is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
160 assert status in XEP_0050.STATUS |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 if not actions: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 actions = [XEP_0050.ACTION.EXECUTE] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
163 result = domish.Element((None, "iq")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
164 result["type"] = "result" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
165 result["id"] = request["id"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
166 result["to"] = request["from"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
167 command_elt = result.addElement("command", NS_COMMANDS) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
168 command_elt["sessionid"] = session_id |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
169 command_elt["node"] = self.node |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
170 command_elt["status"] = status |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 if status != XEP_0050.STATUS.CANCELED: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 if status != XEP_0050.STATUS.COMPLETED: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
174 actions_elt = command_elt.addElement("actions") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
175 actions_elt["execute"] = actions[0] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 for action in actions: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 actions_elt.addElement(action) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 if note is not None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 note_type, note_mess = note |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
181 note_elt = command_elt.addElement("note", content=note_mess) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
182 note_elt["type"] = note_type |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 if payload is not None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 command_elt.addChild(payload) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 |
2129
6a66c8c5a567
core: replaced calls to client.xmlstream.send by client.send which is the right method to use. client.xmlstream should not be used directly
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
187 self.client.send(result) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 if status in (XEP_0050.STATUS.COMPLETED, XEP_0050.STATUS.CANCELED): |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
189 del self.sessions[session_id] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 def _sendError(self, error_constant, session_id, request): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 """ Send error stanza |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
193 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 @param error_constant: one of XEP_OO50.ERROR |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 @param request: original request (domish.Element) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 """ |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 xmpp_condition, cmd_condition = error_constant |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
198 iq_elt = jabber.error.StanzaError(xmpp_condition).toResponse(request) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 if cmd_condition: |
3028 | 200 error_elt = next(iq_elt.elements(None, "error")) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 error_elt.addElement(cmd_condition, NS_COMMANDS) |
2129
6a66c8c5a567
core: replaced calls to client.xmlstream.send by client.send which is the right method to use. client.xmlstream should not be used directly
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
202 self.client.send(iq_elt) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 del self.sessions[session_id] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
205 def _requestEb(self, failure_, request, session_id): |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
206 if failure_.check(AdHocError): |
3315 | 207 error_constant = failure_.value.callback_error |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
208 else: |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
209 log.error(f"unexpected error while handling request: {failure_}") |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
210 error_constant = XEP_0050.ERROR.INTERNAL |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
211 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
212 self._sendError(error_constant, session_id, request) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
213 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 def onRequest(self, command_elt, requestor, action, session_id): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 if not self.isAuthorised(requestor): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
216 return self._sendError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
217 XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
218 ) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 if session_id: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 try: |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
221 session_data = self.sessions[session_id] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
223 return self._sendError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
224 XEP_0050.ERROR.SESSION_EXPIRED, session_id, command_elt.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
225 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
226 if session_data["requestor"] != requestor: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
227 return self._sendError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
228 XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
229 ) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 else: |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
231 session_id, session_data = self.sessions.newSession() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
232 session_data["requestor"] = requestor |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 if action == XEP_0050.ACTION.CANCEL: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
234 d = defer.succeed((None, XEP_0050.STATUS.CANCELED, None, None)) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
235 else: |
3529
698579bedd6f
component file sharing (plugin management): new command to get available quota/used space.
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
236 d = utils.asDeferred( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
237 self.callback, |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
238 self.client, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
239 command_elt, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
240 session_data, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
241 action, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
242 self.node, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
243 ) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 d.addCallback(self._sendAnswer, session_id, command_elt.parent) |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
245 d.addErrback(self._requestEb, command_elt.parent, session_id) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
246 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 class XEP_0050(object): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
249 STATUS = namedtuple("Status", ("EXECUTING", "COMPLETED", "CANCELED"))( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
250 "executing", "completed", "canceled" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
251 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
252 ACTION = namedtuple("Action", ("EXECUTE", "CANCEL", "NEXT", "PREV"))( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
253 "execute", "cancel", "next", "prev" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
254 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
255 NOTE = namedtuple("Note", ("INFO", "WARN", "ERROR"))("info", "warn", "error") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
256 ERROR = namedtuple( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
257 "Error", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
258 ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
259 "MALFORMED_ACTION", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
260 "BAD_ACTION", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
261 "BAD_LOCALE", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
262 "BAD_PAYLOAD", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
263 "BAD_SESSIONID", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
264 "SESSION_EXPIRED", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
265 "FORBIDDEN", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
266 "ITEM_NOT_FOUND", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
267 "FEATURE_NOT_IMPLEMENTED", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
268 "INTERNAL", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
269 ), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
270 )( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
271 ("bad-request", "malformed-action"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
272 ("bad-request", "bad-action"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
273 ("bad-request", "bad-locale"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
274 ("bad-request", "bad-payload"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
275 ("bad-request", "bad-sessionid"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
276 ("not-allowed", "session-expired"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
277 ("forbidden", None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
278 ("item-not-found", None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
279 ("feature-not-implemented", None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
280 ("internal-server-error", None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
281 ) # XEP-0050 §4.4 Table 5 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
283 def __init__(self, host): |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
284 log.info(_("plugin XEP-0050 initialization")) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 self.host = host |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
286 self.requesting = Sessions() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
287 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
288 "adHocRun", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
289 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
290 in_sign="sss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
291 out_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
292 method=self._run, |
3028 | 293 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
294 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
295 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
296 "adHocList", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
297 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
298 in_sign="ss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
299 out_sign="s", |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
300 method=self._listUI, |
3028 | 301 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
302 ) |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
303 host.bridge.addMethod( |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
304 "adHocSequence", |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
305 ".plugin", |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
306 in_sign="ssss", |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
307 out_sign="s", |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
308 method=self._sequence, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
309 async_=True, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
310 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
311 self.__requesting_id = host.registerCallback( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
312 self._requestingEntity, with_data=True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
313 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
314 host.importMenu( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
315 (D_("Service"), D_("Commands")), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
316 self._commandsMenu, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
317 security_limit=2, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
318 help_string=D_("Execute ad-hoc commands"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
319 ) |
3028 | 320 host.registerNamespace('commands', NS_COMMANDS) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
321 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2129
diff
changeset
|
322 def getHandler(self, client): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
323 return XEP_0050_handler(self) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
324 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2129
diff
changeset
|
325 def profileConnected(self, client): |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
326 # map from node to AdHocCommand instance |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
327 client._XEP_0050_commands = {} |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
328 if not client.is_component: |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
329 self.addAdHocCommand(client, self._statusCallback, _("Status")) |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
330 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
331 def do(self, client, entity, node, action=ACTION.EXECUTE, session_id=None, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
332 form_values=None, timeout=30): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
333 """Do an Ad-Hoc Command |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
334 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
335 @param entity(jid.JID): entity which will execture the command |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
336 @param node(unicode): node of the command |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
337 @param action(unicode): one of XEP_0050.ACTION |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
338 @param session_id(unicode, None): id of the ad-hoc session |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
339 None if no session is involved |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
340 @param form_values(dict, None): values to use to create command form |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
341 values will be passed to data_form.Form.makeFields |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
342 @return: iq result element |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
343 """ |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
344 iq_elt = client.IQ(timeout=timeout) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
345 iq_elt["to"] = entity.full() |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
346 command_elt = iq_elt.addElement("command", NS_COMMANDS) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
347 command_elt["node"] = node |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
348 command_elt["action"] = action |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
349 if session_id is not None: |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
350 command_elt["sessionid"] = session_id |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
351 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
352 if form_values: |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
353 # We add the XMLUI result to the command payload |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
354 form = data_form.Form("submit") |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
355 form.makeFields(form_values) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
356 command_elt.addChild(form.toElement()) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
357 d = iq_elt.send() |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
358 return d |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
359 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
360 def getCommandElt(self, iq_elt): |
753
7f98f53f6997
plugin XEP-0050: fixed getDiscoItems when no commands were added + fixed commands purge on profile disconnection
Goffi <goffi@goffi.org>
parents:
728
diff
changeset
|
361 try: |
3028 | 362 return next(iq_elt.elements(NS_COMMANDS, "command")) |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
363 except StopIteration: |
3028 | 364 raise exceptions.NotFound(_("Missing command element")) |
753
7f98f53f6997
plugin XEP-0050: fixed getDiscoItems when no commands were added + fixed commands purge on profile disconnection
Goffi <goffi@goffi.org>
parents:
728
diff
changeset
|
365 |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
366 def adHocError(self, error_type): |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
367 """Shortcut to raise an AdHocError |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
368 |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
369 @param error_type(unicode): one of XEP_0050.ERROR |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
370 """ |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
371 raise AdHocError(error_type) |
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
372 |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
373 def _items2XMLUI(self, items, no_instructions): |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
374 """Convert discovery items to XMLUI dialog """ |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
375 # TODO: manage items on different jids |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
376 form_ui = xml_tools.XMLUI("form", submit_id=self.__requesting_id) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
377 |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
378 if not no_instructions: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
379 form_ui.addText(_("Please select a command"), "instructions") |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
380 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
381 options = [(item.nodeIdentifier, item.name) for item in items] |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
798
diff
changeset
|
382 form_ui.addList("node", options) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
383 return form_ui |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
384 |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
385 def _getDataLvl(self, type_): |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
386 """Return the constant corresponding to <note/> type attribute value |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
387 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
388 @param type_: note type (see XEP-0050 §4.3) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
389 @return: a C.XMLUI_DATA_LVL_* constant |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
390 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
391 if type_ == "error": |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
392 return C.XMLUI_DATA_LVL_ERROR |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
393 elif type_ == "warn": |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
394 return C.XMLUI_DATA_LVL_WARNING |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
395 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
396 if type_ != "info": |
3028 | 397 log.warning(_("Invalid note type [%s], using info") % type_) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
398 return C.XMLUI_DATA_LVL_INFO |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
399 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
400 def _mergeNotes(self, notes): |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
401 """Merge notes with level prefix (e.g. "ERROR: the message") |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
402 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
403 @param notes (list): list of tuple (level, message) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
404 @return: list of messages |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
405 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
406 lvl_map = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
407 C.XMLUI_DATA_LVL_INFO: "", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
408 C.XMLUI_DATA_LVL_WARNING: "%s: " % _("WARNING"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
409 C.XMLUI_DATA_LVL_ERROR: "%s: " % _("ERROR"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
410 } |
3028 | 411 return ["%s%s" % (lvl_map[lvl], msg) for lvl, msg in notes] |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
412 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
413 def parseCommandAnswer(self, iq_elt): |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
414 command_elt = self.getCommandElt(iq_elt) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
415 data = {} |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
416 data["status"] = command_elt.getAttribute("status", XEP_0050.STATUS.EXECUTING) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
417 data["session_id"] = command_elt.getAttribute("sessionid") |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
418 data["notes"] = notes = [] |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
419 for note_elt in command_elt.elements(NS_COMMANDS, "note"): |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
420 notes.append( |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
421 ( |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
422 self._getDataLvl(note_elt.getAttribute("type", "info")), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
423 str(note_elt), |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
424 ) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
425 ) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
426 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
427 return command_elt, data |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
428 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
429 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
430 def _commandsAnswer2XMLUI(self, iq_elt, session_id, session_data): |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
431 """Convert command answer to an ui for frontend |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
432 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
433 @param iq_elt: command result |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
434 @param session_id: id of the session used with the frontend |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
435 @param profile_key: %(doc_profile_key)s |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
436 """ |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
437 command_elt, answer_data = self.parseCommandAnswer(iq_elt) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
438 status = answer_data["status"] |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
439 if status in [XEP_0050.STATUS.COMPLETED, XEP_0050.STATUS.CANCELED]: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
440 # the command session is finished, we purge our session |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
441 del self.requesting[session_id] |
1071
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
442 if status == XEP_0050.STATUS.COMPLETED: |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
443 session_id = None |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
444 else: |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
445 return None |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
446 remote_session_id = answer_data["session_id"] |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
447 if remote_session_id: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
448 session_data["remote_id"] = remote_session_id |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
449 notes = answer_data["notes"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
450 for data_elt in command_elt.elements(data_form.NS_X_DATA, "x"): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
451 if data_elt["type"] in ("form", "result"): |
2585
0112c1f7dcf0
plugin XEP-0050: filter form received from form-processing entity, to only keep "form" and "result" types
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
452 break |
0112c1f7dcf0
plugin XEP-0050: filter form received from form-processing entity, to only keep "form" and "result" types
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
453 else: |
0112c1f7dcf0
plugin XEP-0050: filter form received from form-processing entity, to only keep "form" and "result" types
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
454 # no matching data element found |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
455 if status != XEP_0050.STATUS.COMPLETED: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
456 log.warning( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
457 _("No known payload found in ad-hoc command result, aborting") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
458 ) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
459 del self.requesting[session_id] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
460 return xml_tools.XMLUI( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
461 C.XMLUI_DIALOG, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
462 dialog_opt={ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
463 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
464 C.XMLUI_DATA_MESS: _("No payload found"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
465 C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_ERROR, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
466 }, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
467 ) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
468 if not notes: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
469 # the status is completed, and we have no note to show |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
470 return None |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
471 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
472 # if we have only one note, we show a dialog with the level of the note |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
473 # if we have more, we show a dialog with "info" level, and all notes merged |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
474 dlg_level = notes[0][0] if len(notes) == 1 else C.XMLUI_DATA_LVL_INFO |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
475 return xml_tools.XMLUI( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
476 C.XMLUI_DIALOG, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
477 dialog_opt={ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
478 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE, |
3028 | 479 C.XMLUI_DATA_MESS: "\n".join(self._mergeNotes(notes)), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
480 C.XMLUI_DATA_LVL: dlg_level, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
481 }, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
482 session_id=session_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
483 ) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
484 |
1071
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
485 if session_id is None: |
3530
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
486 xmlui = xml_tools.dataFormEltResult2XMLUI(data_elt) |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
487 if notes: |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
488 for level, note in notes: |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
489 if level != "info": |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
490 note = f"[{level}] {note}" |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
491 xmlui.addWidget("text", note) |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
492 return xmlui |
fad3b3ffa8fe
plugin XEP-0050: show notes when there is a data form on completed command:
Goffi <goffi@goffi.org>
parents:
3529
diff
changeset
|
493 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
494 form = data_form.Form.fromElement(data_elt) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
495 # we add any present note to the instructions |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
496 form.instructions.extend(self._mergeNotes(notes)) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
497 return xml_tools.dataForm2XMLUI(form, self.__requesting_id, session_id=session_id) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
498 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
499 def _requestingEntity(self, data, profile): |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
500 def serialise(ret_data): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
501 if "xmlui" in ret_data: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
502 ret_data["xmlui"] = ret_data["xmlui"].toXml() |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
503 return ret_data |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
504 |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
505 d = self.requestingEntity(data, profile) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
506 d.addCallback(serialise) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
507 return d |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
508 |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
509 def requestingEntity(self, data, profile): |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
510 """Request and entity and create XMLUI accordingly. |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
511 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
512 @param data: data returned by previous XMLUI (first one must come from |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
513 self._commandsMenu) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
514 @param profile: %(doc_profile)s |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
515 @return: callback dict result (with "xmlui" corresponding to the answering |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
516 dialog, or empty if it's finished without error) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
517 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
518 if C.bool(data.get("cancelled", C.BOOL_FALSE)): |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
519 return defer.succeed({}) |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
520 data_form_values = xml_tools.XMLUIResult2DataFormResult(data) |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
521 client = self.host.getClient(profile) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
522 # TODO: cancel, prev and next are not managed |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
523 # TODO: managed answerer errors |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
524 # TODO: manage nodes with a non data form payload |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
525 if "session_id" not in data: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
526 # we just had the jid, we now request it for the available commands |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
527 session_id, session_data = self.requesting.newSession(profile=client.profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
528 entity = jid.JID(data[xml_tools.SAT_FORM_PREFIX + "jid"]) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
529 session_data["jid"] = entity |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
530 d = self.listUI(client, entity) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
531 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
532 def sendItems(xmlui): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
533 xmlui.session_id = session_id # we need to keep track of the session |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
534 return {"xmlui": xmlui} |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
535 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
536 d.addCallback(sendItems) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
537 else: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
538 # we have started a several forms sessions |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
539 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
540 session_data = self.requesting.profileGet( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
541 data["session_id"], client.profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
542 ) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
543 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
544 log.warning("session id doesn't exist, session has probably expired") |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
545 # TODO: send error dialog |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
546 return defer.succeed({}) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
547 session_id = data["session_id"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
548 entity = session_data["jid"] |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
549 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
550 session_data["node"] |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
551 # node has already been received |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
552 except KeyError: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
553 # it's the first time we know the node, we save it in session data |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
554 session_data["node"] = data_form_values.pop("node") |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
555 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
556 # remote_id is the XEP_0050 sessionid used by answering command |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
557 # while session_id is our own session id used with the frontend |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
558 remote_id = session_data.get("remote_id") |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
559 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
560 # we request execute node's command |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
561 d = self.do(client, entity, session_data["node"], action=XEP_0050.ACTION.EXECUTE, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
562 session_id=remote_id, form_values=data_form_values) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
563 d.addCallback(self._commandsAnswer2XMLUI, session_id, session_data) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
564 d.addCallback(lambda xmlui: {"xmlui": xmlui} if xmlui is not None else {}) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
565 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
566 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
567 |
773 | 568 def _commandsMenu(self, menu_data, profile): |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
569 """First XMLUI activated by menu: ask for target jid |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
570 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
571 @param profile: %(doc_profile)s |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
572 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
573 form_ui = xml_tools.XMLUI("form", submit_id=self.__requesting_id) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
574 form_ui.addText(_("Please enter target jid"), "instructions") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
798
diff
changeset
|
575 form_ui.changeContainer("pairs") |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
576 form_ui.addLabel("jid") |
1539
98f92a054539
plugins: lowered security limits for non dangerous actions. A reference documentation is in progress to choose values: http://wiki.goffi.org/wiki/Security_Limits/en
Goffi <goffi@goffi.org>
parents:
1517
diff
changeset
|
577 form_ui.addString("jid", value=self.host.getClient(profile).jid.host) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
578 return {"xmlui": form_ui.toXml()} |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
579 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
580 def _statusCallback(self, client, command_elt, session_data, action, node): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
581 """Ad-hoc command used to change the "show" part of status""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
582 actions = session_data.setdefault("actions", []) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
583 actions.append(action) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
584 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
585 if len(actions) == 1: |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
586 # it's our first request, we ask the desired new status |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
587 status = XEP_0050.STATUS.EXECUTING |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
588 form = data_form.Form("form", title=_("status selection")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
589 show_options = [ |
3028 | 590 data_form.Option(name, label) for name, label in list(SHOWS.items()) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
591 ] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
592 field = data_form.Field( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
593 "list-single", "show", options=show_options, required=True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
594 ) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
595 form.addField(field) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
596 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
597 payload = form.toElement() |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
598 note = None |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
599 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
600 elif len(actions) == 2: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
601 # we should have the answer here |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
602 try: |
3028 | 603 x_elt = next(command_elt.elements(data_form.NS_X_DATA, "x")) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
604 answer_form = data_form.Form.fromElement(x_elt) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
605 show = answer_form["show"] |
941
c6d8fc63b1db
core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
606 except (KeyError, StopIteration): |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
607 self.adHocError(XEP_0050.ERROR.BAD_PAYLOAD) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
608 if show not in SHOWS: |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
609 self.adHocError(XEP_0050.ERROR.BAD_PAYLOAD) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
610 if show == "disconnect": |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
611 self.host.disconnect(client.profile) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
612 else: |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
613 self.host.setPresence(show=show, profile_key=client.profile) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
614 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
615 # job done, we can end the session |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
616 status = XEP_0050.STATUS.COMPLETED |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
617 payload = None |
3028 | 618 note = (self.NOTE.INFO, _("Status updated")) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
619 else: |
2921
a8c2d8b3453f
plugin XEP-0050: make plugin usable with components + new adHocError method to easily raise error when needed
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
620 self.adHocError(XEP_0050.ERROR.INTERNAL) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
621 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
622 return (payload, status, None, note) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
623 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
624 def _run(self, service_jid_s="", node="", profile_key=C.PROF_KEY_NONE): |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
625 client = self.host.getClient(profile_key) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
626 service_jid = jid.JID(service_jid_s) if service_jid_s else None |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
627 d = self.run(client, service_jid, node or None) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
628 d.addCallback(lambda xmlui: xmlui.toXml()) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
629 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
630 |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
631 @defer.inlineCallbacks |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
632 def run(self, client, service_jid=None, node=None): |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
633 """Run an ad-hoc command |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
634 |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
635 @param service_jid(jid.JID, None): jid of the ad-hoc service |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
636 None to use profile's server |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
637 @param node(unicode, None): node of the ad-hoc commnad |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
638 None to get initial list |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
639 @return(unicode): command page XMLUI |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
640 """ |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
641 if service_jid is None: |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
642 service_jid = jid.JID(client.jid.host) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
643 session_id, session_data = self.requesting.newSession(profile=client.profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
644 session_data["jid"] = service_jid |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
645 if node is None: |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
646 xmlui = yield self.listUI(client, service_jid) |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
647 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
648 session_data["node"] = node |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
649 cb_data = yield self.requestingEntity( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
650 {"session_id": session_id}, client.profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
651 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
652 xmlui = cb_data["xmlui"] |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
653 |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
654 xmlui.session_id = session_id |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
655 defer.returnValue(xmlui) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
656 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
657 def list(self, client, to_jid): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
658 """Request available commands |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
659 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
660 @param to_jid(jid.JID, None): the entity answering the commands |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
661 None to use profile's server |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
662 @return D(disco.DiscoItems): found commands |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
663 """ |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
664 d = self.host.getDiscoItems(client, to_jid, NS_COMMANDS) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
665 return d |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
666 |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
667 def _listUI(self, to_jid_s, profile_key): |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
668 client = self.host.getClient(profile_key) |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
669 to_jid = jid.JID(to_jid_s) if to_jid_s else None |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
670 d = self.listUI(client, to_jid, no_instructions=True) |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
671 d.addCallback(lambda xmlui: xmlui.toXml()) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
672 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
673 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
674 def listUI(self, client, to_jid, no_instructions=False): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
675 """Request available commands and generate XMLUI |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
676 |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
677 @param to_jid(jid.JID, None): the entity answering the commands |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
678 None to use profile's server |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
679 @param no_instructions(bool): if True, don't add instructions widget |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
680 @return D(xml_tools.XMLUI): UI with the commands |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
681 """ |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
682 d = self.list(client, to_jid) |
2406
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
683 d.addCallback(self._items2XMLUI, no_instructions) |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
684 return d |
1e5b2c35964e
plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
685 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
686 def _sequence(self, sequence, node, service_jid_s="", profile_key=C.PROF_KEY_NONE): |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
687 sequence = data_format.deserialise(sequence, type_check=list) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
688 client = self.host.getClient(profile_key) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
689 service_jid = jid.JID(service_jid_s) if service_jid_s else None |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
690 d = defer.ensureDeferred(self.sequence(client, sequence, node, service_jid)) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
691 d.addCallback(lambda data: data_format.serialise(data)) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
692 return d |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
693 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
694 async def sequence( |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
695 self, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
696 client: SatXMPPEntity, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
697 sequence: List[dict], |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
698 node: str, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
699 service_jid: Optional[jid.JID] = None, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
700 ) -> dict: |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
701 """Send a series of data to an ad-hoc service |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
702 |
3315 | 703 @param sequence: list of values to send |
704 value are specified by a dict mapping var name to value. | |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
705 @param node: node of the ad-hoc commnad |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
706 @param service_jid: jid of the ad-hoc service |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
707 None to use profile's server |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
708 @return: data received in final answer |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
709 """ |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
710 if service_jid is None: |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
711 service_jid = jid.JID(client.jid.host) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
712 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
713 session_id = None |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
714 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
715 for data_to_send in sequence: |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
716 iq_result_elt = await self.do( |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
717 client, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
718 service_jid, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
719 node, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
720 session_id=session_id, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
721 form_values=data_to_send, |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
722 ) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
723 __, answer_data = self.parseCommandAnswer(iq_result_elt) |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
724 session_id = answer_data.pop("session_id") |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
725 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
726 return answer_data |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
727 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
728 def addAdHocCommand(self, client, callback, label, node=None, features=None, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
729 timeout=600, allowed_jids=None, allowed_groups=None, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
730 allowed_magics=None, forbidden_jids=None, forbidden_groups=None, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
731 ): |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
732 """Add an ad-hoc command for the current profile |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
733 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
734 @param callback: method associated with this ad-hoc command which return the |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
735 payload data (see AdHocCommand._sendAnswer), can return a |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
736 deferred |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
737 @param label: label associated with this command on the main menu |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
738 @param node: disco item node associated with this command. None to use |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
739 autogenerated node |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
740 @param features: features associated with the payload (list of strings), usualy |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
741 data form |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
742 @param timeout: delay between two requests before canceling the session (in |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
743 seconds) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
744 @param allowed_jids: list of allowed entities |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
745 @param allowed_groups: list of allowed roster groups |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
746 @param allowed_magics: list of allowed magic keys, can be: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
747 @ALL@: allow everybody |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
748 @PROFILE_BAREJID@: allow only the jid of the profile |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
749 @param forbidden_jids: black list of entities which can't access this command |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
750 @param forbidden_groups: black list of groups which can't access this command |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
751 @return: node of the added command, useful to remove the command later |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
752 """ |
821
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
753 # FIXME: "@ALL@" for profile_key seems useless and dangerous |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
754 |
1495
987e74cbb839
plugin XEP-0050: fixed crash on empty node in addAdHocCommand
Goffi <goffi@goffi.org>
parents:
1494
diff
changeset
|
755 if node is None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
756 node = "%s_%s" % ("COMMANDS", uuid4()) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
757 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
758 if features is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
759 features = [data_form.NS_X_DATA] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
760 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
761 if allowed_jids is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
762 allowed_jids = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
763 if allowed_groups is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
764 allowed_groups = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
765 if allowed_magics is None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
766 allowed_magics = ["@PROFILE_BAREJID@"] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
767 if forbidden_jids is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
768 forbidden_jids = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
769 if forbidden_groups is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
770 forbidden_groups = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
771 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
772 # TODO: manage newly created/removed profiles |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
773 _allowed_jids = ( |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
774 (allowed_jids + [client.jid.userhostJID()]) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
775 if "@PROFILE_BAREJID@" in allowed_magics |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
776 else allowed_jids |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
777 ) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
778 ad_hoc_command = AdHocCommand( |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
779 callback, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
780 label, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
781 node, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
782 features, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
783 timeout, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
784 _allowed_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
785 allowed_groups, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
786 allowed_magics, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
787 forbidden_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
788 forbidden_groups, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
789 ) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
790 ad_hoc_command.setHandlerParent(client) |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
791 commands = client._XEP_0050_commands |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
792 commands[node] = ad_hoc_command |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
793 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
794 def onCmdRequest(self, request, client): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
795 request.handled = True |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
796 requestor = jid.JID(request["from"]) |
3028 | 797 command_elt = next(request.elements(NS_COMMANDS, "command")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
798 action = command_elt.getAttribute("action", self.ACTION.EXECUTE) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
799 node = command_elt.getAttribute("node") |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
800 if not node: |
3028 | 801 client.sendError(request, "bad-request") |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
802 return |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
803 sessionid = command_elt.getAttribute("sessionid") |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
804 commands = client._XEP_0050_commands |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
805 try: |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
806 command = commands[node] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
807 except KeyError: |
3028 | 808 client.sendError(request, "item-not-found") |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
809 return |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
810 command.onRequest(command_elt, requestor, action, sessionid) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
811 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
812 |
3028 | 813 @implementer(iwokkel.IDisco) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
814 class XEP_0050_handler(XMPPHandler): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
815 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
816 def __init__(self, plugin_parent): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
817 self.plugin_parent = plugin_parent |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
818 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
819 @property |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
820 def client(self): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
821 return self.parent |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
822 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
823 def connectionInitialized(self): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
824 self.xmlstream.addObserver( |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
825 CMD_REQUEST, self.plugin_parent.onCmdRequest, client=self.parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
826 ) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
827 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
828 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
829 identities = [] |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
830 if nodeIdentifier == NS_COMMANDS and self.client._XEP_0050_commands: |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
831 # we only add the identity if we have registred commands |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
832 identities.append(ID_CMD_LIST) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
833 return [disco.DiscoFeature(NS_COMMANDS)] + identities |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
834 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
835 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
836 ret = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
837 if nodeIdentifier == NS_COMMANDS: |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
838 commands = self.client._XEP_0050_commands |
3028 | 839 for command in list(commands.values()): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
840 if command.isAuthorised(requestor): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
841 ret.append( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
842 disco.DiscoItem(self.parent.jid, command.node, command.getName()) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
843 ) # TODO: manage name language |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
844 return ret |