Skip to content

Commit f8113cb

Browse files
authored
fix: close open things (ietf-tools#5593)
* fix: close open things * fix: clean up test created files * fix: remove one close too many
1 parent 9fa5427 commit f8113cb

13 files changed

Lines changed: 156 additions & 111 deletions

File tree

ietf/doc/tests_bofreq.py

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -320,22 +320,26 @@ def test_submit(self):
320320
file = NamedTemporaryFile(delete=False,mode="w+",encoding='utf-8')
321321
file.write(f'# {username}')
322322
file.close()
323-
for postdict in [
324-
{'bofreq_submission':'enter','bofreq_content':f'# {username}'},
325-
{'bofreq_submission':'upload','bofreq_file':open(file.name,'rb')},
326-
]:
327-
docevent_count = doc.docevent_set.count()
328-
empty_outbox()
329-
r = self.client.post(url, postdict)
330-
self.assertEqual(r.status_code, 302)
331-
doc = reload_db_objects(doc)
332-
self.assertEqual('%02d'%(int(rev)+1) ,doc.rev)
333-
self.assertEqual(f'# {username}', doc.text())
334-
self.assertEqual(docevent_count+1, doc.docevent_set.count())
335-
self.assertEqual(1, len(outbox))
336-
rev = doc.rev
323+
try:
324+
with open(file.name, 'rb') as bofreq_fd:
325+
for postdict in [
326+
{'bofreq_submission':'enter','bofreq_content':f'# {username}'},
327+
{'bofreq_submission':'upload','bofreq_file':bofreq_fd},
328+
]:
329+
docevent_count = doc.docevent_set.count()
330+
empty_outbox()
331+
r = self.client.post(url, postdict)
332+
self.assertEqual(r.status_code, 302)
333+
doc = reload_db_objects(doc)
334+
self.assertEqual('%02d'%(int(rev)+1) ,doc.rev)
335+
self.assertEqual(f'# {username}', doc.text())
336+
self.assertEqual(docevent_count+1, doc.docevent_set.count())
337+
self.assertEqual(1, len(outbox))
338+
rev = doc.rev
339+
finally:
340+
os.unlink(file.name)
341+
337342
self.client.logout()
338-
os.unlink(file.name)
339343

340344
def test_start_new_bofreq(self):
341345
url = urlreverse('ietf.doc.views_bofreq.new_bof_request')
@@ -350,25 +354,28 @@ def test_start_new_bofreq(self):
350354
file = NamedTemporaryFile(delete=False,mode="w+",encoding='utf-8')
351355
file.write('some stuff')
352356
file.close()
353-
for postdict in [
354-
dict(title='title one', bofreq_submission='enter', bofreq_content='some stuff'),
355-
dict(title='title two', bofreq_submission='upload', bofreq_file=open(file.name,'rb')),
356-
]:
357-
empty_outbox()
358-
r = self.client.post(url, postdict)
359-
self.assertEqual(r.status_code,302)
360-
name = f"bofreq-{xslugify(nobody.last_name())[:64]}-{postdict['title']}".replace(' ','-')
361-
bofreq = Document.objects.filter(name=name,type_id='bofreq').first()
362-
self.assertIsNotNone(bofreq)
363-
self.assertIsNotNone(DocAlias.objects.filter(name=name).first())
364-
self.assertEqual(bofreq.title, postdict['title'])
365-
self.assertEqual(bofreq.rev, '00')
366-
self.assertEqual(bofreq.get_state_slug(), 'proposed')
367-
self.assertEqual(list(bofreq_editors(bofreq)), [nobody])
368-
self.assertEqual(bofreq.latest_event(NewRevisionDocEvent).rev, '00')
369-
self.assertEqual(bofreq.text_or_error(), 'some stuff')
370-
self.assertEqual(len(outbox),1)
371-
os.unlink(file.name)
357+
try:
358+
with open(file.name,'rb') as bofreq_fd:
359+
for postdict in [
360+
dict(title='title one', bofreq_submission='enter', bofreq_content='some stuff'),
361+
dict(title='title two', bofreq_submission='upload', bofreq_file=bofreq_fd),
362+
]:
363+
empty_outbox()
364+
r = self.client.post(url, postdict)
365+
self.assertEqual(r.status_code,302)
366+
name = f"bofreq-{xslugify(nobody.last_name())[:64]}-{postdict['title']}".replace(' ','-')
367+
bofreq = Document.objects.filter(name=name,type_id='bofreq').first()
368+
self.assertIsNotNone(bofreq)
369+
self.assertIsNotNone(DocAlias.objects.filter(name=name).first())
370+
self.assertEqual(bofreq.title, postdict['title'])
371+
self.assertEqual(bofreq.rev, '00')
372+
self.assertEqual(bofreq.get_state_slug(), 'proposed')
373+
self.assertEqual(list(bofreq_editors(bofreq)), [nobody])
374+
self.assertEqual(bofreq.latest_event(NewRevisionDocEvent).rev, '00')
375+
self.assertEqual(bofreq.text_or_error(), 'some stuff')
376+
self.assertEqual(len(outbox),1)
377+
finally:
378+
os.unlink(file.name)
372379
existing_bofreq = BofreqFactory(requester_lastname=nobody.last_name())
373380
for postdict in [
374381
dict(title='', bofreq_submission='enter', bofreq_content='some stuff'),

ietf/doc/tests_review.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@ def make_test_mbox_tarball(self, review_req):
499499

500500
tar.add(os.path.relpath(tmp.name))
501501

502+
mbox.close()
503+
502504
return mbox_path
503505

504506
def test_search_mail_archive(self):

ietf/ipr/management/commands/process_email.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@ def add_arguments(self, parser):
2323

2424
def handle(self, *args, **options):
2525
email = options.get('email', None)
26-
binary_input = io.open(email, 'rb') if email else sys.stdin.buffer
27-
self.msg_bytes = binary_input.read()
26+
if email:
27+
binary_input = io.open(email, 'rb')
28+
self.msg_bytes = binary_input.read()
29+
binary_input.close()
30+
else:
31+
self.msg_bytes = sys.stdin.buffer.read()
2832
try:
2933
process_response_email(self.msg_bytes)
3034
except ValueError as e:
@@ -44,4 +48,4 @@ def make_failure_message(self, error, **extra):
4448
'application', 'octet-stream', # mime type
4549
filename='original-message',
4650
)
47-
return msg
51+
return msg

ietf/meeting/tests_views.py

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -894,23 +894,27 @@ def build_session_setup(self):
894894

895895
def test_session_draft_tarfile(self):
896896
session, filenames = self.build_session_setup()
897-
url = urlreverse('ietf.meeting.views.session_draft_tarfile', kwargs={'num':session.meeting.number,'acronym':session.group.acronym})
898-
response = self.client.get(url)
899-
self.assertEqual(response.status_code, 200)
900-
self.assertEqual(response.get('Content-Type'), 'application/octet-stream')
901-
for filename in filenames:
902-
os.unlink(filename)
897+
try:
898+
url = urlreverse('ietf.meeting.views.session_draft_tarfile', kwargs={'num':session.meeting.number,'acronym':session.group.acronym})
899+
response = self.client.get(url)
900+
self.assertEqual(response.status_code, 200)
901+
self.assertEqual(response.get('Content-Type'), 'application/octet-stream')
902+
finally:
903+
for filename in filenames:
904+
os.unlink(filename)
903905

904906
@skipIf(skip_pdf_tests, skip_message)
905907
@skip_coverage
906908
def test_session_draft_pdf(self):
907909
session, filenames = self.build_session_setup()
908-
url = urlreverse('ietf.meeting.views.session_draft_pdf', kwargs={'num':session.meeting.number,'acronym':session.group.acronym})
909-
response = self.client.get(url)
910-
self.assertEqual(response.status_code, 200)
911-
self.assertEqual(response.get('Content-Type'), 'application/pdf')
912-
for filename in filenames:
913-
os.unlink(filename)
910+
try:
911+
url = urlreverse('ietf.meeting.views.session_draft_pdf', kwargs={'num':session.meeting.number,'acronym':session.group.acronym})
912+
response = self.client.get(url)
913+
self.assertEqual(response.status_code, 200)
914+
self.assertEqual(response.get('Content-Type'), 'application/pdf')
915+
finally:
916+
for filename in filenames:
917+
os.unlink(filename)
914918

915919
def test_current_materials(self):
916920
url = urlreverse('ietf.meeting.views.current_materials')
@@ -6411,7 +6415,9 @@ def test_submit_and_approve_multiple_versions(self):
64116415
path = os.path.join(submission.session.meeting.get_materials_path(),'slides')
64126416
filename = os.path.join(path,session.sessionpresentation_set.first().document.name+'-01.txt')
64136417
self.assertTrue(os.path.exists(filename))
6414-
contents = io.open(filename,'r').read()
6418+
fd = io.open(filename, 'r')
6419+
contents = fd.read()
6420+
fd.close()
64156421
self.assertIn('third version', contents)
64166422

64176423

@@ -7946,12 +7952,13 @@ def test_add_proceedings_material_doc(self):
79467952
"""Upload proceedings materials document"""
79477953
meeting = self._procmat_test_meeting()
79487954
for mat_type in ProceedingsMaterialTypeName.objects.filter(used=True):
7949-
mat = self.upload_proceedings_material_test(
7950-
meeting,
7951-
mat_type,
7952-
{'file': self._proceedings_file(), 'external_url': ''},
7953-
)
7954-
self.assertEqual(mat.get_href(), f'{mat.document.name}:00')
7955+
with self._proceedings_file() as fd:
7956+
mat = self.upload_proceedings_material_test(
7957+
meeting,
7958+
mat_type,
7959+
{'file': fd, 'external_url': ''},
7960+
)
7961+
self.assertEqual(mat.get_href(), f'{mat.document.name}:00')
79557962

79567963
def test_add_proceedings_material_doc_invalid_ext(self):
79577964
"""Upload proceedings materials document with disallowed extension"""
@@ -8038,12 +8045,13 @@ def test_replace_proceedings_material(self):
80388045
kwargs=dict(num=meeting.number, material_type=pm_doc.type.slug),
80398046
)
80408047
self.client.login(username='secretary', password='secretary+password')
8041-
r = self.client.post(pm_doc_url, {'file': self._proceedings_file(), 'external_url': ''})
8042-
self.assertRedirects(r, success_url)
8043-
self.assertEqual(meeting.proceedings_materials.count(), 2)
8044-
pm_doc = meeting.proceedings_materials.get(pk=pm_doc.pk) # refresh from DB
8045-
self.assertEqual(pm_doc.document.rev, '01')
8046-
self.assertEqual(pm_doc.get_href(), f'{pm_doc.document.name}:01')
8048+
with self._proceedings_file() as fd:
8049+
r = self.client.post(pm_doc_url, {'file': fd, 'external_url': ''})
8050+
self.assertRedirects(r, success_url)
8051+
self.assertEqual(meeting.proceedings_materials.count(), 2)
8052+
pm_doc = meeting.proceedings_materials.get(pk=pm_doc.pk) # refresh from DB
8053+
self.assertEqual(pm_doc.document.rev, '01')
8054+
self.assertEqual(pm_doc.get_href(), f'{pm_doc.document.name}:01')
80478055

