
# 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.xmlstream import ElementBase, ET, register_stanza_plugin


class Certs(ElementBase):
    name = 'items'
    namespace = 'urn:xmpp:saslcert:1'
    plugin_attrib = 'sasl_certs'
    interfaces = set()


class CertItem(ElementBase):
    name = 'item'
    namespace = 'urn:xmpp:saslcert:1'
    plugin_attrib = 'item'
    plugin_multi_attrib = 'items'
    interfaces = {'name', 'x509cert', 'users'}
    sub_interfaces = {'name', 'x509cert'}

    def get_users(self):
        resources = self.xml.findall('{%s}users/{%s}resource' % (
            self.namespace, self.namespace))
        return {res.text for res in resources}

    def set_users(self, values):
        users = self.xml.find('{%s}users' % self.namespace)
        if users is None:
            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)

    def del_users(self):
        users = self.xml.find('{%s}users' % self.namespace)
        if users is not None:
            self.xml.remove(users)


class AppendCert(ElementBase):
    name = 'append'
    namespace = 'urn:xmpp:saslcert:1'
    plugin_attrib = 'sasl_cert_append'
    interfaces = {'name', 'x509cert', 'cert_management'}
    sub_interfaces = {'name', 'x509cert'}

    def get_cert_management(self):
        manage = self.xml.find('{%s}no-cert-management' % self.namespace)
        return manage is None

    def set_cert_management(self, value):
        self.del_cert_management()
        if not value:
            manage = ET.Element('{%s}no-cert-management' % self.namespace)
            self.xml.append(manage)

    def del_cert_management(self):
        manage = self.xml.find('{%s}no-cert-management' % self.namespace)
        if manage is not None:
            self.xml.remove(manage)


class DisableCert(ElementBase):
    name = 'disable'
    namespace = 'urn:xmpp:saslcert:1'
    plugin_attrib = 'sasl_cert_disable'
    interfaces = {'name'}
    sub_interfaces = interfaces


class RevokeCert(ElementBase):
    name = 'revoke'
    namespace = 'urn:xmpp:saslcert:1'
    plugin_attrib = 'sasl_cert_revoke'
    interfaces = {'name'}
    sub_interfaces = interfaces


register_stanza_plugin(Certs, CertItem, iterable=True)
