+ Add Sent, Subscription, and Blacklist tab functionality
+ Add code to delete address from Your Identities + Add code to load Sentbox, Subscriptions, and Blacklist * Lengthen column width from 30 to 40 to better fit unlabeled addresses and long subject lines * Fix row overflow support * Reorder Dialog initialization to remove duplicate code * Add reply argument to sendMessage() * Add newline to Move to Trash message * Replace Your Identities address copy option with an option to send a message
This commit is contained in:
parent
c3feb54b7b
commit
196047b2ed
|
@ -36,7 +36,7 @@ startuptime = time.time()
|
||||||
|
|
||||||
inbox = []
|
inbox = []
|
||||||
inboxcur = 0
|
inboxcur = 0
|
||||||
sent = []
|
sentbox = []
|
||||||
sentcur = 0
|
sentcur = 0
|
||||||
addresses = []
|
addresses = []
|
||||||
addrcur = 0
|
addrcur = 0
|
||||||
|
@ -47,6 +47,7 @@ addrbook = []
|
||||||
abookcur = 0
|
abookcur = 0
|
||||||
blacklist = []
|
blacklist = []
|
||||||
blackcur = 0
|
blackcur = 0
|
||||||
|
bwtype = "black"
|
||||||
|
|
||||||
BROADCAST_STR = "[Broadcast subscribers]"
|
BROADCAST_STR = "[Broadcast subscribers]"
|
||||||
|
|
||||||
|
@ -100,10 +101,10 @@ def drawtab(stdscr):
|
||||||
if menutab in range(1, len(menu)+1):
|
if menutab in range(1, len(menu)+1):
|
||||||
if menutab == 1: # Inbox
|
if menutab == 1: # Inbox
|
||||||
stdscr.addstr(3, 5, "To", curses.A_BOLD)
|
stdscr.addstr(3, 5, "To", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 30, "From", curses.A_BOLD)
|
stdscr.addstr(3, 40, "From", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 60, "Subject", curses.A_BOLD)
|
stdscr.addstr(3, 80, "Subject", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 90, "Time Received", curses.A_BOLD)
|
stdscr.addstr(3, 120, "Time Received", curses.A_BOLD)
|
||||||
stdscr.hline(4, 5, '-', 91)
|
stdscr.hline(4, 5, '-', 121)
|
||||||
for i, item in enumerate(inbox[max(min(len(inbox)-curses.LINES+6, inboxcur-5), 0):]):
|
for i, item in enumerate(inbox[max(min(len(inbox)-curses.LINES+6, inboxcur-5), 0):]):
|
||||||
if 6+i < curses.LINES:
|
if 6+i < curses.LINES:
|
||||||
a = 0
|
a = 0
|
||||||
|
@ -111,40 +112,82 @@ def drawtab(stdscr):
|
||||||
a = a | curses.A_REVERSE
|
a = a | curses.A_REVERSE
|
||||||
if item[7] == False: # If not read, highlight
|
if item[7] == False: # If not read, highlight
|
||||||
a = a | curses.A_BOLD
|
a = a | curses.A_BOLD
|
||||||
stdscr.addstr(5+i, 5, item[1][:29], a)
|
stdscr.addstr(5+i, 5, item[1][:34], a)
|
||||||
stdscr.addstr(5+i, 30, item[3][:29], a)
|
stdscr.addstr(5+i, 40, item[3][:39], a)
|
||||||
stdscr.addstr(5+i, 60, item[5][:29], a)
|
stdscr.addstr(5+i, 80, item[5][:39], a)
|
||||||
stdscr.addstr(5+i, 90, item[6][:29], a)
|
stdscr.addstr(5+i, 120, item[6][:39], a)
|
||||||
elif menutab == 3: # Sent
|
elif menutab == 3: # Sent
|
||||||
pass
|
stdscr.addstr(3, 5, "To", curses.A_BOLD)
|
||||||
|
stdscr.addstr(3, 40, "From", curses.A_BOLD)
|
||||||
|
stdscr.addstr(3, 80, "Subject", curses.A_BOLD)
|
||||||
|
stdscr.addstr(3, 120, "Status", curses.A_BOLD)
|
||||||
|
stdscr.hline(4, 5, '-', 121)
|
||||||
|
for i, item in enumerate(sentbox[max(min(len(sentbox)-curses.LINES+6, sentcur-5), 0):]):
|
||||||
|
if 6+i < curses.LINES:
|
||||||
|
a = 0
|
||||||
|
if i == sentcur - max(min(len(sentbox)-curses.LINES+6, sentcur-5), 0): # Highlight current address
|
||||||
|
a = a | curses.A_REVERSE
|
||||||
|
stdscr.addstr(5+i, 5, item[0][:34], a)
|
||||||
|
stdscr.addstr(5+i, 40, item[2][:39], a)
|
||||||
|
stdscr.addstr(5+i, 80, item[4][:39], a)
|
||||||
|
stdscr.addstr(5+i, 120, item[5][:39], a)
|
||||||
elif menutab == 2 or menutab == 4: # Send or Identities
|
elif menutab == 2 or menutab == 4: # Send or Identities
|
||||||
stdscr.addstr(3, 5, "Label", curses.A_BOLD)
|
stdscr.addstr(3, 5, "Label", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 30, "Address", curses.A_BOLD)
|
stdscr.addstr(3, 40, "Address", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 60, "Stream", curses.A_BOLD)
|
stdscr.addstr(3, 80, "Stream", curses.A_BOLD)
|
||||||
stdscr.hline(4, 5, '-', 61)
|
stdscr.hline(4, 5, '-', 81)
|
||||||
for i, item in enumerate(addresses[max(min(len(addresses)-curses.LINES+6, addrcur-5), 0):]):
|
for i, item in enumerate(addresses[max(min(len(addresses)-curses.LINES+6, addrcur-5), 0):]):
|
||||||
a = 0
|
if 6+i < curses.LINES:
|
||||||
if i == addrcur - max(min(len(addresses)-curses.LINES+6, addrcur-5), 0): # Highlight current address
|
a = 0
|
||||||
a = a | curses.A_REVERSE
|
if i == addrcur - max(min(len(addresses)-curses.LINES+6, addrcur-5), 0): # Highlight current address
|
||||||
if item[1] == True and item[3] not in [8,9]: # Embolden enabled, non-special addresses
|
a = a | curses.A_REVERSE
|
||||||
a = a | curses.A_BOLD
|
if item[1] == True and item[3] not in [8,9]: # Embolden enabled, non-special addresses
|
||||||
stdscr.addstr(5+i, 5, item[0][:30], a)
|
a = a | curses.A_BOLD
|
||||||
stdscr.addstr(5+i, 30, item[2][:30], cpair(item[3]) | a)
|
stdscr.addstr(5+i, 5, item[0][:34], a)
|
||||||
stdscr.addstr(5+i, 60, str(1)[:30], a)
|
stdscr.addstr(5+i, 40, item[2][:39], cpair(item[3]) | a)
|
||||||
|
stdscr.addstr(5+i, 80, str(1)[:39], a)
|
||||||
elif menutab == 5: # Subscriptions
|
elif menutab == 5: # Subscriptions
|
||||||
pass
|
stdscr.addstr(3, 5, "Label", curses.A_BOLD)
|
||||||
|
stdscr.addstr(3, 80, "Address", curses.A_BOLD)
|
||||||
|
stdscr.addstr(3, 120, "Enabled", curses.A_BOLD)
|
||||||
|
stdscr.hline(4, 5, '-', 121)
|
||||||
|
for i, item in enumerate(subscriptions[max(min(len(subscriptions)-curses.LINES+6, subcur-5), 0):]):
|
||||||
|
if 6+i < curses.LINES:
|
||||||
|
a = 0
|
||||||
|
if i == subcur - max(min(len(subscriptions)-curses.LINES+6, subcur-5), 0): # Highlight current address
|
||||||
|
a = a | curses.A_REVERSE
|
||||||
|
if item[2] == True: # Embolden enabled subscriptions
|
||||||
|
a = a | curses.A_BOLD
|
||||||
|
stdscr.addstr(5+i, 5, item[0][:74], a)
|
||||||
|
stdscr.addstr(5+i, 80, item[1][:39], a)
|
||||||
|
stdscr.addstr(5+i, 120, str(item[2]), a)
|
||||||
elif menutab == 6: # Address book
|
elif menutab == 6: # Address book
|
||||||
stdscr.addstr(3, 5, "Label", curses.A_BOLD)
|
stdscr.addstr(3, 5, "Label", curses.A_BOLD)
|
||||||
stdscr.addstr(3, 30, "Address", curses.A_BOLD)
|
stdscr.addstr(3, 40, "Address", curses.A_BOLD)
|
||||||
stdscr.hline(4, 5, '-', 31)
|
stdscr.hline(4, 5, '-', 41)
|
||||||
for i, item in enumerate(addrbook[max(min(len(addrbook)-curses.LINES+6, abookcur-5), 0):]):
|
for i, item in enumerate(addrbook[max(min(len(addrbook)-curses.LINES+6, abookcur-5), 0):]):
|
||||||
a = 0
|
if 6+i < curses.LINES:
|
||||||
if i == abookcur - max(min(len(addrbook)-curses.LINES+6, abookcur-5), 0): # Highlight current address
|
a = 0
|
||||||
a = a | curses.A_REVERSE
|
if i == abookcur - max(min(len(addrbook)-curses.LINES+6, abookcur-5), 0): # Highlight current address
|
||||||
stdscr.addstr(5+i, 5, item[0][:30], a)
|
a = a | curses.A_REVERSE
|
||||||
stdscr.addstr(5+i, 30, item[1][:30], a)
|
stdscr.addstr(5+i, 5, item[0][:34], a)
|
||||||
|
stdscr.addstr(5+i, 40, item[1][:39], a)
|
||||||
elif menutab == 7: # Blacklist
|
elif menutab == 7: # Blacklist
|
||||||
pass
|
stdscr.addstr(3, 5, "Type: "+bwtype)
|
||||||
|
stdscr.addstr(4, 5, "Label", curses.A_BOLD)
|
||||||
|
stdscr.addstr(4, 80, "Address", curses.A_BOLD)
|
||||||
|
stdscr.addstr(4, 120, "Enabled", curses.A_BOLD)
|
||||||
|
stdscr.hline(5, 5, '-', 121)
|
||||||
|
for i, item in enumerate(blacklist[max(min(len(blacklist)-curses.LINES+6, blackcur-5), 0):]):
|
||||||
|
if 7+i < curses.LINES:
|
||||||
|
a = 0
|
||||||
|
if i == blackcur - max(min(len(blacklist)-curses.LINES+6, blackcur-5), 0): # Highlight current address
|
||||||
|
a = a | curses.A_REVERSE
|
||||||
|
if item[2] == True: # Embolden enabled subscriptions
|
||||||
|
a = a | curses.A_BOLD
|
||||||
|
stdscr.addstr(6+i, 5, item[0][:74], a)
|
||||||
|
stdscr.addstr(6+i, 80, item[1][:39], a)
|
||||||
|
stdscr.addstr(6+i, 120, str(item[2]), a)
|
||||||
elif menutab == 8: # Network status
|
elif menutab == 8: # Network status
|
||||||
# Connection data
|
# Connection data
|
||||||
stdscr.addstr(4, 5, "Total Connections: "+str(len(shared.connectedHostsList)).ljust(2))
|
stdscr.addstr(4, 5, "Total Connections: "+str(len(shared.connectedHostsList)).ljust(2))
|
||||||
|
@ -211,9 +254,9 @@ def handlech(c, stdscr):
|
||||||
global quit
|
global quit
|
||||||
quit = True
|
quit = True
|
||||||
elif chr(c) == '\n':
|
elif chr(c) == '\n':
|
||||||
|
curses.curs_set(1)
|
||||||
|
d = Dialog(dialog="dialog")
|
||||||
if menutab == 1:
|
if menutab == 1:
|
||||||
curses.curs_set(1)
|
|
||||||
d = Dialog(dialog="dialog")
|
|
||||||
d.set_background_title("Inbox Message Dialog Box")
|
d.set_background_title("Inbox Message Dialog Box")
|
||||||
r, t = d.menu("Do what with \""+inbox[inboxcur][5]+"\" from \""+inbox[inboxcur][3]+"\"?",
|
r, t = d.menu("Do what with \""+inbox[inboxcur][5]+"\" from \""+inbox[inboxcur][3]+"\"?",
|
||||||
choices=[("1", "View message"),
|
choices=[("1", "View message"),
|
||||||
|
@ -265,11 +308,11 @@ def handlech(c, stdscr):
|
||||||
for row in ret:
|
for row in ret:
|
||||||
body, = row
|
body, = row
|
||||||
|
|
||||||
sendMessage(fromaddr, toaddr, ischan, subject, body)
|
sendMessage(fromaddr, toaddr, ischan, subject, body, True)
|
||||||
dialogreset(stdscr)
|
dialogreset(stdscr)
|
||||||
elif t == "4": # Add to Address Book
|
elif t == "4": # Add to Address Book
|
||||||
addr = inbox[inboxcur][4]
|
addr = inbox[inboxcur][4]
|
||||||
if addr in [item[1] for i,item in enumerate(addrbook)]:
|
if addr not in [item[1] for i,item in enumerate(addrbook)]:
|
||||||
r, t = d.inputbox("Label for address \""+addr+"\"")
|
r, t = d.inputbox("Label for address \""+addr+"\"")
|
||||||
if r == d.DIALOG_OK:
|
if r == d.DIALOG_OK:
|
||||||
sqlExecute("INSERT INTO addressbook VALUES (?,?)", t, addr)
|
sqlExecute("INSERT INTO addressbook VALUES (?,?)", t, addr)
|
||||||
|
@ -293,20 +336,37 @@ def handlech(c, stdscr):
|
||||||
elif t == "6": # Move to trash
|
elif t == "6": # Move to trash
|
||||||
sqlExecute("UPDATE inbox SET folder='trash' WHERE msgid=?", inbox[inboxcur][0])
|
sqlExecute("UPDATE inbox SET folder='trash' WHERE msgid=?", inbox[inboxcur][0])
|
||||||
del inbox[inboxcur]
|
del inbox[inboxcur]
|
||||||
d.scrollbox(unicode("Message moved to trash. There is no interface to view your trash, but the message is still on disk if you are desperate to recover it."),
|
d.scrollbox(unicode("Message moved to trash. There is no interface to view your trash, \nbut the message is still on disk if you are desperate to recover it."),
|
||||||
exit_label="Continue")
|
exit_label="Continue")
|
||||||
dialogreset(stdscr)
|
|
||||||
elif menutab == 2:
|
elif menutab == 2:
|
||||||
curses.curs_set(1)
|
|
||||||
sendMessage(addresses[addrcur][2])
|
sendMessage(addresses[addrcur][2])
|
||||||
dialogreset(stdscr)
|
elif menutab == 3:
|
||||||
|
d.set_background_title("Sent Messages Dialog Box")
|
||||||
|
r, t = d.menu("Do what with \""+sentbox[sentcur][4]+"\" to \""+sentbox[sentcur][0]+"\"?",
|
||||||
|
choices=[("1", "View message"),
|
||||||
|
("2", "Move to trash")])
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
if t == "1": # View
|
||||||
|
d.set_background_title("\""+sentbox[sentcur][4]+"\" from \""+sentbox[sentcur][3]+"\" to \""+sentbox[sentcur][1]+"\"")
|
||||||
|
msg = ""
|
||||||
|
ret = sqlQuery("SELECT message FROM sent WHERE subject=? AND ackdata=?", sentbox[sentcur][4], sentbox[sentcur][6])
|
||||||
|
if ret != []:
|
||||||
|
for row in ret:
|
||||||
|
msg, = row
|
||||||
|
msg = shared.fixPotentiallyInvalidUTF8Data(msg)
|
||||||
|
d.scrollbox(unicode(ascii(msg)), 30, 100, exit_label="Continue")
|
||||||
|
else:
|
||||||
|
d.scrollbox(unicode("Could not fetch message."), exit_label="Continue")
|
||||||
|
elif t == "2": # Move to trash
|
||||||
|
sqlExecute("UPDATE sent SET folder='trash' WHERE subject=? AND ackdata=?", sentbox[sentcur][4], sentbox[sentcur][6])
|
||||||
|
del sentbox[sentcur]
|
||||||
|
d.scrollbox(unicode("Message moved to trash. There is no interface to view your trash, \nbut the message is still on disk if you are desperate to recover it."),
|
||||||
|
exit_label="Continue")
|
||||||
elif menutab == 4:
|
elif menutab == 4:
|
||||||
curses.curs_set(1)
|
|
||||||
d = Dialog(dialog="dialog")
|
|
||||||
d.set_background_title("Your Identities Dialog Box")
|
d.set_background_title("Your Identities Dialog Box")
|
||||||
r, t = d.menu("Do what with \""+addresses[addrcur][0]+"\" : \""+addresses[addrcur][2]+"\"?",
|
r, t = d.menu("Do what with \""+addresses[addrcur][0]+"\" : \""+addresses[addrcur][2]+"\"?",
|
||||||
choices=[("1", "Create new address"),
|
choices=[("1", "Create new address"),
|
||||||
("2", "Copy address to internal buffer"),
|
("2", "Send a message from this address"),
|
||||||
("3", "Rename"),
|
("3", "Rename"),
|
||||||
("4", "Enable"),
|
("4", "Enable"),
|
||||||
("5", "Disable"),
|
("5", "Disable"),
|
||||||
|
@ -381,9 +441,8 @@ def handlech(c, stdscr):
|
||||||
shared.addressGeneratorQueue.put(('createDeterministicAddresses', 4, stream, "unused deterministic address", number, str(passphrase), shorten))
|
shared.addressGeneratorQueue.put(('createDeterministicAddresses', 4, stream, "unused deterministic address", number, str(passphrase), shorten))
|
||||||
else:
|
else:
|
||||||
d.scrollbox(unicode("Passphrases do not match"), exit_label="Continue")
|
d.scrollbox(unicode("Passphrases do not match"), exit_label="Continue")
|
||||||
elif t == "2": # Copy address to internal buffer
|
elif t == "2": # Send a message
|
||||||
global addrcopy
|
sendMessage(addresses[addrcur][2])
|
||||||
addrcopy = addrcur
|
|
||||||
elif t == "3": # Rename address label
|
elif t == "3": # Rename address label
|
||||||
a = addresses[addrcur][2]
|
a = addresses[addrcur][2]
|
||||||
label = addresses[addrcur][0]
|
label = addresses[addrcur][0]
|
||||||
|
@ -420,7 +479,12 @@ def handlech(c, stdscr):
|
||||||
addresses[addrcur][1] = False
|
addresses[addrcur][1] = False
|
||||||
shared.reloadMyAddressHashes() # Reload address hashes
|
shared.reloadMyAddressHashes() # Reload address hashes
|
||||||
elif t == "6": # Delete address
|
elif t == "6": # Delete address
|
||||||
pass
|
r, t = d.inputbox("Type in \"I want to delete this address\"", width=50)
|
||||||
|
if r == d.DIALOG_OK and t == "I want to delete this address":
|
||||||
|
shared.config.remove_section(addresses[addrcur][2])
|
||||||
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
|
shared.config.write(configfile)
|
||||||
|
del addresses[addrcur]
|
||||||
elif t == "7": # Special address behavior
|
elif t == "7": # Special address behavior
|
||||||
a = addresses[addrcur][2]
|
a = addresses[addrcur][2]
|
||||||
d.set_background_title("Special address behavior")
|
d.set_background_title("Special address behavior")
|
||||||
|
@ -452,39 +516,147 @@ def handlech(c, stdscr):
|
||||||
# Write config
|
# Write config
|
||||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||||
shared.config.write(configfile)
|
shared.config.write(configfile)
|
||||||
dialogreset(stdscr)
|
elif menutab == 5:
|
||||||
|
d.set_background_title("Subscriptions Dialog Box")
|
||||||
|
r, t = d.menu("Do what with subscription to \""+subscriptions[subcur][0]+"\"?",
|
||||||
|
choices=[("1", "Add new subscription"),
|
||||||
|
("2", "Delete this subscription"),
|
||||||
|
("3", "Enable"),
|
||||||
|
("4", "Disable")])
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
if t == "1":
|
||||||
|
r, t = d.inputbox("New subscription address")
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
addr = addBMIfNotPresent(t)
|
||||||
|
if not shared.isAddressInMySubscriptionsList(addr):
|
||||||
|
r, t = d.inputbox("New subscription label")
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
label = t
|
||||||
|
subscriptions.reverse().append(label, addr, True).reverse()
|
||||||
|
sqlExecute("INSERT INTO subscriptions VALUES (?,?,?)", label, address, True)
|
||||||
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
elif t == "2":
|
||||||
|
r, t = d.inpuxbox("Type in \"I want to delete this subscription\"")
|
||||||
|
if r == d.DIALOG_OK and t == "I want to delete this subscription":
|
||||||
|
sqlExecute("DELETE FROM subscriptions WHERE label=? AND address=?", subscriptions[subcur][0], subscriptions[subcur][1])
|
||||||
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
del subscriptions[subcur]
|
||||||
|
elif t == "3":
|
||||||
|
sqlExecute("UPDATE subscriptions SET enabled=1 WHERE label=? AND address=?", subscriptions[subcur][0], subscriptions[subcur][1])
|
||||||
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
subscriptions[subcur][2] = True
|
||||||
|
elif t == "4":
|
||||||
|
sqlExecute("UPDATE subscriptions SET enabled=0 WHERE label=? AND address=?", subscriptions[subcur][0], subscriptions[subcur][1])
|
||||||
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
subscriptions[subcur][2] = False
|
||||||
|
elif menutab == 6:
|
||||||
|
d.set_background_title("Address Book Dialog Box")
|
||||||
|
r, t = d.menu("Do what with \""+addrbook[abookcur][0]+"\" : \""+addrbook[abookcur][1]+"\"",
|
||||||
|
choices=[("1", "Send a message to this address"),
|
||||||
|
("2", "Subscribe to this address"),
|
||||||
|
("3", "Add new address to Address Book"),
|
||||||
|
("4", "Delete this address")])
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
if t == "1":
|
||||||
|
sendMessage(recv=addrbook[abookcur][1])
|
||||||
|
elif t == "2":
|
||||||
|
r, t = d.inputbox("New subscription label")
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
label = t
|
||||||
|
subscriptions.reverse().append(label, addr, True).reverse()
|
||||||
|
sqlExecute("INSERT INTO subscriptions VALUES (?,?,?)", label, address, True)
|
||||||
|
shared.reloadBroadcastSendersForWhichImWatching()
|
||||||
|
elif t == "3":
|
||||||
|
r, t = d.inputbox("Input new address")
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
addr = t
|
||||||
|
if addr not in [item[1] for i,item in enumerate(addrbook)]:
|
||||||
|
r, t = d.inputbox("Label for address \""+addr+"\"")
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
sqlExecute("INSERT INTO addressbook VALUES (?,?)", t, addr)
|
||||||
|
addrbook.reverse().append([t, addr]).reverse() # Prepend new entry
|
||||||
|
else:
|
||||||
|
d.scrollbox(unicode("The selected address is already in the Address Book."), exit_label="Continue")
|
||||||
|
elif t == "4":
|
||||||
|
r, t = d.inputbox("Type in \"I want to delete this Address Book entry\"")
|
||||||
|
if r == d.DIALOG_OK and t == "I want to delete this Address Book entry":
|
||||||
|
sqlExecute("DELETE FROM addressbook WHERE label=? AND address=?", addrbook[abookcur][0], addrbook[abookcur][1])
|
||||||
|
del addrbook[abookcur]
|
||||||
|
elif menutab == 7:
|
||||||
|
d.set_background_title("Blacklist Dialog Box")
|
||||||
|
r, t = d.menu("Do what with \""+blacklist[blackcur][0]+"\" : \""+blacklist[blackcur][1]+"\"?",
|
||||||
|
choices=[("1", "Delete"),
|
||||||
|
("2", "Enable"),
|
||||||
|
("3", "Disable")])
|
||||||
|
if r == d.DIALOG_OK:
|
||||||
|
if t == "1":
|
||||||
|
r, t = d.inputbox("Type in \"I want to delete this Blacklist entry\"")
|
||||||
|
if r == d.DIALOG_OK and t == "I want to delete this Blacklist entry":
|
||||||
|
sqlExecute("DELETE FROM blacklist WHERE label=? AND address=?", blacklist[blackcur][0], blacklist[blackcur][1])
|
||||||
|
del blacklist[blackcur]
|
||||||
|
elif t == "2":
|
||||||
|
sqlExecute("UPDATE blacklist SET enabled=1 WHERE label=? AND address=?", blacklist[blackcur][0], blacklist[blackcur][1])
|
||||||
|
blacklist[blackcur][2] = True
|
||||||
|
elif t== "3":
|
||||||
|
sqlExecute("UPDATE blacklist SET enabled=0 WHERE label=? AND address=?", blacklist[blackcur][0], blacklist[blackcur][1])
|
||||||
|
blacklist[blackcur][2] = False
|
||||||
|
dialogreset(stdscr)
|
||||||
else:
|
else:
|
||||||
global addrcur, inboxcur, abookcur
|
global addrcur, inboxcur, sentcur, subcur, abookcur, blackcur
|
||||||
if c == curses.KEY_UP:
|
if c == curses.KEY_UP:
|
||||||
if menutab == 1 and inboxcur > 0:
|
if menutab == 1 and inboxcur > 0:
|
||||||
inboxcur -= 1
|
inboxcur -= 1
|
||||||
if (menutab == 2 or menutab == 4) and addrcur > 0:
|
if (menutab == 2 or menutab == 4) and addrcur > 0:
|
||||||
addrcur -= 1
|
addrcur -= 1
|
||||||
|
if menutab == 3 and sentcur > 0:
|
||||||
|
sentcur -= 1
|
||||||
|
if menutab == 5 and subcur > 0:
|
||||||
|
subcur -= 1
|
||||||
if menutab == 6 and abookcur > 0:
|
if menutab == 6 and abookcur > 0:
|
||||||
abookcur -= 1
|
abookcur -= 1
|
||||||
|
if menutab == 7 and blackcur > 0:
|
||||||
|
blackcur -= 1
|
||||||
elif c == curses.KEY_DOWN:
|
elif c == curses.KEY_DOWN:
|
||||||
if menutab == 1 and inboxcur < len(inbox)-1:
|
if menutab == 1 and inboxcur < len(inbox)-1:
|
||||||
inboxcur += 1
|
inboxcur += 1
|
||||||
if (menutab == 2 or menutab == 4) and addrcur < len(addresses)-1:
|
if (menutab == 2 or menutab == 4) and addrcur < len(addresses)-1:
|
||||||
addrcur += 1
|
addrcur += 1
|
||||||
|
if menutab == 3 and sentcur < len(sentbox)-1:
|
||||||
|
sentcur += 1
|
||||||
|
if menutab == 5 and subcur < len(subscriptions)-1:
|
||||||
|
subcur += 1
|
||||||
if menutab == 6 and abookcur < len(addrbook)-1:
|
if menutab == 6 and abookcur < len(addrbook)-1:
|
||||||
abookcur += 1
|
abookcur += 1
|
||||||
|
if menutab == 7 and blackcur < len(blacklist)-1:
|
||||||
|
blackcur += 1
|
||||||
elif c == curses.KEY_HOME:
|
elif c == curses.KEY_HOME:
|
||||||
if menutab == 1:
|
if menutab == 1:
|
||||||
inboxcur = 0
|
inboxcur = 0
|
||||||
if menutab == 2 or menutab == 4:
|
if menutab == 2 or menutab == 4:
|
||||||
addrcur = 0
|
addrcur = 0
|
||||||
|
if menutab == 3:
|
||||||
|
sentcur = 0
|
||||||
|
if menutab == 5:
|
||||||
|
subcur = 0
|
||||||
if menutab == 6:
|
if menutab == 6:
|
||||||
abookcur = 0
|
abookcur = 0
|
||||||
|
if menutab == 7:
|
||||||
|
blackcur = 0
|
||||||
elif c == curses.KEY_END:
|
elif c == curses.KEY_END:
|
||||||
if menutab == 1:
|
if menutab == 1:
|
||||||
inboxcur = len(inbox)-1
|
inboxcur = len(inbox)-1
|
||||||
if menutab == 2 or menutab == 4:
|
if menutab == 2 or menutab == 4:
|
||||||
addrcur = len(addresses)-1
|
addrcur = len(addresses)-1
|
||||||
|
if menutab == 3:
|
||||||
|
sentcur = len(sentbox)-1
|
||||||
|
if menutab == 5:
|
||||||
|
subcur = len(subscriptions)-1
|
||||||
if menutab == 6:
|
if menutab == 6:
|
||||||
abookcur = len(addrbook)-1
|
abookcur = len(addrbook)-1
|
||||||
|
if menutab == 7:
|
||||||
|
blackcur = len(blackcur)-1
|
||||||
redraw(stdscr)
|
redraw(stdscr)
|
||||||
def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
def sendMessage(sender="", recv="", broadcast=None, subject="", body="", reply=False):
|
||||||
if sender == "":
|
if sender == "":
|
||||||
return
|
return
|
||||||
d = Dialog(dialog="dialog")
|
d = Dialog(dialog="dialog")
|
||||||
|
@ -505,13 +677,13 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
||||||
broadcast = False
|
broadcast = False
|
||||||
if t == "2": # Broadcast
|
if t == "2": # Broadcast
|
||||||
broadcast = True
|
broadcast = True
|
||||||
if subject == "":
|
if subject == "" or reply:
|
||||||
r, t = d.inputbox("Message subject", width=60)
|
r, t = d.inputbox("Message subject", width=60, init=subject)
|
||||||
if r != d.DIALOG_OK:
|
if r != d.DIALOG_OK:
|
||||||
return
|
return
|
||||||
subject = shared.fixPotentiallyInvalidUTF8Data(t)
|
subject = shared.fixPotentiallyInvalidUTF8Data(t)
|
||||||
if body == "":
|
if body == "" or reply:
|
||||||
r, t = d.inputbox("Message body", 10, 80)
|
r, t = d.inputbox("Message body", 10, 80, init=body)
|
||||||
if r != d.DIALOG_OK:
|
if r != d.DIALOG_OK:
|
||||||
return
|
return
|
||||||
body = shared.fixPotentiallyInvalidUTF8Data(t)
|
body = shared.fixPotentiallyInvalidUTF8Data(t)
|
||||||
|
@ -561,8 +733,8 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
||||||
|
|
||||||
ackdata = OpenSSL.rand(32)
|
ackdata = OpenSSL.rand(32)
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''',
|
"INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",
|
||||||
'',
|
"",
|
||||||
addr,
|
addr,
|
||||||
ripe,
|
ripe,
|
||||||
sender,
|
sender,
|
||||||
|
@ -570,10 +742,10 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
||||||
body,
|
body,
|
||||||
ackdata,
|
ackdata,
|
||||||
int(time.time()),
|
int(time.time()),
|
||||||
'msgqueued',
|
"msgqueued",
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
'sent',
|
"sent",
|
||||||
2)
|
2)
|
||||||
shared.workerQueue.put(("sendmessage", addr))
|
shared.workerQueue.put(("sendmessage", addr))
|
||||||
else: # Broadcast
|
else: # Broadcast
|
||||||
|
@ -586,8 +758,8 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
||||||
addr = BROADCAST_STR
|
addr = BROADCAST_STR
|
||||||
ripe = ""
|
ripe = ""
|
||||||
sqlExecute(
|
sqlExecute(
|
||||||
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''',
|
"INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)",
|
||||||
'',
|
"",
|
||||||
addr,
|
addr,
|
||||||
ripe,
|
ripe,
|
||||||
sender,
|
sender,
|
||||||
|
@ -595,10 +767,10 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body=""):
|
||||||
body,
|
body,
|
||||||
ackdata,
|
ackdata,
|
||||||
int(time.time()),
|
int(time.time()),
|
||||||
'broadcastqueued',
|
"broadcastqueued",
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
'sent',
|
"sent",
|
||||||
2)
|
2)
|
||||||
shared.workerQueue.put(('sendbroadcast', ''))
|
shared.workerQueue.put(('sendbroadcast', ''))
|
||||||
|
|
||||||
|
@ -653,6 +825,83 @@ def loadInbox():
|
||||||
strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(received))),
|
strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(received))),
|
||||||
read])
|
read])
|
||||||
inbox.reverse()
|
inbox.reverse()
|
||||||
|
def loadSent():
|
||||||
|
sys.stdout = sys.__stdout__
|
||||||
|
print("Loading sent messages...")
|
||||||
|
sys.stdout = printlog
|
||||||
|
|
||||||
|
where = "toaddress || fromaddress || subject || message"
|
||||||
|
what = "%%"
|
||||||
|
ret = sqlQuery("""SELECT toaddress, fromaddress, subject, status, ackdata, lastactiontime
|
||||||
|
FROM sent WHERE folder='sent' AND %s LIKE ?
|
||||||
|
ORDER BY lastactiontime
|
||||||
|
""" % (where,), what)
|
||||||
|
global sent
|
||||||
|
for row in ret:
|
||||||
|
toaddr, fromaddr, subject, status, ackdata, lastactiontime = row
|
||||||
|
subject = ascii(shared.fixPotentiallyInvalidUTF8Data(subject))
|
||||||
|
|
||||||
|
# Set label for to address
|
||||||
|
tolabel = ""
|
||||||
|
qr = sqlQuery("SELECT label FROM addressbook WHERE address=?", toaddr)
|
||||||
|
if qr != []:
|
||||||
|
for r in qr:
|
||||||
|
tolabel, = r
|
||||||
|
if tolabel == "":
|
||||||
|
qr = sqlQuery("SELECT label FROM subscriptions WHERE address=?", toaddr)
|
||||||
|
if qr != []:
|
||||||
|
for r in qr:
|
||||||
|
tolabel, = r
|
||||||
|
if tolabel == "":
|
||||||
|
if shared.config.has_section(toaddr):
|
||||||
|
tolabel = shared.config.get(toaddr, "label")
|
||||||
|
if tolabel == "":
|
||||||
|
tolabel = toaddr
|
||||||
|
|
||||||
|
# Set label for from address
|
||||||
|
fromlabel = ""
|
||||||
|
if shared.config.has_section(fromaddr):
|
||||||
|
fromlabel = shared.config.get(fromaddr, "label")
|
||||||
|
if fromlabel == "":
|
||||||
|
fromlabel = fromaddr
|
||||||
|
|
||||||
|
# Set status string
|
||||||
|
if status == "awaitingpubkey":
|
||||||
|
statstr = "Waiting for their public key. Will request it again soon"
|
||||||
|
elif status == "doingpowforpubkey":
|
||||||
|
statstr = "Encryption key request queued"
|
||||||
|
elif status == "msgqueued":
|
||||||
|
statstr = "Message queued"
|
||||||
|
elif status == "msgsent":
|
||||||
|
t = strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))
|
||||||
|
statstr = "Message sent at "+t+".Waiting for acknowledgement."
|
||||||
|
elif status == "msgsentnoackexpected":
|
||||||
|
t = strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))
|
||||||
|
statstr = "Message sent at "+t+"."
|
||||||
|
elif status == "doingmsgpow":
|
||||||
|
statstr = "The proof of work required to send the message has been queued."
|
||||||
|
elif status == "askreceived":
|
||||||
|
t = strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))
|
||||||
|
statstr = "Acknowledgment of the message received at "+t+"."
|
||||||
|
elif status == "broadcastqueued":
|
||||||
|
statstr = "Broadcast queued."
|
||||||
|
elif status == "broadcastsent":
|
||||||
|
t = strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))
|
||||||
|
statstr = "Broadcast sent at "+t+"."
|
||||||
|
elif status == "forcepow":
|
||||||
|
statstr = "Forced difficulty override. Message will start sending soon."
|
||||||
|
elif status == "badkey":
|
||||||
|
statstr = "Warning: Could not encrypt message because the recipient's encryption key is no good."
|
||||||
|
elif status == "toodifficult":
|
||||||
|
statstr = "Error: The work demanded by the recipient is more difficult than you are willing to do."
|
||||||
|
else:
|
||||||
|
t = strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))
|
||||||
|
statstr = "Unknown status "+status+" at "+t+"."
|
||||||
|
|
||||||
|
# Load into array
|
||||||
|
sentbox.append([tolabel, toaddr, fromlabel, fromaddr, subject, statstr, ackdata,
|
||||||
|
strftime(shared.config.get('bitmessagesettings', 'timeformat'), localtime(int(lastactiontime)))])
|
||||||
|
sentbox.reverse()
|
||||||
def loadAddrBook():
|
def loadAddrBook():
|
||||||
sys.stdout = sys.__stdout__
|
sys.stdout = sys.__stdout__
|
||||||
print("Loading address book...")
|
print("Loading address book...")
|
||||||
|
@ -665,6 +914,23 @@ def loadAddrBook():
|
||||||
label = shared.fixPotentiallyInvalidUTF8Data(label)
|
label = shared.fixPotentiallyInvalidUTF8Data(label)
|
||||||
addrbook.append([label, addr])
|
addrbook.append([label, addr])
|
||||||
addrbook.reverse()
|
addrbook.reverse()
|
||||||
|
def loadSubscriptions():
|
||||||
|
ret = sqlQuery("SELECT label, address, enabled FROM subscriptions")
|
||||||
|
for row in ret:
|
||||||
|
label, address, enabled = row
|
||||||
|
subscriptions.append([label, address, enabled])
|
||||||
|
subscriptions.reverse()
|
||||||
|
def loadBlackWhiteList():
|
||||||
|
global bwtype
|
||||||
|
bwtype = shared.config.get("bitmessagesettings", "blackwhitelist")
|
||||||
|
if bwtype == "black":
|
||||||
|
ret = sqlQuery("SELECT label, address, enabled FROM blacklist")
|
||||||
|
else:
|
||||||
|
ret = sqlQuery("SELECT label, address, enabled FROM whitelist")
|
||||||
|
for row in ret:
|
||||||
|
label, address, enabled = row
|
||||||
|
blacklist.append([label, address, enabled])
|
||||||
|
blacklist.reverse()
|
||||||
|
|
||||||
def runwrapper():
|
def runwrapper():
|
||||||
sys.stdout = printlog
|
sys.stdout = printlog
|
||||||
|
@ -672,8 +938,10 @@ def runwrapper():
|
||||||
|
|
||||||
# Load messages from database
|
# Load messages from database
|
||||||
loadInbox()
|
loadInbox()
|
||||||
#loadSent()
|
loadSent()
|
||||||
loadAddrBook()
|
loadAddrBook()
|
||||||
|
loadSubscriptions()
|
||||||
|
loadBlackWhiteList()
|
||||||
|
|
||||||
stdscr = curses.initscr()
|
stdscr = curses.initscr()
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user