80488056
# Replace the uploaded document with a URL
80498057
r = self.client.post(pm_doc_url, {'use_url': 'on', 'external_url': 'https://example.com/second'})
@@ -8066,12 +8074,13 @@ def test_replace_proceedings_material(self):
80668074
self.assertEqual(pm_url.get_href(), 'https://example.com/third')
80678075

80688076
# Now replace the URL doc with an uploaded file
8069-
r = self.client.post(pm_url_url, {'file': self._proceedings_file(), 'external_url': ''})
8070-
self.assertRedirects(r, success_url)
8071-
self.assertEqual(meeting.proceedings_materials.count(), 2)
8072-
pm_url = meeting.proceedings_materials.get(pk=pm_url.pk) # refresh from DB
8073-
self.assertEqual(pm_url.document.rev, '02')
8074-
self.assertEqual(pm_url.get_href(), f'{pm_url.document.name}:02')
8077+
with self._proceedings_file() as fd:
8078+
r = self.client.post(pm_url_url, {'file': fd, 'external_url': ''})
8079+
self.assertRedirects(r, success_url)
8080+
self.assertEqual(meeting.proceedings_materials.count(), 2)
8081+
pm_url = meeting.proceedings_materials.get(pk=pm_url.pk) # refresh from DB
8082+
self.assertEqual(pm_url.document.rev, '02')
8083+
self.assertEqual(pm_url.get_href(), f'{pm_url.document.name}:02')
80758084

