annotate sat/plugins/plugin_xep_0050.py @ 3120:0c29155ac68b

core: backend autoconnection: A new Connection/autoconnect_backend param can be set for a profile or component to be started automatically with backend. This is specially useful for components, but can be useful for client profile too (e.g. on Android we need to start profile with backend to get notifications, this part will come with following commits). The new Sqlite.getIndParamValues method allows to retrieve the same parameters for all profiles.
author Goffi <goffi@goffi.org>
date Sat, 25 Jan 2020 21:08:32 +0100
parents ab2696e34d29
children 9d0df638c8b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
1 #!/usr/bin/env python3
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
3
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for Ad-Hoc Commands (XEP-0050)
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2667
diff changeset
5 # Copyright (C) 2009-2019 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
6
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # 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
8 # 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
9 # 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
10 # (at your option) any later version.
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
11
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # 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
13 # 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
14 # 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
15 # 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
16
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # 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
18 # 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
19
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
20 from sat.core.i18n import _, D_
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 821
diff changeset
21 from sat.core.constants import Const as C
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 944
diff changeset
22 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
23
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 944
diff changeset
24 log = getLogger(__name__)
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
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
27 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
28 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
29 from wokkel import disco, iwokkel, data_form
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from sat.core import exceptions
758
86224a13cc1d plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents: 753
diff changeset
31 from sat.memory.memory import Sessions
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from uuid import uuid4
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
33 from sat.tools import xml_tools
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
34
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
35 from zope.interface import implementer
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
36
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
37 try:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
38 from twisted.words.protocols.xmlstream import XMPPHandler
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
39 except ImportError:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
40 from wokkel.subprotocols import XMPPHandler
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
41
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
42 from collections import namedtuple
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 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
45 from collections import OrderedDict # only available from python 2.7
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
46 except ImportError:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
47 from ordereddict import OrderedDict
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
48
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
49 IQ_SET = '/iq[@type="set"]'
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
50 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
51 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
52 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
53 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
54
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
55 SHOWS = OrderedDict(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
56 [
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
57 ("default", _("Online")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
58 ("away", _("Away")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
59 ("chat", _("Free for chat")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
60 ("dnd", _("Do not disturb")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
61 ("xa", _("Left")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
62 ("disconnect", _("Disconnect")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
63 ]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
64 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
65
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
66 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
67 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
68 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
69 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
70 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
71 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
72 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
73 C.PI_HANDLER: "yes",
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
74 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
75 }
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
76
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
77
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
78 class AdHocError(Exception):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
79 def __init__(self, error_const):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
80 """ Error to be used from callback
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
81 @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
82 """
1517
4eca4f5e21ec plugin XEP-0050: minor parentheses removal
Goffi <goffi@goffi.org>
parents: 1505
diff changeset
83 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
84 self.callback_error = error_const
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
85
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
86
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
87 @implementer(iwokkel.IDisco)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
88 class AdHocCommand(XMPPHandler):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
89
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
90 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
91 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
92 forbidden_groups):
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
93 XMPPHandler.__init__(self)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
94 self.callback = callback
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
95 self.label = label
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
96 self.node = node
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
97 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
98 (
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
99 self.allowed_jids,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
100 self.allowed_groups,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
101 self.allowed_magics,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
102 self.forbidden_jids,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
103 self.forbidden_groups,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
104 ) = (
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
105 allowed_jids,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
106 allowed_groups,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
107 allowed_magics,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
108 forbidden_jids,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
109 forbidden_groups,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
110 )
758
86224a13cc1d plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents: 753
diff changeset
111 self.sessions = Sessions(timeout=timeout)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
112
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
113 @property
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
114 def client(self):
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
115 return self.parent
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
116
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
117 def getName(self, xml_lang=None):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
118 return self.label
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
119
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
120 def isAuthorised(self, requestor):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
121 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
122 return True
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
123 forbidden = set(self.forbidden_jids)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
124 for group in self.forbidden_groups:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
125 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
126 if requestor.userhostJID() in forbidden:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
127 return False
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
128 allowed = set(self.allowed_jids)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
129 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
130 try:
38bc9abd6722 plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents: 811
diff changeset
131 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
132 except exceptions.UnknownGroupError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
133 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
134 .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
135 if requestor.userhostJID() in allowed:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
136 return True
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
137 return False
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
138
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
139 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
140 if (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
141 nodeIdentifier != NS_COMMANDS
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
142 ): # 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
143 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
144 # 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
145 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
146
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
147 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
148 return []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
149
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
150 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
151 """ 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
152
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
153 @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
154 - 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
155 - 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
156 - 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
157 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
158 - 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
159 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
160 XEP_0050.NOTE
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
161 @param session_id: current session id
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
162 @param request: original request (domish.Element)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
163 @return: deferred
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
164 """
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
165 payload, status, actions, note = callback_data
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
166 assert isinstance(payload, domish.Element) or payload is None
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
167 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
168 if not actions:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
169 actions = [XEP_0050.ACTION.EXECUTE]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
170 result = domish.Element((None, "iq"))
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
171 result["type"] = "result"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
172 result["id"] = request["id"]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
173 result["to"] = request["from"]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
174 command_elt = result.addElement("command", NS_COMMANDS)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
175 command_elt["sessionid"] = session_id
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
176 command_elt["node"] = self.node
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
177 command_elt["status"] = status
728
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 status != XEP_0050.STATUS.CANCELED:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
180 if status != XEP_0050.STATUS.COMPLETED:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
181 actions_elt = command_elt.addElement("actions")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
182 actions_elt["execute"] = actions[0]
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
183 for action in actions:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
184 actions_elt.addElement(action)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
185
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
186 if note is not None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
187 note_type, note_mess = note
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
188 note_elt = command_elt.addElement("note", content=note_mess)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
189 note_elt["type"] = note_type
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 if payload is not None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
192 command_elt.addChild(payload)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
193
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
194 self.client.send(result)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
195 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
196 del self.sessions[session_id]
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
197
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
198 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
199 """ 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
200
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
201 @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
202 @param request: original request (domish.Element)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
203 """
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
204 xmpp_condition, cmd_condition = error_constant
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 944
diff changeset
205 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
206 if cmd_condition:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
207 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
208 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
209 self.client.send(iq_elt)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
210 del self.sessions[session_id]
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
211
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
212 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
213 if not self.isAuthorised(requestor):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
214 return self._sendError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
215 XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
216 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
217 if session_id:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
218 try:
758
86224a13cc1d plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents: 753
diff changeset
219 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
220 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
221 return self._sendError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
222 XEP_0050.ERROR.SESSION_EXPIRED, session_id, command_elt.parent
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
223 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
224 if session_data["requestor"] != requestor:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
225 return self._sendError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
226 XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
227 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
228 else:
758
86224a13cc1d plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents: 753
diff changeset
229 session_id, session_data = self.sessions.newSession()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
230 session_data["requestor"] = requestor
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
231 if action == XEP_0050.ACTION.CANCEL:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
232 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
233 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
234 d = defer.maybeDeferred(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
235 self.callback,
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
236 self.client,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
237 command_elt,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
238 session_data,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
239 action,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
240 self.node,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
241 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
242 d.addCallback(self._sendAnswer, session_id, command_elt.parent)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
243 d.addErrback(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
244 lambda failure, request: self._sendError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
245 failure.value.callback_error, session_id, request
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
246 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
247 command_elt.parent,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
248 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
249
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
250
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
251 class XEP_0050(object):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
252 STATUS = namedtuple("Status", ("EXECUTING", "COMPLETED", "CANCELED"))(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
253 "executing", "completed", "canceled"
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 ACTION = namedtuple("Action", ("EXECUTE", "CANCEL", "NEXT", "PREV"))(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
256 "execute", "cancel", "next", "prev"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
257 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
258 NOTE = namedtuple("Note", ("INFO", "WARN", "ERROR"))("info", "warn", "error")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
259 ERROR = namedtuple(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
260 "Error",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
261 (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
262 "MALFORMED_ACTION",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
263 "BAD_ACTION",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
264 "BAD_LOCALE",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
265 "BAD_PAYLOAD",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
266 "BAD_SESSIONID",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
267 "SESSION_EXPIRED",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
268 "FORBIDDEN",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
269 "ITEM_NOT_FOUND",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
270 "FEATURE_NOT_IMPLEMENTED",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
271 "INTERNAL",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
272 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
273 )(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
274 ("bad-request", "malformed-action"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
275 ("bad-request", "bad-action"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
276 ("bad-request", "bad-locale"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
277 ("bad-request", "bad-payload"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
278 ("bad-request", "bad-sessionid"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
279 ("not-allowed", "session-expired"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
280 ("forbidden", None),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
281 ("item-not-found", None),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
282 ("feature-not-implemented", None),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
283 ("internal-server-error", None),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
284 ) # 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
285
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
286 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 944
diff changeset
287 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
288 self.host = host
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
289 self.requesting = Sessions()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
290 host.bridge.addMethod(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
291 "adHocRun",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
292 ".plugin",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
293 in_sign="sss",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
294 out_sign="s",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
295 method=self._run,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
296 async_=True,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
297 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
298 host.bridge.addMethod(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
299 "adHocList",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
300 ".plugin",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
301 in_sign="ss",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
302 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
303 method=self._listUI,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
304 async_=True,
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
305 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
306 self.__requesting_id = host.registerCallback(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
307 self._requestingEntity, with_data=True
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
308 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
309 host.importMenu(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
310 (D_("Service"), D_("Commands")),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
311 self._commandsMenu,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
312 security_limit=2,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
313 help_string=D_("Execute ad-hoc commands"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
314 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
315 host.registerNamespace('commands', NS_COMMANDS)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
316
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
317 def getHandler(self, client):
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
318 return XEP_0050_handler(self)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
319
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
320 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
321 # 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
322 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
323 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
324 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
325
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
326 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
327 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
328 """Do an Ad-Hoc Command
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
329
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
330 @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
331 @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
332 @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
333 @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
334 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
335 @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
336 values will be passed to data_form.Form.makeFields
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
337 @return
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
338 """
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
339 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
340 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
341 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
342 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
343 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
344 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
345 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
346
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
347 if form_values:
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
348 # 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
349 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
350 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
351 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
352 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
353 return d
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
354
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
355 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
356 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
357 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
358 except StopIteration:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
359 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
360
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
361 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
362 """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
363
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
364 @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
365 """
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 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
367
2406
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
368 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
369 """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
370 # 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
371 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
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 if not no_instructions:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
374 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
375
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
376 options = [(item.nodeIdentifier, item.name) for item in items]
802
9007bb133009 core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents: 798
diff changeset
377 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
378 return form_ui
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
379
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
380 def _getDataLvl(self, type_):
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
381 """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
382
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
383 @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
384 @return: a C.XMLUI_DATA_LVL_* constant
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
385 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
386 if type_ == "error":
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
387 return C.XMLUI_DATA_LVL_ERROR
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
388 elif type_ == "warn":
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
389 return C.XMLUI_DATA_LVL_WARNING
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
390 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
391 if type_ != "info":
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
392 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
393 return C.XMLUI_DATA_LVL_INFO
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
394
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
395 def _mergeNotes(self, notes):
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
396 """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
397
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
398 @param notes (list): list of tuple (level, message)
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
399 @return: list of messages
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
400 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
401 lvl_map = {
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
402 C.XMLUI_DATA_LVL_INFO: "",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
403 C.XMLUI_DATA_LVL_WARNING: "%s: " % _("WARNING"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
404 C.XMLUI_DATA_LVL_ERROR: "%s: " % _("ERROR"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
405 }
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
406 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
407
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
408 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
409 """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
410
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
411 @param iq_elt: command result
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
412 @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
413 @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
414 """
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
415 command_elt = self.getCommandElt(iq_elt)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
416 status = command_elt.getAttribute("status", XEP_0050.STATUS.EXECUTING)
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
417 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
418 # 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
419 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
420 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
421 session_id = None
eef1f200d733 plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents: 993
diff changeset
422 else:
eef1f200d733 plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents: 993
diff changeset
423 return None
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
424 remote_session_id = command_elt.getAttribute("sessionid")
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
425 if remote_session_id:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
426 session_data["remote_id"] = remote_session_id
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
427 notes = []
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
428 for note_elt in command_elt.elements(NS_COMMANDS, "note"):
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
429 notes.append(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
430 (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
431 self._getDataLvl(note_elt.getAttribute("type", "info")),
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
432 str(note_elt),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
433 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
434 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
435 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
436 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
437 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
438 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
439 # no matching data element found
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
440 if status != XEP_0050.STATUS.COMPLETED:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
441 log.warning(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
442 _("No known payload found in ad-hoc command result, aborting")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
443 )
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
444 del self.requesting[session_id]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
445 return xml_tools.XMLUI(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
446 C.XMLUI_DIALOG,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
447 dialog_opt={
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
448 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
449 C.XMLUI_DATA_MESS: _("No payload found"),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
450 C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_ERROR,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
451 },
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
452 )
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
453 if not notes:
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
454 # 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
455 return None
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
456
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
457 # 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
458 # 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
459 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
460 return xml_tools.XMLUI(
2624
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,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
464 C.XMLUI_DATA_MESS: "\n".join(self._mergeNotes(notes)),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
465 C.XMLUI_DATA_LVL: dlg_level,
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 session_id=session_id,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
468 )
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
469
1071
eef1f200d733 plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents: 993
diff changeset
470 if session_id is None:
2364
918e38622a48 core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents: 2145
diff changeset
471 return xml_tools.dataFormEltResult2XMLUI(data_elt)
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
472 form = data_form.Form.fromElement(data_elt)
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
473 # we add any present note to the instructions
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
474 form.instructions.extend(self._mergeNotes(notes))
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
475 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
476
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
477 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
478 def serialise(ret_data):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
479 if "xmlui" in ret_data:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
480 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
481 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
482
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
483 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
484 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
485 return d
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
486
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
487 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
488 """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
489
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
490 @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
491 self._commandsMenu)
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
492 @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
493 @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
494 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
495 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
496 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
497 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
498 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
499 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
500 # 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
501 # TODO: managed answerer errors
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
502 # 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
503 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
504 # 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
505 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
506 entity = jid.JID(data[xml_tools.SAT_FORM_PREFIX + "jid"])
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
507 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
508 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
509
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
510 def sendItems(xmlui):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
511 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
512 return {"xmlui": xmlui}
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
513
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
514 d.addCallback(sendItems)
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
515 else:
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
516 # 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
517 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
518 session_data = self.requesting.profileGet(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
519 data["session_id"], client.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
520 )
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
521 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
522 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
523 # TODO: send error dialog
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
524 return defer.succeed({})
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
525 session_id = data["session_id"]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
526 entity = session_data["jid"]
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
527 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
528 session_data["node"]
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
529 # node has already been received
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
530 except KeyError:
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
531 # 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
532 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
533
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
534 # 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
535 # 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
536 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
537
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
538 # 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
539 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
540 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
541 d.addCallback(self._commandsAnswer2XMLUI, session_id, session_data)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
542 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
543
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
544 return d
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
545
773
eac23b1aad90 core: dynamics menus refactoring:
Goffi <goffi@goffi.org>
parents: 771
diff changeset
546 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
547 """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
548
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
549 @param profile: %(doc_profile)s
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
550 """
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
551 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
552 form_ui.addText(_("Please enter target jid"), "instructions")
802
9007bb133009 core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents: 798
diff changeset
553 form_ui.changeContainer("pairs")
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
554 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
555 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
556 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
557
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
558 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
559 """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
560 actions = session_data.setdefault("actions", [])
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
561 actions.append(action)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
562
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
563 if len(actions) == 1:
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
564 # 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
565 status = XEP_0050.STATUS.EXECUTING
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
566 form = data_form.Form("form", title=_("status selection"))
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
567 show_options = [
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
568 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
569 ]
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
570 field = data_form.Field(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
571 "list-single", "show", options=show_options, required=True
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
572 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
573 form.addField(field)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
574
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
575 payload = form.toElement()
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
576 note = None
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
577
763
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
578 elif len(actions) == 2:
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
579 # 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
580 try:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
581 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
582 answer_form = data_form.Form.fromElement(x_elt)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
583 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
584 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
585 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
586 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
587 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
588 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
589 self.host.disconnect(client.profile)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
590 else:
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
591 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
592
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
593 # 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
594 status = XEP_0050.STATUS.COMPLETED
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
595 payload = None
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
596 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
597 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
598 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
599
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
600 return (payload, status, None, note)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
601
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
602 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
603 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
604 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
605 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
606 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
607 return d
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
608
2406
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
609 @defer.inlineCallbacks
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
610 def run(self, client, service_jid=None, node=None):
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
611 """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
612
2406
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
613 @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
614 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
615 @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
616 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
617 @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
618 """
2406
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
619 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
620 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
621 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
622 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
623 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
624 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
625 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
626 session_data["node"] = node
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
627 cb_data = yield self.requestingEntity(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
628 {"session_id": session_id}, client.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
629 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
630 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
631
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
632 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
633 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
634
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
635 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
636 """Request available commands
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
637
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
638 @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
639 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
640 @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
641 """
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
642 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
643 return d
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
644
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
645 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
646 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
647 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
648 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
649 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
650 return d
ab851b46009c plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents: 758
diff changeset
651
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
652 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
653 """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
654
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
655 @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
656 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
657 @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
658 @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
659 """
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
660 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
661 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
662 return d
1e5b2c35964e plugin XEP-0050: renamed "requestCommandsList" method to "list" + added a run command + fixes:
Goffi <goffi@goffi.org>
parents: 2364
diff changeset
663
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
664 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
665 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
666 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
667 ):
1110
36c1bbb8ca24 plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents: 1079
diff changeset
668 """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
669
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
670 @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
671 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
672 deferred
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
673 @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
674 @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
675 autogenerated node
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
676 @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
677 data form
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
678 @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
679 seconds)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
680 @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
681 @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
682 @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
683 @ALL@: allow everybody
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
684 @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
685 @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
686 @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
687 @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
688 """
821
38bc9abd6722 plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents: 811
diff changeset
689 # 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
690
1495
987e74cbb839 plugin XEP-0050: fixed crash on empty node in addAdHocCommand
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
691 if node is None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
692 node = "%s_%s" % ("COMMANDS", uuid4())
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
693
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
694 if features is None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
695 features = [data_form.NS_X_DATA]
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
696
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
697 if allowed_jids is None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
698 allowed_jids = []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
699 if allowed_groups is None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
700 allowed_groups = []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
701 if allowed_magics is None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
702 allowed_magics = ["@PROFILE_BAREJID@"]
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
703 if forbidden_jids is None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
704 forbidden_jids = []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
705 if forbidden_groups is None:
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
706 forbidden_groups = []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
707
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
708 # 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
709 _allowed_jids = (
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
710 (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
711 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
712 else allowed_jids
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
713 )
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
714 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
715 callback,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
716 label,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
717 node,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
718 features,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
719 timeout,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
720 _allowed_jids,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
721 allowed_groups,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
722 allowed_magics,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
723 forbidden_jids,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
724 forbidden_groups,
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
725 )
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
726 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
727 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
728 commands[node] = ad_hoc_command
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
729
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
730 def onCmdRequest(self, request, client):
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
731 request.handled = True
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
732 requestor = jid.JID(request["from"])
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
733 command_elt = next(request.elements(NS_COMMANDS, "command"))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
734 action = command_elt.getAttribute("action", self.ACTION.EXECUTE)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
735 node = command_elt.getAttribute("node")
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
736 if not node:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
737 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
738 return
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
739 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
740 commands = client._XEP_0050_commands
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
741 try:
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
742 command = commands[node]
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
743 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
744 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
745 return
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
746 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
747
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
748
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
749 @implementer(iwokkel.IDisco)
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
750 class XEP_0050_handler(XMPPHandler):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
751
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
752 def __init__(self, plugin_parent):
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
753 self.plugin_parent = plugin_parent
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
754
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
755 @property
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
756 def client(self):
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
757 return self.parent
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
758
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
759 def connectionInitialized(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
760 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
761 CMD_REQUEST, self.plugin_parent.onCmdRequest, client=self.parent
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
762 )
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
763
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
764 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
765 identities = []
2667
8dd9db785ac8 plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
766 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
767 # 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
768 identities.append(ID_CMD_LIST)
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
769 return [disco.DiscoFeature(NS_COMMANDS)] + identities
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
770
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
771 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
772 ret = []
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
773 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
774 commands = self.client._XEP_0050_commands
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2921
diff changeset
775 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
776 if command.isAuthorised(requestor):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
777 ret.append(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
778 disco.DiscoItem(self.parent.jid, command.node, command.getName())
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2585
diff changeset
779 ) # TODO: manage name language
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff changeset
780 return ret