示例#1
0
    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
示例#2
0
    def worker(self,
               incoming=False,
               outgoing=False,
               register=False,
               crypto=False,
               daemon=False,
               once=False,
               dryrun=False,
               send=True,
               period=0):
        import time
        from idapi.mails import save_mail, send_mails, get_mails, process_crypto, process_register
        global worker_work

        imap, smtp = {}, {}  # connection cache
        last_time = 0
        while worker_work:
            towait = period - (time.time() - last_time)
            if towait > 0: time.sleep(towait)
            last_time = time.time()
            if incoming:
                send_mails(joint=True, connections=imaps)
            if outgoing:
                send_mails(joint=True, connections=smtp)
            if register:
                process_register()
            if crypto:
                process_crypto()
            if once: break
示例#3
0
    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
示例#4
0
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
示例#5
0
def test_send(request, accounts, tokens, mails, bilateral, client, defect):
    from accounts.models import Account
    from idapi.models import Message, PublicKey
    from idapi.mails import send_mails, update_keyrings
    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 = None
    else: server, imapsend, imaprecv = mails

    user.publickeys.create(active=True,
                           keytype=PublicKey.PGP,
                           trust=PublicKey.TRUSTED)

    data = {
        'identity': 'portal',
        'content': {
            'subject': 'hallo1',
            'body': 'foö'
        }
    }
    response, out = api(client, 'user/mails/', 'post', data, token=token)
    assert response.status_code == 200
    data = {
        'identity': 'portal',
        'content': {
            'subject': 'hallo2',
            'body': 'foo'
        },
        'sign': True
    }
    response, out = api(client, 'user/mails/', 'post', data, token=token)
    assert response.status_code == 200
    data = {
        'identity': 'portal',
        'content': {
            'subject': 'hallo3',
            'body': 'foo'
        },
        'sign': True,
        'encrypt': True
    }
    response, out = api(client, 'user/mails/', 'post', data, token=token)
    assert response.status_code == 200

    send_mails(joint=True, debug=server, debug_gpg=bilateral['gpg1'])
    if livemail:
        server.close()
        return
    assert not len(imapsend) and len(imaprecv) == 3
    for mail, flags in imaprecv:
        mail, verified, result = id2.decrypt(mail)
        assert mail and result
        subj = mail.get('subject')
        if subj == 'hallo1':
            assert not result['encrypted'] and not result['signed']
        else:
            assert result['encrypted'] == (
                subj == 'hallo3'
            ) and result['signed'] and result['fingerprints'] == [key1]
示例#6
0
def do_send(attach, request, accounts, apps, tokens, mails, bilateral, client,
            settings, defect):
    from accounts.models import Account
    from idapi.models import Message, PublicKey
    from idapi.mails import send_mails, update_keyrings, send_mail, send_queue
    from rest_framework.exceptions import ValidationError, PermissionDenied, MethodNotAllowed
    from kryptomime.pgp import find_gnupg_key
    from kryptomime.mail import mail_payload
    queue = settings.EMAIL_QUEUE
    user = accounts['member1']
    token = tokens['member1']
    app = apps['portal']
    #update_keyrings()
    id1, id2 = bilateral['id1'], bilateral['id2']
    key1, key2 = bilateral['fingerprints']
    gpg = bilateral['gpg1']
    livemail = request.config.getoption('livemail')
    if livemail: server = None
    else: server, imapsend, imaprecv = mails
    debug = dict(mail=server, gpg=gpg, broker={})

    content = {'subject': 'hallo1', 'body': u'foö'}
    data = {'identity': 'portal', 'content': content, 'acknowledge': True}
    if attach:
        msg = {'content': u'bär', 'content-type': 'text/plain'}
        mfile = {'content': 'foo\r\nbar', 'filename': 'some.txt'}
        data['parts'] = [msg, 'second', mfile]
    else:
        msg = data
    excpt, error, estatus = None, None, None
    if defect == 'client':
        app = apps['debug']
        excpt, estatus = PermissionDenied, 403
    elif defect == 'noid':
        del data['identity']
        excpt, error = ValidationError, 'identity_missing'
    elif defect == 'badid':
        data['identity'] = 'bad'
        excpt, error = ValidationError, 'identity_unknown'
    elif defect == 'idperm':
        data['identity'] = 'register'
        excpt, error = ValidationError, 'identity_not_permitted'
    elif defect == 'nosend':
        data['identity'] = 'voting'
        excpt, estatus = MethodNotAllowed, 405
    elif defect == 'notemplate':
        app = apps['voting']
        data['identity'] = 'voting'
        excpt, error = ValidationError, 'template_not_permitted'
    elif defect == 'template':
        data['template'] = 'bad'
        excpt, error = ValidationError, 'template_unknown'
    elif defect == 'content':
        msg['content'] = ''
        excpt, error = ValidationError, 'content_missing'
    elif defect == 'ctype':
        msg['content-type'] = 'image'
        excpt, error = ValidationError, 'type_error'
    elif defect == 'cparams':
        msg['content-params'] = 'bad'
        excpt, error = ValidationError, 'type_error'
    elif defect == 'charset':
        msg['content-charset'] = 'latin1'
        if attach: msg['content'] = u'fo😃'
        else: content['body'] = u'fo😃'
        excpt, error = ValidationError, 'type_error'
    elif defect == 'encoding':
        msg['content-encoding'] = '7bit'
        excpt, error = ValidationError, 'type_error'
    elif defect == 'sign':
        import copy  # only top-level items are preserved
        settings.EMAIL_IDS = copy.deepcopy(settings.EMAIL_IDS)
        del settings.EMAIL_IDS['portal']['key']
        excpt, error = ValidationError, 'signing'

    if defect == 'encrypt':
        excpt, error = ValidationError, 'pubkey_missing'
    else:
        user.publickeys.create(active=True,
                               keytype=PublicKey.PGP,
                               trust=PublicKey.TRUSTED,
                               fingerprint=key2)

    def sendit(subject, sign, encrypt):
        content['subject'] = subject
        data['sign'], data['encrypt'] = sign, encrypt
        if queue is True:
            response, out = api(client,
                                'user/mails/',
                                'post',
                                data,
                                token=token)
            if not excpt:
                assert response.status_code == 200
            else:
                assert response.status_code == (estatus or 400)
                assert not error or out['error'] == error
        else:
            if not excpt:
                resp = send_mail(data, user, app, debug=debug)
                if queue == 'crypto' and (sign or encrypt):
                    assert resp['status'] == 'queued'
                    send_queue(resp['msgid'], debug=debug)
                    response, out = api(client,
                                        'user/mails/%s/' % resp['msgid'],
                                        token=token)
                    assert response.status_code == 200 and out[
                        'status'] == 'sent'
                    assert out['encrypt'] == encrypt and out['sign'] == sign
                else:
                    assert resp == dict(status='sent')
            else:
                with raises(excpt) as excinfo:
                    resp = send_mail(data, user, app, debug=debug)
                assert not error or excinfo.value.detail['error'] == error

    sendit('hallo1', True, True)
    if excpt: return
    sendit('hallo2', False, False)
    sendit('hallo3', True, False)
    sendit('hallo4', False, True)
    if queue is True:
        send_mails(joint=True, debug=debug)
    if livemail:
        server.close()
        return
    assert not len(imapsend) and len(imaprecv) == 4
    for mail, flags in imaprecv:
        mail, verified, result = id2.decrypt(mail)
        assert mail and result
        subj = mail['subject']
        if attach:
            assert mail_payload(mail) == [
                u'foö', u'bär', u'second', u'foo\r\nbar'
            ]
        else:
            assert mail_payload(mail) == content['body']
        assert result['encrypted'] == (subj in ('hallo1', 'hallo4'))
        assert result['signed'] == (subj in ('hallo1', 'hallo3'))
        if result['signed']: assert result['fingerprints'] == [key1]