From c2756ce72c05c78f1ed3cdb5f0b1ea0b0507bbfa Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 3 Oct 2024 13:04:12 -0300 Subject: [PATCH 01/10] feat: capture xml2rfc output on exception --- ietf/submit/utils.py | 76 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 11 deletions(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index c814b84657..fc368eebc6 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -17,6 +17,7 @@ from shutil import move from typing import Optional, Union # pyflakes:ignore from unidecode import unidecode +from xml2rfc import RfcWriterError from xym import xym from django.conf import settings @@ -919,7 +920,18 @@ def accept_submission_requires_group_approval(submission): class SubmissionError(Exception): """Exception for errors during submission processing""" - pass + + +class XmlRfcError(SubmissionError): + """SubmissionError caused by xml2rfc + + Includes the output from xml2rfc, if any, in xml2rfc_stdout / xml2rfc_stderr + """ + def __init__(self, *args, xml2rfc_stdout: str, xml2rfc_stderr: str): + super().__init__(*args) + self.xml2rfc_stderr = xml2rfc_stderr + self.xml2rfc_stdout = xml2rfc_stdout + class InconsistentRevisionError(SubmissionError): """SubmissionError caused by an inconsistent revision""" @@ -937,27 +949,55 @@ def render_missing_formats(submission): If a txt file already exists, leaves it in place. Overwrites an existing html file if there is one. """ - xml2rfc.log.write_out = io.StringIO() # open(os.devnull, "w") - xml2rfc.log.write_err = io.StringIO() # open(os.devnull, "w") + # Capture stdio/stdout from xml2rfc + xml2rfc_stdout = io.StringIO() + xml2rfc_stderr = io.StringIO() + xml2rfc.log.write_out = xml2rfc_stdout + xml2rfc.log.write_err = xml2rfc_stderr xml_path = staging_path(submission.name, submission.rev, '.xml') parser = xml2rfc.XmlRfcParser(str(xml_path), quiet=True) - # --- Parse the xml --- - xmltree = parser.parse(remove_comments=False) + try: + # --- Parse the xml --- + xmltree = parser.parse(remove_comments=False) + except Exception as err: + raise XmlRfcError( + "Error parsing XML", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) from err # If we have v2, run it through v2v3. Keep track of the submitted version, though. xmlroot = xmltree.getroot() xml_version = xmlroot.get('version', '2') if xml_version == '2': v2v3 = xml2rfc.V2v3XmlWriter(xmltree) - xmltree.tree = v2v3.convert2to3() + try: + xmltree.tree = v2v3.convert2to3() + except Exception as err: + raise XmlRfcError( + "Error converting v2 XML to v3", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) from err # --- Prep the xml --- today = date_today() prep = xml2rfc.PrepToolWriter(xmltree, quiet=True, liberal=True, keep_pis=[xml2rfc.V3_PI_TARGET]) prep.options.accept_prepped = True prep.options.date = today - xmltree.tree = prep.prep() - if xmltree.tree == None: - raise SubmissionError(f'Error from xml2rfc (prep): {prep.errors}') + try: + xmltree.tree = prep.prep() + except RfcWriterError: + raise XmlRfcError( + f"Error during xml2rfc prep: {prep.errors}", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) + except Exception as err: + raise XmlRfcError( + "Unexpected error during xml2rfc prep", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) from err # --- Convert to txt --- txt_path = staging_path(submission.name, submission.rev, '.txt') @@ -965,7 +1005,14 @@ def render_missing_formats(submission): writer = xml2rfc.TextWriter(xmltree, quiet=True) writer.options.accept_prepped = True writer.options.date = today - writer.write(txt_path) + try: + writer.write(txt_path) + except Exception as err: + raise XmlRfcError( + "Error generating text format from XML", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) from err log.log( 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( str(xml_path.parent), @@ -980,7 +1027,14 @@ def render_missing_formats(submission): html_path = staging_path(submission.name, submission.rev, '.html') writer = xml2rfc.HtmlWriter(xmltree, quiet=True) writer.options.date = today - writer.write(str(html_path)) + try: + writer.write(str(html_path)) + except Exception as err: + raise XmlRfcError( + "Error generating HTML format from XML", + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), + ) from err log.log( 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( str(xml_path.parent), From 46c2cdada905a90ec268e64d6145be2e442c4323 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 3 Oct 2024 14:44:25 -0300 Subject: [PATCH 02/10] fix: chain exception properly --- ietf/submit/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index fc368eebc6..778f91b63f 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -1317,7 +1317,7 @@ def process_submission_text(filename, revision): def process_and_validate_submission(submission): """Process and validate a submission - Raises SubmissionError if an error is encountered. + Raises SubmissionError or a subclass if an error is encountered. """ if len(set(submission.file_types.split(",")).intersection({".xml", ".txt"})) == 0: raise SubmissionError("Require XML and/or text format to process an Internet-Draft submission.") @@ -1386,11 +1386,11 @@ def process_and_validate_submission(submission): raise SubmissionError('Checks failed: ' + ' / '.join(errors)) except SubmissionError: raise # pass SubmissionErrors up the stack - except Exception: + except Exception as err: # convert other exceptions into SubmissionErrors log.log(f'Unexpected exception while processing submission {submission.pk}.') log.log(traceback.format_exc()) - raise SubmissionError('A system error occurred while processing the submission.') + raise SubmissionError('A system error occurred while processing the submission.') from err def submitter_is_author(submission): From 959c54d30733a4a3df7ed0250fef347ed6f03a08 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 3 Oct 2024 15:06:10 -0300 Subject: [PATCH 03/10] feat: log xml2rfc stderr/stdout May want to pass these back to the submitter, but let's watch them to see what sorts of sanitizing we should do first. --- ietf/submit/utils.py | 60 +++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 778f91b63f..c545dca417 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -11,45 +11,44 @@ import sys import time import traceback -import xml2rfc - from pathlib import Path from shutil import move from typing import Optional, Union # pyflakes:ignore -from unidecode import unidecode -from xml2rfc import RfcWriterError -from xym import xym +import xml2rfc from django.conf import settings +from django.contrib.auth.models import AnonymousUser from django.core.exceptions import ValidationError -from django.core.validators import validate_email +from django.core.validators import validate_email from django.db import transaction -from django.http import HttpRequest # pyflakes:ignore -from django.utils.module_loading import import_string -from django.contrib.auth.models import AnonymousUser +from django.http import HttpRequest # pyflakes:ignore from django.utils import timezone +from django.utils.module_loading import import_string +from unidecode import unidecode +from xml2rfc import RfcWriterError +from xym import xym -import debug # pyflakes:ignore - -from ietf.doc.models import ( Document, State, DocEvent, SubmissionDocEvent, - DocumentAuthor, AddedMessageEvent ) +from ietf.community.utils import update_name_contains_indexes_with_new_doc +from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request +from ietf.doc.models import (Document, State, DocEvent, SubmissionDocEvent, + DocumentAuthor, AddedMessageEvent) from ietf.doc.models import NewRevisionDocEvent from ietf.doc.models import RelatedDocument, DocRelationshipName, DocExtResource from ietf.doc.utils import (add_state_change_event, rebuild_reference_relations, - set_replaces_for_document, prettify_std_name, update_doc_extresources, - can_edit_docextresources, update_documentauthors, update_action_holders, - bibxml_for_draft ) -from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request + set_replaces_for_document, prettify_std_name, update_doc_extresources, + can_edit_docextresources, update_documentauthors, update_action_holders, + bibxml_for_draft) from ietf.group.models import Group from ietf.ietfauth.utils import has_role from ietf.name.models import StreamName, FormalLanguageName from ietf.person.models import Person, Email -from ietf.community.utils import update_name_contains_indexes_with_new_doc -from ietf.submit.mail import ( announce_to_lists, announce_new_version, announce_to_authors, - send_approval_request, send_submission_confirmation, announce_new_wg_00, send_manual_post_request ) +from ietf.person.name import unidecode_name from ietf.submit.checkers import DraftYangChecker -from ietf.submit.models import ( Submission, SubmissionEvent, Preapproval, DraftSubmissionStateName, - SubmissionCheck, SubmissionExtResource ) +from ietf.submit.mail import (announce_to_lists, announce_new_version, announce_to_authors, + send_approval_request, send_submission_confirmation, announce_new_wg_00, + send_manual_post_request) +from ietf.submit.models import (Submission, SubmissionEvent, Preapproval, DraftSubmissionStateName, + SubmissionCheck, SubmissionExtResource) from ietf.utils import log from ietf.utils.accesstoken import generate_random_key from ietf.utils.draft import PlaintextDraft @@ -57,7 +56,6 @@ from ietf.utils.text import parse_unicode, normalize_text from ietf.utils.timezone import date_today from ietf.utils.xmldraft import XMLDraft -from ietf.person.name import unidecode_name def validate_submission(submission): @@ -1010,8 +1008,8 @@ def render_missing_formats(submission): except Exception as err: raise XmlRfcError( "Error generating text format from XML", - xml2rfc_stdout=xml2rfc_stdout.getvalue(), - xml2rfc_stderr=xml2rfc_stderr.getvalue(), + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), ) from err log.log( 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( @@ -1327,7 +1325,16 @@ def process_and_validate_submission(submission): # Parse XML first, if we have it if ".xml" in submission.file_types: xml_metadata = process_submission_xml(submission.name, submission.rev) - render_missing_formats(submission) # makes HTML and text, unless text was uploaded + try: + render_missing_formats(submission) # makes HTML and text, unless text was uploaded + except XmlRfcError as err: + # log stdio/stderr + log.log( + f"xml2rfc failure when rendering missing formats for {submission.name}-{submission.rev}:\n" + f">> stdout:\n{err.xml2rfc_stdout}\n" + f">> stderr:\n{err.xml2rfc_stderr}" + ) + raise # Parse text, whether uploaded or generated from XML text_metadata = process_submission_text(submission.name, submission.rev) @@ -1482,6 +1489,7 @@ def process_uploaded_submission(submission): create_submission_event(None, submission, desc="Uploaded submission (diverted to manual process)") send_manual_post_request(None, submission, errors=dict(consistency=str(consistency_error))) except SubmissionError as err: + # something generic went wrong submission.refresh_from_db() # guard against incomplete changes in submission validation / processing cancel_submission(submission) # changes Submission.state create_submission_event(None, submission, f"Submission rejected: {err}") From d573ef939acd81bf5d80aa0b69dc173b3c8aa420 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 16 Oct 2024 13:25:00 -0300 Subject: [PATCH 04/10] Revert "feat: log xml2rfc stderr/stdout" This reverts commit 959c54d30733a4a3df7ed0250fef347ed6f03a08. --- ietf/submit/utils.py | 60 +++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 34 deletions(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index c545dca417..778f91b63f 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -11,44 +11,45 @@ import sys import time import traceback +import xml2rfc + from pathlib import Path from shutil import move from typing import Optional, Union # pyflakes:ignore +from unidecode import unidecode +from xml2rfc import RfcWriterError +from xym import xym -import xml2rfc from django.conf import settings -from django.contrib.auth.models import AnonymousUser from django.core.exceptions import ValidationError -from django.core.validators import validate_email +from django.core.validators import validate_email from django.db import transaction -from django.http import HttpRequest # pyflakes:ignore -from django.utils import timezone +from django.http import HttpRequest # pyflakes:ignore from django.utils.module_loading import import_string -from unidecode import unidecode -from xml2rfc import RfcWriterError -from xym import xym +from django.contrib.auth.models import AnonymousUser +from django.utils import timezone -from ietf.community.utils import update_name_contains_indexes_with_new_doc -from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request -from ietf.doc.models import (Document, State, DocEvent, SubmissionDocEvent, - DocumentAuthor, AddedMessageEvent) +import debug # pyflakes:ignore + +from ietf.doc.models import ( Document, State, DocEvent, SubmissionDocEvent, + DocumentAuthor, AddedMessageEvent ) from ietf.doc.models import NewRevisionDocEvent from ietf.doc.models import RelatedDocument, DocRelationshipName, DocExtResource from ietf.doc.utils import (add_state_change_event, rebuild_reference_relations, - set_replaces_for_document, prettify_std_name, update_doc_extresources, - can_edit_docextresources, update_documentauthors, update_action_holders, - bibxml_for_draft) + set_replaces_for_document, prettify_std_name, update_doc_extresources, + can_edit_docextresources, update_documentauthors, update_action_holders, + bibxml_for_draft ) +from ietf.doc.mails import send_review_possibly_replaces_request, send_external_resource_change_request from ietf.group.models import Group from ietf.ietfauth.utils import has_role from ietf.name.models import StreamName, FormalLanguageName from ietf.person.models import Person, Email -from ietf.person.name import unidecode_name +from ietf.community.utils import update_name_contains_indexes_with_new_doc +from ietf.submit.mail import ( announce_to_lists, announce_new_version, announce_to_authors, + send_approval_request, send_submission_confirmation, announce_new_wg_00, send_manual_post_request ) from ietf.submit.checkers import DraftYangChecker -from ietf.submit.mail import (announce_to_lists, announce_new_version, announce_to_authors, - send_approval_request, send_submission_confirmation, announce_new_wg_00, - send_manual_post_request) -from ietf.submit.models import (Submission, SubmissionEvent, Preapproval, DraftSubmissionStateName, - SubmissionCheck, SubmissionExtResource) +from ietf.submit.models import ( Submission, SubmissionEvent, Preapproval, DraftSubmissionStateName, + SubmissionCheck, SubmissionExtResource ) from ietf.utils import log from ietf.utils.accesstoken import generate_random_key from ietf.utils.draft import PlaintextDraft @@ -56,6 +57,7 @@ from ietf.utils.text import parse_unicode, normalize_text from ietf.utils.timezone import date_today from ietf.utils.xmldraft import XMLDraft +from ietf.person.name import unidecode_name def validate_submission(submission): @@ -1008,8 +1010,8 @@ def render_missing_formats(submission): except Exception as err: raise XmlRfcError( "Error generating text format from XML", - xml2rfc_stdout=xml2rfc_stdout.getvalue(), - xml2rfc_stderr=xml2rfc_stderr.getvalue(), + xml2rfc_stdout=xml2rfc_stdout.getvalue(), + xml2rfc_stderr=xml2rfc_stderr.getvalue(), ) from err log.log( 'In %s: xml2rfc %s generated %s from %s (version %s)' % ( @@ -1325,16 +1327,7 @@ def process_and_validate_submission(submission): # Parse XML first, if we have it if ".xml" in submission.file_types: xml_metadata = process_submission_xml(submission.name, submission.rev) - try: - render_missing_formats(submission) # makes HTML and text, unless text was uploaded - except XmlRfcError as err: - # log stdio/stderr - log.log( - f"xml2rfc failure when rendering missing formats for {submission.name}-{submission.rev}:\n" - f">> stdout:\n{err.xml2rfc_stdout}\n" - f">> stderr:\n{err.xml2rfc_stderr}" - ) - raise + render_missing_formats(submission) # makes HTML and text, unless text was uploaded # Parse text, whether uploaded or generated from XML text_metadata = process_submission_text(submission.name, submission.rev) @@ -1489,7 +1482,6 @@ def process_uploaded_submission(submission): create_submission_event(None, submission, desc="Uploaded submission (diverted to manual process)") send_manual_post_request(None, submission, errors=dict(consistency=str(consistency_error))) except SubmissionError as err: - # something generic went wrong submission.refresh_from_db() # guard against incomplete changes in submission validation / processing cancel_submission(submission) # changes Submission.state create_submission_event(None, submission, f"Submission rejected: {err}") From a3039644d9cd7ae4cf371c985a50ad23347db74c Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 16 Oct 2024 13:28:28 -0300 Subject: [PATCH 05/10] feat: log xml2rfc stderr/stdout This time without reformatting all the imports --- ietf/submit/utils.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 778f91b63f..6a3f5a5b4b 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -1327,7 +1327,16 @@ def process_and_validate_submission(submission): # Parse XML first, if we have it if ".xml" in submission.file_types: xml_metadata = process_submission_xml(submission.name, submission.rev) - render_missing_formats(submission) # makes HTML and text, unless text was uploaded + try: + render_missing_formats(submission) # makes HTML and text, unless text was uploaded + except XmlRfcError as err: + # log stdio/stderr + log.log( + f"xml2rfc failure when rendering missing formats for {submission.name}-{submission.rev}:\n" + f">> stdout:\n{err.xml2rfc_stdout}\n" + f">> stderr:\n{err.xml2rfc_stderr}" + ) + raise # Parse text, whether uploaded or generated from XML text_metadata = process_submission_text(submission.name, submission.rev) @@ -1482,6 +1491,7 @@ def process_uploaded_submission(submission): create_submission_event(None, submission, desc="Uploaded submission (diverted to manual process)") send_manual_post_request(None, submission, errors=dict(consistency=str(consistency_error))) except SubmissionError as err: + # something generic went wrong submission.refresh_from_db() # guard against incomplete changes in submission validation / processing cancel_submission(submission) # changes Submission.state create_submission_event(None, submission, f"Submission rejected: {err}") From 5038873267e78e0b2d6688f5031575883e58d56a Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 17 Oct 2024 10:13:48 -0300 Subject: [PATCH 06/10] feat: path sanitization for submission errors --- ietf/submit/utils.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 6a3f5a5b4b..a9c78b60c5 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -919,7 +919,39 @@ def accept_submission_requires_group_approval(submission): class SubmissionError(Exception): - """Exception for errors during submission processing""" + """Exception for errors during submission processing + + Sanitizes paths appearing in exception messages. + """ + def __init__(self, *args): + if len(args) > 0: + args = (self.sanitize_message(args[0]), *args[1:]) + super().__init__(*args) + + @staticmethod + def sanitize_message(msg): + # Paths likely to appear in submission-related errors + paths = [ + p for p in ( + getattr(settings, "ALL_ID_DOWNLOAD_DIR", None), + getattr(settings, "BIBXML_BASE_PATH", None), + getattr(settings, "DERIVED_DIR", None), + getattr(settings, "FTP_DIR", None), + getattr(settings, "IDSUBMIT_REPOSITORY_PATH", None), + getattr(settings, "IDSUBMIT_STAGING_PATH", None), + getattr(settings, "INTERNET_ALL_DRAFTS_ARCHIVE_DIR", None), + getattr(settings, "INTERNET_DRAFT_PATH", None), + getattr(settings, "INTERNET_DRAFT_ARCHIVE_DIR", None), + getattr(settings, "INTERNET_DRAFT_PDF_PATH", None), + getattr(settings, "RFC_PATH", None), + getattr(settings, "SUBMIT_YANG_CATALOG_MODEL_DIR", None), + getattr(settings, "SUBMIT_YANG_DRAFT_MODEL_DIR", None), + getattr(settings, "SUBMIT_YANG_IANA_MODEL_DIR", None), + getattr(settings, "SUBMIT_YANG_RFC_MODEL_DIR", None), + "/tmp/", + ) if p is not None + ] + return re.sub(fr"{'|'.join(paths)}/?", "**/", msg) class XmlRfcError(SubmissionError): From 6a046cb43fa1481cb9e27990b06d6c5c23e8d832 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 17 Oct 2024 10:36:37 -0300 Subject: [PATCH 07/10] fix: parentheses in regex --- ietf/submit/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index a9c78b60c5..e03185f3a9 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -951,7 +951,7 @@ def sanitize_message(msg): "/tmp/", ) if p is not None ] - return re.sub(fr"{'|'.join(paths)}/?", "**/", msg) + return re.sub(fr"({'|'.join(paths)})/*", "**/", msg) class XmlRfcError(SubmissionError): From be56f08e3fa19843c65e7db26ade285255c7bcd1 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 17 Oct 2024 10:46:31 -0300 Subject: [PATCH 08/10] test: test SubmissionError sanitization --- ietf/submit/tests.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index ed28c7ef02..a7da4d21fa 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -3384,3 +3384,26 @@ def test_apply_yang_checker_to_draft(self): apply_yang_checker_to_draft(checker, draft) self.assertEqual(checker.check_file_txt.call_args, mock.call(draft.get_file_name())) + +@override_settings(IDSUBMIT_REPOSITORY_PATH="/some/path/", IDSUBMIT_STAGING_PATH="/some/other/path") +class SubmissionErrorTests(TestCase): + def test_sanitize_message(self): + sanitized = SubmissionError.sanitize_message( + "This refers to /some/path/with-a-file\n" + "and also /some/other/path/with-a-different-file isn't that neat?\n" + "and has /some/path//////with-slashes" + ) + self.assertEqual( + sanitized, + "This refers to **/with-a-file\n" + "and also **/with-a-different-file isn't that neat?\n" + "and has **/with-slashes" + ) + + @mock.patch.object(SubmissionError, "sanitize_message") + def test_submissionerror(self, mock_sanitize_message): + SubmissionError() + self.assertFalse(mock_sanitize_message.called) + SubmissionError("hi") + self.assertTrue(mock_sanitize_message.called) + self.assertEqual(mock_sanitize_message.call_args, mock.call("hi")) From 305ebcbb087482a0d8e01606d559d9b4c22a12a3 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 17 Oct 2024 10:50:49 -0300 Subject: [PATCH 09/10] style: consolidate imports --- ietf/submit/tests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index a7da4d21fa..f87de9ab0d 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -27,11 +27,6 @@ from django.utils.encoding import force_str import debug # pyflakes:ignore -from ietf.submit.utils import (expirable_submissions, expire_submission, find_submission_filenames, - post_submission, validate_submission_name, validate_submission_rev, - process_and_accept_uploaded_submission, SubmissionError, process_submission_text, - process_submission_xml, process_uploaded_submission, - process_and_validate_submission) from ietf.doc.factories import (DocumentFactory, WgDraftFactory, IndividualDraftFactory, ReviewFactory, WgRfcFactory) from ietf.doc.models import ( Document, DocEvent, State, @@ -49,7 +44,12 @@ from ietf.submit.forms import SubmissionBaseUploadForm, SubmissionAutoUploadForm from ietf.submit.models import Submission, Preapproval, SubmissionExtResource from ietf.submit.tasks import cancel_stale_submissions, process_and_accept_uploaded_submission_task -from ietf.submit.utils import apply_yang_checker_to_draft, run_all_yang_model_checks +from ietf.submit.utils import (expirable_submissions, expire_submission, find_submission_filenames, + post_submission, validate_submission_name, validate_submission_rev, + process_and_accept_uploaded_submission, SubmissionError, process_submission_text, + process_submission_xml, process_uploaded_submission, + process_and_validate_submission, apply_yang_checker_to_draft, + run_all_yang_model_checks) from ietf.utils import tool_version from ietf.utils.accesstoken import generate_access_token from ietf.utils.mail import outbox, get_payload_text From 98d733b166a0cc3dc321e7d1021ac6f0204b4338 Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Thu, 17 Oct 2024 13:07:07 -0300 Subject: [PATCH 10/10] fix: apply sanitization to all args --- ietf/submit/tests.py | 7 +++++-- ietf/submit/utils.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index f87de9ab0d..21ed6672df 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -3404,6 +3404,9 @@ def test_sanitize_message(self): def test_submissionerror(self, mock_sanitize_message): SubmissionError() self.assertFalse(mock_sanitize_message.called) - SubmissionError("hi") + SubmissionError("hi", "there") self.assertTrue(mock_sanitize_message.called) - self.assertEqual(mock_sanitize_message.call_args, mock.call("hi")) + self.assertCountEqual( + mock_sanitize_message.call_args_list, + [mock.call("hi"), mock.call("there")], + ) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index e03185f3a9..e6cbcb12f7 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -925,7 +925,7 @@ class SubmissionError(Exception): """ def __init__(self, *args): if len(args) > 0: - args = (self.sanitize_message(args[0]), *args[1:]) + args = (self.sanitize_message(arg) for arg in args) super().__init__(*args) @staticmethod