80768085
def test_remove_proceedings_material(self):
80778086
"""Proceedings material can be removed"""

ietf/nomcom/management/commands/feedback_email.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ def handle(self, *args, **options):
4242
except NomCom.DoesNotExist:
4343
raise CommandError("NomCom %s does not exist or it isn't active" % year)
4444

45-
binary_input = io.open(email, 'rb') if email else sys.stdin.buffer
46-
self.msg = binary_input.read()
45+
if email:
46+
with io.open(email, 'rb') as binary_input:
47+
self.msg = binary_input.read()
48+
else:
49+
self.msg = sys.stdin.buffer.read()
4750

4851
try:
4952
feedback = create_feedback_email(self.nomcom, self.msg)

ietf/nomcom/test_data.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ def check_comments(encryped, plain, privatekey_file):
9494

9595
decrypted_file.close()
9696
encrypted_file.close()
97-
decrypted_comments = io.open(decrypted_file.name, 'rb').read().decode('utf-8')
97+
with io.open(decrypted_file.name, 'rb') as fd:
98+
decrypted_comments = fd.read().decode('utf-8')
9899
os.unlink(encrypted_file.name)
99100
os.unlink(decrypted_file.name)
100101

@@ -116,7 +117,8 @@ def nomcom_test_data():
116117
nomcom_test_cert_file, privatekey_file = generate_cert()
117118

