Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Runnable with both Python3 and Python2, with PyQt4 #2249

Open
wants to merge 60 commits into
base: v0.6
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
72ba0b6
make runnable with OpenSSL 3 in addition to other versions
kashikoibumi May 20, 2024
f181b85
replace all of arg() occurrences to format()
kashikoibumi May 22, 2024
046a29e
stop using QString
kashikoibumi May 23, 2024
f70aff6
use import paths compatible with both Python2 and Python3
kashikoibumi May 24, 2024
f37a973
use six.PY2 and six.PY3
kashikoibumi May 25, 2024
46d56c7
use six.itervalues(), six.iteritems()
kashikoibumi May 25, 2024
21a7bdb
use six.int2byte(), six.byte2int, six.BytesIO
kashikoibumi May 25, 2024
81a6bdb
use six.assertRaisesRegex, six.assertRegex, six.assertNotRegex
kashikoibumi May 25, 2024
a11df0c
use six.moves
kashikoibumi May 26, 2024
4ee9986
Merge branch 'six' into py3
kashikoibumi May 26, 2024
d4bb580
fix importing collections for Python3
kashikoibumi May 26, 2024
e0c2976
Merge branch 'six' into py3
kashikoibumi May 26, 2024
ba49d32
use binary literals for compatibility to Python3
kashikoibumi May 26, 2024
4309cb3
use buffer() in Python2 and use memoryview in Python3
kashikoibumi May 26, 2024
a4c4338
use bytes() on keys to be hashable in Python3
kashikoibumi May 26, 2024
5ccfd52
Merge branch 'bytes-key' into py3
kashikoibumi May 26, 2024
0f858bc
read from and write to SQLite database in binary mode
kashikoibumi May 26, 2024
d38f425
fix address validator to work
kashikoibumi May 26, 2024
96c764b
refined: read from and write to SQLite database in binary mode
kashikoibumi May 27, 2024
2a0d2d3
update translation files for using format() instead of arg()
kashikoibumi May 26, 2024
9c64db0
remove restriction for Python3 and add startup script for Python3
kashikoibumi May 27, 2024
b9bfa51
fix import path compatible with both Python2 and Python3
kashikoibumi May 27, 2024
5fa08f4
misc fixes to run with Python3
kashikoibumi May 27, 2024
6ec9fb1
Merge branch 'binary' into py3
kashikoibumi May 27, 2024
df2631c
misc fixes to run with Python3; part 2
kashikoibumi May 28, 2024
0fa71f2
Merge branch 'openssl3' into py3
kashikoibumi May 28, 2024
10e5563
misc fixes to run with Python3; part 3
kashikoibumi May 28, 2024
c3d083d
Merge branch 'memoryview' into py3
kashikoibumi May 28, 2024
822b90e
fix to connect with TLS in Python3
kashikoibumi May 28, 2024
e5c0654
fix types
kashikoibumi May 29, 2024
c39dd18
fix one of database compatibility problems; others remained
kashikoibumi May 29, 2024
d9efe1c
fix for newer versions of Python3
kashikoibumi May 30, 2024
d676ea3
quick workaround for BLOB as TEXT problem (#2247)
kashikoibumi May 30, 2024
35abdf2
Merge branch 'v0.6' into py3
kashikoibumi May 30, 2024
01296a8
Merge branch 'strict-blob' into py3
kashikoibumi May 30, 2024
0795359
fix careless mistakes
kashikoibumi May 30, 2024
31dcbd6
add script to revert BLOB-keys into TEXT-keys
kashikoibumi May 30, 2024
0ff6b43
fix imports
kashikoibumi May 30, 2024
0739f53
Merge branch 'strict-blob' into py3
kashikoibumi May 30, 2024
f07af4e
fix TLS configuration bug
kashikoibumi May 30, 2024
e166116
disable UPnP in Python3 temporally
kashikoibumi May 30, 2024
a6e980d
use hexlify() to display hash ID
kashikoibumi May 30, 2024
a1d633d
workaround to invalid tag type
kashikoibumi May 30, 2024
08650d5
fix unexpected label string
kashikoibumi May 30, 2024
5af72b0
fix user agent format on debug log
kashikoibumi May 30, 2024
5973725
fix to pass tests
kashikoibumi May 31, 2024
ba8ccfc
fix bug on dandelion specific with Python3
kashikoibumi May 31, 2024
f9d2364
fix bug in chunked database access
kashikoibumi May 31, 2024
f8919a8
fix bug in responsibility of message list on Qt GUI
kashikoibumi May 31, 2024
9adcd1b
fix SOCKS
kashikoibumi May 31, 2024
d103297
fix UPnP to work with Python3
kashikoibumi Jun 1, 2024
0c110b9
fix to be runnable with prctl module in Python3
kashikoibumi Jun 3, 2024
11ba022
fix bug in detecting file system type
kashikoibumi Jun 22, 2024
cdcffa4
fix timestamp type mismatch bug
kashikoibumi Jun 24, 2024
e7b5f29
use SafeConfigParser or ConfigParser, which is available
kashikoibumi Jun 24, 2024
8bfcc4c
add comments
kashikoibumi Jun 25, 2024
da58e00
Merge branch 'v0.6' into py3
kashikoibumi Jun 30, 2024
c194943
Merge branch 'v0.6' into py3
kashikoibumi Aug 2, 2024
37bbe44
fix bug in generating deterministic address
kashikoibumi Aug 2, 2024
54cf229
Merge branch 'v0.6' into py3
kashikoibumi Sep 1, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/collectd/pybitmessagestatus.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import collectd
import json
import xmlrpclib
from six.moves import xmlrpc_client as xmlrpclib

pybmurl = ""
api = ""
Expand Down
3 changes: 3 additions & 0 deletions py3start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

python3 pybitmessage/bitmessagemain.py "$@"
3 changes: 3 additions & 0 deletions revert_blob_to_text.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

python3 pybitmessage/revert_blob_to_text.py "$@"
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import platform
import shutil
import sys
import six

from importlib import import_module
from setuptools import setup, Extension
Expand Down Expand Up @@ -83,7 +84,7 @@ def run(self):
'images/kivy/text_images*.png'
]}

