Skip to content

Commit d676ea3

Browse files
committed
quick workaround for BLOB as TEXT problem (Bitmessage#2247)
1 parent a209d65 commit d676ea3

18 files changed

+320
-101
lines changed

src/api.py

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import time
6868
from binascii import hexlify, unhexlify
6969
from struct import pack, unpack
70+
import sqlite3
7071

7172
import six
7273
from six.moves import configparser, http_client, xmlrpc_server
@@ -953,20 +954,32 @@ def HandleGetInboxMessageById(self, hid, readStatus=None):
953954
23, 'Bool expected in readStatus, saw %s instead.'
954955
% type(readStatus))
955956
queryreturn = sqlQuery(
956-
"SELECT read FROM inbox WHERE msgid=?", msgid)
957+
"SELECT read FROM inbox WHERE msgid=?", sqlite3.Binary(msgid))
958+
if len(queryreturn) < 1:
959+
queryreturn = sqlQuery(
960+
"SELECT read FROM inbox WHERE msgid=CAST(? AS TEXT)", msgid)
957961
# UPDATE is slow, only update if status is different
958962
try:
959963
if (queryreturn[0][0] == 1) != readStatus:
960-
sqlExecute(
964+
rowcount = sqlExecute(
961965
"UPDATE inbox set read = ? WHERE msgid=?",
962-
readStatus, msgid)
966+
readStatus, sqlite3.Binary(msgid))
967+
if rowcount < 1:
968+
rowcount = sqlExecute(
969+
"UPDATE inbox set read = ? WHERE msgid=CAST(? AS TEXT)",
970+
readStatus, msgid)
963971
queues.UISignalQueue.put(('changedInboxUnread', None))
964972
except IndexError:
965973
pass
966974
queryreturn = sqlQuery(
967975
"SELECT msgid, toaddress, fromaddress, subject, received, message,"
968-
" encodingtype, read FROM inbox WHERE msgid=?", msgid
976+
" encodingtype, read FROM inbox WHERE msgid=?", sqlite3.Binary(msgid)
969977
)
978+
if len(queryreturn) < 1:
979+
queryreturn = sqlQuery(
980+
"SELECT msgid, toaddress, fromaddress, subject, received, message,"
981+
" encodingtype, read FROM inbox WHERE msgid=CAST(? AS TEXT)", msgid
982+
)
970983
try:
971984
return {"inboxMessage": [
972985
self._dump_inbox_message(*queryreturn[0])]}
@@ -1035,8 +1048,14 @@ def HandleGetSentMessageById(self, hid):
10351048
queryreturn = sqlQuery(
10361049
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
10371050
" message, encodingtype, status, ackdata FROM sent WHERE msgid=?",
1038-
msgid
1051+
sqlite3.Binary(msgid)
10391052
)
1053+
if len(queryreturn) < 1:
1054+
queryreturn = sqlQuery(
1055+
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1056+
" message, encodingtype, status, ackdata FROM sent WHERE msgid=CAST(? AS TEXT)",
1057+
msgid
1058+
)
10401059
try:
10411060
return {"sentMessage": [
10421061
self._dump_sent_message(*queryreturn[0])
@@ -1072,8 +1091,14 @@ def HandleGetSentMessagesByAckData(self, ackData):
10721091
queryreturn = sqlQuery(
10731092
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
10741093
" message, encodingtype, status, ackdata FROM sent"
1075-
" WHERE ackdata=?", ackData
1094+
" WHERE ackdata=?", sqlite3.Binary(ackData)
10761095
)
1096+
if len(queryreturn) < 1:
1097+
queryreturn = sqlQuery(
1098+
"SELECT msgid, toaddress, fromaddress, subject, lastactiontime,"
1099+
" message, encodingtype, status, ackdata FROM sent"
1100+
" WHERE ackdata=CAST(? AS TEXT)", ackData
1101+
)
10771102

10781103
try:
10791104
return {"sentMessage": [
@@ -1093,7 +1118,9 @@ def HandleTrashMessage(self, msgid):
10931118
# Trash if in inbox table
10941119
helper_inbox.trash(msgid)
10951120
# Trash if in sent table
1096-
sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=?", msgid)
1121+
rowcount = sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=?", sqlite3.Binary(msgid))
1122+
if rowcount < 1:
1123+
sqlExecute("UPDATE sent SET folder='trash' WHERE msgid=CAST(? AS TEXT)", msgid)
10971124
return 'Trashed message (assuming message existed).'
10981125

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

11131142
@command('sendMessage')
@@ -1217,7 +1246,10 @@ def HandleGetStatus(self, ackdata):
12171246
raise APIError(15, 'Invalid ackData object size.')
12181247
ackdata = self._decode(ackdata, "hex")
12191248
queryreturn = sqlQuery(
1220-
"SELECT status FROM sent where ackdata=?", ackdata)
1249+
"SELECT status FROM sent where ackdata=?", sqlite3.Binary(ackdata))
1250+
if len(queryreturn) < 1:
1251+
queryreturn = sqlQuery(
1252+
"SELECT status FROM sent where ackdata=CAST(? AS TEXT)", ackdata)
12211253
try:
12221254
return queryreturn[0][0]
12231255
except IndexError:
@@ -1354,7 +1386,9 @@ def HandleTrashSentMessageByAckDAta(self, ackdata):
13541386
"""Trash a sent message by ackdata (hex encoded)"""
13551387
# This API method should only be used when msgid is not available
13561388
ackdata = self._decode(ackdata, "hex")
1357-
sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", ackdata)
1389+
rowcount = sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", sqlite3.Binary(ackdata))
1390+
if rowcount < 1:
1391+
sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=CAST(? AS TEXT)", ackdata)
13581392
return 'Trashed sent message (assuming message existed).'
13591393

13601394
@command('disseminatePubkey')
@@ -1421,19 +1455,29 @@ def HandleGetMessageDataByDestinationHash(self, requestedHash):
14211455
# use it we'll need to fill out a field in our inventory database
14221456
# which is blank by default (first20bytesofencryptedmessage).
14231457
queryreturn = sqlQuery(
1424-
"SELECT hash, payload FROM inventory WHERE tag = ''"
1425-
" and objecttype = 2")
1458+
"SELECT hash, payload FROM inventory WHERE tag = ?"
1459+
" and objecttype = 2", sqlite3.Binary(b""))
1460+
if len(queryreturn) < 1:
1461+
queryreturn = sqlQuery(
1462+
"SELECT hash, payload FROM inventory WHERE tag = CAST(? AS TEXT)"
1463+
" and objecttype = 2", b"")
14261464
with SqlBulkExecute() as sql:
14271465
for hash01, payload in queryreturn:
14281466
readPosition = 16 # Nonce length + time length
14291467
# Stream Number length
14301468
readPosition += decodeVarint(
14311469
payload[readPosition:readPosition + 10])[1]
1432-
t = (payload[readPosition:readPosition + 32], hash01)
1433-
sql.execute("UPDATE inventory SET tag=? WHERE hash=?", *t)
1470+
t = (payload[readPosition:readPosition + 32], sqlite3.Binary(hash01))
1471+
_, rowcount = sql.execute("UPDATE inventory SET tag=? WHERE hash=?", *t)
1472+
if rowcount < 1:
1473+
t = (payload[readPosition:readPosition + 32], hash01)
1474+
sql.execute("UPDATE inventory SET tag=? WHERE hash=CAST(? AS TEXT)", *t)
14341475

14351476
queryreturn = sqlQuery(
1436-
"SELECT payload FROM inventory WHERE tag = ?", requestedHash)
1477+
"SELECT payload FROM inventory WHERE tag = ?", sqlite3.Binary(requestedHash))
1478+
if len(queryreturn) < 1:
1479+
queryreturn = sqlQuery(
1480+
"SELECT payload FROM inventory WHERE tag = CAST(? AS TEXT)", requestedHash)
14371481
return {"receivedMessageDatas": [
14381482
{'data': hexlify(payload)} for payload, in queryreturn
14391483
]}

src/bitmessagecurses/__init__.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import time
1818
from textwrap import fill
1919
from threading import Timer
20+
import sqlite3
2021

2122
from dialog import Dialog
2223
import helper_sent
@@ -358,7 +359,9 @@ def handlech(c, stdscr):
358359
inbox[inboxcur][1] +
359360
"\"")
360361
data = "" # pyint: disable=redefined-outer-name
361-
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", inbox[inboxcur][0])
362+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", sqlite3.Binary(inbox[inboxcur][0]))
363+
if len(ret) < 1:
364+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=CAST(? AS TEXT)", inbox[inboxcur][0])
362365
if ret != []:
363366
for row in ret:
364367
data, = row
@@ -367,12 +370,16 @@ def handlech(c, stdscr):
367370
for i, item in enumerate(data.split("\n")):
368371
msg += fill(item, replace_whitespace=False) + "\n"
369372
scrollbox(d, unicode(ascii(msg)), 30, 80)
370-
sqlExecute("UPDATE inbox SET read=1 WHERE msgid=?", inbox[inboxcur][0])
373+
rowcount = sqlExecute("UPDATE inbox SET read=1 WHERE msgid=?", sqlite3.Binary(inbox[inboxcur][0]))
374+
if rowcount < 1:
375+
sqlExecute("UPDATE inbox SET read=1 WHERE msgid=CAST(? AS TEXT)", inbox[inboxcur][0])
371376
inbox[inboxcur][7] = 1
372377
else:
373378
scrollbox(d, unicode("Could not fetch message."))
374379
elif t == "2": # Mark unread
375-
sqlExecute("UPDATE inbox SET read=0 WHERE msgid=?", inbox[inboxcur][0])
380+
rowcount = sqlExecute("UPDATE inbox SET read=0 WHERE msgid=?", sqlite3.Binary(inbox[inboxcur][0]))
381+
if rowcount < 1:
382+
sqlExecute("UPDATE inbox SET read=0 WHERE msgid=CAST(? AS TEXT)", inbox[inboxcur][0])
376383
inbox[inboxcur][7] = 0
377384
elif t == "3": # Reply
378385
curses.curs_set(1)
@@ -396,7 +403,9 @@ def handlech(c, stdscr):
396403
if not m[5][:4] == "Re: ":
397404
subject = "Re: " + m[5]
398405
body = ""
399-
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", m[0])
406+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", sqlite3.Binary(m[0]))
407+
if len(ret) < 1:
408+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=CAST(? AS TEXT)", m[0])
400409
if ret != []:
401410
body = "\n\n------------------------------------------------------\n"
402411
for row in ret:
@@ -422,7 +431,9 @@ def handlech(c, stdscr):
422431
r, t = d.inputbox("Filename", init=inbox[inboxcur][5] + ".txt")
423432
if r == d.DIALOG_OK:
424433
msg = ""
425-
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", inbox[inboxcur][0])
434+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=?", sqlite3.Binary(inbox[inboxcur][0]))
435+
if len(ret) < 1:
436+
ret = sqlQuery("SELECT message FROM inbox WHERE msgid=CAST(? AS TEXT)", inbox[inboxcur][0])
426437
if ret != []:
427438
for row in ret:
428439
msg, = row
@@ -432,7 +443,9 @@ def handlech(c, stdscr):
432443
else:
433444
scrollbox(d, unicode("Could not fetch message."))
434445
elif t == "6": # Move to trash
435-
sqlExecute("UPDATE inbox SET folder='trash' WHERE msgid=?", inbox[inboxcur][0])
446+
rowcount = sqlExecute("UPDATE inbox SET folder='trash' WHERE msgid=?", sqlite3.Binary(inbox[inboxcur][0]))
447+
if rowcount < 1:
448+
sqlExecute("UPDATE inbox SET folder='trash' WHERE msgid=CAST(? AS TEXT)", inbox[inboxcur][0])
436449
del inbox[inboxcur]
437450
scrollbox(d, unicode(
438451
"Message moved to trash. There is no interface to view your trash,"
@@ -464,7 +477,12 @@ def handlech(c, stdscr):
464477
ret = sqlQuery(
465478
"SELECT message FROM sent WHERE subject=? AND ackdata=?",
466479
sentbox[sentcur][4],
467-
sentbox[sentcur][6])
480+
sqlite3.Binary(sentbox[sentcur][6]))
481+
if len(ret) < 1:
482+
ret = sqlQuery(
483+
"SELECT message FROM sent WHERE subject=? AND ackdata=CAST(? AS TEXT)",
484+
sentbox[sentcur][4],
485+
sentbox[sentcur][6])
468486
if ret != []:
469487
for row in ret:
470488
data, = row
@@ -476,10 +494,15 @@ def handlech(c, stdscr):
476494
else:
477495
scrollbox(d, unicode("Could not fetch message."))
478496
elif t == "2": # Move to trash
479-
sqlExecute(
497+
rowcount = sqlExecute(
480498
"UPDATE sent SET folder='trash' WHERE subject=? AND ackdata=?",
481499
sentbox[sentcur][4],
482-
sentbox[sentcur][6])
500+
sqlite3.Binary(sentbox[sentcur][6]))
501+
if rowcount < 1:
502+
rowcount = sqlExecute(
503+
"UPDATE sent SET folder='trash' WHERE subject=? AND ackdata=CAST(? AS TEXT)",
504+
sentbox[sentcur][4],
505+
sentbox[sentcur][6])
483506
del sentbox[sentcur]
484507
scrollbox(d, unicode(
485508
"Message moved to trash. There is no interface to view your trash"

src/bitmessagekivy/baseclass/maildetail.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import os
99
from datetime import datetime
10+
import sqlite3
1011

1112
from kivy.core.clipboard import Clipboard
1213
from kivy.clock import Clock
@@ -111,7 +112,11 @@ def init_ui(self, dt=0):
111112
elif self.kivy_state.detail_page_type == 'inbox':
112113
data = sqlQuery(
113114
"select toaddress, fromaddress, subject, message, received from inbox"
114-
" where msgid = ?", self.kivy_state.mail_id)
115+
" where msgid = ?", sqlite3.Binary(self.kivy_state.mail_id))
116+
if len(data) < 1:
117+
data = sqlQuery(
118+
"select toaddress, fromaddress, subject, message, received from inbox"
119+
" where msgid = CAST(? AS TEXT)", self.kivy_state.mail_id)
115120
self.assign_mail_details(data)
116121
App.get_running_app().set_mail_detail_header()
117122
except Exception as e: # pylint: disable=unused-variable

0 commit comments

Comments
 (0)