monero-ecosystem / monero-python

A comprehensive Python module for handling Monero cryptocurrency
BSD 3-Clause "New" or "Revised" License
245 stars 79 forks source link

TypeError: 'str' object does not support item assignment #27

Closed rooterkyberian closed 6 years ago

rooterkyberian commented 6 years ago

Steps to reproduce:

  1. run monero.address.Address('41tjz19p4qc2gudqnwsdrhgcgxud8bgxy84ufe869nyw7ywbxw9s9gqbix7piu9d7qjvbjtrdnbubhcf663ydq3bsxj1brL')

Expected: ValueError Got: TypeError

The problem seems to be that monero.base58.decode_block returns strings for errors instead of raising ValueErrors.

In [1]: import monero.address

In [2]: monero.address.Address('41tjz19p4qc2gudqnwsdrhgcgxud8bgxy84ufe869nyw7ywbxw9s9gqbix7piu
   ...: 9d7qjvbjtrdnbubhcf663ydq3bsxj1brL')

TypeError                                 Traceback (most recent call last)
<ipython-input-5-8987b1372f1f> in <module>()
----> 1 monero.address.Address('41tjz19p4qc2gudqnwsdrhgcgxud8bgxy84ufe869nyw7ywbxw9s9gqbix7piu9d7qjvbjtrdnbubhcf663ydq3bsxj1brL')

venv/lib/python3.6/site-packages/monero/address.py in __init__(self, addr, label)
     28             raise ValueError("Address must be 95 characters long base58-encoded string, "
     29                 "is {addr} ({len} chars length)".format(addr=addr, len=len(addr)))
---> 30         self._decode(addr)
     31         self.label = label or self.label
     32 
venv/lib/python3.6/site-packages/monero/address.py in _decode(self, address)
     32 
     33     def _decode(self, address):
---> 34         self._decoded = bytearray(unhexlify(base58.decode(address)))
     35         checksum = self._decoded[-4:]
     36         if checksum != keccak_256(self._decoded[:-4]).digest()[:4]:

venv/lib/python3.6/site-packages/monero/base58.py in decode(enc)
    161     data = [0] * data_size
    162     for i in range(full_block_count):
--> 163         data = decode_block(enc[(i*__fullEncodedBlockSize):(i*__fullEncodedBlockSize+__fullEncodedBlockSize)], data, i * __fullBlockSize)
    164 
    165     if last_block_size > 0:

venv/lib/python3.6/site-packages/monero/base58.py in decode_block(data, buf, index)
    138     tmp_buf = _uint64_to_8be(res_num, res_size)
    139     for i in range(len(tmp_buf)):
--> 140         buf[i+index] = tmp_buf[i]
    141 
    142     return buf

TypeError: 'str' object does not support item assignment
emesik commented 6 years ago

That commit fixes this particular bug but proper test coverage for base58.py possible errors is still needed.

rooterkyberian commented 6 years ago

thanks for quick fix!