1
# -*- test-case-name: twisted.words.test.test_jabberjid -*-
3
# Copyright (c) 2001-2005 Twisted Matrix Laboratories.
4
# See LICENSE for details.
6
from twisted.internet import reactor, protocol, defer
7
from twisted.words.xish import domish, utility
8
from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep, resourceprep, nameprep
11
class InvalidFormat(Exception):
19
# Search for delimiters
20
user_sep = jidstring.find("@")
21
res_sep = jidstring.find("/")
29
server = jidstring[0:res_sep]
30
resource = jidstring[res_sep + 1:] or None
34
user = jidstring[0:user_sep] or None
35
server = jidstring[user_sep + 1:]
37
if user_sep < res_sep:
39
user = jidstring[0:user_sep] or None
40
server = jidstring[user_sep + 1:user_sep + (res_sep - user_sep)]
41
resource = jidstring[res_sep + 1:] or None
43
# server/resource (with an @ in resource)
44
server = jidstring[0:res_sep]
45
resource = jidstring[res_sep + 1:] or None
47
return prep(user, server, resource)
49
def prep(user, server, resource):
50
""" Perform stringprep on all JID fragments """
54
user = nodeprep.prepare(unicode(user))
56
raise InvalidFormat, "Invalid character in username"
61
raise InvalidFormat, "Server address required."
64
server = nameprep.prepare(unicode(server))
66
raise InvalidFormat, "Invalid character in hostname"
70
resource = resourceprep.prepare(unicode(resource))
72
raise InvalidFormat, "Invalid character in resource"
76
return (user, server, resource)
81
""" Return interned JID.
83
Assumes C{str} is stringprep'd.
86
if str in __internJIDs:
87
return __internJIDs[str]
94
""" Represents a stringprep'd Jabber ID.
96
Note that it is assumed that the attributes C{host}, C{user} and
97
C{resource}, when set individually, have been properly stringprep'd.
100
def __init__(self, str = None, tuple = None):
101
assert (str or tuple)
104
user, host, res = parse(str)
106
user, host, res = prep(*tuple)
114
return "%s@%s" % (self.user, self.host)
118
def userhostJID(self):
120
if "_uhjid" not in self.__dict__:
121
self._uhjid = internJID(self.userhost())
129
return "%s@%s/%s" % (self.user, self.host, self.resource)
131
return "%s@%s" % (self.user, self.host)
134
return "%s/%s" % (self.host, self.resource)
138
def __eq__(self, other):
139
return (self.user == other.user and
140
self.host == other.host and
141
self.resource == other.resource)
143
def __ne__(self, other):
144
return not (self.user == other.user and
145
self.host == other.host and
146
self.resource == other.resource)