if sys.version_info[0] == 3:
if six.PY3:
packages.extend(
[
'pybitmessage.bitmessagekivy',
Expand Down
24 changes: 12 additions & 12 deletions src/addresses.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ def decodeAddress(address):
integer = decodeBase58(address)
if integer == 0:
status = 'invalidcharacters'
return status, 0, 0, ''
return status, 0, 0, b''
# after converting to hex, the string will be prepended
# with a 0x and appended with a L in python2
hexdata = hex(integer)[2:].rstrip('L')
Expand All @@ -200,31 +200,31 @@ def decodeAddress(address):

if checksum != double_sha512(data[:-4])[0:4]:
status = 'checksumfailed'
return status, 0, 0, ''
return status, 0, 0, b''

try:
addressVersionNumber, bytesUsedByVersionNumber = decodeVarint(data[:9])
except varintDecodeError as e:
logger.error(str(e))
status = 'varintmalformed'
return status, 0, 0, ''
return status, 0, 0, b''

if addressVersionNumber > 4:
logger.error('cannot decode address version numbers this high')
status = 'versiontoohigh'
return status, 0, 0, ''
return status, 0, 0, b''
elif addressVersionNumber == 0:
logger.error('cannot decode address version numbers of zero.')
status = 'versiontoohigh'
return status, 0, 0, ''
return status, 0, 0, b''

try:
streamNumber, bytesUsedByStreamNumber = \
decodeVarint(data[bytesUsedByVersionNumber:])
except varintDecodeError as e:
logger.error(str(e))
status = 'varintmalformed'
return status, 0, 0, ''
return status, 0, 0, b''

status = 'success'
if addressVersionNumber == 1:
Expand All @@ -242,21 +242,21 @@ def decodeAddress(address):
return status, addressVersionNumber, streamNumber, \
b'\x00\x00' + embeddedRipeData
elif len(embeddedRipeData) < 18:
return 'ripetooshort', 0, 0, ''
return 'ripetooshort', 0, 0, b''
elif len(embeddedRipeData) > 20:
return 'ripetoolong', 0, 0, ''
return 'otherproblem', 0, 0, ''
return 'ripetoolong', 0, 0, b''
return 'otherproblem', 0, 0, b''
elif addressVersionNumber == 4:
embeddedRipeData = \
data[bytesUsedByVersionNumber + bytesUsedByStreamNumber:-4]
if embeddedRipeData[0:1] == b'\x00':
# In order to enforce address non-malleability, encoded
# RIPE data must have NULL bytes removed from the front
return 'encodingproblem', 0, 0, ''
return 'encodingproblem', 0, 0, b''
elif len(embeddedRipeData) > 20:
return 'ripetoolong', 0, 0, ''
return 'ripetoolong', 0, 0, b''
elif len(embeddedRipeData) < 4:
return 'ripetooshort', 0, 0, ''
return 'ripetooshort', 0, 0, b''
x00string = b'\x00' * (20 - len(embeddedRipeData))
return status, addressVersionNumber, streamNumber, \
x00string + embeddedRipeData
Expand Down
109 changes: 79 additions & 30 deletions src/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,12 @@
import time
from binascii import hexlify, unhexlify
from struct import pack, unpack
import sqlite3

import six
from six.moves import configparser, http_client, xmlrpc_server
from six.moves.reprlib import repr
from dbcompat import dbstr

import helper_inbox
import helper_sent
Expand Down Expand Up @@ -531,12 +534,12 @@ def _dump_inbox_message( # pylint: disable=too-many-arguments
message = shared.fixPotentiallyInvalidUTF8Data(message)
return {
'msgid': hexlify(msgid),
'toAddress': toAddress,
'fromAddress': fromAddress,
'toAddress': toAddress.decode("utf-8", "replace"),
'fromAddress': fromAddress.decode("utf-8", "replace"),
'subject': base64.b64encode(subject),
'message': base64.b64encode(message),
'encodingType': encodingtype,
'receivedTime': received,
'receivedTime': received.decode("utf-8", "replace"),
'read': read
}

Expand Down Expand Up @@ -598,11 +601,12 @@ def HandleListAddressBookEntries(self, label=None):
"""
queryreturn = sqlQuery(
"SELECT label, address from addressbook WHERE label = ?",
label
dbstr(label)
) if label else sqlQuery("SELECT label, address from addressbook")
data = []
for label, address in queryreturn:
label = shared.fixPotentiallyInvalidUTF8Data(label)
address = address.decode("utf-8", "replace")
data.append({
'label': base64.b64encode(label),
'address': address
Expand All @@ -618,12 +622,12 @@ def HandleAddAddressBookEntry(self, address, label):
self._verifyAddress(address)
# TODO: add unique together constraint in the table
queryreturn = sqlQuery(
"SELECT address FROM addressbook WHERE address=?", address)
"SELECT address FROM addressbook WHERE address=?", dbstr(address))
if queryreturn != []:
raise APIError(
16, 'You already have this address in your address book.')

sqlExecute("INSERT INTO addressbook VALUES(?,?)", label, address)
sqlExecute("INSERT INTO addressbook VALUES(?,?)", dbstr(label), dbstr(address))
queues.UISignalQueue.put(('rerenderMessagelistFromLabels', ''))
queues.UISignalQueue.put(('rerenderMessagelistToLabels', ''))
queues.UISignalQueue.put(('rerenderAddressBook', ''))
Expand All @@ -635,7 +639,7 @@ def HandleDeleteAddressBookEntry(self, address):
"""Delete an entry from address book."""
address = addBMIfNotPresent(address)
self._verifyAddress(address)
sqlExecute('DELETE FROM addressbook WHERE address=?', address)
sqlExecute('DELETE FROM addressbook WHERE address=?', dbstr(address))
queues.UISignalQueue.put(('rerenderMessagelistFromLabels', ''))
queues.UISignalQueue.put(('rerenderMessagelistToLabels', ''))
queues.UISignalQueue.put(('rerenderAddressBook', ''))
Expand Down Expand Up @@ -919,6 +923,7 @@ def HandleGetAllInboxMessages(self):
" ORDER BY received"
)
return {"inboxMessages": [

self._dump_inbox_message(*data) for data in queryreturn
]}

Expand Down Expand Up @@ -953,20 +958,32 @@ def HandleGetInboxMessageById(self, hid, readStatus=None):
23, 'Bool expected in readStatus, saw %s instead.'
% type(readStatus))
queryreturn = sqlQuery(
"SELECT read FROM inbox WHERE msgid=?", msgid)
"SELECT read FROM inbox WHERE msgid=?", sqlite3.Binary(msgid))
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT read FROM inbox WHERE msgid=CAST(? AS TEXT)", msgid)
# UPDATE is slow, only update if status is different
try:
if (queryreturn[0][0] == 1) != readStatus:
sqlExecute(
rowcount = sqlExecute(
"UPDATE inbox set read = ? WHERE msgid=?",
readStatus, msgid)
readStatus, sqlite3.Binary(msgid))
if rowcount < 1:
rowcount = sqlExecute(
"UPDATE inbox set read = ? WHERE msgid=CAST(? AS TEXT)",
readStatus, msgid)
queues.UISignalQueue.put(('changedInboxUnread', None))
except IndexError:
pass
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, received, message,"
" encodingtype, read FROM inbox WHERE msgid=?", msgid
" encodingtype, read FROM inbox WHERE msgid=?", sqlite3.Binary(msgid)
)
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, received, message,"
" encodingtype, read FROM inbox WHERE msgid=CAST(? AS TEXT)", msgid
)
try:
return {"inboxMessage": [
self._dump_inbox_message(*queryreturn[0])]}
Expand Down Expand Up @@ -1018,7 +1035,7 @@ def HandleInboxMessagesByReceiver(self, toAddress):
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, received,"
" message, encodingtype, read FROM inbox WHERE folder='inbox'"
" AND toAddress=?", toAddress)
" AND toAddress=?", dbstr(toAddress))
return {"inboxMessages": [
self._dump_inbox_message(*data) for data in queryreturn
]}
Expand All @@ -1035,8 +1052,14 @@ def HandleGetSentMessageById(self, hid):
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
" message, encodingtype, status, ackdata FROM sent WHERE msgid=?",
msgid
sqlite3.Binary(msgid)
)
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
" message, encodingtype, status, ackdata FROM sent WHERE msgid=CAST(? AS TEXT)",
msgid
)
try:
return {"sentMessage": [
self._dump_sent_message(*queryreturn[0])
Expand All @@ -1055,7 +1078,7 @@ def HandleGetSentMessagesByAddress(self, fromAddress):
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
" message, encodingtype, status, ackdata FROM sent"
" WHERE folder='sent' AND fromAddress=? ORDER BY lastactiontime",
fromAddress
dbstr(fromAddress)
)
return {"sentMessages": [
self._dump_sent_message(*data) for data in queryreturn
Expand All @@ -1072,8 +1095,14 @@ def HandleGetSentMessagesByAckData(self, ackData):
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
" message, encodingtype, status, ackdata FROM sent"
" WHERE ackdata=?", ackData
" WHERE ackdata=?", sqlite3.Binary(ackData)
)
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
" message, encodingtype, status, ackdata FROM sent"
" WHERE ackdata=CAST(? AS TEXT)", ackData
)

try:
return {"sentMessage": [
Expand All @@ -1093,7 +1122,9 @@ def HandleTrashMessage(self, msgid):
# Trash if in inbox table
helper_inbox.trash(msgid)
# Trash if in sent table
sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=?", msgid)
rowcount = sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=?", sqlite3.Binary(msgid))
if rowcount < 1:
sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=CAST(? AS TEXT)", msgid)
return 'Trashed message (assuming message existed).'

@command('trashInboxMessage')
Expand All @@ -1107,7 +1138,9 @@ def HandleTrashInboxMessage(self, msgid):
def HandleTrashSentMessage(self, msgid):
"""Trash sent message by msgid (encoded in hex)."""
msgid = self._decode(msgid, "hex")
sqlExecute('''UPDATE sent SET folder='trash' WHERE msgid=?''', msgid)
rowcount = sqlExecute('''UPDATE sent SET folder='trash' WHERE msgid=?''', sqlite3.Binary(msgid))
if rowcount < 1:
sqlExecute('''UPDATE sent SET folder='trash' WHERE msgid=CAST(? AS TEXT)''', msgid)
return 'Trashed sent message (assuming message existed).'

@command('sendMessage')
Expand Down Expand Up @@ -1150,9 +1183,9 @@ def HandleSendMessage(

toLabel = ''
queryreturn = sqlQuery(
"SELECT label FROM addressbook WHERE address=?", toAddress)
"SELECT label FROM addressbook WHERE address=?", dbstr(toAddress))
try:
toLabel = queryreturn[0][0]
toLabel = queryreturn[0][0].decode("utf-8", "replace")
except IndexError:
pass

Expand Down Expand Up @@ -1217,9 +1250,12 @@ def HandleGetStatus(self, ackdata):
raise APIError(15, 'Invalid ackData object size.')
ackdata = self._decode(ackdata, "hex")
queryreturn = sqlQuery(
"SELECT status FROM sent where ackdata=?", ackdata)
"SELECT status FROM sent where ackdata=?", sqlite3.Binary(ackdata))
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT status FROM sent where ackdata=CAST(? AS TEXT)", ackdata)
try:
return queryreturn[0][0]
return queryreturn[0][0].decode("utf-8", "replace")
except IndexError:
return 'notfound'

Expand All @@ -1238,11 +1274,11 @@ def HandleAddSubscription(self, address, label=''):
# First we must check to see if the address is already in the
# subscriptions list.
queryreturn = sqlQuery(
"SELECT * FROM subscriptions WHERE address=?", address)
"SELECT * FROM subscriptions WHERE address=?", dbstr(address))
if queryreturn:
raise APIError(16, 'You are already subscribed to that address.')
sqlExecute(
"INSERT INTO subscriptions VALUES (?,?,?)", label, address, True)
"INSERT INTO subscriptions VALUES (?,?,?)", dbstr(label), dbstr(address), True)
shared.reloadBroadcastSendersForWhichImWatching()
queues.UISignalQueue.put(('rerenderMessagelistFromLabels', ''))
queues.UISignalQueue.put(('rerenderSubscriptions', ''))
Expand All @@ -1256,7 +1292,7 @@ def HandleDeleteSubscription(self, address):
"""

address = addBMIfNotPresent(address)
sqlExecute("DELETE FROM subscriptions WHERE address=?", address)
sqlExecute("DELETE FROM subscriptions WHERE address=?", dbstr(address))
shared.reloadBroadcastSendersForWhichImWatching()
queues.UISignalQueue.put(('rerenderMessagelistFromLabels', ''))
queues.UISignalQueue.put(('rerenderSubscriptions', ''))
Expand All @@ -1274,6 +1310,7 @@ def ListSubscriptions(self):
data = []
for label, address, enabled in queryreturn:
label = shared.fixPotentiallyInvalidUTF8Data(label)
address = address.decode("utf-8", "replace")
data.append({
'label': base64.b64encode(label),
'address': address,
Expand Down Expand Up @@ -1354,7 +1391,9 @@ def HandleTrashSentMessageByAckDAta(self, ackdata):
"""Trash a sent message by ackdata (hex encoded)"""
# This API method should only be used when msgid is not available
ackdata = self._decode(ackdata, "hex")
sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", ackdata)
rowcount = sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", sqlite3.Binary(ackdata))
if rowcount < 1:
sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=CAST(? AS TEXT)", ackdata)
return 'Trashed sent message (assuming message existed).'

@command('disseminatePubkey')
Expand Down Expand Up @@ -1421,19 +1460,29 @@ def HandleGetMessageDataByDestinationHash(self, requestedHash):
# use it we'll need to fill out a field in our inventory database
# which is blank by default (first20bytesofencryptedmessage).
queryreturn = sqlQuery(
"SELECT hash, payload FROM inventory WHERE tag = ''"
" and objecttype = 2")
"SELECT hash, payload FROM inventory WHERE tag = ?"
" and objecttype = 2", sqlite3.Binary(b""))
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT hash, payload FROM inventory WHERE tag = CAST(? AS TEXT)"
" and objecttype = 2", b"")
with SqlBulkExecute() as sql:
for hash01, payload in queryreturn:
readPosition = 16 # Nonce length + time length
# Stream Number length
readPosition += decodeVarint(
payload[readPosition:readPosition + 10])[1]
t = (payload[readPosition:readPosition + 32], hash01)
sql.execute("UPDATE inventory SET tag=? WHERE hash=?", *t)
t = (sqlite3.Binary(payload[readPosition:readPosition + 32]), sqlite3.Binary(hash01))
_, rowcount = sql.execute("UPDATE inventory SET tag=? WHERE hash=?", *t)
if rowcount < 1:
t = (sqlite3.Binary(payload[readPosition:readPosition + 32]), hash01)
sql.execute("UPDATE inventory SET tag=? WHERE hash=CAST(? AS TEXT)", *t)

queryreturn = sqlQuery(
"SELECT payload FROM inventory WHERE tag = ?", requestedHash)
"SELECT payload FROM inventory WHERE tag = ?", sqlite3.Binary(requestedHash))
if len(queryreturn) < 1:
queryreturn = sqlQuery(
"SELECT payload FROM inventory WHERE tag = CAST(? AS TEXT)", requestedHash)
return {"receivedMessageDatas": [
{'data': hexlify(payload)} for payload, in queryreturn
]}
Expand Down
Loading