From 5c4f7bfe8b122874475d8a4d52b2f8212dce6231 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Mon, 18 Jun 2012 01:32:58 -0700 Subject: Initial support for XEP-0258 --- sleekxmpp/plugins/xep_0258/__init__.py | 18 ++++ sleekxmpp/plugins/xep_0258/security_labels.py | 40 ++++++++ sleekxmpp/plugins/xep_0258/stanza.py | 142 ++++++++++++++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 sleekxmpp/plugins/xep_0258/__init__.py create mode 100644 sleekxmpp/plugins/xep_0258/security_labels.py create mode 100644 sleekxmpp/plugins/xep_0258/stanza.py (limited to 'sleekxmpp/plugins/xep_0258') diff --git a/sleekxmpp/plugins/xep_0258/__init__.py b/sleekxmpp/plugins/xep_0258/__init__.py new file mode 100644 index 00000000..516a3706 --- /dev/null +++ b/sleekxmpp/plugins/xep_0258/__init__.py @@ -0,0 +1,18 @@ +""" + 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.base import register_plugin + +from sleekxmpp.plugins.xep_0258 import stanza +from sleekxmpp.plugins.xep_0258.stanza import SecurityLabel, Label +from sleekxmpp.plugins.xep_0258.stanza import DisplayMarking, EquivalentLabel +from sleekxmpp.plugins.xep_0258.stanza import ESSLabel, Catalog, CatalogItem +from sleekxmpp.plugins.xep_0258.security_labels import XEP_0258 + + +register_plugin(XEP_0258) diff --git a/sleekxmpp/plugins/xep_0258/security_labels.py b/sleekxmpp/plugins/xep_0258/security_labels.py new file mode 100644 index 00000000..27be6de1 --- /dev/null +++ b/sleekxmpp/plugins/xep_0258/security_labels.py @@ -0,0 +1,40 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +import logging + +from sleekxmpp import Iq, Message +from sleekxmpp.plugins import BasePlugin +from sleekxmpp.xmlstream import register_stanza_plugin +from sleekxmpp.plugins.xep_0258 import stanza, SecurityLabel, Catalog + + +log = logging.getLogger(__name__) + + +class XEP_0258(BasePlugin): + + name = 'xep_0258' + description = 'XEP-0258: Security Labels in XMPP' + dependencies = set(['xep_0030']) + stanza = stanza + + def plugin_init(self): + self.xmpp['xep_0030'].add_feature(SecurityLabel.namespace) + + register_stanza_plugin(Message, SecurityLabel) + register_stanza_plugin(Iq, Catalog) + + def get_catalog(self, jid, ifrom=None, block=True, + callback=None, timeout=None): + iq = self.xmpp.Iq() + iq['to'] = jid + iq['from'] = ifrom + iq['type'] = 'get' + iq.enable('security_label_catalog') + return iq.send(block=block, callback=callback, timeout=timeout) diff --git a/sleekxmpp/plugins/xep_0258/stanza.py b/sleekxmpp/plugins/xep_0258/stanza.py new file mode 100644 index 00000000..6e10b28b --- /dev/null +++ b/sleekxmpp/plugins/xep_0258/stanza.py @@ -0,0 +1,142 @@ +""" + SleekXMPP: The Sleek XMPP Library + Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout + This file is part of SleekXMPP. + + See the file LICENSE for copying permission. +""" + +from base64 import b64encode, b64decode + +from sleekxmpp.thirdparty.suelta.util import bytes + +from sleekxmpp.xmlstream import ElementBase, ET, register_stanza_plugin + + +class SecurityLabel(ElementBase): + name = 'securitylabel' + namespace = 'urn:xmpp:sec-label:0' + plugin_attrib = 'security_label' + + def add_equivalent(self, label): + equiv = EquivalentLabel(parent=self) + equiv.append(label) + return equiv + + +class Label(ElementBase): + name = 'label' + namespace = 'urn:xmpp:sec-label:0' + plugin_attrib = 'label' + + +class DisplayMarking(ElementBase): + name = 'displaymarking' + namespace = 'urn:xmpp:sec-label:0' + plugin_attrib = 'display_marking' + interfaces = set(['fgcolor', 'bgcolor', 'value']) + + def get_fgcolor(self): + return self._get_attr('fgcolor', 'black') + + def get_bgcolor(self): + return self._get_attr('fgcolor', 'white') + + def get_value(self): + return self.xml.text + + def set_value(self, value): + self.xml.text = value + + def del_value(self): + self.xml.text = '' + + +class EquivalentLabel(ElementBase): + name = 'equivalentlabel' + namespace = 'urn:xmpp:sec-label:0' + plugin_attrib = 'equivalent_label' + plugin_multi_attrib = 'equivalent_labels' + + +class Catalog(ElementBase): + name = 'catalog' + namespace = 'urn:xmpp:sec-label:catalog:2' + plugin_attrib = 'security_label_catalog' + interfaces = set(['to', 'from', 'name', 'desc', 'id', 'size', 'restrict']) + + def get_to(self): + return JID(self._get_attr('to')) + pass + + def set_to(self, value): + return self._set_attr('to', str(value)) + + def get_from(self): + return JID(self._get_attr('from')) + + def set_from(self, value): + return self._set_attr('from', str(value)) + + def get_restrict(self): + value = self._get_attr('restrict', '') + if value and value.lower() in ('true', '1'): + return True + return False + + def set_restrict(self, value): + self._del_attr('restrict') + if value: + self._set_attr('restrict', 'true') + elif value == False: + self._set_attr('restrict', 'false') + + +class CatalogItem(ElementBase): + name = 'catalog' + namespace = 'urn:xmpp:sec-label:catalog:2' + plugin_attrib = 'item' + plugin_multi_attrib = 'items' + interfaces = set(['selector', 'default']) + + def get_default(self): + value = self._get_attr('default', '') + if value.lower() in ('true', '1'): + return True + return False + + def set_default(self, value): + self._del_attr('default') + if value: + self._set_attr('default', 'true') + elif value == False: + self._set_attr('default', 'false') + + +class ESSLabel(ElementBase): + name = 'esssecuritylabel' + namespace = 'urn:xmpp:sec-label:ess:0' + plugin_attrib = 'ess' + interfaces = set(['value']) + + def get_value(self): + if self.xml.text: + return b64decode(bytes(self.xml.text)) + return '' + + def set_value(self, value): + self.xml.text = '' + if value: + self.xml.text = b64encode(bytes(value)) + + def del_value(self): + self.xml.text = '' + + +register_stanza_plugin(Catalog, CatalogItem, iterable=True) +register_stanza_plugin(CatalogItem, SecurityLabel) +register_stanza_plugin(EquivalentLabel, ESSLabel) +register_stanza_plugin(Label, ESSLabel) +register_stanza_plugin(SecurityLabel, DisplayMarking) +register_stanza_plugin(SecurityLabel, EquivalentLabel, iterable=True) +register_stanza_plugin(SecurityLabel, Label) -- cgit v1.2.3 From d92aa05b5c18806ab5addc947eeedaaf4d51500e Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Tue, 19 Jun 2012 01:29:48 -0700 Subject: PEP8 formatting updates. --- sleekxmpp/plugins/xep_0258/security_labels.py | 2 +- sleekxmpp/plugins/xep_0258/stanza.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'sleekxmpp/plugins/xep_0258') diff --git a/sleekxmpp/plugins/xep_0258/security_labels.py b/sleekxmpp/plugins/xep_0258/security_labels.py index 27be6de1..e0426f32 100644 --- a/sleekxmpp/plugins/xep_0258/security_labels.py +++ b/sleekxmpp/plugins/xep_0258/security_labels.py @@ -30,7 +30,7 @@ class XEP_0258(BasePlugin): register_stanza_plugin(Message, SecurityLabel) register_stanza_plugin(Iq, Catalog) - def get_catalog(self, jid, ifrom=None, block=True, + def get_catalog(self, jid, ifrom=None, block=True, callback=None, timeout=None): iq = self.xmpp.Iq() iq['to'] = jid diff --git a/sleekxmpp/plugins/xep_0258/stanza.py b/sleekxmpp/plugins/xep_0258/stanza.py index 6e10b28b..d844e44c 100644 --- a/sleekxmpp/plugins/xep_0258/stanza.py +++ b/sleekxmpp/plugins/xep_0258/stanza.py @@ -33,7 +33,7 @@ class Label(ElementBase): class DisplayMarking(ElementBase): name = 'displaymarking' namespace = 'urn:xmpp:sec-label:0' - plugin_attrib = 'display_marking' + plugin_attrib = 'display_marking' interfaces = set(['fgcolor', 'bgcolor', 'value']) def get_fgcolor(self): -- cgit v1.2.3 From 811955104968a055c651ea1fe97adc9f0ae61676 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Tue, 19 Jun 2012 01:38:36 -0700 Subject: Don't compare against booleans using ==. --- sleekxmpp/plugins/xep_0258/stanza.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sleekxmpp/plugins/xep_0258') diff --git a/sleekxmpp/plugins/xep_0258/stanza.py b/sleekxmpp/plugins/xep_0258/stanza.py index d844e44c..4d828a46 100644 --- a/sleekxmpp/plugins/xep_0258/stanza.py +++ b/sleekxmpp/plugins/xep_0258/stanza.py @@ -88,7 +88,7 @@ class Catalog(ElementBase): self._del_attr('restrict') if value: self._set_attr('restrict', 'true') - elif value == False: + elif value is False: self._set_attr('restrict', 'false') @@ -109,7 +109,7 @@ class CatalogItem(ElementBase): self._del_attr('default') if value: self._set_attr('default', 'true') - elif value == False: + elif value is False: self._set_attr('default', 'false') -- cgit v1.2.3