Anonymous authentication

Implemented ANONYMOUS authentication on the ClientXMPP class.
To use it, you just need to provide a domain (e.g 'anon.example.com')
with an optional resource (e.g 'anon.example.com/resource') as the JID,
with no password. The JID class has been improved to accept
domains as fulljid.

You can test this with echo_client.py
python echo_client.py -j anon.louiz.org/  # anonymous with a resource
                                          # defined by the server
python echo_client.py -j anon.louiz.org/resource  # anonymous with given
                                                  # resource

The "normal" authentication method still works exactly like before.
This commit is contained in:
Florent Le Coz 2010-10-17 02:26:06 +08:00 committed by Lance Stout
parent 4eb4d729ee
commit 2d18d905a5
2 changed files with 11 additions and 1 deletions

View file

@ -304,7 +304,7 @@ class ClientXMPP(BaseXMPP):
if sasl_mechs: if sasl_mechs:
for sasl_mech in sasl_mechs: for sasl_mech in sasl_mechs:
self.features.append("sasl:%s" % sasl_mech.text) self.features.append("sasl:%s" % sasl_mech.text)
if 'sasl:PLAIN' in self.features: if 'sasl:PLAIN' in self.features and self.boundjid.user:
if sys.version_info < (3, 0): if sys.version_info < (3, 0):
user = bytes(self.username) user = bytes(self.username)
password = bytes(self.password) password = bytes(self.password)
@ -318,6 +318,8 @@ class ClientXMPP(BaseXMPP):
self.send("<auth xmlns='%s' mechanism='PLAIN'>%s</auth>" % ( self.send("<auth xmlns='%s' mechanism='PLAIN'>%s</auth>" % (
sasl_ns, sasl_ns,
auth)) auth))
elif 'sasl:ANONYMOUS' in self.features and not self.boundjid.user:
self.send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS' />")
else: else:
logging.error("No appropriate login method.") logging.error("No appropriate login method.")
self.disconnect() self.disconnect()

View file

@ -94,6 +94,14 @@ class JID(object):
elif name in ('server', 'domain', 'host'): elif name in ('server', 'domain', 'host'):
self.domain = value self.domain = value
elif name in ('full', 'jid'): elif name in ('full', 'jid'):
if '@' not in value:
if '/' in value:
d, r = value.split('/', 1)
object.__setattr__(self, "_resource", r)
else:
d = value
object.__setattr__(self, "_domain", d)
else:
self.reset(value) self.reset(value)
elif name == 'bare': elif name == 'bare':
if '@' in value: if '@' in value: