Open Table Of Contents

Source code for bridgedb.parse.nickname

# -*- coding: utf-8 -*-
#
# This file is part of BridgeDB, a Tor bridge distribution system.
#
# :authors: Isis Lovecruft 0xA3ADB67A2CDB8B35 <isis@torproject.org>
#           please also see AUTHORS file
# :copyright: (c) 2013-2015 Isis Lovecruft
#             (c) 2007-2015, The Tor Project, Inc.
#             (c) 2007-2015, all entities within the AUTHORS file
# :license: 3-clause BSD, see included LICENSE for information

"""Parsers for bridge nicknames.

.. py:module:: bridgedb.parse.nickname
   :synopsis: Parsers for Tor bridge nicknames.

bridgedb.parse.nicknames
========================
::

  nicknames
   |_ isValidRouterNickname - Determine if a nickname is according to spec
..
"""

import logging
import string


[docs]class InvalidRouterNickname(ValueError): """Router nickname doesn't follow tor-spec."""
[docs]def isValidRouterNickname(nickname): """Determine if a router's given nickname meets the specification. :param string nickname: An OR's nickname. :rtype: bool :returns: ``True`` if the nickname is valid, ``False`` otherwise. """ ALPHANUMERIC = string.letters + string.digits try: if not (1 <= len(nickname) <= 19): raise InvalidRouterNickname( "Nicknames must be between 1 and 19 characters: %r" % nickname) for letter in nickname: if not letter in ALPHANUMERIC: raise InvalidRouterNickname( "Nicknames must only use [A-Za-z0-9]: %r" % nickname) except InvalidRouterNickname as error: logging.error(str(error)) except TypeError: # The nickname was probably still set to ``None`` pass else: return True return False