Source code for slixmpp.plugins.xep_0257.stanza
# Slixmpp: The Slick XMPP Library
# Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
# This file is part of Slixmpp.
# See the file LICENSE for copying permission.
from slixmpp import Iq
from slixmpp.xmlstream import ElementBase, ET, register_stanza_plugin
from collections.abc import Sequence
[docs]
class Certs(ElementBase):
"""
List of certs returned by the server.
This element is only useful for accessing the certs inside.
.. code-block:: xml
<items xmlns='urn:xmpp:saslcert:1'>
<item>
<name>Mobile Client</name>
<x509cert>
...
</x509cert>
<users>
<resource>Phone</resource>
</users>
</item>
<item>
<name>Laptop</name>
<x509cert>
...
</x509cert>
</item>
</items>
</iq>
"""
name = 'items'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_certs'
interfaces = set()
[docs]
class CertItem(ElementBase):
"""
A single cert item.
Contains the X.509 base64 DER representation, its name, as well
as a list of users currently logged in with it.
.. code-block:: xml
<item xmlns='urn:xmpp:saslcert:1'>
<name>Mobile Client</name>
<x509cert>
...
</x509cert>
<users>
<resource>Phone</resource>
</users>
</item>
"""
name = 'item'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'item'
plugin_multi_attrib = 'items'
interfaces = {'name', 'x509cert', 'users'}
sub_interfaces = {'name', 'x509cert'}
[docs]
def get_users(self) -> set[str]:
"""Return the resources currently using this cert."""
resources = self.xml.findall('{%s}users/{%s}resource' % (
self.namespace, self.namespace))
return {res.text for res in resources if res is not None and res.text}
[docs]
def set_users(self, values: Sequence[str]) -> None:
users = self.xml.find('{%s}users' % self.namespace)
if users is not None:
self.xml.remove(users)
if not values:
return
users = ET.Element('{%s}users' % self.namespace)
self.xml.append(users)
for resource in values:
res = ET.Element('{%s}resource' % self.namespace)
res.text = resource
users.append(res)
[docs]
def del_users(self) -> None:
users = self.xml.find('{%s}users' % self.namespace)
if users is not None:
self.xml.remove(users)
[docs]
class AppendCert(ElementBase):
"""
Element used for adding a cert.
.. code-block:: xml
<append xmlns='urn:xmpp:saslcert:1'>
<name>Simple Bot</name>
<no-cert-management/>
<x509cert>
...
</x509cert>
</append>
"""
name = 'append'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_append'
interfaces = {'name', 'x509cert', 'cert_management'}
sub_interfaces = {'name', 'x509cert'}
[docs]
def get_cert_management(self) -> bool:
manage = self.xml.find('{%s}no-cert-management' % self.namespace)
return manage is None
[docs]
def set_cert_management(self, value: bool) -> None:
self.del_cert_management()
if not value:
manage = ET.Element('{%s}no-cert-management' % self.namespace)
self.xml.append(manage)
[docs]
def del_cert_management(self) -> None:
manage = self.xml.find('{%s}no-cert-management' % self.namespace)
if manage is not None:
self.xml.remove(manage)
[docs]
class DisableCert(ElementBase):
"""
Element used for disabling a cert.
.. code-block:: xml
<disable xmlns='urn:xmpp:saslcert:1'>
<name>Mobile Client</name>
</disable>
"""
name = 'disable'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_disable'
interfaces = {'name'}
sub_interfaces = interfaces
[docs]
class RevokeCert(ElementBase):
"""
Element used for revoking a cert.
.. code-block:: xml
<revoke xmlns='urn:xmpp:saslcert:1'>
<name>Mobile Client</name>
</revoke>
"""
name = 'revoke'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_revoke'
interfaces = {'name'}
sub_interfaces = interfaces
[docs]
def register_plugins():
register_stanza_plugin(Certs, CertItem, iterable=True)
register_stanza_plugin(Iq, Certs)
register_stanza_plugin(Iq, AppendCert)
register_stanza_plugin(Iq, DisableCert)
register_stanza_plugin(Iq, RevokeCert)