Add full support for initial payloads with adhoc commands, plus test.
This commit is contained in:
parent
f53b815855
commit
ad5b61de50
2 changed files with 81 additions and 5 deletions
|
@ -213,13 +213,21 @@ class XEP_0050(BasePlugin):
|
||||||
name, handler = self.commands.get(key, ('Not found', None))
|
name, handler = self.commands.get(key, ('Not found', None))
|
||||||
if not handler:
|
if not handler:
|
||||||
log.debug('Command not found: %s, %s', key, self.commands)
|
log.debug('Command not found: %s, %s', key, self.commands)
|
||||||
|
|
||||||
|
payload = []
|
||||||
|
for stanza in iq['command']['substanzas']:
|
||||||
|
payload.append(stanza)
|
||||||
|
|
||||||
|
interfaces = set([item.plugin_attrib for item in payload])
|
||||||
|
payload_classes = set([item.__class__ for item in payload])
|
||||||
|
|
||||||
initial_session = {'id': sessionid,
|
initial_session = {'id': sessionid,
|
||||||
'from': iq['from'],
|
'from': iq['from'],
|
||||||
'to': iq['to'],
|
'to': iq['to'],
|
||||||
'node': node,
|
'node': node,
|
||||||
'payload': None,
|
'payload': payload,
|
||||||
'interfaces': '',
|
'interfaces': interfaces,
|
||||||
'payload_classes': None,
|
'payload_classes': payload_classes,
|
||||||
'notes': None,
|
'notes': None,
|
||||||
'has_next': False,
|
'has_next': False,
|
||||||
'allow_complete': False,
|
'allow_complete': False,
|
||||||
|
@ -269,11 +277,19 @@ class XEP_0050(BasePlugin):
|
||||||
sessionid = session['id']
|
sessionid = session['id']
|
||||||
|
|
||||||
payload = session['payload']
|
payload = session['payload']
|
||||||
|
if payload is None:
|
||||||
|
payload = []
|
||||||
if not isinstance(payload, list):
|
if not isinstance(payload, list):
|
||||||
payload = [payload]
|
payload = [payload]
|
||||||
|
|
||||||
session['interfaces'] = [item.plugin_attrib for item in payload]
|
interfaces = session.get('interfaces', set())
|
||||||
session['payload_classes'] = [item.__class__ for item in payload]
|
payload_classes = session.get('payload_classes', set())
|
||||||
|
|
||||||
|
interfaces.update(set([item.plugin_attrib for item in payload]))
|
||||||
|
payload_classes.update(set([item.__class__ for item in payload]))
|
||||||
|
|
||||||
|
session['interfaces'] = interfaces
|
||||||
|
session['payload_classes'] = payload_classes
|
||||||
|
|
||||||
self.sessions[sessionid] = session
|
self.sessions[sessionid] = session
|
||||||
|
|
||||||
|
@ -486,6 +502,12 @@ class XEP_0050(BasePlugin):
|
||||||
session['from'] = ifrom
|
session['from'] = ifrom
|
||||||
iq['command']['node'] = node
|
iq['command']['node'] = node
|
||||||
iq['command']['action'] = 'execute'
|
iq['command']['action'] = 'execute'
|
||||||
|
if session['payload'] is not None:
|
||||||
|
payload = session['payload']
|
||||||
|
if not isinstance(payload, list):
|
||||||
|
payload = list(payload)
|
||||||
|
for stanza in payload:
|
||||||
|
iq['command'].append(stanza)
|
||||||
sessionid = 'client:pending_' + iq['id']
|
sessionid = 'client:pending_' + iq['id']
|
||||||
session['id'] = sessionid
|
session['id'] = sessionid
|
||||||
self.sessions[sessionid] = session
|
self.sessions[sessionid] = session
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import time
|
import time
|
||||||
|
import logging
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
from sleekxmpp.test import *
|
from sleekxmpp.test import *
|
||||||
|
@ -17,6 +18,59 @@ class TestAdHocCommands(SleekTest):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.stream_close()
|
self.stream_close()
|
||||||
|
|
||||||
|
def testInitialPayloadCommand(self):
|
||||||
|
"""Test a command with an initial payload."""
|
||||||
|
|
||||||
|
class TestPayload(ElementBase):
|
||||||
|
name = 'foo'
|
||||||
|
namespace = 'test'
|
||||||
|
interfaces = set(['bar'])
|
||||||
|
plugin_attrib = name
|
||||||
|
|
||||||
|
Command = self.xmpp['xep_0050'].stanza.Command
|
||||||
|
register_stanza_plugin(Command, TestPayload, iterable=True)
|
||||||
|
|
||||||
|
def handle_command(iq, session):
|
||||||
|
initial = session['payload']
|
||||||
|
logging.debug(initial)
|
||||||
|
new_payload = TestPayload()
|
||||||
|
if initial:
|
||||||
|
new_payload['bar'] = 'Received: %s' % initial[0]['bar']
|
||||||
|
else:
|
||||||
|
new_payload['bar'] = 'Failed'
|
||||||
|
|
||||||
|
logging.debug(initial)
|
||||||
|
|
||||||
|
session['payload'] = new_payload
|
||||||
|
session['next'] = None
|
||||||
|
session['has_next'] = False
|
||||||
|
|
||||||
|
return session
|
||||||
|
|
||||||
|
self.xmpp['xep_0050'].add_command('tester@localhost', 'foo',
|
||||||
|
'Do Foo', handle_command)
|
||||||
|
|
||||||
|
self.recv("""
|
||||||
|
<iq id="11" type="set" to="tester@localhost" from="foo@bar">
|
||||||
|
<command xmlns="http://jabber.org/protocol/commands"
|
||||||
|
node="foo"
|
||||||
|
action="execute">
|
||||||
|
<foo xmlns="test" bar="baz" />
|
||||||
|
</command>
|
||||||
|
</iq>
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.send("""
|
||||||
|
<iq id="11" type="result" to="foo@bar">
|
||||||
|
<command xmlns="http://jabber.org/protocol/commands"
|
||||||
|
node="foo"
|
||||||
|
status="completed"
|
||||||
|
sessionid="_sessionid_">
|
||||||
|
<foo xmlns="test" bar="Received: baz" />
|
||||||
|
</command>
|
||||||
|
</iq>
|
||||||
|
""")
|
||||||
|
|
||||||
def testZeroStepCommand(self):
|
def testZeroStepCommand(self):
|
||||||
"""Test running a command with no steps."""
|
"""Test running a command with no steps."""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue