summaryrefslogtreecommitdiff
path: root/tests/test_protection.py
blob: 70c1a57377ac0ff6834e445ecd5ede2fcfc7b77a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import six
from base64 import b64encode
from email.parser import Parser
from zope.interface import implementer

from memoryhole import protect, ProtectConfig, IOpenPGP


FROM = "me@domain.com"
TO = "you@other.com"
SUBJECT = "some subject"
BODY = "body text"
EMAIL = """From: %(from)s
To: %(to)s
Subject: %(subject)s

%(body)s
""" % {
    "from": FROM,
    "to": TO,
    "subject": SUBJECT,
    "body": BODY
}

parser = Parser()


def test_pgp_encrypted_mime():
    msg = parser.parsestr(EMAIL)
    encrypter = Encrypter()
    conf = ProtectConfig(openpgp=encrypter, obscured_headers=[])
    encmsg = protect(msg, config=conf)

    assert encmsg.get_payload(1).get_payload() == encrypter.encstr
    assert [TO] == encrypter.encraddr
    assert encmsg.get_content_type() == "multipart/encrypted"
    assert get_body(encrypter.data) == BODY + '\n'


def test_unobscured_headers():
    msg = parser.parsestr(EMAIL)
    encrypter = Encrypter()
    conf = ProtectConfig(openpgp=encrypter, obscured_headers=[])
    encmsg = protect(msg, config=conf)

    assert encmsg['from'] == FROM
    assert encmsg['to'] == TO
    assert encmsg['subject'] == SUBJECT


def test_obscured_headers():
    msg = parser.parsestr(EMAIL)
    encrypter = Encrypter()
    conf = ProtectConfig(openpgp=encrypter)
    encmsg = protect(msg, config=conf)

    for header, value in conf.obscured_headers.items():
        msgheaders = encmsg.get_all(header, [])
        if msgheaders:
            assert msgheaders == [value]

    encpart = parser.parsestr(encrypter.data)
    assert encpart.get_content_type() == "multipart/mixed"

    rfc822part = encpart.get_payload(0)
    assert rfc822part.get_content_type() == "text/rfc822-headers"

    rfc822body = "Subject: %s\n" % (SUBJECT,)
    assert rfc822part.get_payload() == rfc822body
    assert encpart.get_payload(1).get_payload() == BODY+'\n'


def test_pgp_signed_mime():
    msg = parser.parsestr(EMAIL)
    signer = Signer()
    conf = ProtectConfig(openpgp=signer)
    encmsg = protect(msg, encrypt=False, config=conf)

    b64body = b64encode(six.b(BODY+'\n'))
    assert six.b(encmsg.get_payload(0).get_payload()) == b64body
    assert encmsg.get_payload(1).get_payload() == signer.signature
    assert get_body(signer.data) == b64body.decode('utf-8')
    assert encmsg.get_content_type() == "multipart/signed"


def test_signed_headers():
    msg = parser.parsestr(EMAIL)
    signer = Signer()
    conf = ProtectConfig(openpgp=signer)
    signmsg = protect(msg, encrypt=False, config=conf)

    assert signmsg['from'] == FROM
    assert signmsg['to'] == TO
    assert signmsg['subject'] == SUBJECT

    signedpart = signmsg.get_payload(0)
    assert signedpart['from'] == FROM
    assert signedpart['to'] == TO
    assert signedpart['subject'] == SUBJECT


def get_body(data):
    return parser.parsestr(data).get_payload()


@implementer(IOpenPGP)
class Encrypter(object):
    encstr = "this is encrypted"

    def encrypt(self, data, encraddr):
        self.data = data
        self.encraddr = encraddr
        return self.encstr


@implementer(IOpenPGP)
class Signer(object):
    signature = "this is a signature"

    def sign(self, data):
        self.data = data
        return self.signature