|
1 | 1 | # Copyright The IETF Trust 2013-2020, All Rights Reserved
|
2 | 2 | # -*- coding: utf-8 -*-
|
3 | 3 |
|
4 |
| - |
5 |
| -import re |
6 |
| -import email |
7 |
| -import base64 |
8 | 4 | import os
|
9 |
| -import pyzmail |
10 | 5 |
|
11 | 6 | from django.conf import settings
|
12 | 7 | from django.urls import reverse as urlreverse
|
13 |
| -from django.core.exceptions import ValidationError |
14 | 8 | from django.contrib.sites.models import Site
|
15 | 9 | from django.template.loader import render_to_string
|
16 |
| -from django.utils.encoding import force_str |
17 | 10 |
|
18 | 11 | import debug # pyflakes:ignore
|
19 | 12 |
|
20 |
| -from ietf.utils.log import log |
21 | 13 | from ietf.utils.mail import send_mail, send_mail_message
|
22 | 14 | from ietf.doc.models import Document
|
23 |
| -from ietf.ipr.mail import utc_from_string |
24 | 15 | from ietf.person.models import Person
|
25 |
| -from ietf.message.models import Message, MessageAttachment |
| 16 | +from ietf.message.models import Message |
26 | 17 | from ietf.utils.accesstoken import generate_access_token
|
27 |
| -from ietf.mailtrigger.utils import gather_address_lists, get_base_submission_message_address |
28 |
| -from ietf.submit.models import SubmissionEmailEvent, Submission |
| 18 | +from ietf.mailtrigger.utils import gather_address_lists |
29 | 19 | from ietf.submit.checkers import DraftIdnitsChecker
|
30 |
| -from ietf.utils.timezone import date_today |
31 | 20 |
|
32 | 21 |
|
33 | 22 | def send_submission_confirmation(request, submission, chair_notice=False):
|
@@ -196,181 +185,3 @@ def announce_to_authors(request, submission):
|
196 | 185 | 'group': group},
|
197 | 186 | cc=cc)
|
198 | 187 |
|
199 |
| - |
200 |
| -def get_reply_to(): |
201 |
| - """Returns a new reply-to address for use with an outgoing message. This is an |
202 |
| - address with "plus addressing" using a random string. Guaranteed to be unique""" |
203 |
| - local,domain = get_base_submission_message_address().split('@') |
204 |
| - while True: |
205 |
| - rand = force_str(base64.urlsafe_b64encode(os.urandom(12))) |
206 |
| - address = "{}+{}@{}".format(local,rand,domain) |
207 |
| - q = Message.objects.filter(reply_to=address) |
208 |
| - if not q: |
209 |
| - return address |
210 |
| - |
211 |
| - |
212 |
| -def process_response_email(msg): |
213 |
| - """Saves an incoming message. msg=string. Message "To" field is expected to |
214 |
| - be in the format ietf-submit+[identifier]@ietf.org. Expect to find a message with |
215 |
| - a matching value in the reply_to field, associated to a submission. |
216 |
| - Create a Message object for the incoming message and associate it to |
217 |
| - the original message via new SubmissionEvent""" |
218 |
| - message = email.message_from_string(force_str(msg)) |
219 |
| - to = message.get('To') |
220 |
| - |
221 |
| - # exit if this isn't a response we're interested in (with plus addressing) |
222 |
| - local,domain = get_base_submission_message_address().split('@') |
223 |
| - if not re.match(r'^{}\+[a-zA-Z0-9_\-]{}@{}'.format(local,'{16}',domain),to): |
224 |
| - return None |
225 |
| - |
226 |
| - try: |
227 |
| - to_message = Message.objects.get(reply_to=to) |
228 |
| - except Message.DoesNotExist: |
229 |
| - log('Error finding matching message ({})'.format(to)) |
230 |
| - return None |
231 |
| - |
232 |
| - try: |
233 |
| - submission = to_message.manualevents.first().submission |
234 |
| - except: |
235 |
| - log('Error processing message ({})'.format(to)) |
236 |
| - return None |
237 |
| - |
238 |
| - if not submission: |
239 |
| - log('Error processing message - no submission ({})'.format(to)) |
240 |
| - return None |
241 |
| - |
242 |
| - parts = pyzmail.parse.get_mail_parts(message) |
243 |
| - body='' |
244 |
| - for part in parts: |
245 |
| - if part.is_body == 'text/plain' and part.disposition == None: |
246 |
| - payload, used_charset = pyzmail.decode_text(part.get_payload(), part.charset, None) |
247 |
| - body = body + payload + '\n' |
248 |
| - |
249 |
| - by = Person.objects.get(name="(System)") |
250 |
| - msg = submit_message_from_message(message, body, by) |
251 |
| - |
252 |
| - desc = "Email: received message - manual post - {}-{}".format( |
253 |
| - submission.name, |
254 |
| - submission.rev) |
255 |
| - |
256 |
| - submission_email_event = SubmissionEmailEvent.objects.create( |
257 |
| - submission = submission, |
258 |
| - desc = desc, |
259 |
| - msgtype = 'msgin', |
260 |
| - by = by, |
261 |
| - message = msg, |
262 |
| - in_reply_to = to_message |
263 |
| - ) |
264 |
| - |
265 |
| - save_submission_email_attachments(submission_email_event, parts) |
266 |
| - |
267 |
| - log("Received submission email from %s" % msg.frm) |
268 |
| - return msg |
269 |
| - |
270 |
| - |
271 |
| -def add_submission_email(request, remote_ip, name, rev, submission_pk, message, by, msgtype): |
272 |
| - """Add email to submission history""" |
273 |
| - |
274 |
| - #in_reply_to = form.cleaned_data['in_reply_to'] |
275 |
| - # create Message |
276 |
| - parts = pyzmail.parse.get_mail_parts(message) |
277 |
| - body='' |
278 |
| - for part in parts: |
279 |
| - if part.is_body == 'text/plain' and part.disposition == None: |
280 |
| - payload, used_charset = pyzmail.decode_text(part.get_payload(), part.charset, None) |
281 |
| - body = body + payload + '\n' |
282 |
| - |
283 |
| - msg = submit_message_from_message(message, body, by) |
284 |
| - |
285 |
| - if (submission_pk != None): |
286 |
| - # Must exist - we're adding a message to an existing submission |
287 |
| - submission = Submission.objects.get(pk=submission_pk) |
288 |
| - else: |
289 |
| - # Must not exist |
290 |
| - submissions = Submission.objects.filter(name=name,rev=rev).exclude(state_id='cancel') |
291 |
| - if submissions.count() > 0: |
292 |
| - raise ValidationError("Submission {} already exists".format(name)) |
293 |
| - |
294 |
| - # create Submission using the name |
295 |
| - try: |
296 |
| - submission = Submission.objects.create( |
297 |
| - state_id="waiting-for-draft", |
298 |
| - remote_ip=remote_ip, |
299 |
| - name=name, |
300 |
| - rev=rev, |
301 |
| - title=name, |
302 |
| - note="", |
303 |
| - submission_date=date_today(), |
304 |
| - replaces="", |
305 |
| - ) |
306 |
| - from ietf.submit.utils import create_submission_event, docevent_from_submission |
307 |
| - desc = "Submission created for rev {} in response to email".format(rev) |
308 |
| - create_submission_event(request, |
309 |
| - submission, |
310 |
| - desc) |
311 |
| - docevent_from_submission(submission, desc) |
312 |
| - except Exception as e: |
313 |
| - log("Exception: %s\n" % e) |
314 |
| - raise |
315 |
| - |
316 |
| - if msgtype == 'msgin': |
317 |
| - rs = "Received" |
318 |
| - else: |
319 |
| - rs = "Sent" |
320 |
| - |
321 |
| - desc = "{} message - manual post - {}-{}".format(rs, name, rev) |
322 |
| - submission_email_event = SubmissionEmailEvent.objects.create( |
323 |
| - desc = desc, |
324 |
| - submission = submission, |
325 |
| - msgtype = msgtype, |
326 |
| - by = by, |
327 |
| - message = msg) |
328 |
| - #in_reply_to = in_reply_to |
329 |
| - |
330 |
| - save_submission_email_attachments(submission_email_event, parts) |
331 |
| - return submission, submission_email_event |
332 |
| - |
333 |
| - |
334 |
| -def submit_message_from_message(message,body,by=None): |
335 |
| - """Returns a ietf.message.models.Message. msg=email.Message |
336 |
| - A copy of mail.message_from_message with different body handling |
337 |
| - """ |
338 |
| - if not by: |
339 |
| - by = Person.objects.get(name="(System)") |
340 |
| - msg = Message.objects.create( |
341 |
| - by = by, |
342 |
| - subject = message.get('subject',''), |
343 |
| - frm = message.get('from',''), |
344 |
| - to = message.get('to',''), |
345 |
| - cc = message.get('cc',''), |
346 |
| - bcc = message.get('bcc',''), |
347 |
| - reply_to = message.get('reply_to',''), |
348 |
| - body = body, |
349 |
| - time = utc_from_string(message.get('date', '')), |
350 |
| - content_type = message.get('content_type', 'text/plain'), |
351 |
| - ) |
352 |
| - return msg |
353 |
| - |
354 |
| -def save_submission_email_attachments(submission_email_event, parts): |
355 |
| - for part in parts: |
356 |
| - if part.disposition != 'attachment': |
357 |
| - continue |
358 |
| - |
359 |
| - if part.type == 'text/plain': |
360 |
| - payload, used_charset = pyzmail.decode_text(part.get_payload(), |
361 |
| - part.charset, |
362 |
| - None) |
363 |
| - encoding = "" |
364 |
| - else: |
365 |
| - # Need a better approach - for the moment we'll just handle these |
366 |
| - # and encode as base64 |
367 |
| - payload = base64.b64encode(part.get_payload()) |
368 |
| - encoding = "base64" |
369 |
| - |
370 |
| - #name = submission_email_event.submission.name |
371 |
| - |
372 |
| - MessageAttachment.objects.create(message = submission_email_event.message, |
373 |
| - content_type = part.type, |
374 |
| - encoding = encoding, |
375 |
| - filename=part.filename, |
376 |
| - body=payload) |
0 commit comments