Index: third_party/twisted_8_1/twisted/words/protocols/jabber/error.py |
diff --git a/third_party/twisted_8_1/twisted/words/protocols/jabber/error.py b/third_party/twisted_8_1/twisted/words/protocols/jabber/error.py |
deleted file mode 100644 |
index 64fbe284d9fbecf6138365959671b15a1e7e0c28..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/words/protocols/jabber/error.py |
+++ /dev/null |
@@ -1,336 +0,0 @@ |
-# -*- test-case-name: twisted.words.test.test_jabbererror -*- |
-# |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-""" |
-XMPP Error support. |
-""" |
- |
-import copy |
- |
-from twisted.words.xish import domish |
- |
-NS_XML = "http://www.w3.org/XML/1998/namespace" |
-NS_XMPP_STREAMS = "urn:ietf:params:xml:ns:xmpp-streams" |
-NS_XMPP_STANZAS = "urn:ietf:params:xml:ns:xmpp-stanzas" |
- |
-STANZA_CONDITIONS = { |
- 'bad-request': {'code': '400', 'type': 'modify'}, |
- 'conflict': {'code': '409', 'type': 'cancel'}, |
- 'feature-not-implemented': {'code': '501', 'type': 'cancel'}, |
- 'forbidden': {'code': '403', 'type': 'auth'}, |
- 'gone': {'code': '302', 'type': 'modify'}, |
- 'internal-server-error': {'code': '500', 'type': 'wait'}, |
- 'item-not-found': {'code': '404', 'type': 'cancel'}, |
- 'jid-malformed': {'code': '400', 'type': 'modify'}, |
- 'not-acceptable': {'code': '406', 'type': 'modify'}, |
- 'not-allowed': {'code': '405', 'type': 'cancel'}, |
- 'not-authorized': {'code': '401', 'type': 'auth'}, |
- 'payment-required': {'code': '402', 'type': 'auth'}, |
- 'recipient-unavailable': {'code': '404', 'type': 'wait'}, |
- 'redirect': {'code': '302', 'type': 'modify'}, |
- 'registration-required': {'code': '407', 'type': 'auth'}, |
- 'remote-server-not-found': {'code': '404', 'type': 'cancel'}, |
- 'remove-server-timeout': {'code': '504', 'type': 'wait'}, |
- 'resource-constraint': {'code': '500', 'type': 'wait'}, |
- 'service-unavailable': {'code': '503', 'type': 'cancel'}, |
- 'subscription-required': {'code': '407', 'type': 'auth'}, |
- 'undefined-condition': {'code': '500', 'type': None}, |
- 'unexpected-request': {'code': '400', 'type': 'wait'}, |
-} |
- |
-CODES_TO_CONDITIONS = { |
- '302': ('gone', 'modify'), |
- '400': ('bad-request', 'modify'), |
- '401': ('not-authorized', 'auth'), |
- '402': ('payment-required', 'auth'), |
- '403': ('forbidden', 'auth'), |
- '404': ('item-not-found', 'cancel'), |
- '405': ('not-allowed', 'cancel'), |
- '406': ('not-acceptable', 'modify'), |
- '407': ('registration-required', 'auth'), |
- '408': ('remote-server-timeout', 'wait'), |
- '409': ('conflict', 'cancel'), |
- '500': ('internal-server-error', 'wait'), |
- '501': ('feature-not-implemented', 'cancel'), |
- '502': ('service-unavailable', 'wait'), |
- '503': ('service-unavailable', 'cancel'), |
- '504': ('remote-server-timeout', 'wait'), |
- '510': ('service-unavailable', 'cancel'), |
-} |
- |
-class BaseError(Exception): |
- """ |
- Base class for XMPP error exceptions. |
- |
- @cvar namespace: The namespace of the C{error} element generated by |
- C{getElement}. |
- @type namespace: C{str} |
- @ivar condition: The error condition. The valid values are defined by |
- subclasses of L{BaseError}. |
- @type contition: C{str} |
- @ivar text: Optional text message to supplement the condition or application |
- specific condition. |
- @type text: C{unicode} |
- @ivar textLang: Identifier of the language used for the message in C{text}. |
- Values are as described in RFC 3066. |
- @type textLang: C{str} |
- @ivar appCondition: Application specific condition element, supplementing |
- the error condition in C{condition}. |
- @type appCondition: object providing L{domish.IElement}. |
- """ |
- |
- namespace = None |
- |
- def __init__(self, condition, text=None, textLang=None, appCondition=None): |
- Exception.__init__(self) |
- self.condition = condition |
- self.text = text |
- self.textLang = textLang |
- self.appCondition = appCondition |
- |
- |
- def __str__(self): |
- message = "%s with condition %r" % (self.__class__.__name__, |
- self.condition) |
- |
- if self.text: |
- message += ': ' + self.text |
- |
- return message |
- |
- |
- def getElement(self): |
- """ |
- Get XML representation from self. |
- |
- The method creates an L{domish} representation of the |
- error data contained in this exception. |
- |
- @rtype: L{domish.Element} |
- """ |
- error = domish.Element((None, 'error')) |
- error.addElement((self.namespace, self.condition)) |
- if self.text: |
- text = error.addElement((self.namespace, 'text'), |
- content=self.text) |
- if self.textLang: |
- text[(NS_XML, 'lang')] = self.textLang |
- if self.appCondition: |
- error.addChild(self.appCondition) |
- return error |
- |
- |
- |
-class StreamError(BaseError): |
- """ |
- Stream Error exception. |
- |
- Refer to RFC 3920, section 4.7.3, for the allowed values for C{condition}. |
- """ |
- |
- namespace = NS_XMPP_STREAMS |
- |
- def getElement(self): |
- """ |
- Get XML representation from self. |
- |
- Overrides the base L{BaseError.getElement} to make sure the returned |
- element is in the XML Stream namespace. |
- |
- @rtype: L{domish.Element} |
- """ |
- from twisted.words.protocols.jabber.xmlstream import NS_STREAMS |
- |
- error = BaseError.getElement(self) |
- error.uri = NS_STREAMS |
- return error |
- |
- |
- |
-class StanzaError(BaseError): |
- """ |
- Stanza Error exception. |
- |
- Refer to RFC 3920, section 9.3, for the allowed values for C{condition} and |
- C{type}. |
- |
- @ivar type: The stanza error type. Gives a suggestion to the recipient |
- of the error on how to proceed. |
- @type type: C{str} |
- @ivar code: A numeric identifier for the error condition for backwards |
- compatibility with pre-XMPP Jabber implementations. |
- """ |
- |
- namespace = NS_XMPP_STANZAS |
- |
- def __init__(self, condition, type=None, text=None, textLang=None, |
- appCondition=None): |
- BaseError.__init__(self, condition, text, textLang, appCondition) |
- |
- if type is None: |
- try: |
- type = STANZA_CONDITIONS[condition]['type'] |
- except KeyError: |
- pass |
- self.type = type |
- |
- try: |
- self.code = STANZA_CONDITIONS[condition]['code'] |
- except KeyError: |
- self.code = None |
- |
- self.children = [] |
- self.iq = None |
- |
- |
- def getElement(self): |
- """ |
- Get XML representation from self. |
- |
- Overrides the base L{BaseError.getElement} to make sure the returned |
- element has a C{type} attribute and optionally a legacy C{code} |
- attribute. |
- |
- @rtype: L{domish.Element} |
- """ |
- error = BaseError.getElement(self) |
- error['type'] = self.type |
- if self.code: |
- error['code'] = self.code |
- return error |
- |
- |
- def toResponse(self, stanza): |
- """ |
- Construct error response stanza. |
- |
- The C{stanza} is transformed into an error response stanza by |
- swapping the C{to} and C{from} addresses and inserting an error |
- element. |
- |
- @note: This creates a shallow copy of the list of child elements of the |
- stanza. The child elements themselves are not copied themselves, |
- and references to their parent element will still point to the |
- original stanza element. |
- |
- The serialization of an element does not use the reference to |
- its parent, so the typical use case of immediately sending out |
- the constructed error response is not affected. |
- |
- @param stanza: the stanza to respond to |
- @type stanza: L{domish.Element} |
- """ |
- from twisted.words.protocols.jabber.xmlstream import toResponse |
- response = toResponse(stanza, stanzaType='error') |
- response.children = copy.copy(stanza.children) |
- response.addChild(self.getElement()) |
- return response |
- |
- |
-def _getText(element): |
- for child in element.children: |
- if isinstance(child, basestring): |
- return unicode(child) |
- |
- return None |
- |
- |
- |
-def _parseError(error, errorNamespace): |
- """ |
- Parses an error element. |
- |
- @param error: The error element to be parsed |
- @type error: L{domish.Element} |
- @param errorNamespace: The namespace of the elements that hold the error |
- condition and text. |
- @type errorNamespace: C{str} |
- @return: Dictionary with extracted error information. If present, keys |
- C{condition}, C{text}, C{textLang} have a string value, |
- and C{appCondition} has an L{domish.Element} value. |
- @rtype: L{dict} |
- """ |
- condition = None |
- text = None |
- textLang = None |
- appCondition = None |
- |
- for element in error.elements(): |
- if element.uri == errorNamespace: |
- if element.name == 'text': |
- text = _getText(element) |
- textLang = element.getAttribute((NS_XML, 'lang')) |
- else: |
- condition = element.name |
- else: |
- appCondition = element |
- |
- return { |
- 'condition': condition, |
- 'text': text, |
- 'textLang': textLang, |
- 'appCondition': appCondition, |
- } |
- |
- |
- |
-def exceptionFromStreamError(element): |
- """ |
- Build an exception object from a stream error. |
- |
- @param element: the stream error |
- @type element: L{domish.Element} |
- @return: the generated exception object |
- @rtype: L{StreamError} |
- """ |
- error = _parseError(element, NS_XMPP_STREAMS) |
- |
- exception = StreamError(error['condition'], |
- error['text'], |
- error['textLang'], |
- error['appCondition']) |
- |
- return exception |
- |
- |
- |
-def exceptionFromStanza(stanza): |
- """ |
- Build an exception object from an error stanza. |
- |
- @param stanza: the error stanza |
- @type stanza: L{domish.Element} |
- @return: the generated exception object |
- @rtype: L{StanzaError} |
- """ |
- children = [] |
- condition = text = textLang = appCondition = type = code = None |
- |
- for element in stanza.elements(): |
- if element.name == 'error' and element.uri == stanza.uri: |
- code = element.getAttribute('code') |
- type = element.getAttribute('type') |
- error = _parseError(element, NS_XMPP_STANZAS) |
- condition = error['condition'] |
- text = error['text'] |
- textLang = error['textLang'] |
- appCondition = error['appCondition'] |
- |
- if not condition and code: |
- condition, type = CODES_TO_CONDITIONS[code] |
- text = _getText(stanza.error) |
- else: |
- children.append(element) |
- |
- if condition is None: |
- # TODO: raise exception instead? |
- return StanzaError(None) |
- |
- exception = StanzaError(condition, type, text, textLang, appCondition) |
- |
- exception.children = children |
- exception.stanza = stanza |
- |
- return exception |