* fix: close open things * fix: clean up test created files * fix: remove one close too many
152 lines
5.5 KiB
Python
152 lines
5.5 KiB
Python
# Copyright The IETF Trust 2012-2020, All Rights Reserved
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import io
|
|
import tempfile
|
|
import os
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.core.files import File
|
|
from django.core.files.storage import FileSystemStorage
|
|
from django.conf import settings
|
|
|
|
import debug # pyflakes:ignore
|
|
|
|
from ietf.group.models import Group, ChangeStateGroupEvent
|
|
from ietf.nomcom.models import NomCom, Position, Nominee
|
|
from ietf.person.models import Email, Person
|
|
from ietf.utils.pipe import pipe
|
|
from ietf.utils.test_data import create_person
|
|
|
|
COMMUNITY_USER = 'plain'
|
|
CHAIR_USER = 'nomcomchair'
|
|
MEMBER_USER = 'nomcommember'
|
|
SECRETARIAT_USER = 'secretary'
|
|
EMAIL_DOMAIN = '@example.com'
|
|
NOMCOM_YEAR = "2013"
|
|
|
|
POSITIONS = [
|
|
"GEN",
|
|
"APP",
|
|
"INT",
|
|
"OAM",
|
|
"OPS",
|
|
"RAI",
|
|
"RTG",
|
|
"SEC",
|
|
"TSV",
|
|
"IAB",
|
|
"IAOC"
|
|
]
|
|
|
|
|
|
def generate_cert():
|
|
"""Function to generate cert"""
|
|
config = b"""
|
|
[ req ]
|
|
distinguished_name = req_distinguished_name
|
|
string_mask = utf8only
|
|
x509_extensions = ss_v3_ca
|
|
|
|
[ req_distinguished_name ]
|
|
commonName = Common Name (e.g., NomComYY)
|
|
commonName_default = NomCom12
|
|
|
|
[ ss_v3_ca ]
|
|
|
|
subjectKeyIdentifier = hash
|
|
keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment
|
|
basicConstraints = critical, CA:true
|
|
subjectAltName = email:nomcom12@ietf.org
|
|
extendedKeyUsage= emailProtection"""
|
|
|
|
config_file = tempfile.NamedTemporaryFile(delete=False)
|
|
privatekey_file = tempfile.NamedTemporaryFile(delete=False)
|
|
cert_file = tempfile.NamedTemporaryFile(delete=False)
|
|
|
|
config_file.write(config)
|
|
config_file.close()
|
|
|
|
command = "%s req -config %s -x509 -new -newkey rsa:2048 -sha256 -days 730 -nodes \
|
|
-keyout %s -out %s -batch"
|
|
code, out, error = pipe(command % (settings.OPENSSL_COMMAND,
|
|
config_file.name,
|
|
privatekey_file.name,
|
|
cert_file.name))
|
|
privatekey_file.close()
|
|
cert_file.close()
|
|
return cert_file, privatekey_file
|
|
|
|
|
|
def check_comments(encryped, plain, privatekey_file):
|
|
encrypted_file = tempfile.NamedTemporaryFile(delete=False)
|
|
encrypted_file.write(encryped)
|
|
encrypted_file.close()
|
|
|
|
# to decrypt comments was encryped and check they are equal to the plain comments
|
|
decrypted_file = tempfile.NamedTemporaryFile(delete=False)
|
|
command = "%s smime -decrypt -in %s -out %s -inkey %s"
|
|
code, out, error = pipe(command % (settings.OPENSSL_COMMAND,
|
|
encrypted_file.name,
|
|
decrypted_file.name,
|
|
privatekey_file.name))
|
|
|
|
decrypted_file.close()
|
|
encrypted_file.close()
|
|
with io.open(decrypted_file.name, 'rb') as fd:
|
|
decrypted_comments = fd.read().decode('utf-8')
|
|
os.unlink(encrypted_file.name)
|
|
os.unlink(decrypted_file.name)
|
|
|
|
return decrypted_comments == plain
|
|
|
|
nomcom_test_cert_file = None
|
|
|
|
def nomcom_test_data():
|
|
# groups
|
|
group, created = Group.objects.get_or_create(name='IAB/IESG Nominating Committee 2013/2014',
|
|
state_id='active',
|
|
type_id='nomcom',
|
|
acronym='nomcom%s' % NOMCOM_YEAR)
|
|
|
|
nomcom, created = NomCom.objects.get_or_create(group=group)
|
|
|
|
global nomcom_test_cert_file
|
|
if not nomcom_test_cert_file:
|
|
nomcom_test_cert_file, privatekey_file = generate_cert()
|
|
|
|
nomcom.public_key.storage = FileSystemStorage(location=settings.NOMCOM_PUBLIC_KEYS_DIR)
|
|
with io.open(nomcom_test_cert_file.name, 'r') as fd:
|
|
nomcom.public_key.save('cert', File(fd))
|
|
|
|
# chair and member
|
|
create_person(group, "chair", username=CHAIR_USER, email_address='%s%s'%(CHAIR_USER,EMAIL_DOMAIN))
|
|
create_person(group, "member", username=MEMBER_USER, email_address='%s%s'%(MEMBER_USER,EMAIL_DOMAIN))
|
|
|
|
# nominee
|
|
u, created = User.objects.get_or_create(username=COMMUNITY_USER)
|
|
if created:
|
|
u.set_password(COMMUNITY_USER+"+password")
|
|
u.save()
|
|
plainman, _ = Person.objects.get_or_create(name="Plain Man", ascii="Plain Man", user=u)
|
|
email = Email.objects.filter(address="plain@example.com", person=plainman).first()
|
|
if not email:
|
|
email = Email.objects.create(address="plain@example.com", person=plainman, origin=u.username)
|
|
nominee, _ = Nominee.objects.get_or_create(email=email, nomcom=nomcom)
|
|
|
|
# positions
|
|
for name in POSITIONS:
|
|
position, created = Position.objects.get_or_create(nomcom=nomcom,
|
|
name=name,
|
|
is_open=True,
|
|
accepting_nominations=True,
|
|
accepting_feedback=True,
|
|
is_iesg_position=POSITIONS.index(name) < 9)
|
|
|
|
ChangeStateGroupEvent.objects.get_or_create(group=group,
|
|
type="changed_state",
|
|
state_id="active",
|
|
time=group.time,
|
|
by=Person.objects.all()[0])
|