a3b13b70e2
also improve sorting
222 lines
8.2 KiB
Python
222 lines
8.2 KiB
Python
from PyQt4 import QtCore, QtGui
|
|
|
|
import shared
|
|
import re
|
|
import sys
|
|
import inspect
|
|
from helper_sql import *
|
|
from addresses import decodeAddress
|
|
from foldertree import AccountMixin
|
|
from pyelliptic.openssl import OpenSSL
|
|
from utils import str_broadcast_subscribers
|
|
import time
|
|
|
|
def getSortedAccounts():
|
|
configSections = filter(lambda x: x != 'bitmessagesettings', shared.config.sections())
|
|
configSections.sort(cmp =
|
|
lambda x,y: cmp(unicode(shared.config.get(x, 'label'), 'utf-8').lower(), unicode(shared.config.get(y, 'label'), 'utf-8').lower())
|
|
)
|
|
return configSections
|
|
|
|
def getSortedSubscriptions(count = False):
|
|
queryreturn = sqlQuery('SELECT label, address, enabled FROM subscriptions ORDER BY label COLLATE NOCASE ASC')
|
|
ret = {}
|
|
for row in queryreturn:
|
|
label, address, enabled = row
|
|
ret[address] = {}
|
|
ret[address]["inbox"] = {}
|
|
ret[address]["inbox"]['label'] = label
|
|
ret[address]["inbox"]['enabled'] = enabled
|
|
ret[address]["inbox"]['count'] = 0
|
|
if count:
|
|
queryreturn = sqlQuery('''SELECT fromaddress, folder, count(msgid) as cnt
|
|
FROM inbox, subscriptions
|
|
WHERE read = 0 AND subscriptions.address = inbox.fromaddress
|
|
GROUP BY inbox.fromaddress, folder''')
|
|
for row in queryreturn:
|
|
address, folder, cnt = row
|
|
ret[address][folder]['count'] = cnt
|
|
return ret
|
|
|
|
def accountClass(address):
|
|
if not shared.config.has_section(address):
|
|
if address == str_broadcast_subscribers:
|
|
subscription = BroadcastAccount(address)
|
|
if subscription.type != AccountMixin.BROADCAST:
|
|
return None
|
|
else:
|
|
subscription = SubscriptionAccount(address)
|
|
if subscription.type != AccountMixin.SUBSCRIPTION:
|
|
return None
|
|
return subscription
|
|
try:
|
|
gateway = shared.config.get(address, "gateway")
|
|
for name, cls in inspect.getmembers(sys.modules[__name__], inspect.isclass):
|
|
# obj = g(address)
|
|
if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway:
|
|
return cls(address)
|
|
# general gateway
|
|
return GatewayAccount(address)
|
|
except:
|
|
pass
|
|
# no gateway
|
|
return BMAccount(address)
|
|
|
|
class AccountColor(AccountMixin):
|
|
def __init__(self, address, type = None):
|
|
self.isEnabled = True
|
|
self.address = address
|
|
if type is None:
|
|
if address is None:
|
|
self.type = AccountMixin.ALL
|
|
elif shared.safeConfigGetBoolean(self.address, 'mailinglist'):
|
|
self.type = AccountMixin.MAILINGLIST
|
|
elif shared.safeConfigGetBoolean(self.address, 'chan'):
|
|
self.type = AccountMixin.CHAN
|
|
elif sqlQuery(
|
|
'''select label from subscriptions where address=?''', self.address):
|
|
self.type = AccountMixin.SUBSCRIPTION
|
|
else:
|
|
self.type = AccountMixin.NORMAL
|
|
else:
|
|
self.type = type
|
|
|
|
|
|
class BMAccount(object):
|
|
def __init__(self, address = None):
|
|
self.address = address
|
|
self.type = 'normal'
|
|
if shared.config.has_section(address):
|
|
if shared.safeConfigGetBoolean(self.address, 'chan'):
|
|
self.type = AccountMixin.CHAN
|
|
elif shared.safeConfigGetBoolean(self.address, 'mailinglist'):
|
|
self.type = AccountMixin.MAILINGLIST
|
|
elif self.address == str_broadcast_subscribers:
|
|
self.type = AccountMixin.BROADCAST
|
|
else:
|
|
queryreturn = sqlQuery(
|
|
'''select label from subscriptions where address=?''', self.address)
|
|
if queryreturn:
|
|
self.type = AccountMixin.SUBSCRIPTION
|
|
|
|
def getLabel(self, address = None):
|
|
if address is None:
|
|
address = self.address
|
|
label = address
|
|
if shared.config.has_section(address):
|
|
label = shared.config.get(address, 'label')
|
|
queryreturn = sqlQuery(
|
|
'''select label from addressbook where address=?''', address)
|
|
if queryreturn != []:
|
|
for row in queryreturn:
|
|
label, = row
|
|
else:
|
|
queryreturn = sqlQuery(
|
|
'''select label from subscriptions where address=?''', address)
|
|
if queryreturn != []:
|
|
for row in queryreturn:
|
|
label, = row
|
|
return label
|
|
|
|
def parseMessage(self, toAddress, fromAddress, subject, message):
|
|
self.toAddress = toAddress
|
|
self.fromAddress = fromAddress
|
|
self.subject = subject
|
|
self.message = message
|
|
self.fromLabel = self.getLabel(fromAddress)
|
|
self.toLabel = self.getLabel(toAddress)
|
|
|
|
|
|
class SubscriptionAccount(BMAccount):
|
|
pass
|
|
|
|
|
|
class BroadcastAccount(BMAccount):
|
|
pass
|
|
|
|
|
|
class GatewayAccount(BMAccount):
|
|
gatewayName = None
|
|
def __init__(self, address):
|
|
super(BMAccount, self).__init__(address)
|
|
|
|
def send(self):
|
|
status, addressVersionNumber, streamNumber, ripe = decodeAddress(self.toAddress)
|
|
ackdata = OpenSSL.rand(32)
|
|
t = ()
|
|
sqlExecute(
|
|
'''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
|
|
'',
|
|
self.toAddress,
|
|
ripe,
|
|
self.fromAddress,
|
|
self.subject,
|
|
self.message,
|
|
ackdata,
|
|
int(time.time()), # sentTime (this will never change)
|
|
int(time.time()), # lastActionTime
|
|
0, # sleepTill time. This will get set when the POW gets done.
|
|
'msgqueued',
|
|
0, # retryNumber
|
|
'sent', # folder
|
|
2, # encodingtype
|
|
shared.config.getint('bitmessagesettings', 'ttl')
|
|
)
|
|
|
|
shared.workerQueue.put(('sendmessage', self.toAddress))
|
|
|
|
def parseMessage(self, toAddress, fromAddress, subject, message):
|
|
super(BMAccount, self).parseMessage(toAddress, fromAddress, subject, message)
|
|
|
|
class MailchuckAccount(GatewayAccount):
|
|
# set "gateway" in keys.dat to this
|
|
gatewayName = "mailchuck"
|
|
registrationAddress = "BM-2cVYYrhaY5Gbi3KqrX9Eae2NRNrkfrhCSA"
|
|
unregistrationAddress = "BM-2cVMAHTRjZHCTPMue75XBK5Tco175DtJ9J"
|
|
relayAddress = "BM-2cWim8aZwUNqxzjMxstnUMtVEUQJeezstf"
|
|
regExpIncoming = re.compile("(.*)MAILCHUCK-FROM::(\S+) \| (.*)")
|
|
regExpOutgoing = re.compile("(\S+) (.*)")
|
|
def __init__(self, address):
|
|
super(GatewayAccount, self).__init__(address)
|
|
|
|
def createMessage(self, toAddress, fromAddress, subject, message):
|
|
self.subject = toAddress + " " + subject
|
|
self.toAddress = self.relayAddress
|
|
self.fromAddress = fromAddress
|
|
self.message = message
|
|
|
|
def register(self, email):
|
|
self.toAddress = self.registrationAddress
|
|
self.subject = email
|
|
self.message = ""
|
|
self.fromAddress = self.address
|
|
self.send()
|
|
|
|
def unregister(self):
|
|
self.toAddress = self.unregistrationAddress
|
|
self.subject = ""
|
|
self.message = ""
|
|
self.fromAddress = self.address
|
|
self.send()
|
|
|
|
def parseMessage(self, toAddress, fromAddress, subject, message):
|
|
super(GatewayAccount, self).parseMessage(toAddress, fromAddress, subject, message)
|
|
if fromAddress == self.relayAddress:
|
|
matches = self.regExpIncoming.search(subject)
|
|
if not matches is None:
|
|
self.subject = ""
|
|
if not matches.group(1) is None:
|
|
self.subject += matches.group(1)
|
|
if not matches.group(3) is None:
|
|
self.subject += matches.group(3)
|
|
if not matches.group(2) is None:
|
|
self.fromLabel = matches.group(2)
|
|
self.fromAddress = matches.group(2)
|
|
if toAddress == self.relayAddress:
|
|
matches = self.regExpOutgoing.search(subject)
|
|
if not matches is None:
|
|
if not matches.group(2) is None:
|
|
self.subject = matches.group(2)
|
|
if not matches.group(1) is None:
|
|
self.toLabel = matches.group(1)
|
|
self.toAddress = matches.group(1) |