From a62e02993287f1da3c0864cb560e6e7e8d71d9a2 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 15 May 2019 18:40:23 +0000 Subject: [PATCH] After feedback from the RFC-Editor staff, changed the URL POST notification of Group name changes to an Email notification. - Legacy-Id: 16210 --- ietf/group/models.py | 79 ++++++++++++++++++++++++---------------- ietf/group/tests_info.py | 2 +- ietf/settings.py | 3 +- 3 files changed, 50 insertions(+), 34 deletions(-) diff --git a/ietf/group/models.py b/ietf/group/models.py index 1fa623b8a..6b58e36bf 100644 --- a/ietf/group/models.py +++ b/ietf/group/models.py @@ -3,14 +3,10 @@ import datetime import email.utils -import json import jsonfield import os import re -import requests -from jwcrypto import jwk, jws -from jwcrypto.common import json_encode from urlparse import urljoin from django.conf import settings @@ -26,7 +22,7 @@ import debug # pyflakes:ignore from ietf.group.colors import fg_group_colors, bg_group_colors from ietf.name.models import GroupStateName, GroupTypeName, DocTagName, GroupMilestoneStateName, RoleName, AgendaTypeName from ietf.person.models import Email, Person -from ietf.utils.mail import formataddr +from ietf.utils.mail import formataddr, send_mail_text from ietf.utils import log from ietf.utils.models import ForeignKey, OneToOneField @@ -367,31 +363,50 @@ def notify_rfceditor_of_group_name_change(sender, instance=None, **kwargs): current = Group.objects.get(pk=instance.pk) except Group.DoesNotExist: return - url = settings.RFC_EDITOR_GROUP_NOTIFICATION_URL - if url and instance.name != current.name: - data = { - 'acronym': current.acronym, - 'old_name': current.name, - 'name': instance.name, - } - # Build signed data - key = jwk.JWK() - key.import_from_pem(settings.API_PRIVATE_KEY_PEM) - payload = json.dumps(data) - jwstoken = jws.JWS(payload.encode('utf-8')) - jwstoken.add_signature(key, None, - json_encode({"alg": settings.API_KEY_TYPE}), - json_encode({"kid": key.thumbprint()})) - sig = jwstoken.serialize() - # Send signed data - response = requests.post(url, data = { 'jws': sig, }) - log.log("Sent notify: %s: '%s' --> '%s' to %s, result code %s" % - (current.acronym, current.name, instance.name, url, response.status_code)) - # Verify locally, to make sure we've got things right - key = jwk.JWK() - key.import_from_pem(settings.API_PUBLIC_KEY_PEM) - jwstoken = jws.JWS() - jwstoken.deserialize(sig) - jwstoken.verify(key) - log.assertion('payload == jwstoken.payload') + addr = settings.RFC_EDITOR_GROUP_NOTIFICATION_EMAIL + if addr and instance.name != current.name: + msg = """ +This is an automated notification of a group name change: + + acronym: %s + old name: %s + new name: %s + + Regards, + + The datatracker +""" % (current.acronym, current.name, instance.name, ) + send_mail_text(None, to=addr, frm=None, subject="Group '%s' name change"%instance.acronym, txt=msg) + log.log("Sent notification email: %s: '%s' --> '%s' to %s" % (current.acronym, current.name, instance.name, addr)) + + +## Keep this code as a worked and tested example of sending signed notifies +## by HTTP POST. (superseded for this use case by email notification) +# url = settings.RFC_EDITOR_GROUP_NOTIFICATION_URL +# if url and instance.name != current.name: +# data = { +# 'acronym': current.acronym, +# 'old_name': current.name, +# 'name': instance.name, +# } +# # Build signed data +# key = jwk.JWK() +# key.import_from_pem(settings.API_PRIVATE_KEY_PEM) +# payload = json.dumps(data) +# jwstoken = jws.JWS(payload.encode('utf-8')) +# jwstoken.add_signature(key, None, +# json_encode({"alg": settings.API_KEY_TYPE}), +# json_encode({"kid": key.thumbprint()})) +# sig = jwstoken.serialize() +# # Send signed data +# response = requests.post(url, data = { 'jws': sig, }) +# log.log("Sent notify: %s: '%s' --> '%s' to %s, result code %s" % +# (current.acronym, current.name, instance.name, url, response.status_code)) +# # Verify locally, to make sure we've got things right +# key = jwk.JWK() +# key.import_from_pem(settings.API_PUBLIC_KEY_PEM) +# jwstoken = jws.JWS() +# jwstoken.deserialize(sig) +# jwstoken.verify(key) +# log.assertion('payload == jwstoken.payload') diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py index c6e7bf186..dcd172e1a 100644 --- a/ietf/group/tests_info.py +++ b/ietf/group/tests_info.py @@ -618,7 +618,7 @@ class GroupEditTests(TestCase): self.assertEqual(group.groupurl_set.all()[0].url, "http://mars.mars") self.assertEqual(group.groupurl_set.all()[0].name, "MARS site") self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)))) - self.assertEqual(len(outbox), 1) + self.assertEqual(len(outbox), 2) self.assertTrue('Personnel change' in outbox[0]['Subject']) for prefix in ['ad1','ad2','aread','marschairman','marsdelegate']: self.assertTrue(prefix+'@' in outbox[0]['To']) diff --git a/ietf/settings.py b/ietf/settings.py index a69dd2912..a0b7ef80a 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -704,7 +704,8 @@ RFC_TEXT_RSYNC_SOURCE="ftp.rfc-editor.org::rfcs-text-only" RFC_EDITOR_SYNC_PASSWORD="secret" RFC_EDITOR_SYNC_NOTIFICATION_URL = "https://www.rfc-editor.org/parser/parser.php" -RFC_EDITOR_GROUP_NOTIFICATION_URL = "https://www.rfc-editor.org/notification/group.php" +RFC_EDITOR_GROUP_NOTIFICATION_EMAIL = "webmaster@rfc-editor.org" +#RFC_EDITOR_GROUP_NOTIFICATION_URL = "https://www.rfc-editor.org/notification/group.php" RFC_EDITOR_QUEUE_URL = "https://www.rfc-editor.org/queue2.xml" RFC_EDITOR_INDEX_URL = "https://www.rfc-editor.org/rfc/rfc-index.xml" RFC_EDITOR_ERRATA_URL = "https://www.rfc-editor.org/errata_search.php?rfc={rfc_number}&rec_status=0"