# No `secret` provided, defaults to `None`
>>> Authenticator().one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'NoneType' object has no attribute 'replace'
# No padding (only ascii strings that are multiples of 8 length work)
# The next 8 calls all have the same `binascii.Error` (removed for brevity)
>>> Authenticator('a').one_time_password()
>>> Authenticator('ab').one_time_password()
>>> Authenticator('abc').one_time_password()
>>> Authenticator('abcd').one_time_password()
>>> Authenticator('abcde').one_time_password()
>>> Authenticator('abcd e').one_time_password()
>>> Authenticator('abcd ef').one_time_password()
>>> Authenticator('abcd efg').one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 71, in one_time_password
File "<input>", line 43, in decode_with_base32
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 205, in b32decode
raise binascii.Error('Incorrect padding')
binascii.Error: Incorrect padding
# Ascii string with a length of 8
>>> Authenticator('abcd efgh').one_time_password()
455904
>>> Authenticator('abcd efgh ijkl').one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 71, in one_time_password
File "<input>", line 43, in decode_with_base32
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 205, in b32decode
raise binascii.Error('Incorrect padding')
binascii.Error: Incorrect padding
# Ascii string with a length of 16
>>> Authenticator('abcd efgh ijkl mnop').one_time_password()
823746
# Unicode secret
>>> Authenticator('ĀƯŤĤËŊŦĩÇÁƮŏƦ').one_time_password()
Traceback (most recent call last):
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 37, in _bytes_from_decode_data
return s.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 71, in one_time_password
File "<input>", line 43, in decode_with_base32
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 203, in b32decode
s = _bytes_from_decode_data(s)
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 39, in _bytes_from_decode_data
raise ValueError('string argument should contain only ASCII characters')
ValueError: string argument should contain only ASCII characters
# Other types of whitespace aren't being removed
>>> Authenticator('\t\t\t\t \t\t\t\t').one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 71, in one_time_password
File "<input>", line 43, in decode_with_base32
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 231, in b32decode
raise binascii.Error('Non-base32 digit found') from None
binascii.Error: Non-base32 digit found
>>> Authenticator('\r\r\r\r \r\r\r\r').one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 71, in one_time_password
File "<input>", line 43, in decode_with_base32
File "/home/lettuce/.pyenv/versions/3.6.3/lib/python3.6/base64.py", line 231, in b32decode
raise binascii.Error('Non-base32 digit found') from None
binascii.Error: Non-base32 digit found
# Non-string secret
>>> Authenticator(lambda: None).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'function' object has no attribute 'replace'
>>> Authenticator(123456).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'int' object has no attribute 'replace'
>>> Authenticator(123456.789).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'float' object has no attribute 'replace'
>>> Authenticator([]).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'list' object has no attribute 'replace'
>>> Authenticator(set()).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'set' object has no attribute 'replace'
>>> Authenticator(tuple()).one_time_password()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 69, in one_time_password
File "<input>", line 32, in remove_spaces
AttributeError: 'tuple' object has no attribute 'replace'