-# Copyright (C) 2006, 2007, 2009, 2011 Nominum, Inc.
+# Copyright (C) 2006-2017 Nominum, Inc.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose with or without fee is hereby granted,
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-"""DNS E.164 helpers
-
-@var public_enum_domain: The DNS public ENUM domain, e164.arpa.
-@type public_enum_domain: dns.name.Name object
-"""
-
+"""DNS E.164 helpers."""
import dns.exception
import dns.name
import dns.resolver
-from ._compat import string_types
+from ._compat import string_types, maybe_decode
+#: The public E.164 domain.
public_enum_domain = dns.name.from_text('e164.arpa.')
def from_e164(text, origin=public_enum_domain):
"""Convert an E.164 number in textual form into a Name object whose
value is the ENUM domain name for that number.
- @param text: an E.164 number in textual form.
- @type text: str
- @param origin: The domain in which the number should be constructed.
- The default is e164.arpa.
- @type origin: dns.name.Name object or None
- @rtype: dns.name.Name object
+
+ *text*, a ``text``, is an E.164 number in textual form.
+
+ *origin*, a ``dns.name.Name``, the domain in which the number
+ should be constructed. The default is ``e164.arpa.``.
+
+ Returns a ``dns.name.Name``.
"""
+
parts = [d for d in text if d.isdigit()]
parts.reverse()
return dns.name.from_text('.'.join(parts), origin=origin)
def to_e164(name, origin=public_enum_domain, want_plus_prefix=True):
"""Convert an ENUM domain name into an E.164 number.
- @param name: the ENUM domain name.
- @type name: dns.name.Name object.
- @param origin: A domain containing the ENUM domain name. The
- name is relativized to this domain before being converted to text.
- @type origin: dns.name.Name object or None
- @param want_plus_prefix: if True, add a '+' to the beginning of the
- returned number.
- @rtype: str
+
+ *name* is a ``dns.name.Name``, the ENUM domain name.
+
+ *origin* is a ``dns.anme.Name``, a domain containing the ENUM
+ domain name. The name is relativized to this domain before being
+ converted to text. If ``None``, no relativization is done.
+
+ *want_plus_prefix* is a ``bool``. If True, add a '+' to the beginning of
+ the returned number.
+
+ Returns a ``text``.
"""
if origin is not None:
name = name.relativize(origin)
text = b''.join(dlabels)
if want_plus_prefix:
text = b'+' + text
- return text
+ return maybe_decode(text)
def query(number, domains, resolver=None):
"""Look for NAPTR RRs for the specified number in the specified domains.
e.g. lookup('16505551212', ['e164.dnspython.org.', 'e164.arpa.'])
+
+ *number*, a ``text`` is the number to look for.
+
+ *domains* is an iterable containing ``dns.name.Name`` values.
+
+ *resolver*, a ``dns.resolver.Resolver``, is the resolver to use. If
+ ``None``, the default resolver is used.
"""
+
if resolver is None:
resolver = dns.resolver.get_default_resolver()
e_nx = dns.resolver.NXDOMAIN()