Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0050.py @ 1524:7b0fcefd52d4
plugin XEP-0047, XEP-0096: In-Band Bystream plugin cleaning:
- some renaming, comments improvments, etc
- progress callback is no more managed here, as it will be managed by application
- no more file data is used, beside file_obj
- a proper Deferred is used instead of success and error callbacks
- more clean error sending method
plugin XEP-0096 has been updated to handle changes. Its temporarily partially broken though
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 25 Sep 2015 19:19:12 +0200 |
parents | 4eca4f5e21ec |
children | 98f92a054539 |
rev | line source |
---|---|
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT plugin for Ad-Hoc Commands (XEP-0050) |
1396 | 5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jérôme Poisson (goffi@goffi.org) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
773 | 20 from sat.core.i18n import _, D_ |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
821
diff
changeset
|
21 from sat.core.constants import Const as C |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
22 from sat.core.log import getLogger |
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
23 log = getLogger(__name__) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 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
|
25 from twisted.words.protocols import jabber |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 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
|
27 from twisted.internet import defer |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
28 from wokkel import disco, iwokkel, data_form, compat |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from sat.core import exceptions |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
30 from sat.memory.memory import Sessions |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 from uuid import uuid4 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
32 from sat.tools import xml_tools |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 from zope.interface import implements |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 try: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 from twisted.words.protocols.xmlstream import XMPPHandler |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 except ImportError: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 from wokkel.subprotocols import XMPPHandler |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 from collections import namedtuple |
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 try: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 from collections import OrderedDict # only available from python 2.7 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 except ImportError: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 from ordereddict import OrderedDict |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 IQ_SET = '/iq[@type="set"]' |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 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
|
50 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
|
51 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
|
52 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
|
53 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 SHOWS = OrderedDict([('default', _('Online')), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 ('away', _('Away')), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 ('chat', _('Free for chat')), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 ('dnd', _('Do not disturb')), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 ('xa', _('Left')), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 ('disconnect', _('Disconnect'))]) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 PLUGIN_INFO = { |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 "name": "Ad-Hoc Commands", |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 "import_name": "XEP-0050", |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 "type": "XEP", |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 "protocols": ["XEP-0050"], |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 "main": "XEP_0050", |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 "handler": "yes", |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 "description": _("""Implementation of Ad-Hoc Commands""") |
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 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 class AdHocError(Exception): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 def __init__(self, error_const): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 """ Error to be used from callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 @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
|
77 """ |
1517
4eca4f5e21ec
plugin XEP-0050: minor parentheses removal
Goffi <goffi@goffi.org>
parents:
1505
diff
changeset
|
78 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
|
79 self.callback_error = error_const |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 |
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 implements(iwokkel.IDisco) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 def __init__(self, parent, callback, label, node, features, timeout, allowed_jids, allowed_groups, allowed_magics, forbidden_jids, forbidden_groups, client): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 self.parent = parent |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 self.callback = callback |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 self.label = label |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self.node = node |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 self.features = [disco.DiscoFeature(feature) for feature in features] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 self.allowed_jids, self.allowed_groups, self.allowed_magics, self.forbidden_jids, self.forbidden_groups = allowed_jids, allowed_groups, allowed_magics, forbidden_jids, forbidden_groups |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 self.client = client |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
92 self.sessions = Sessions(timeout=timeout) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 def getName(self, xml_lang=None): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 return self.label |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 def isAuthorised(self, requestor): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 if '@ALL@' in self.allowed_magics: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 return True |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 forbidden = set(self.forbidden_jids) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 for group in self.forbidden_groups: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 forbidden.update(self.client.roster.getJidsFromGroup(group)) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 if requestor.userhostJID() in forbidden: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 return False |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 allowed = set(self.allowed_jids) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 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
|
107 try: |
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
108 allowed.update(self.client.roster.getJidsFromGroup(group)) |
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
109 except exceptions.UnknownGroupError: |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
110 log.warning(_(u"The groups [%(group)s] is unknown for profile [%(profile)s])" % {'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
|
111 if requestor.userhostJID() in allowed: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 return True |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 return False |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
1494
74ddb4cc2ff9
plugin XEP-0050: return disco for commands only on commands namespace
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
116 if nodeIdentifier != NS_COMMANDS: # FIXME: we should manage other disco nodes here |
74ddb4cc2ff9
plugin XEP-0050: return disco for commands only on commands namespace
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
117 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
|
118 # 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
|
119 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
|
120 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 return [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 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
|
125 """ Send result of the command |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 @param callback_data: tuple (payload, status, actions, note) with: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 - payload (domish.Element) usualy containing data form |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 - status: current status, see XEP_0050.STATUS |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 - actions: list of allowed actions (see XEP_0050.ACTION). First action is the default one. Default to EXECUTE |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 - note: optional additional note: either None or a tuple with (note type, human readable string), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 note type being in XEP_0050.NOTE |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 @param session_id: current session id |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 @param request: original request (domish.Element) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 @return: deferred |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 """ |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 payload, status, actions, note = callback_data |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 assert(isinstance(payload, domish.Element) or payload is None) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 assert(status in XEP_0050.STATUS) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 if not actions: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 actions = [XEP_0050.ACTION.EXECUTE] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 result = domish.Element((None, 'iq')) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 result['type'] = 'result' |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 result['id'] = request['id'] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 result['to'] = request['from'] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 command_elt = result.addElement('command', NS_COMMANDS) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 command_elt['sessionid'] = session_id |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 command_elt['node'] = self.node |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 command_elt['status'] = status |
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 if status != XEP_0050.STATUS.CANCELED: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 if status != XEP_0050.STATUS.COMPLETED: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 actions_elt = command_elt.addElement('actions') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 actions_elt['execute'] = actions[0] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 for action in actions: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 actions_elt.addElement(action) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 if note is not None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 note_type, note_mess = note |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 note_elt = command_elt.addElement('note', content=note_mess) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 note_elt['type'] = note_type |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 if payload is not None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 command_elt.addChild(payload) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 self.client.xmlstream.send(result) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 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
|
167 del self.sessions[session_id] |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 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
|
170 """ Send error stanza |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 @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
|
172 @param request: original request (domish.Element) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 """ |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 xmpp_condition, cmd_condition = error_constant |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
175 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
|
176 if cmd_condition: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 error_elt = iq_elt.elements(None, "error").next() |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 error_elt.addElement(cmd_condition, NS_COMMANDS) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 self.client.xmlstream.send(iq_elt) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 del self.sessions[session_id] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 def onRequest(self, command_elt, requestor, action, session_id): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 if not self.isAuthorised(requestor): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 return self._sendError(XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 if session_id: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 try: |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
187 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
|
188 except KeyError: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 return self._sendError(XEP_0050.ERROR.SESSION_EXPIRED, session_id, command_elt.parent) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 if session_data['requestor'] != requestor: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 return self._sendError(XEP_0050.ERROR.FORBIDDEN, session_id, command_elt.parent) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 else: |
758
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
193 session_id, session_data = self.sessions.newSession() |
86224a13cc1d
plugin xep-0050: using new Sessions class
Goffi <goffi@goffi.org>
parents:
753
diff
changeset
|
194 session_data['requestor'] = requestor |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 if action == XEP_0050.ACTION.CANCEL: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 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
|
197 else: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 d = defer.maybeDeferred(self.callback, command_elt, session_data, action, self.node, self.client.profile) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 d.addCallback(self._sendAnswer, session_id, command_elt.parent) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 d.addErrback(lambda failure, request: self._sendError(failure.value.callback_error, session_id, request), command_elt.parent) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 class XEP_0050(object): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 STATUS = namedtuple('Status', ('EXECUTING', 'COMPLETED', 'CANCELED'))('executing', 'completed', 'canceled') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 ACTION = namedtuple('Action', ('EXECUTE', 'CANCEL', 'NEXT', 'PREV'))('execute', 'cancel', 'next', 'prev') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 NOTE = namedtuple('Note', ('INFO','WARN','ERROR'))('info','warn','error') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 ERROR = namedtuple('Error', ('MALFORMED_ACTION', 'BAD_ACTION', 'BAD_LOCALE', 'BAD_PAYLOAD', 'BAD_SESSIONID', 'SESSION_EXPIRED', |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 'FORBIDDEN', 'ITEM_NOT_FOUND', 'FEATURE_NOT_IMPLEMENTED', 'INTERNAL'))(('bad-request', 'malformed-action'), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 ('bad-request', 'bad-action'), ('bad-request', 'bad-locale'), ('bad-request','bad-payload'), |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 ('bad-request','bad-sessionid'), ('not-allowed','session-expired'), ('forbidden', None), |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
941
diff
changeset
|
211 ('item-not-found', None), ('feature-not-implemented', None), ('internal-server-error', None)) # 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
|
212 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 def __init__(self, host): |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
214 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
|
215 self.host = host |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
216 self.requesting = Sessions() |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 self.answering = {} |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
218 host.bridge.addMethod("requestCommand", ".plugin", in_sign='ss', out_sign='s', |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
219 method=self._requestCommandsList, |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
220 async=True) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
221 self.__requesting_id = host.registerCallback(self._requestingEntity, with_data=True) |
809 | 222 host.importMenu((D_("Service"), D_("commands")), self._commandsMenu, security_limit=4, help_string=D_("Execute ad-hoc commands")) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 def getHandler(self, profile): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 return XEP_0050_handler(self) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 def profileConnected(self, profile): |
821
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
228 self.addAdHocCommand(self._statusCallback, _("Status"), profile_key=profile) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 |
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
|
230 def profileDisconnected(self, profile): |
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
|
231 try: |
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
|
232 del self.answering[profile] |
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
|
233 except KeyError: |
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
|
234 pass |
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
|
235 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
236 def _items2XMLUI(self, items): |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
237 """ Convert discovery items to XMLUI dialog """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
238 # 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
|
239 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
|
240 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
241 form_ui.addText(_("Please select a command"), 'instructions') |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
242 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
243 options = [(item.nodeIdentifier, item.name) for item in items] |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
798
diff
changeset
|
244 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
|
245 return form_ui |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
246 |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
247 def _getDataLvl(self, type_): |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
248 """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
|
249 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
250 @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
|
251 @return: a C.XMLUI_DATA_LVL_* constant |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
252 """ |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
253 if type_ == 'error': |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
254 return C.XMLUI_DATA_LVL_ERROR |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
255 elif type_ == 'warn': |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
256 return C.XMLUI_DATA_LVL_WARNING |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
257 else: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
258 if type_ != 'info': |
1409
3265a2639182
massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents:
1396
diff
changeset
|
259 log.warning(_(u"Invalid note type [%s], using info") % type_) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
260 return C.XMLUI_DATA_LVL_INFO |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
261 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
262 def _mergeNotes(self, notes): |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
263 """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
|
264 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
265 @param notes (list): list of tuple (level, message) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
266 @return: list of messages |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
267 """ |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
268 lvl_map = {C.XMLUI_DATA_LVL_INFO: '', |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
269 C.XMLUI_DATA_LVL_WARNING: "%s: " % _("WARNING"), |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
270 C.XMLUI_DATA_LVL_ERROR: "%s: " % _("ERROR") |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
271 } |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
272 return [u"%s%s" % (lvl_map[lvl], msg) for lvl, msg in notes] |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
273 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
274 def _commandsAnswer2XMLUI(self, iq_elt, session_id, session_data): |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
275 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
276 Convert command answer to an ui for frontend |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
277 @param iq_elt: command result |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
278 @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
|
279 @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
|
280 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
281 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
282 command_elt = iq_elt.elements(NS_COMMANDS, "command").next() |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
283 status = command_elt.getAttribute('status', XEP_0050.STATUS.EXECUTING) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
284 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
|
285 # 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
|
286 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
|
287 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
|
288 session_id = None |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
289 else: |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
290 return None |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
291 remote_session_id = command_elt.getAttribute('sessionid') |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
292 if remote_session_id: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
293 session_data['remote_id'] = remote_session_id |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
294 notes = [] |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
295 for note_elt in command_elt.elements(NS_COMMANDS, 'note'): |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
296 notes.append((self._getDataLvl(note_elt.getAttribute('type', 'info')), |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
297 unicode(note_elt))) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
298 try: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
299 data_elt = command_elt.elements(data_form.NS_X_DATA, 'x').next() |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
300 except StopIteration: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
301 if status != XEP_0050.STATUS.COMPLETED: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
302 log.warning(_("No known payload found in ad-hoc command result, aborting")) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
303 del self.requesting[session_id] |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
304 return xml_tools.XMLUI(C.XMLUI_DIALOG, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
305 dialog_opt = {C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
306 C.XMLUI_DATA_MESS: _("No payload found"), |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
307 C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_ERROR, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
308 } |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
309 ) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
310 if not notes: |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
311 # 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
|
312 return None |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
313 |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
314 # 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
|
315 # 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
|
316 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
|
317 return xml_tools.XMLUI( |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
318 C.XMLUI_DIALOG, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
319 dialog_opt = {C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
320 C.XMLUI_DATA_MESS: u'\n'.join(self._mergeNotes(notes)), |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
321 C.XMLUI_DATA_LVL: dlg_level, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
322 }, |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
323 session_id = session_id |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
324 ) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
325 |
1071
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
326 if session_id is None: |
eef1f200d733
plugin XEP-0050: form returned by completed command are now managed
Goffi <goffi@goffi.org>
parents:
993
diff
changeset
|
327 return xml_tools.dataFormResult2XMLUI(data_elt) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
328 form = data_form.Form.fromElement(data_elt) |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
329 # we add any present note to the instructions |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
330 form.instructions.extend(self._mergeNotes(notes)) |
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
331 return xml_tools.dataForm2XMLUI(form, self.__requesting_id, session_id=session_id) |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
332 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
333 def _requestingEntity(self, data, profile): |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
334 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
335 request and entity and create XMLUI accordingly |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
336 @param data: data returned by previous XMLUI (first one must come from self._commandsMenu) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
337 @param profile: %(doc_profile)s |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
338 @return: callback dict result (with "xmlui" corresponding to the answering dialog, or empty if it's finished without error) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
339 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
340 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
341 # 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
|
342 # TODO: managed answerer errors |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
343 # 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
|
344 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
|
345 # we just had the jid, we now request it for the available commands |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
346 session_id, session_data = self.requesting.newSession(profile=profile) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
347 entity = jid.JID(data[xml_tools.SAT_FORM_PREFIX+'jid']) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
348 session_data['jid'] = entity |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
349 d = self.requestCommandsList(entity, profile) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
350 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
351 def sendItems(xmlui): |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
773
diff
changeset
|
352 xmlui.session_id = session_id # we need to keep track of the session |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
353 return {'xmlui': xmlui.toXml()} |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
354 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
355 d.addCallback(sendItems) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
356 else: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
357 # 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
|
358 try: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
359 session_data = self.requesting.profileGet(data["session_id"], profile) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
360 except KeyError: |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
944
diff
changeset
|
361 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
|
362 # TODO: send error dialog |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
363 return defer.succeed({}) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
364 session_id = data["session_id"] |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
365 entity = session_data['jid'] |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
366 try: |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
367 session_data['node'] |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
368 # node has already been received |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
369 except KeyError: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
370 # it's the first time we know the node, we save it in session data |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
371 session_data['node'] = data[xml_tools.SAT_FORM_PREFIX+'node'] |
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 client = self.host.getClient(profile) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
374 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
375 # we request execute node's command |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
376 iq_elt = compat.IQ(client.xmlstream, 'set') |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
377 iq_elt['to'] = entity.full() |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
378 command_elt = iq_elt.addElement("command", NS_COMMANDS) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
379 command_elt['node'] = session_data['node'] |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
380 command_elt['action'] = XEP_0050.ACTION.EXECUTE |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
381 try: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
382 # remote_id is the XEP_0050 sessionid used by answering command |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
383 # while session_id is our own session id used with the frontend |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
384 command_elt['sessionid'] = session_data['remote_id'] |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
385 except KeyError: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
386 pass |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
387 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
388 command_elt.addChild(xml_tools.XMLUIResultToElt(data)) # We add the XMLUI result to the command payload |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
389 d = iq_elt.send() |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
390 d.addCallback(self._commandsAnswer2XMLUI, session_id, session_data) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
391 d.addCallback(lambda xmlui: {'xmlui': xmlui.toXml()} if xmlui is not None else {}) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
392 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
393 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
394 |
773 | 395 def _commandsMenu(self, menu_data, profile): |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
396 """ First XMLUI activated by menu: ask for target jid |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
397 @param profile: %(doc_profile)s |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
398 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
399 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
400 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
|
401 form_ui.addText(_("Please enter target jid"), 'instructions') |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
798
diff
changeset
|
402 form_ui.changeContainer("pairs") |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
403 form_ui.addLabel("jid") |
1505
5ddc4cf251fa
plugin XEP-0050: pre-fill the target server's field with user's host.
souliane <souliane@mailoo.org>
parents:
1495
diff
changeset
|
404 jid = form_ui.addString("jid", value=self.host.getClient(profile).jid.host) |
773 | 405 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
|
406 |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
407 def _statusCallback(self, command_elt, session_data, action, node, profile): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
408 """ Ad-hoc command used to change the "show" part of status """ |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
409 actions = session_data.setdefault('actions',[]) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 actions.append(action) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
411 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
412 if len(actions) == 1: |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
413 # 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
|
414 status = XEP_0050.STATUS.EXECUTING |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
415 form = data_form.Form('form', title=_('status selection')) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
416 show_options = [data_form.Option(name, label) for name, label in SHOWS.items()] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
417 field = data_form.Field('list-single', 'show', options=show_options, required=True) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
418 form.addField(field) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
419 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
420 payload = form.toElement() |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
421 note = None |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
422 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
423 elif len(actions) == 2: |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
424 # 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
|
425 try: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
426 x_elt = command_elt.elements(data_form.NS_X_DATA,'x').next() |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
427 answer_form = data_form.Form.fromElement(x_elt) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
428 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
|
429 except (KeyError, StopIteration): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
430 raise AdHocError(XEP_0050.ERROR.BAD_PAYLOAD) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
431 if show not in SHOWS: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
432 raise AdHocError(XEP_0050.ERROR.BAD_PAYLOAD) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
433 if show == "disconnect": |
1505
5ddc4cf251fa
plugin XEP-0050: pre-fill the target server's field with user's host.
souliane <souliane@mailoo.org>
parents:
1495
diff
changeset
|
434 self.host.disconnect(profile) |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
435 else: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
436 self.host.setPresence(show=show, profile_key=profile) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
437 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
438 # 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
|
439 form = data_form.Form('form', title=_(u'Updated')) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
440 form.addField(data_form.Field('fixed', u'Status updated')) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
441 status = XEP_0050.STATUS.COMPLETED |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
442 payload = None |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
443 note = (self.NOTE.INFO, _(u"Status updated")) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
444 else: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
445 raise AdHocError(XEP_0050.ERROR.INTERNAL) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
446 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
447 return (payload, status, None, note) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
448 |
763
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
449 def _requestCommandsList(self, to_jid_s, profile_key): |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
450 d = self.requestCommandsList(jid.JID(to_jid_s), profile_key) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
451 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
|
452 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
453 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
454 def requestCommandsList(self, to_jid, profile_key): |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
455 """ Request available commands |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
456 @param to_jid: the entity answering the commands |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
457 @param profile_key: %(doc_profile)s |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
458 |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
459 """ |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
460 client = self.host.getClient(profile_key) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
461 d = client.disco.requestItems(to_jid, NS_COMMANDS) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
462 d.addCallback(self._items2XMLUI) |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
463 return d |
ab851b46009c
plugin xep-0050 (ad-hoc commands): requesting part. first draft
Goffi <goffi@goffi.org>
parents:
758
diff
changeset
|
464 |
1494
74ddb4cc2ff9
plugin XEP-0050: return disco for commands only on commands namespace
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
465 def addAdHocCommand(self, callback, label, node=None, features = None, timeout = 600, allowed_jids = None, allowed_groups = None, |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
821
diff
changeset
|
466 allowed_magics = None, forbidden_jids = None, forbidden_groups = None, profile_key=C.PROF_KEY_NONE): |
1110
36c1bbb8ca24
plugin XEP-0050: notes are now managed:
Goffi <goffi@goffi.org>
parents:
1079
diff
changeset
|
467 """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
|
468 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
469 @param callback: method associated with this ad-hoc command which return the payload data (see AdHocCommand._sendAnswer), can return a deferred |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
470 @param label: label associated with this command on the main menu |
1494
74ddb4cc2ff9
plugin XEP-0050: return disco for commands only on commands namespace
Goffi <goffi@goffi.org>
parents:
1409
diff
changeset
|
471 @param node: disco item node associated with this command. None to use autogenerated node |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
472 @param features: features associated with the payload (list of strings), usualy data form |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
473 @param timeout: delay between two requests before canceling the session (in seconds) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
474 @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
|
475 @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
|
476 @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
|
477 @ALL@: allow everybody |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
478 @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
|
479 @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
|
480 @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
|
481 @param profile_key: profile key associated with this command, @ALL@ means can be accessed with every profiles |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
482 @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
|
483 """ |
821
38bc9abd6722
plugin XEP-0050: fixed UnknownGroupError management + "@ALL@" profile for status command
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
484 # 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
|
485 |
1495
987e74cbb839
plugin XEP-0050: fixed crash on empty node in addAdHocCommand
Goffi <goffi@goffi.org>
parents:
1494
diff
changeset
|
486 if node is None: |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
487 node = "%s_%s" % ('COMMANDS', uuid4()) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
488 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
489 if features is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
490 features = [data_form.NS_X_DATA] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
491 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
492 if allowed_jids is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
493 allowed_jids = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
494 if allowed_groups is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
495 allowed_groups = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
496 if allowed_magics is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
497 allowed_magics = ['@PROFILE_BAREJID@'] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
498 if forbidden_jids is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
499 forbidden_jids = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
500 if forbidden_groups is None: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
501 forbidden_groups = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
502 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
503 for client in self.host.getClients(profile_key): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
504 #TODO: manage newly created/removed profiles |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
505 _allowed_jids = (allowed_jids + [client.jid.userhostJID()]) if '@PROFILE_BAREJID@' in allowed_magics else allowed_jids |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
506 ad_hoc_command = AdHocCommand(self, callback, label, node, features, timeout, _allowed_jids, |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
507 allowed_groups, allowed_magics, forbidden_jids, forbidden_groups, client) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
508 ad_hoc_command.setHandlerParent(client) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
509 profile_commands = self.answering.setdefault(client.profile, {}) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
510 profile_commands[node] = ad_hoc_command |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
511 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 def onCmdRequest(self, request, profile): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
513 request.handled = True |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
514 requestor = jid.JID(request['from']) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
515 command_elt = request.elements(NS_COMMANDS, 'command').next() |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
516 action = command_elt.getAttribute('action', self.ACTION.EXECUTE) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
517 node = command_elt.getAttribute('node') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
518 if not node: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
519 raise exceptions.DataError |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
520 sessionid = command_elt.getAttribute('sessionid') |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
521 try: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
522 command = self.answering[profile][node] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
523 except KeyError: |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
524 raise exceptions.DataError |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
525 command.onRequest(command_elt, requestor, action, sessionid) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
526 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
527 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
528 class XEP_0050_handler(XMPPHandler): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
529 implements(iwokkel.IDisco) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
530 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
531 def __init__(self, plugin_parent): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
532 self.plugin_parent = plugin_parent |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
533 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
534 def connectionInitialized(self): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
535 self.xmlstream.addObserver(CMD_REQUEST, self.plugin_parent.onCmdRequest, profile=self.parent.profile) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
536 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
537 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
538 identities = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
539 if nodeIdentifier == NS_COMMANDS and self.plugin_parent.answering.get(self.parent.profile): # we only add the identity if we have registred commands |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
540 identities.append(ID_CMD_LIST) |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
541 return [disco.DiscoFeature(NS_COMMANDS)] + identities |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
542 |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
543 def getDiscoItems(self, requestor, target, nodeIdentifier=''): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
544 ret = [] |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
545 if nodeIdentifier == NS_COMMANDS: |
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
|
546 for command in self.plugin_parent.answering.get(self.parent.profile,{}).values(): |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
547 if command.isAuthorised(requestor): |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
548 ret.append(disco.DiscoItem(self.parent.jid, command.node, command.getName())) #TODO: manage name language |
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
549 return ret |