|
| 1 | +import os |
| 2 | +import tempfile |
| 3 | + |
| 4 | +from django.conf import settings |
1 | 5 | from django.test import TestCase |
2 | 6 | from django.db import IntegrityError |
3 | 7 | from django.core.urlresolvers import reverse |
| 8 | +from django.core.files import File |
4 | 9 |
|
5 | 10 | from ietf.utils.test_utils import login_testing_unauthorized |
| 11 | +from ietf.utils.pipe import pipe |
6 | 12 | from ietf.nomcom.test_data import nomcom_test_data |
7 | | -from ietf.nomcom.models import NomineePosition, Position, Nominee, NomineePositionState |
| 13 | +from ietf.nomcom.models import NomineePosition, Position, Nominee, \ |
| 14 | + NomineePositionState, Feedback, FeedbackType |
8 | 15 |
|
9 | 16 |
|
10 | | -class NomcomTest(TestCase): |
| 17 | +class NomcomViewsTest(TestCase): |
11 | 18 | """Tests to create a new nomcom""" |
12 | 19 | fixtures = ['names', 'nomcom_templates'] |
13 | 20 |
|
@@ -78,3 +85,90 @@ def test_nomine_position_unique(self): |
78 | 85 | nominee_position = NomineePosition(position=position, nominee=self.nominee) |
79 | 86 |
|
80 | 87 | self.assertRaises(IntegrityError, nominee_position.save) |
| 88 | + |
| 89 | + |
| 90 | +class FeedbackTest(TestCase): |
| 91 | + fixtures = ['names', 'nomcom_templates'] |
| 92 | + |
| 93 | + def setUp(self): |
| 94 | + nomcom_test_data() |
| 95 | + self.generate_cert() |
| 96 | + |
| 97 | + def generate_cert(self): |
| 98 | + """Function to generate cert""" |
| 99 | + config = """ |
| 100 | + [ req ] |
| 101 | + distinguished_name = req_distinguished_name |
| 102 | + string_mask = utf8only |
| 103 | + x509_extensions = ss_v3_ca |
| 104 | +
|
| 105 | + [ req_distinguished_name ] |
| 106 | + commonName = Common Name (e.g., NomComYY) |
| 107 | + commonName_default = NomCom12 |
| 108 | +
|
| 109 | + [ ss_v3_ca ] |
| 110 | +
|
| 111 | + subjectKeyIdentifier = hash |
| 112 | + keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment |
| 113 | + basicConstraints = critical, CA:true |
| 114 | + subjectAltName = email:nomcom12@ietf.org |
| 115 | + extendedKeyUsage= emailProtection""" |
| 116 | + |
| 117 | + self.config_file = tempfile.NamedTemporaryFile(delete=False) |
| 118 | + self.privatekey_file = tempfile.NamedTemporaryFile(delete=False) |
| 119 | + self.cert_file = tempfile.NamedTemporaryFile(delete=False) |
| 120 | + |
| 121 | + self.config_file.write(config) |
| 122 | + self.config_file.close() |
| 123 | + |
| 124 | + command = "%s req -config %s -x509 -new -newkey rsa:2048 -sha256 -days 730 -nodes \ |
| 125 | + -keyout %s -out %s -batch" |
| 126 | + code, out, error = pipe(command % (settings.OPENSSL_COMMAND, |
| 127 | + self.config_file.name, |
| 128 | + self.privatekey_file.name, |
| 129 | + self.cert_file.name)) |
| 130 | + self.privatekey_file.close() |
| 131 | + self.cert_file.close() |
| 132 | + |
| 133 | + def test_encrypted_comments(self): |
| 134 | + |
| 135 | + nominee = Nominee.objects.get(email__address="plain@example.com") |
| 136 | + position = Position.objects.get(name='OAM') |
| 137 | + nomcom = position.nomcom |
| 138 | + |
| 139 | + # save the cert file in tmp |
| 140 | + nomcom.public_key.storage.location = tempfile.gettempdir() |
| 141 | + nomcom.public_key.save('cert', File(open(self.cert_file.name, 'r'))) |
| 142 | + |
| 143 | + comments = 'plain text' |
| 144 | + feedback = Feedback.objects.create(position=position, |
| 145 | + nominee=nominee, |
| 146 | + comments=comments, |
| 147 | + type=FeedbackType.objects.get(slug='nomina')) |
| 148 | + |
| 149 | + # to check feedback comments are saved like enrypted data |
| 150 | + self.assertNotEqual(feedback.comments, comments) |
| 151 | + |
| 152 | + encrypted_file = tempfile.NamedTemporaryFile(delete=False) |
| 153 | + encrypted_file.write(feedback.comments) |
| 154 | + encrypted_file.close() |
| 155 | + |
| 156 | + # to decrypt comments was encryped and check they are equal to the plain comments |
| 157 | + decrypted_file = tempfile.NamedTemporaryFile(delete=False) |
| 158 | + command = "%s smime -decrypt -in %s -out %s -inkey %s" |
| 159 | + code, out, error = pipe(command % (settings.OPENSSL_COMMAND, |
| 160 | + encrypted_file.name, |
| 161 | + decrypted_file.name, |
| 162 | + self.privatekey_file.name)) |
| 163 | + |
| 164 | + decrypted_file.close() |
| 165 | + encrypted_file.close() |
| 166 | + |
| 167 | + self.assertEqual(open(decrypted_file.name, 'r').read(), comments) |
| 168 | + |
| 169 | + # delete tmps |
| 170 | + os.unlink(self.config_file.name) |
| 171 | + os.unlink(self.privatekey_file.name) |
| 172 | + os.unlink(self.cert_file.name) |
| 173 | + os.unlink(encrypted_file.name) |
| 174 | + os.unlink(decrypted_file.name) |
0 commit comments