Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_xep_0050.py @ 4094:c3b68fdc2de7
component AP gateway: fix handling of XMPP comments authors:
the gateway was supposing that comments where emitted from PEP of author. While this is
the case for most blog posts, it's not for comments. Instead the component is now using
`author_jid` which is retrieved by XEP-0277 plugin, and reject the item if the auhor is
not verified (i.e. if `publisher` attribute is not set by XMPP service).
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 12 Jun 2023 14:50:43 +0200 |
parents | 4b842c1fb686 |
children | 50c919dfe61b |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
3368
e86b71b1aa31
core: minor typos, docstring/comments update
Goffi <goffi@goffi.org>
parents:
3315
diff
changeset
|
3 # SàT plugin for Ad-Hoc Commands (XEP-0050) |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
19 |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
20 from collections import namedtuple |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
21 from uuid import uuid4 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
22 from typing import List, Optional |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
23 |
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
24 from zope.interface import implementer |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from twisted.words.protocols.jabber import jid |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
26 from twisted.words.protocols import jabber |
3302
9d61ceeaa847
plugin XEP-0050: some modernisation + adHocSequence:
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
27 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.words.xish import domish |
941
c6d8fc63b1db
core, plugins: host.getClient now raise an exception instead of returning None when no profile is found, plugins have been adapted consequently and a bit cleaned
Goffi <goffi@goffi.org>
parents:
916
diff
changeset
|
29 from twisted.internet import defer |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
30 from wokkel import disco, iwokkel, data_form |
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 | 67 C.PI_DESCRIPTION: _("""Implementation of Ad-Hoc Commands"""), |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 } |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 class AdHocError(Exception): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 def __init__(self, error_const): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 """ Error to be used from callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 @param error_const: one of XEP_0050.ERROR |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 """ |
1517
4eca4f5e21ec
plugin XEP-0050: minor parentheses removal
Goffi <goffi@goffi.org>
parents:
1505
diff
changeset
|
76 assert error_const in XEP_0050.ERROR |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 self.callback_error = error_const |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2585
diff
changeset
|
79 |
3028 | 80 @implementer(iwokkel.IDisco) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 class AdHocCommand(XMPPHandler): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
2667
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
83 def __init__(self, callback, label, node, features, timeout, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
84 allowed_jids, allowed_groups, allowed_magics, forbidden_jids, |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
85 forbidden_groups): |
8dd9db785ac8
plugin XEP-0050, adhoc D-Bus: Ad-Hoc improvment + remote media control:
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
86 XMPPHandler.__init__(self) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 self.callback = callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self.label = label |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 self.node = node |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 self.features = [disco.DiscoFeature(feature) for feature in features] |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 694 @param sequence: list of values to send |
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 | 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 | 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 | 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 | 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 | 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 |