209 lines
6.5 KiB
Python
209 lines
6.5 KiB
Python
import subprocess # nosec
|
|
import time
|
|
|
|
import queues
|
|
from bmconfigparser import BMConfigParser
|
|
from helper_search import search_sql, check_match
|
|
from helper_sql import sqlExecute, sqlQuery
|
|
|
|
|
|
__all__ = ["search_sql", "check_match"]
|
|
|
|
_groups = ("blacklist", "whitelist", "subscriptions", "addressbook")
|
|
_groups_enable = ("blacklist", "whitelist", "subscriptions")
|
|
|
|
|
|
# + genAckPayload
|
|
def put_sent(
|
|
to_address, from_address, subject, message, ackdata,
|
|
status, encoding,
|
|
ripe='', ttl=0, msgid='', sent_time=None, last_action_time=None,
|
|
sleep_till_time=0, retrynumber=0):
|
|
"""Put message into Sent table"""
|
|
# We don't know msgid until the POW is done.
|
|
# sleep_till_time will get set when the POW gets done
|
|
if not sent_time:
|
|
sent_time = time.time()
|
|
if not last_action_time:
|
|
last_action_time = sent_time
|
|
if not ttl:
|
|
ttl = BMConfigParser().getint('bitmessagesettings', 'ttl')
|
|
sqlExecute(
|
|
"INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
|
|
msgid, to_address, ripe, from_address, subject, message, ackdata,
|
|
int(sent_time), int(last_action_time), sleep_till_time, status, retrynumber,
|
|
'sent', encoding, ttl
|
|
)
|
|
|
|
|
|
def _in_inbox_already(sighash):
|
|
return sqlQuery(
|
|
"SELECT COUNT(*) FROM inbox WHERE sighash=?", sighash
|
|
)[0][0] != 0
|
|
|
|
|
|
def put_inbox(
|
|
to_address, from_address, subject, message, msgid, sighash,
|
|
encoding=0, received_time=None, broadcast=False):
|
|
"""Put message into Inbox table"""
|
|
if not received_time:
|
|
received_time = time.time()
|
|
if encoding == 0 or _in_inbox_already(sighash):
|
|
return False
|
|
|
|
sqlExecute(
|
|
"INSERT INTO inbox VALUES (?,?,?,?,?,?,?,?,?,?)",
|
|
msgid, to_address, from_address, subject, int(received_time), message,
|
|
'inbox', encoding, 0, sighash
|
|
)
|
|
|
|
queues.UISignalQueue.put((
|
|
'displayNewInboxMessage',
|
|
(msgid, to_address, from_address, subject, message)
|
|
))
|
|
|
|
# If we are behaving as an API then we might need to run an
|
|
# outside command to let some program know that a new message
|
|
# has arrived.
|
|
if BMConfigParser().safeGetBoolean('bitmessagesettings', 'apienabled'):
|
|
apinotify_path = BMConfigParser().safeGet(
|
|
'bitmessagesettings', 'apinotifypath')
|
|
if apinotify_path:
|
|
subprocess.call([
|
|
apinotify_path,
|
|
"newBroadcast" if broadcast else "newMessage"])
|
|
|
|
|
|
def put_trash(msgid, sent=False):
|
|
"""Put inbox message (or sent if sent=True) into trash by msgid"""
|
|
sqlExecute(
|
|
"UPDATE %s SET folder='trash' WHERE msgid=?" %
|
|
('sent' if sent else 'inbox'), msgid)
|
|
if not sent:
|
|
queues.UISignalQueue.put(('removeInboxRowByMsgid', msgid))
|
|
|
|
|
|
def put_pubkey(address, address_version, data, used_personally=None):
|
|
"""Put pubkey into Pubkeys table"""
|
|
if used_personally is None:
|
|
if sqlQuery(
|
|
"SELECT * FROM pubkeys WHERE address=? AND usedpersonally='yes'",
|
|
address
|
|
) == []:
|
|
used_personally = False
|
|
else:
|
|
sqlExecute(
|
|
"UPDATE pubkeys SET time=? WHERE address=?",
|
|
time.time(), address
|
|
)
|
|
return
|
|
sqlExecute(
|
|
"INSERT INTO pubkeys VALUES (?,?,?,?,?)",
|
|
address, address_version, data, time.time(),
|
|
'yes' if used_personally else 'no'
|
|
)
|
|
|
|
|
|
def _in_group_already(address, group="addressbook"):
|
|
if group not in _groups:
|
|
return True
|
|
# elif group in _groups_enable:
|
|
# try:
|
|
# return sqlQuery(
|
|
# "SELECT enabled FROM %s WHERE address=?" % group, address
|
|
# )[-1][0]
|
|
# except IndexError:
|
|
# return
|
|
else:
|
|
return sqlQuery(
|
|
"SELECT * FROM %s WHERE address=?" % group, address)
|
|
|
|
|
|
def put_addresslist(label, address, group="blacklist", enabled=True):
|
|
"""Put address into address list (e.g. blacklist, subscriptions...)"""
|
|
# We must check to see if the address is already in the
|
|
# subscriptions list. The user cannot add it again or else it
|
|
# will cause problems when updating and deleting the entry.
|
|
# FIXME: address should be primary key in this case
|
|
if _in_group_already(address, group):
|
|
return False
|
|
sqlExecute(
|
|
"INSERT INTO %s VALUES (?,?,?)" % group, label, address, enabled)
|
|
return True
|
|
|
|
|
|
def put_blacklist(label, address):
|
|
"""Put address into blacklist"""
|
|
return put_addresslist(label, address, "blacklist")
|
|
|
|
|
|
def put_subscriptions(label, address, enabled=True):
|
|
"""Put address into subscriptions"""
|
|
return put_addresslist(label, address, "subscriptions", enabled)
|
|
|
|
|
|
def put_addressbook(label, address):
|
|
"""Put address into Addressbook"""
|
|
# First we must check to see if the address is already in the
|
|
# address book. The user cannot add it again or else it will
|
|
# cause problems when updating and deleting the entry.
|
|
if _in_group_already(address):
|
|
return False
|
|
sqlExecute("INSERT INTO addressbook VALUES (?,?)", label, address)
|
|
return True
|
|
|
|
|
|
def get_subscriptions():
|
|
"""Generator for Subscriptions"""
|
|
queryreturn = sqlQuery(
|
|
"SELECT label, address FROM subscriptions WHERE enabled=1")
|
|
for row in queryreturn:
|
|
yield row
|
|
|
|
|
|
def get_addressbook():
|
|
"""Generator for Addressbook"""
|
|
queryreturn = sqlQuery("SELECT * FROM addressbook")
|
|
for row in queryreturn:
|
|
yield row
|
|
|
|
|
|
def get_addresslist(group="blacklist"):
|
|
"""Generator for address list given by group arg"""
|
|
if group not in _groups:
|
|
return
|
|
queryreturn = sqlQuery("SELECT * FROM %s" % group)
|
|
for row in queryreturn:
|
|
yield row
|
|
|
|
|
|
def get_label(address, group="addressbook"):
|
|
"""
|
|
Get address label from address list given by group arg
|
|
(default is addressbook)
|
|
"""
|
|
if group not in _groups:
|
|
return
|
|
queryreturn = sqlQuery(
|
|
"SELECT label FROM %s WHERE address=?" % group, address)
|
|
try:
|
|
return unicode(queryreturn[-1][0], 'utf-8')
|
|
except IndexError:
|
|
pass
|
|
|
|
|
|
def set_label(address, label, group="addressbook"):
|
|
"""Set address label in the address list given by group arg"""
|
|
if group not in _groups:
|
|
return
|
|
sqlExecute("UPDATE %s set label=? WHERE address=?" % group, label, address)
|
|
|
|
|
|
def get_message(msgid):
|
|
"""Get inbox message by msgid"""
|
|
queryreturn = sqlQuery("SELECT message FROM inbox WHERE msgid=?", msgid)
|
|
try:
|
|
return queryreturn[-1][0]
|
|
except IndexError:
|
|
return ''
|