annotate libervia/backend/plugins/plugin_xep_0050.py @ 4163:3b3cd9453d9b

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