mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-11-27 11:09:56 +00:00
Update the XEP-0092 plugin to the new style.
This commit is contained in:
parent
68ce47c905
commit
2076d506b4
5 changed files with 210 additions and 61 deletions
|
@ -1,61 +0,0 @@
|
|||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2010 Nathanael C. Fritz
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
from xml.etree import cElementTree as ET
|
||||
from . import base
|
||||
from .. xmlstream.handler.xmlwaiter import XMLWaiter
|
||||
|
||||
class xep_0092(base.base_plugin):
|
||||
"""
|
||||
XEP-0092 Software Version
|
||||
"""
|
||||
def plugin_init(self):
|
||||
self.description = "Software Version"
|
||||
self.xep = "0092"
|
||||
self.name = self.config.get('name', 'SleekXMPP')
|
||||
self.version = self.config.get('version', '0.1-dev')
|
||||
self.os = self.config.get('os', '')
|
||||
self.xmpp.add_handler("<iq type='get' xmlns='%s'><query xmlns='jabber:iq:version' /></iq>" % self.xmpp.default_ns, self.report_version, name='Sofware Version')
|
||||
|
||||
def post_init(self):
|
||||
base.base_plugin.post_init(self)
|
||||
self.xmpp.plugin['xep_0030'].add_feature('jabber:iq:version')
|
||||
|
||||
def report_version(self, xml):
|
||||
iq = self.xmpp.makeIqResult(xml.get('id', 'unknown'))
|
||||
iq.attrib['to'] = xml.get('from', self.xmpp.server)
|
||||
query = ET.Element('{jabber:iq:version}query')
|
||||
name = ET.Element('name')
|
||||
name.text = self.name
|
||||
version = ET.Element('version')
|
||||
version.text = self.version
|
||||
if self.os:
|
||||
os = ET.Element('os')
|
||||
os.text = self.os
|
||||
query.append(os)
|
||||
query.append(name)
|
||||
query.append(version)
|
||||
iq.append(query)
|
||||
self.xmpp.send(iq)
|
||||
|
||||
def getVersion(self, jid):
|
||||
iq = self.xmpp.makeIqGet()
|
||||
query = ET.Element('{jabber:iq:version}query')
|
||||
iq.append(query)
|
||||
iq.attrib['to'] = jid
|
||||
iq.attrib['from'] = self.xmpp.boundjid.full
|
||||
id = iq.get('id')
|
||||
result = iq.send()
|
||||
if result and result is not None and result.get('type', 'error') != 'error':
|
||||
qry = result.find('{jabber:iq:version}query')
|
||||
version = {}
|
||||
for child in qry.getchildren():
|
||||
version[child.tag.split('}')[-1]] = child.text
|
||||
return version
|
||||
else:
|
||||
return False
|
||||
|
11
sleekxmpp/plugins/xep_0092/__init__.py
Normal file
11
sleekxmpp/plugins/xep_0092/__init__.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2010 Nathanael C. Fritz, Lance J.T. Stout
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from sleekxmpp.plugins.xep_0092 import stanza
|
||||
from sleekxmpp.plugins.xep_0092.stanza import Version
|
||||
from sleekxmpp.plugins.xep_0092.version import xep_0092
|
42
sleekxmpp/plugins/xep_0092/stanza.py
Normal file
42
sleekxmpp/plugins/xep_0092/stanza.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2010 Nathanael C. Fritz
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from sleekxmpp.xmlstream import ElementBase, ET
|
||||
|
||||
|
||||
class Version(ElementBase):
|
||||
|
||||
"""
|
||||
XMPP allows for an agent to advertise the name and version of the
|
||||
underlying software libraries, as well as the operating system
|
||||
that the agent is running on.
|
||||
|
||||
Example version stanzas:
|
||||
<iq type="get">
|
||||
<query xmlns="jabber:iq:version" />
|
||||
</iq>
|
||||
|
||||
<iq type="result">
|
||||
<query xmlns="jabber:iq:version">
|
||||
<name>SleekXMPP</name>
|
||||
<version>1.0</version>
|
||||
<os>Linux</os>
|
||||
</query>
|
||||
</iq>
|
||||
|
||||
Stanza Interface:
|
||||
name -- The human readable name of the software.
|
||||
version -- The specific version of the software.
|
||||
os -- The name of the operating system running the program.
|
||||
"""
|
||||
|
||||
name = 'query'
|
||||
namespace = 'jabber:iq:version'
|
||||
plugin_attrib = 'software_version'
|
||||
interfaces = set(('name', 'version', 'os'))
|
||||
sub_interfaces = interfaces
|
88
sleekxmpp/plugins/xep_0092/version.py
Normal file
88
sleekxmpp/plugins/xep_0092/version.py
Normal file
|
@ -0,0 +1,88 @@
|
|||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2010 Nathanael C. Fritz
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
import sleekxmpp
|
||||
from sleekxmpp import Iq
|
||||
from sleekxmpp.xmlstream import register_stanza_plugin
|
||||
from sleekxmpp.xmlstream.handler import Callback
|
||||
from sleekxmpp.xmlstream.matcher import StanzaPath
|
||||
from sleekxmpp.plugins.base import base_plugin
|
||||
from sleekxmpp.plugins.xep_0092 import Version
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class xep_0092(base_plugin):
|
||||
|
||||
"""
|
||||
XEP-0092: Software Version
|
||||
"""
|
||||
|
||||
def plugin_init(self):
|
||||
"""
|
||||
Start the XEP-0092 plugin.
|
||||
"""
|
||||
self.xep = "0092"
|
||||
self.description = "Software Version"
|
||||
self.stanza = sleekxmpp.plugins.xep_0092.stanza
|
||||
|
||||
self.name = self.config.get('name', 'SleekXMPP')
|
||||
self.version = self.config.get('version', '0.1-dev')
|
||||
self.os = self.config.get('os', '')
|
||||
|
||||
self.getVersion = self.get_version
|
||||
|
||||
self.xmpp.register_handler(
|
||||
Callback('Software Version',
|
||||
StanzaPath('iq/software_version'),
|
||||
self._handle_version))
|
||||
|
||||
register_stanza_plugin(Iq, Version)
|
||||
|
||||
def post_init(self):
|
||||
"""
|
||||
Handle cross-plugin dependencies.
|
||||
"""
|
||||
base_plugin.post_init(self)
|
||||
self.xmpp.plugin['xep_0030'].add_feature('jabber:iq:version')
|
||||
|
||||
def _handle_version(self, iq):
|
||||
"""
|
||||
Respond to a software version query.
|
||||
|
||||
Arguments:
|
||||
iq -- The Iq stanza containing the software version query.
|
||||
"""
|
||||
iq.reply()
|
||||
iq['software_version']['name'] = self.name
|
||||
iq['software_version']['version'] = self.version
|
||||
iq['software_version']['os'] = self.os
|
||||
iq.send()
|
||||
|
||||
def get_version(self, jid, ifrom=None):
|
||||
"""
|
||||
Retrieve the software version of a remote agent.
|
||||
|
||||
Arguments:
|
||||
jid -- The JID of the entity to query.
|
||||
"""
|
||||
iq = self.xmpp.Iq()
|
||||
iq['to'] = jid
|
||||
if ifrom:
|
||||
iq['from'] = ifrom
|
||||
iq['type'] = 'get'
|
||||
iq['query'] = Version.namespace
|
||||
|
||||
result = iq.send()
|
||||
|
||||
if result and result['type'] != 'error':
|
||||
return result['software_version']._get_stanza_values()
|
||||
return False
|
69
tests/test_stream_xep_0092.py
Normal file
69
tests/test_stream_xep_0092.py
Normal file
|
@ -0,0 +1,69 @@
|
|||
import threading
|
||||
|
||||
from sleekxmpp.test import *
|
||||
|
||||
|
||||
class TestStreamSet(SleekTest):
|
||||
|
||||
def tearDown(self):
|
||||
self.stream_close()
|
||||
|
||||
def testHandleSoftwareVersionRequest(self):
|
||||
self.stream_start(mode='client', plugins=['xep_0030', 'xep_0092'])
|
||||
|
||||
self.xmpp['xep_0092'].name = 'SleekXMPP'
|
||||
self.xmpp['xep_0092'].version = 'dev'
|
||||
self.xmpp['xep_0092'].os = 'Linux'
|
||||
|
||||
self.recv("""
|
||||
<iq type="get" id="1">
|
||||
<query xmlns="jabber:iq:version" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.send("""
|
||||
<iq type="result" id="1">
|
||||
<query xmlns="jabber:iq:version">
|
||||
<name>SleekXMPP</name>
|
||||
<version>dev</version>
|
||||
<os>Linux</os>
|
||||
</query>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
def testMakeSoftwareVersionRequest(self):
|
||||
results = []
|
||||
|
||||
def query():
|
||||
r = self.xmpp['xep_0092'].get_version('foo@bar')
|
||||
results.append(r)
|
||||
|
||||
self.stream_start(mode='client', plugins=['xep_0030', 'xep_0092'])
|
||||
|
||||
t = threading.Thread(target=query)
|
||||
t.start()
|
||||
|
||||
self.send("""
|
||||
<iq type="get" id="1" to="foo@bar">
|
||||
<query xmlns="jabber:iq:version" />
|
||||
</iq>
|
||||
""")
|
||||
|
||||
self.recv("""
|
||||
<iq type="result" id="1" from="foo@bar" to="tester@localhost">
|
||||
<query xmlns="jabber:iq:version">
|
||||
<name>Foo</name>
|
||||
<version>1.0</version>
|
||||
<os>Linux</os>
|
||||
</query>
|
||||
</iq>
|
||||
""")
|
||||
|
||||
t.join()
|
||||
|
||||
expected = [{'name': 'Foo', 'version': '1.0', 'os':'Linux'}]
|
||||
self.assertEqual(results, expected,
|
||||
"Did not receive expected results: %s" % results)
|
||||
|
||||
|
||||
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamSet)
|
Loading…
Reference in a new issue