1 # Copyright (C) 2006, 2007, 2009, 2011 Nominum, Inc.
3 # Permission to use, copy, modify, and distribute this software and its
4 # documentation for any purpose with or without fee is hereby granted,
5 # provided that the above copyright notice and this permission notice
6 # appear in all copies.
8 # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES
9 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR
11 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
14 # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 @var public_enum_domain: The DNS public ENUM domain, e164.arpa.
19 @type public_enum_domain: dns.name.Name object
26 public_enum_domain
= dns
.name
.from_text('e164.arpa.')
28 def from_e164(text
, origin
=public_enum_domain
):
29 """Convert an E.164 number in textual form into a Name object whose
30 value is the ENUM domain name for that number.
31 @param text: an E.164 number in textual form.
33 @param origin: The domain in which the number should be constructed.
34 The default is e164.arpa.
35 @type: dns.name.Name object or None
36 @rtype: dns.name.Name object
38 parts
= [d
for d
in text
if d
.isdigit()]
40 return dns
.name
.from_text('.'.join(parts
), origin
=origin
)
42 def to_e164(name
, origin
=public_enum_domain
, want_plus_prefix
=True):
43 """Convert an ENUM domain name into an E.164 number.
44 @param name: the ENUM domain name.
45 @type name: dns.name.Name object.
46 @param origin: A domain containing the ENUM domain name. The
47 name is relativized to this domain before being converted to text.
48 @type: dns.name.Name object or None
49 @param want_plus_prefix: if True, add a '+' to the beginning of the
53 if not origin
is None:
54 name
= name
.relativize(origin
)
55 dlabels
= [d
for d
in name
.labels
if (d
.isdigit() and len(d
) == 1)]
56 if len(dlabels
) != len(name
.labels
):
57 raise dns
.exception
.SyntaxError('non-digit labels in ENUM domain name')
59 text
= ''.join(dlabels
)
64 def query(number
, domains
, resolver
=None):
65 """Look for NAPTR RRs for the specified number in the specified domains.
67 e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.'])
70 resolver
= dns
.resolver
.get_default_resolver()
71 for domain
in domains
:
72 if isinstance(domain
, (str, unicode)):
73 domain
= dns
.name
.from_text(domain
)
74 qname
= dns
.e164
.from_e164(number
, domain
)
76 return resolver
.query(qname
, 'NAPTR')
77 except dns
.resolver
.NXDOMAIN
:
79 raise dns
.resolver
.NXDOMAIN