def worker(self,incoming=False,outgoing=False,register=False,crypto=False, once=False,dryrun=False,send=True,period=0): import time, celery, socket, ssl from kombu import Connection from idapi.mails import save_mail, send_mails, get_mails, process_crypto, process_register if not (incoming or outgoing or register or crypto): raise CommandError('nothing to do') conn = dummy_context() if settings.BROKER_URL and incoming: if settings.USE_CELERY: conn = celery.current_app.pool.acquire(timeout=1) else: conn = Connection(settings.BROKER_URL,ssl=settings.BROKER_USE_SSL) imap, smtp = {}, {} # connection cache last_time = 0 with conn as conn: self.connection = conn while not self.terminated: towait = period - (time.time() - last_time) if towait>0: time.sleep(towait) last_time = time.time() if incoming: get_mails(joint=True,connections=imap,notify=conn) if outgoing: send_mails(joint=True,connections=smtp) if register: process_register() if crypto: process_crypto(notify=conn) if once: break
def worker(self, incoming=False, outgoing=False, register=False, crypto=False, once=False, dryrun=False, send=True, period=0): import time, celery, socket, ssl from kombu import Connection from idapi.mails import save_mail, send_mails, get_mails, process_crypto, process_register if not (incoming or outgoing or register or crypto): raise CommandError('nothing to do') conn = dummy_context() if settings.BROKER_URL and incoming: if settings.USE_CELERY: conn = celery.current_app.pool.acquire(timeout=1) else: conn = Connection(settings.BROKER_URL, ssl=settings.BROKER_USE_SSL) imap, smtp = {}, {} # connection cache last_time = 0 with conn as conn: self.connection = conn while not self.terminated: towait = period - (time.time() - last_time) if towait > 0: time.sleep(towait) last_time = time.time() if incoming: get_mails(joint=True, connections=imap, notify=conn) if outgoing: send_mails(joint=True, connections=smtp) if register: process_register() if crypto: process_crypto(notify=conn) if once: break
def test_registerkey(request,accounts,mails,bilateral,defect): from accounts.models import Account from idapi.models import Message, PublicKey from idapi.mails import gnupg_init, get_mails, send_mails, update_keyrings, process_register import email.mime.text from kryptomime import create_mail from kryptomime.pgp import find_gnupg_key import tempfile home = tempfile.mkdtemp() gpg = gnupg_init(home) update_keyrings(debug_gpg=gpg,debug_import=bilateral['gpg1']) user = accounts['member1'] id1, id2 = bilateral['id1'], bilateral['id2'] key1 = find_gnupg_key(bilateral['gpg1'],sender) key2 = find_gnupg_key(bilateral['gpg2'],receiver) server, imapsend, imaprecv = mails # id1=register, id2=member1 if defect=='unknown': # unknown sender, should be rejected unknown = 'unknown@localhost' imapbad = server.add_account(unknown,keep=False) msg = create_mail(unknown,sender,'register','register') elif defect=='nokey': # known sender, but forget key/signing msg = create_mail(receiver,sender,'register','register') else: # known sender, return confirmation request attach = id2.pubkey_attachment(key2) msg = create_mail(receiver,sender,'register','register',attach=[attach]) assert server.send(msg) assert len(imapsend)==1 get_mails(joint=True,debug=server,debug_gpg=gpg,keep=False) process_register(debug_gpg=gpg) send_mails(joint=True,debug=server,debug_gpg=gpg) if defect=='unknown': assert len(imapbad)==1 for mail, flags in imapbad: mail, verified, result = id2.decrypt(mail,strict=False) assert mail and result assert not result['encrypted'] and result['signed'] and result['fingerprints']==[key1] #print mail # assert key1 attached return return #FIXME assert len(imaprecv)==1 msg = None for mail, flags in imaprecv: mail, verified, result = id2.decrypt(mail,strict=False) assert mail and result assert result['signed'] and result['fingerprints']==[key1] assert bool(result['encrypted']) == (defect!='nokey') #print mail msg = mail # assert key1 attached if defect=='nokey': return if defect=='badcode': reply = create_mail(receiver,sender,'confirmation','bad code') else: body = msg.get_payload() reply = '> '+'> '.join(body.splitlines(True)) reply = create_mail(receiver,sender,'Re: '+mail['subject'],reply) reply = id2.encrypt(reply,sign=True) assert server.send(reply) assert len(imapsend)==1 get_mails(joint=True,debug=server,debug_gpg=gpg,keep=False) process_register(debug_gpg=gpg) send_mails(joint=True,debug=server,debug_gpg=gpg) assert len(imaprecv)==1 for mail, flags in imaprecv: mail, verified, result = id2.decrypt(mail,strict=False) assert mail and result assert result['encrypted'] and result['signed'] and result['fingerprints']==[key1] #print mail msg = mail # assert key1 attached if defect=='badcode': return if defect!='unverified': key = user.publickeys.get(active=True) key.trust=PublicKey.TRUSTED key.save() msg = create_mail(receiver,sender,'test','test') msg = id2.encrypt(msg,sign=True) assert server.send(reply) assert len(imapsend)==1 get_mails(joint=True,debug=server,debug_gpg=gpg,keep=False) # check verified = CONFIRMED/TRUST/... # verifiyed key, receive return
def test_receive(request, accounts, tokens, mails, bilateral, client, defect): from accounts.models import Account from idapi.models import Message, PublicKey from idapi.mails import get_mails, update_keyrings import email.mime.text, six from kryptomime import create_mail, protect_mail from kryptomime.pgp import find_gnupg_key user = accounts['member1'] token = tokens['member1'] #update_keyrings() id1, id2 = bilateral['id1'], bilateral['id2'] key1 = find_gnupg_key(bilateral['gpg1'], sender) key2 = find_gnupg_key(bilateral['gpg2'], receiver) livemail = request.config.getoption('livemail') if livemail: server = mails else: server, imapsend, imaprecv = mails if not livemail: assert not len(imapsend) and not len(imaprecv) user.publickeys.create(active=True, keytype=PublicKey.PGP, trust=PublicKey.TRUSTED) key1 = find_gnupg_key(bilateral['gpg1'], sender) key2 = find_gnupg_key(bilateral['gpg2'], receiver) attachment = email.mime.text.MIMEText('some\nattachment') msg = create_mail(receiver, sender, 'subject', 'body\nmessage', attach=[attachment]) msg = protect_mail(msg, linesep='\r\n') assert server.send(msg) if not livemail: assert len(imapsend) == 1 and not len(imaprecv) sgn, _ = id2.sign(msg, inline=True, verify=True) assert sgn and id1.analyze(sgn) == (False, True) assert server.send(sgn) if not livemail: assert len(imapsend) == 2 and not len(imaprecv) enc, _ = id2.encrypt(msg, sign=True, inline=False) assert enc and id1.analyze(enc) == (True, None) assert server.send(enc) if not livemail: assert len(imapsend) == 3 and not len(imaprecv) """ for mail, flags in imapsend: mtype = id1.analyze(mail) if mtype != (False,False): if mtype == (False,True): verified, result = id1.verify(mail) mail = id1.strip_signature(mail)[0] mail = protect_mail(mail,linesep='\r\n') else: #if mtype == (True,None): mail, verified, result = id1.decrypt(mail) assert mail and verified and result assert result['signed'] and result['fingerprints']==[key2] assert result['encrypted']==(mtype != (False,True)) else: mail = protect_mail(mail,linesep='\r\n') compare_mail(msg,mail) assert not len(imapsend) and not len(imaprecv) """ get_mails(joint=True, debug=None if livemail else server, debug_gpg=bilateral['gpg1'], keep=False) if not livemail: assert not len(imapsend) and not len(imaprecv) response, out = api(client, 'user/mails/', token=token) assert response.status_code == 200 todo = [(False, False), (True, False), (True, True)] for mid in out['items']: response, out = api(client, 'user/mails/%i/' % mid, token=token) assert response.status_code == 200 parts = out['parts'] assert out['subject'] == 'subject' and len(parts) == 2 signed, encrypted = out['signed'], out['encrypted'] contents = ['body\r\nmessage', 'some\r\nattachment'] assert parts[0] == { 'content': contents[0], 'content-charset': 'us-ascii', 'content-type': 'text/plain', 'content-encoding': '7bit' } assert parts[1] == { 'content': contents[1], 'content-charset': 'us-ascii', 'content-type': 'text/plain', 'content-encoding': '7bit' } todo.remove((signed, encrypted)) if signed: assert out['verified'] == 'trusted' #print out assert not todo if livemail: server.close()