Skip to content
This repository has been archived by the owner on Dec 15, 2021. It is now read-only.

Commit

Permalink
Fixes for Unicode domain names
Browse files Browse the repository at this point in the history
1. Properly encode host via IDNA (each label separately)
2. Expect unicode host names in server response and propely
   convert those to JIDs
3. Do not force 'us-ascii' when generating DIGEST-MD5 digest_uri
  • Loading branch information
Jajcus committed May 8, 2011
1 parent c9e88b9 commit d00f128
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 11 deletions.
7 changes: 4 additions & 3 deletions pyxmpp/resolver.py
Expand Up @@ -31,7 +31,6 @@
import dns.name
import dns.exception
import random
from encodings import idna
import logging

from .exceptions import DNSError, UnexpectedCNAMEError
Expand Down Expand Up @@ -136,7 +135,8 @@ def resolve_srv(domain, service, proto="tcp"):
for a in service_aliases[service]:
names_to_try.append(u"_%s._%s.%s" % (a,proto,domain))
for name in names_to_try:
name = idna.ToASCII(name)
if isinstance(name, unicode):
name = name.encode("idna")
try:
r = dns.resolver.query(name, 'SRV')
except dns.exception.DNSException, err:
Expand Down Expand Up @@ -188,7 +188,8 @@ def getaddrinfo(host, port, family = None,
return [(AF_INET, socktype, proto, host, (host, port))]
if ipv6_re.match(host) and family in (AF_UNSPEC, AF_INET6):
return [(AF_INET6, socktype, proto, host, (host, port))]
host=idna.ToASCII(host)
if isinstance(host, unicode):
host = host.encode("idna")
rtypes = []
if family in (AF_UNSPEC, AF_INET6):
rtypes.append(("AAAA", AF_INET6))
Expand Down
4 changes: 2 additions & 2 deletions pyxmpp/sasl/digest_md5.py
Expand Up @@ -338,8 +338,8 @@ def _make_response(self,charset,realms,nonce):
params.append('qop=auth')

serv_type=self.password_manager.get_serv_type().encode("us-ascii")
host=self.password_manager.get_serv_host().encode("us-ascii")
serv_name=self.password_manager.get_serv_name().encode("us-ascii")
host=self.password_manager.get_serv_host().encode("idna")
serv_name=self.password_manager.get_serv_name().encode("utf-8")

if serv_name and serv_name != host:
digest_uri="%s/%s/%s" % (serv_type,host,serv_name)
Expand Down
12 changes: 6 additions & 6 deletions pyxmpp/streambase.py
Expand Up @@ -36,7 +36,7 @@

from pyxmpp import xmlextra
from pyxmpp.expdict import ExpiringDictionary
from pyxmpp.utils import to_utf8
from pyxmpp.utils import to_utf8, from_utf8
from pyxmpp.stanza import Stanza
from pyxmpp.error import StreamErrorNode
from pyxmpp.iq import Iq
Expand Down Expand Up @@ -184,7 +184,7 @@ def connect(self,addr,port,service=None,to=None):
def _connect(self, addr, port, service = None, to = None):
"""Same as `Stream.connect` but assume `self.lock` is acquired."""
if to is None:
to = str(addr)
to = from_utf8(addr)
allow_cname = True
if service is not None:
self.state_change("resolving srv", (addr, service))
Expand Down Expand Up @@ -239,7 +239,7 @@ def _connect(self, addr, port, service = None, to = None):

self.addr=addr
self.port=port
self._connect_socket(s,to)
self._connect_socket(s, to)
self.last_keepalive=time.time()

def accept(self,sock,myname):
Expand Down Expand Up @@ -354,9 +354,9 @@ def stream_start(self,doc):
to_from_mismatch=0
if self.initiator:
self.stream_id=r.prop("id")
peer=r.prop("from")
peer = from_utf8(r.prop("from"))
if peer:
peer=JID(peer)
peer = JID(peer)
if self.peer:
if peer and peer!=self.peer:
self.__logger.debug("peer hostname mismatch:"
Expand All @@ -365,7 +365,7 @@ def stream_start(self,doc):
else:
self.peer=peer
else:
to=r.prop("to")
to = from_utf8(r.prop("to"))
if to:
to=self.check_to(to)
if not to:
Expand Down

0 comments on commit d00f128

Please sign in to comment.