diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz |
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py')
-rw-r--r-- | contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py b/contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py new file mode 100644 index 0000000000..a5b012c682 --- /dev/null +++ b/contrib/python/Twisted/py2/twisted/words/protocols/jabber/jid.py @@ -0,0 +1,253 @@ +# -*- test-case-name: twisted.words.test.test_jabberjid -*- +# +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + +""" +Jabber Identifier support. + +This module provides an object to represent Jabber Identifiers (JIDs) and +parse string representations into them with proper checking for illegal +characters, case folding and canonicalisation through L{stringprep<twisted.words.protocols.jabber.xmpp_stringprep>}. +""" + +from twisted.python.compat import _PY3, unicode +from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep, resourceprep, nameprep + +class InvalidFormat(Exception): + """ + The given string could not be parsed into a valid Jabber Identifier (JID). + """ + +def parse(jidstring): + """ + Parse given JID string into its respective parts and apply stringprep. + + @param jidstring: string representation of a JID. + @type jidstring: L{unicode} + @return: tuple of (user, host, resource), each of type L{unicode} as + the parsed and stringprep'd parts of the given JID. If the + given string did not have a user or resource part, the respective + field in the tuple will hold L{None}. + @rtype: L{tuple} + """ + user = None + host = None + resource = None + + # Search for delimiters + user_sep = jidstring.find("@") + res_sep = jidstring.find("/") + + if user_sep == -1: + if res_sep == -1: + # host + host = jidstring + else: + # host/resource + host = jidstring[0:res_sep] + resource = jidstring[res_sep + 1:] or None + else: + if res_sep == -1: + # user@host + user = jidstring[0:user_sep] or None + host = jidstring[user_sep + 1:] + else: + if user_sep < res_sep: + # user@host/resource + user = jidstring[0:user_sep] or None + host = jidstring[user_sep + 1:user_sep + (res_sep - user_sep)] + resource = jidstring[res_sep + 1:] or None + else: + # host/resource (with an @ in resource) + host = jidstring[0:res_sep] + resource = jidstring[res_sep + 1:] or None + + return prep(user, host, resource) + +def prep(user, host, resource): + """ + Perform stringprep on all JID fragments. + + @param user: The user part of the JID. + @type user: L{unicode} + @param host: The host part of the JID. + @type host: L{unicode} + @param resource: The resource part of the JID. + @type resource: L{unicode} + @return: The given parts with stringprep applied. + @rtype: L{tuple} + """ + + if user: + try: + user = nodeprep.prepare(unicode(user)) + except UnicodeError: + raise InvalidFormat("Invalid character in username") + else: + user = None + + if not host: + raise InvalidFormat("Server address required.") + else: + try: + host = nameprep.prepare(unicode(host)) + except UnicodeError: + raise InvalidFormat("Invalid character in hostname") + + if resource: + try: + resource = resourceprep.prepare(unicode(resource)) + except UnicodeError: + raise InvalidFormat("Invalid character in resource") + else: + resource = None + + return (user, host, resource) + +__internJIDs = {} + +def internJID(jidstring): + """ + Return interned JID. + + @rtype: L{JID} + """ + + if jidstring in __internJIDs: + return __internJIDs[jidstring] + else: + j = JID(jidstring) + __internJIDs[jidstring] = j + return j + +class JID(object): + """ + Represents a stringprep'd Jabber ID. + + JID objects are hashable so they can be used in sets and as keys in + dictionaries. + """ + + def __init__(self, str=None, tuple=None): + if not (str or tuple): + raise RuntimeError("You must provide a value for either 'str' or " + "'tuple' arguments.") + + if str: + user, host, res = parse(str) + else: + user, host, res = prep(*tuple) + + self.user = user + self.host = host + self.resource = res + + def userhost(self): + """ + Extract the bare JID as a unicode string. + + A bare JID does not have a resource part, so this returns either + C{user@host} or just C{host}. + + @rtype: L{unicode} + """ + if self.user: + return u"%s@%s" % (self.user, self.host) + else: + return self.host + + def userhostJID(self): + """ + Extract the bare JID. + + A bare JID does not have a resource part, so this returns a + L{JID} object representing either C{user@host} or just C{host}. + + If the object this method is called upon doesn't have a resource + set, it will return itself. Otherwise, the bare JID object will + be created, interned using L{internJID}. + + @rtype: L{JID} + """ + if self.resource: + return internJID(self.userhost()) + else: + return self + + def full(self): + """ + Return the string representation of this JID. + + @rtype: L{unicode} + """ + if self.user: + if self.resource: + return u"%s@%s/%s" % (self.user, self.host, self.resource) + else: + return u"%s@%s" % (self.user, self.host) + else: + if self.resource: + return u"%s/%s" % (self.host, self.resource) + else: + return self.host + + def __eq__(self, other): + """ + Equality comparison. + + L{JID}s compare equal if their user, host and resource parts all + compare equal. When comparing against instances of other types, it + uses the default comparison. + """ + if isinstance(other, JID): + return (self.user == other.user and + self.host == other.host and + self.resource == other.resource) + else: + return NotImplemented + + def __ne__(self, other): + """ + Inequality comparison. + + This negates L{__eq__} for comparison with JIDs and uses the default + comparison for other types. + """ + result = self.__eq__(other) + if result is NotImplemented: + return result + else: + return not result + + def __hash__(self): + """ + Calculate hash. + + L{JID}s with identical constituent user, host and resource parts have + equal hash values. In combination with the comparison defined on JIDs, + this allows for using L{JID}s in sets and as dictionary keys. + """ + return hash((self.user, self.host, self.resource)) + + def __unicode__(self): + """ + Get unicode representation. + + Return the string representation of this JID as a unicode string. + @see: L{full} + """ + + return self.full() + + if _PY3: + __str__ = __unicode__ + + def __repr__(self): + """ + Get object representation. + + Returns a string that would create a new JID object that compares equal + to this one. + """ + return 'JID(%r)' % self.full() |