118119
nomcom.public_key.storage = FileSystemStorage(location=settings.NOMCOM_PUBLIC_KEYS_DIR)
119-
nomcom.public_key.save('cert', File(io.open(nomcom_test_cert_file.name, 'r')))
120+
with io.open(nomcom_test_cert_file.name, 'r') as fd:
121+
nomcom.public_key.save('cert', File(fd))
120122

121123
# chair and member
122124
create_person(group, "chair", username=CHAIR_USER, email_address='%s%s'%(CHAIR_USER,EMAIL_DOMAIN))

ietf/nomcom/tests.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,8 @@ def nominate_view(self, *args, **kwargs):
715715

716716
# save the cert file in tmp
717717
#nomcom.public_key.storage.location = tempfile.gettempdir()
718-
nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
718+
with io.open(self.cert_file.name, 'r') as fd:
719+
nomcom.public_key.save('cert', File(fd))
719720

720721
response = self.client.get(nominate_url)
721722
self.assertEqual(response.status_code, 200)
@@ -781,7 +782,8 @@ def nominate_newperson_view(self, *args, **kwargs):
781782

782783
# save the cert file in tmp
783784
#nomcom.public_key.storage.location = tempfile.gettempdir()
784-
nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
785+
with io.open(self.cert_file.name, 'r') as fd:
786+
nomcom.public_key.save('cert', File(fd))
785787

786788
response = self.client.get(nominate_url)
787789
self.assertEqual(response.status_code, 200)
@@ -863,7 +865,8 @@ def add_questionnaire(self, *args, **kwargs):
863865

864866
# save the cert file in tmp
865867
#nomcom.public_key.storage.location = tempfile.gettempdir()
866-
nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
868+
with io.open(self.cert_file.name, 'r') as fd:
869+
nomcom.public_key.save('cert', File(fd))
867870

868871
response = self.client.get(self.add_questionnaire_url)
869872
self.assertEqual(response.status_code, 200)
@@ -942,7 +945,8 @@ def feedback_view(self, *args, **kwargs):
942945

943946
# save the cert file in tmp
944947
#nomcom.public_key.storage.location = tempfile.gettempdir()
945-
nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
948+
with io.open(self.cert_file.name, 'r') as fd:
949+
nomcom.public_key.save('cert', File(fd))
946950

947951
response = self.client.get(feedback_url)
948952
self.assertEqual(response.status_code, 200)
@@ -1066,7 +1070,8 @@ def test_encrypted_comments(self):
10661070

10671071
# save the cert file in tmp
10681072
#nomcom.public_key.storage.location = tempfile.gettempdir()
1069-
nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
1073+
with io.open(self.cert_file.name, 'r') as fd:
1074+
nomcom.public_key.save('cert', File(fd))
10701075

10711076
comment_text = 'Plain text. Comments with accents äöåÄÖÅ éáíóú âêîôû ü àèìòù.'
10721077
comments = nomcom.encrypt(comment_text)
@@ -1089,7 +1094,8 @@ def setUp(self):
10891094
self.nomcom = get_nomcom_by_year(NOMCOM_YEAR)
10901095
self.cert_file, self.privatekey_file = get_cert_files()
10911096
#self.nomcom.public_key.storage.location = tempfile.gettempdir()
1092-
self.nomcom.public_key.save('cert', File(io.open(self.cert_file.name, 'r')))
1097+
with io.open(self.cert_file.name, 'r') as fd:
1098+
self.nomcom.public_key.save('cert', File(fd))
10931099

10941100
gen = Position.objects.get(nomcom=self.nomcom,name='GEN')
10951101
rai = Position.objects.get(nomcom=self.nomcom,name='RAI')

ietf/person/views.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,14 @@ def photo(request, email_or_name):
100100
if not size.isdigit():
101101
return HttpResponse("Size must be integer", status=400)
102102
size = int(size)
103-
img = Image.open(person.photo)
104-
img = img.resize((size, img.height*size//img.width))
105-
bytes = BytesIO()
106-
try:
107-
img.save(bytes, format='JPEG')
108-
return HttpResponse(bytes.getvalue(), content_type='image/jpg')
109-
except OSError:
110-
raise Http404
103+
with Image.open(person.photo) as img:
104+
img = img.resize((size, img.height*size//img.width))
105+
bytes = BytesIO()
106+
try:
107+
img.save(bytes, format='JPEG')
108+
return HttpResponse(bytes.getvalue(), content_type='image/jpg')
109+
except OSError:
110+
raise Http404
111111

112112

113113
@role_required("Secretariat")

ietf/review/mailarch.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ def retrieve_messages_from_mbox(mbox_fileobj):
103103
"date": msg["Date"],
104104
"utcdate": (utcdate.date().isoformat(), utcdate.time().isoformat()) if utcdate else ("", ""),
105105
})
106+
mbox.close()
106107

107108
return res
108109

0 commit comments

Comments
 (0)