Mercurial > p > roundup > code
annotate roundup/mailgw.py @ 5350:66a17c80e035
Force all uses of random to use SystemRandom and abort if
pseudorandom random.Random would be used rather than
Random.SystemRandom.
random.Random is returning the same value time after time. Even when
being seeded after instantiation, calls to the random.random()
function return the same value like it's not advanceing the state of
the generator.
So "fix" is to force use of system random generator to generate:
one time keys for password reset (action.py)
random passwords when resetting passwords (password.py)
serial number for auto ssl cert generation (roundup_server.py)
Message-ID's in email: mailgw.py, client.py
anti-csrf nonces (templating.py)
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 07 Jul 2018 22:02:41 -0400 |
| parents | 57caeefb2f81 |
| children | 91954be46a66 |
| rev | line source |
|---|---|
|
3831
14ec78618bd5
Allow customisation of regular expressions used in email parsing...
Richard Jones <richard@users.sourceforge.net>
parents:
3815
diff
changeset
|
1 # -*- coding: utf-8 -*- |
|
213
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
2 # |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
3 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
4 # This module is free software, and you may redistribute it and/or modify |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
5 # under the same terms as Python, so long as this copyright message and |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
6 # disclaimer are retained in their original form. |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
7 # |
| 214 | 8 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR |
|
213
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
9 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
10 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
11 # POSSIBILITY OF SUCH DAMAGE. |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
12 # |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
13 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
|
406
bdc2ea127ae9
Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
391
diff
changeset
|
18 # |
|
bdc2ea127ae9
Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
391
diff
changeset
|
19 |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1982
diff
changeset
|
20 """An e-mail gateway for Roundup. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
22 Incoming messages are examined for multiple parts: |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
23 . In a multipart/mixed message or part, each subpart is extracted and |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
24 examined. The text/plain subparts are assembled to form the textual |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
25 body of the message, to be stored in the file associated with a "msg" |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
26 class node. Any parts of other types are each stored in separate files |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
27 and given "file" class nodes that are linked to the "msg" node. |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
28 . In a multipart/alternative message or part, we look for a text/plain |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
29 subpart and ignore the other parts. |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
30 . A message/rfc822 is treated similar tomultipart/mixed (except for |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
31 special handling of the first text part) if unpack_rfc822 is set in |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
32 the mailgw config section. |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
33 |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
34 Addresses |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
35 --------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 All of the addresses in the To: and Cc: headers of the incoming message are |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 looked up among the user nodes, and the corresponding users are placed in |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 the "recipients" property on the new "msg" node. The address in the From: |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 header similarly determines the "author" property of the new "msg" |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 node. The default handling for addresses that don't have corresponding |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 users is to create new users with no passwords and a username equal to the |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 address. (The web interface does not permit logins for users with no |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 passwords.) If we prefer to reject mail from outside sources, we can simply |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 register an auditor on the "user" class that prevents the creation of user |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
45 nodes with no passwords. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
47 Actions |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
48 ------- |
|
5056
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
49 The subject line of the incoming message is examined to determine |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
50 whether the message is an attempt to create a new item, discuss an |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
51 existing item, or execute some other command. |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
52 |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
53 If the subject consists of one of the following (case insensitive), |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
54 the corresponding action is taken: |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
55 |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
56 help |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
57 Respond with an explanation of this interface. |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
58 |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
59 If the subject contains the following, the corresponding action is |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
60 taken: |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
61 |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
62 -- key <OneTimeKey> |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
63 Complete an in-progress user registration. |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
64 |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
65 If the email is not a command, it is either a new item or a message |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
66 associated with an existing item. A designator enclosed in square |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
67 brackets is sought as the first thing on the subject line (after |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
68 skipping any "Fwd:" or "Re:" prefixes). |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 If an item designator (class name and id number) is found there, the newly |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 created "msg" node is added to the "messages" property for that item, and |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
72 any new "file" nodes are added to the "files" property for the item. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 If just an item class name is found there, we attempt to create a new item |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 of that class with its "messages" property initialized to contain the new |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 "msg" node and its "files" property initialized to contain any new "file" |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
77 nodes. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 |
|
5056
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
79 Summary |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
80 ------- |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
81 The "summary" property on message nodes is taken from the first non-quoting |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
82 section in the message body. The message body is divided into sections by |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
83 blank lines. Sections where the second and all subsequent lines begin with |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
84 a ">" or "|" character are considered "quoting sections". The first line of |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
85 the first non-quoting section becomes the summary of the message. |
|
d995ee7d49bf
issue2550757: one bug raised by issue fixed. Patch created by
John Rouillard <rouilj@ieee.org>
parents:
5045
diff
changeset
|
86 |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
87 Triggers |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
88 -------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 Both cases may trigger detectors (in the first case we are calling the |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 set() method to add the message to the item's spool; in the second case we |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 are calling the create() method to create a new node). If an auditor raises |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 an exception, the original message is bounced back to the sender with the |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
93 explanatory message given in the exception. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
94 """ |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1982
diff
changeset
|
95 __docformat__ = 'restructuredtext' |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
97 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri |
|
5350
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
98 import time, sys, logging |
|
4980
13f8f88ad984
Replace rfc822 imports with email package (issue2550870)
John Kristensen <john@jerrykan.com>
parents:
4781
diff
changeset
|
99 import traceback |
|
13f8f88ad984
Replace rfc822 imports with email package (issue2550870)
John Kristensen <john@jerrykan.com>
parents:
4781
diff
changeset
|
100 import email.utils |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 |
|
5350
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
102 try: |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
103 # Use the cryptographic source of randomness if available |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
104 from random import SystemRandom |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
105 random=SystemRandom() |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
106 except ImportError: |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
107 raise |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
108 from random import Random |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
109 random=Random() |
|
66a17c80e035
Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents:
5331
diff
changeset
|
110 |
|
4575
c426cb251bc7
Be more tolerant when parsing RFC2047 encoded mail headers.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4573
diff
changeset
|
111 from anypy.email_ import decode_header |
|
4093
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
112 |
| 4981 | 113 from roundup import configuration, hyperdb, date, password, exceptions |
|
3371
4f3285913a8c
discard, don't bounce messages to the mailgw when the messages's sender...
Richard Jones <richard@users.sourceforge.net>
parents:
3367
diff
changeset
|
114 from roundup.mailer import Mailer, MessageSendError |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
115 from roundup.i18n import _ |
|
4306
966592263fb8
Clean up all the places where role processing occurs.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4301
diff
changeset
|
116 from roundup.hyperdb import iter_roles |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
117 |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
118 try: |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
119 import pyme, pyme.core, pyme.constants, pyme.constants.sigsum |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
120 except ImportError: |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
121 pyme = None |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
122 |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
123 SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '') |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
124 |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
125 class MailGWError(ValueError): |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
126 pass |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
127 |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
128 class MailUsageError(ValueError): |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
129 pass |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
130 |
|
5264
32f95ec6bd8e
Python 2 and 3 support. Convert Exception into BaseException in core code.
John Rouillard <rouilj@ieee.org>
parents:
5248
diff
changeset
|
131 class MailUsageHelp(BaseException): |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
132 """ We need to send the help message to the user. """ |
|
1321
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
133 pass |
|
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
134 |
|
5264
32f95ec6bd8e
Python 2 and 3 support. Convert Exception into BaseException in core code.
John Rouillard <rouilj@ieee.org>
parents:
5248
diff
changeset
|
135 class Unauthorized(BaseException): |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
136 """ Access denied """ |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
137 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
138 |
|
5264
32f95ec6bd8e
Python 2 and 3 support. Convert Exception into BaseException in core code.
John Rouillard <rouilj@ieee.org>
parents:
5248
diff
changeset
|
139 class IgnoreMessage(BaseException): |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
140 """ A general class of message that we should ignore. """ |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
141 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
142 class IgnoreBulk(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
143 """ This is email from a mailing list or from a vacation program. """ |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
144 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
145 class IgnoreLoop(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
146 """ We've seen this message before... """ |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
147 pass |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
148 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
149 def initialiseSecurity(security): |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
150 ''' Create some Permissions and Roles on the security object |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
151 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
152 This function is directly invoked by security.Security.__init__() |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
153 as a part of the Security object instantiation. |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
154 ''' |
|
948
8d8db618c2c3
grant email access to admin too ;)
Richard Jones <richard@users.sourceforge.net>
parents:
928
diff
changeset
|
155 p = security.addPermission(name="Email Access", |
|
928
23c9d4f86380
Added the web access and email access permissions..
Richard Jones <richard@users.sourceforge.net>
parents:
905
diff
changeset
|
156 description="User may use the email interface") |
|
948
8d8db618c2c3
grant email access to admin too ;)
Richard Jones <richard@users.sourceforge.net>
parents:
928
diff
changeset
|
157 security.addPermissionToRole('Admin', p) |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
158 |
|
1409
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
159 def getparam(str, param): |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
160 ''' From the rfc822 "header" string, extract "param" if it appears. |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
161 ''' |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
162 if ';' not in str: |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
163 return None |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
164 str = str[str.index(';'):] |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
165 while str[:1] == ';': |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
166 str = str[1:] |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
167 if ';' in str: |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
168 # XXX Should parse quotes! |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
169 end = str.index(';') |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
170 else: |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
171 end = len(str) |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
172 f = str[:end] |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
173 if '=' in f: |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
174 i = f.index('=') |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
175 if f[:i].strip().lower() == param: |
|
4980
13f8f88ad984
Replace rfc822 imports with email package (issue2550870)
John Kristensen <john@jerrykan.com>
parents:
4781
diff
changeset
|
176 return email.utils.unquote(f[i+1:].strip()) |
|
1409
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
177 return None |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
178 |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
179 def gpgh_key_getall(key, attr): |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
180 ''' return list of given attribute for all uids in |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
181 a key |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
182 ''' |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
183 for u in key.uids: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
184 yield getattr(u, attr) |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
185 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
186 def check_pgp_sigs(sigs, gpgctx, author, may_be_unsigned=False): |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
187 ''' Theoretically a PGP message can have several signatures. GPGME |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
188 returns status on all signatures in a list. Walk that list |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
189 looking for the author's signature. Note that even if incoming |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
190 signatures are not required, the processing fails if there is an |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
191 invalid signature. |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
192 ''' |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
193 for sig in sigs: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
194 key = gpgctx.get_key(sig.fpr, False) |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
195 # we really only care about the signature of the user who |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
196 # submitted the email |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
197 if key and (author in gpgh_key_getall(key, 'email')): |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
198 if sig.summary & pyme.constants.sigsum.VALID: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
199 return True |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
200 else: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
201 # try to narrow down the actual problem to give a more useful |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
202 # message in our bounce |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
203 if sig.summary & pyme.constants.sigsum.KEY_MISSING: |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
204 raise MailUsageError( \ |
|
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
205 _("Message signed with unknown key: %s") % sig.fpr) |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
206 elif sig.summary & pyme.constants.sigsum.KEY_EXPIRED: |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
207 raise MailUsageError( \ |
|
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
208 _("Message signed with an expired key: %s") % sig.fpr) |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
209 elif sig.summary & pyme.constants.sigsum.KEY_REVOKED: |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
210 raise MailUsageError( \ |
|
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
211 _("Message signed with a revoked key: %s") % sig.fpr) |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
212 else: |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
213 raise MailUsageError( \ |
|
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
214 _("Invalid PGP signature detected.")) |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
215 |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
216 # we couldn't find a key belonging to the author of the email |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
217 if sigs: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
218 raise MailUsageError, _("Message signed with unknown key: %s") % sig.fpr |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
219 elif not may_be_unsigned: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
220 raise MailUsageError, _("Unsigned Message") |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
221 |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
222 class Message(mimetools.Message): |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
223 ''' subclass mimetools.Message so we can retrieve the parts of the |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
224 message... |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
225 ''' |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
226 def getpart(self): |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
227 ''' Get a single part of a multipart message and return it as a new |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
228 Message instance. |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
229 ''' |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
230 boundary = self.getparam('boundary') |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
231 mid, end = '--'+boundary, '--'+boundary+'--' |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
232 s = cStringIO.StringIO() |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
233 while 1: |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
234 line = self.fp.readline() |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
235 if not line: |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
236 break |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
237 if line.strip() in (mid, end): |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
238 # according to rfc 1431 the preceding line ending is part of |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
239 # the boundary so we need to strip that |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
240 length = s.tell() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
241 s.seek(-2, 1) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
242 lineending = s.read(2) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
243 if lineending == '\r\n': |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
244 s.truncate(length - 2) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
245 elif lineending[1] in ('\r', '\n'): |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
246 s.truncate(length - 1) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
247 else: |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
248 raise ValueError('Unknown line ending in message.') |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
249 break |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
250 s.write(line) |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
251 if not s.getvalue().strip(): |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
252 return None |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
253 s.seek(0) |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
254 return Message(s) |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
255 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
256 def getparts(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
257 """Get all parts of this multipart message.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
258 # skip over the intro to the first boundary |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
259 self.fp.seek(0) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
260 self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
261 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
262 # accumulate the other parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
263 parts = [] |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
264 while 1: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
265 part = self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
266 if part is None: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
267 break |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
268 parts.append(part) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
269 return parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
270 |
|
4505
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
271 def _decode_header_to_utf8(self, hdr): |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
272 l = [] |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
273 for part, encoding in decode_header(hdr): |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
274 if encoding: |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
275 part = part.decode(encoding) |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
276 # RFC 2047 specifies that between encoded parts spaces are |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
277 # swallowed while at the borders from encoded to non-encoded |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
278 # or vice-versa we must preserve a space. Multiple adjacent |
|
4575
c426cb251bc7
Be more tolerant when parsing RFC2047 encoded mail headers.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4573
diff
changeset
|
279 # non-encoded parts should not occur. This is now |
|
c426cb251bc7
Be more tolerant when parsing RFC2047 encoded mail headers.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4573
diff
changeset
|
280 # implemented in our patched decode_header method in anypy |
|
4505
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
281 l.append(part) |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
282 return ''.join([s.encode('utf-8') for s in l]) |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
283 |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
284 def getheader(self, name, default=None): |
|
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
285 hdr = mimetools.Message.getheader(self, name, default) |
|
4375
378fc1ecaaa6
Default to "text/plain" if no Content-Type header is present in email
Richard Jones <richard@users.sourceforge.net>
parents:
4373
diff
changeset
|
286 # TODO are there any other False values possible? |
|
378fc1ecaaa6
Default to "text/plain" if no Content-Type header is present in email
Richard Jones <richard@users.sourceforge.net>
parents:
4373
diff
changeset
|
287 # TODO if not hdr: return hdr |
|
378fc1ecaaa6
Default to "text/plain" if no Content-Type header is present in email
Richard Jones <richard@users.sourceforge.net>
parents:
4373
diff
changeset
|
288 if hdr is None: |
|
378fc1ecaaa6
Default to "text/plain" if no Content-Type header is present in email
Richard Jones <richard@users.sourceforge.net>
parents:
4373
diff
changeset
|
289 return None |
|
4093
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
290 if not hdr: |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
291 return '' |
|
1712
f686c73fc5d1
The .replace in getheader would fail for absent headers (that return None).
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1711
diff
changeset
|
292 if hdr: |
|
f686c73fc5d1
The .replace in getheader would fail for absent headers (that return None).
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1711
diff
changeset
|
293 hdr = hdr.replace('\n','') # Inserted by rfc822.readheaders |
|
4505
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
294 return self._decode_header_to_utf8(hdr) |
|
4093
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
295 |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
296 def getaddrlist(self, name): |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
297 # overload to decode the name part of the address |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
298 l = [] |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
299 for (name, addr) in mimetools.Message.getaddrlist(self, name): |
|
4505
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
300 name = self._decode_header_to_utf8(name) |
|
4093
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
301 l.append((name, addr)) |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
302 return l |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
303 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
304 def getname(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
305 """Find an appropriate name for this message.""" |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
306 name = None |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
307 if self.gettype() == 'message/rfc822': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
308 # handle message/rfc822 specially - the name should be |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
309 # the subject of the actual e-mail embedded here |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
310 # we add a '.eml' extension like other email software does it |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
311 self.fp.seek(0) |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
312 s = cStringIO.StringIO(self.getbody()) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
313 name = Message(s).getheader('subject') |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
314 if name: |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
315 name = name + '.eml' |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
316 if not name: |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
317 # try name on Content-Type |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
318 name = self.getparam('name') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
319 if not name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
320 disp = self.getheader('content-disposition', None) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
321 if disp: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
322 name = getparam(disp, 'filename') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
323 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
324 if name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
325 return name.strip() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
326 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
327 def getbody(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
328 """Get the decoded message body.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
329 self.rewindbody() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
330 encoding = self.getencoding() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
331 data = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
332 if encoding == 'base64': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
333 # BUG: is base64 really used for text encoding or |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
334 # are we inserting zip files here. |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
335 data = binascii.a2b_base64(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
336 elif encoding == 'quoted-printable': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
337 # the quopri module wants to work with files |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
338 decoded = cStringIO.StringIO() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
339 quopri.decode(self.fp, decoded) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
340 data = decoded.getvalue() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
341 elif encoding == 'uuencoded': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
342 data = binascii.a2b_uu(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
343 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
344 # take it as text |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
345 data = self.fp.read() |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
346 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
347 # Encode message to unicode |
| 4981 | 348 charset = self.getparam("charset") |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
349 if charset: |
| 4981 | 350 charset = charset.lower().replace("windows-", 'cp') |
|
3415
4a228402b810
Handle invalidly-specified charsets in incoming email
Richard Jones <richard@users.sourceforge.net>
parents:
3371
diff
changeset
|
351 # Do conversion only if charset specified - handle |
|
4a228402b810
Handle invalidly-specified charsets in incoming email
Richard Jones <richard@users.sourceforge.net>
parents:
3371
diff
changeset
|
352 # badly-specified charsets |
|
4a228402b810
Handle invalidly-specified charsets in incoming email
Richard Jones <richard@users.sourceforge.net>
parents:
3371
diff
changeset
|
353 edata = unicode(data, charset, 'replace').encode('utf-8') |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
354 # Convert from dos eol to unix |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
355 edata = edata.replace('\r\n', '\n') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
356 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
357 # Leave message content as is |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
358 edata = data |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
359 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
360 return edata |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
361 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
362 # General multipart handling: |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
363 # Take the first text/plain part, anything else is considered an |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
364 # attachment. |
| 2364 | 365 # multipart/mixed: |
| 366 # Multiple "unrelated" parts. | |
| 367 # multipart/Alternative (rfc 1521): | |
| 368 # Like multipart/mixed, except that we'd only want one of the | |
| 369 # alternatives. Generally a top-level part from MUAs sending HTML | |
| 370 # mail - there will be a text/plain version. | |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
371 # multipart/signed (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
372 # The control information is carried in the second of the two |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
373 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
374 # ACTION: Default, so if content is text/plain we get it. |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
375 # multipart/encrypted (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
376 # The control information is carried in the first of the two |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
377 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
378 # ACTION: Not handleable as the content is encrypted. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
379 # multipart/related (rfc 1872, 2112, 2387): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
380 # The Multipart/Related content-type addresses the MIME |
| 2364 | 381 # representation of compound objects, usually HTML mail with embedded |
| 382 # images. Usually appears as an alternative. | |
| 383 # ACTION: Default, if we must. | |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
384 # multipart/report (rfc 1892): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
385 # e.g. mail system delivery status reports. |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
386 # ACTION: Default. Could be ignored or used for Delivery Notification |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
387 # flagging. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
388 # multipart/form-data: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
389 # For web forms only. |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
390 # message/rfc822: |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
391 # Only if configured in [mailgw] unpack_rfc822 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
392 |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
393 def extract_content(self, parent_type=None, ignore_alternatives=False, |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
394 unpack_rfc822=False, html2text=None): |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
395 """Extract the body and the attachments recursively. |
|
3976
7dc74da6c3e8
Fix mailgw total failure bounce message generation (thanks Bradley Dean)
Richard Jones <richard@users.sourceforge.net>
parents:
3964
diff
changeset
|
396 |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
397 If the content is hidden inside a multipart/alternative part, |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
398 we use the *last* text/plain part of the *first* |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
399 multipart/alternative in the whole message. |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
400 """ |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
401 content_type = self.gettype() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
402 content = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
403 attachments = [] |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
404 html_part = False |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
405 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
406 if content_type == 'text/plain': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
407 content = self.getbody() |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
408 elif content_type == 'text/html' and html2text: |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
409 # if user allows html conversion run this. |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
410 content = html2text(self.getbody()) |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
411 attachments.append(self.as_attachment()) |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
412 html_part = True |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
413 elif content_type[:10] == 'multipart/': |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
414 content_found = False |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
415 ig = ignore_alternatives |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
416 html_part_found = False |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
417 for part in self.getparts(): |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
418 new_content, new_attach, html_part = part.extract_content( |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
419 content_type, not content and ig, unpack_rfc822, |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
420 html2text) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
421 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
422 # If we haven't found a text/plain part yet, take this one, |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
423 # otherwise make it an attachment. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
424 if not content: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
425 content = new_content |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
426 cpart = part |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
427 if html_part: |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
428 html_part_found = True |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
429 elif new_content: |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
430 if html_part: |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
431 # attachment should be added elsewhere. |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
432 pass |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
433 elif content_found or content_type != 'multipart/alternative': |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
434 attachments.append(part.text_as_attachment()) |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
435 elif html_part_found: |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
436 # text/plain part found after html |
|
5306
91354bf0b683
Codecov showed text/html followed by text/plain not tested. Fixed bug
John Rouillard <rouilj@ieee.org>
parents:
5305
diff
changeset
|
437 # text/html already stored as attachment, |
|
91354bf0b683
Codecov showed text/html followed by text/plain not tested. Fixed bug
John Rouillard <rouilj@ieee.org>
parents:
5305
diff
changeset
|
438 # so just use the text as the content. |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
439 content = new_content |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
440 cpart = part |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
441 else: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
442 # if we have found a text/plain in the current |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
443 # multipart/alternative and find another one, we |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
444 # use the first as an attachment (if configured) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
445 # and use the second one because rfc 2046, sec. |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
446 # 5.1.4. specifies that later parts are better |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
447 # (thanks to Philipp Gortan for pointing this |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
448 # out) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
449 attachments.append(cpart.text_as_attachment()) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
450 content = new_content |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
451 cpart = part |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
452 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
453 attachments.extend(new_attach) |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
454 if ig and content_type == 'multipart/alternative' and content: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
455 attachments = [] |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
456 html_part = False |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
457 elif unpack_rfc822 and content_type == 'message/rfc822': |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
458 s = cStringIO.StringIO(self.getbody()) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
459 m = Message(s) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
460 ig = ignore_alternatives and not content |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
461 new_content, attachments, html_part = m.extract_content(m.gettype(), ig, |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
462 unpack_rfc822, html2text) |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
463 attachments.insert(0, m.text_as_attachment()) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
464 elif (parent_type == 'multipart/signed' and |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
465 content_type == 'application/pgp-signature'): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
466 # ignore it so it won't be saved as an attachment |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
467 pass |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
468 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
469 attachments.append(self.as_attachment()) |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
470 return content, attachments, html_part |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
471 |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
472 def text_as_attachment(self): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
473 """Return first text/plain part as Message""" |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
474 if not self.gettype().startswith ('multipart/'): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
475 return self.as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
476 for part in self.getparts(): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
477 content_type = part.gettype() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
478 if content_type == 'text/plain': |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
479 return part.as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
480 elif content_type.startswith ('multipart/'): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
481 p = part.text_as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
482 if p: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
483 return p |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
484 return None |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
485 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
486 def as_attachment(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
487 """Return this message as an attachment.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
488 return (self.getname(), self.gettype(), self.getbody()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
489 |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
490 def pgp_signed(self): |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
491 ''' RFC 3156 requires OpenPGP MIME mail to have the protocol parameter |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
492 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
493 return self.gettype() == 'multipart/signed' \ |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
494 and self.typeheader.find('protocol="application/pgp-signature"') != -1 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
495 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
496 def pgp_encrypted(self): |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
497 ''' RFC 3156 requires OpenPGP MIME mail to have the protocol parameter |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
498 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
499 return self.gettype() == 'multipart/encrypted' \ |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
500 and self.typeheader.find('protocol="application/pgp-encrypted"') != -1 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
501 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
502 def decrypt(self, author, may_be_unsigned=False): |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
503 ''' decrypt an OpenPGP MIME message |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
504 This message must be signed as well as encrypted using the |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
505 "combined" method if incoming signatures are configured. |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
506 The decrypted contents are returned as a new message. |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
507 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
508 (hdr, msg) = self.getparts() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
509 # According to the RFC 3156 encrypted mail must have exactly two parts. |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
510 # The first part contains the control information. Let's verify that |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
511 # the message meets the RFC before we try to decrypt it. |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
512 if hdr.getbody().strip() != 'Version: 1' \ |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
513 or hdr.gettype() != 'application/pgp-encrypted': |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
514 raise MailUsageError, \ |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
515 _("Unknown multipart/encrypted version.") |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
516 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
517 context = pyme.core.Context() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
518 ciphertext = pyme.core.Data(msg.getbody()) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
519 plaintext = pyme.core.Data() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
520 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
521 result = context.op_decrypt_verify(ciphertext, plaintext) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
522 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
523 if result: |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
524 raise MailUsageError, _("Unable to decrypt your message.") |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
525 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
526 # we've decrypted it but that just means they used our public |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
527 # key to send it to us. now check the signatures to see if it |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
528 # was signed by someone we trust |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
529 result = context.op_verify_result() |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
530 check_pgp_sigs(result.signatures, context, author, |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
531 may_be_unsigned = may_be_unsigned) |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
532 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
533 plaintext.seek(0,0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
534 # pyme.core.Data implements a seek method with a different signature |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
535 # than roundup can handle. So we'll put the data in a container that |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
536 # the Message class can work with. |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
537 c = cStringIO.StringIO() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
538 c.write(plaintext.read()) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
539 c.seek(0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
540 return Message(c) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
541 |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
542 def verify_signature(self, author): |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
543 ''' verify the signature of an OpenPGP MIME message |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
544 This only handles detached signatures. Old style |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
545 PGP mail (i.e. '-----BEGIN PGP SIGNED MESSAGE----') |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
546 is archaic and not supported :) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
547 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
548 # we don't check the micalg parameter...gpgme seems to |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
549 # figure things out on its own |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
550 (msg, sig) = self.getparts() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
551 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
552 if sig.gettype() != 'application/pgp-signature': |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
553 raise MailUsageError, \ |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
554 _("No PGP signature found in message.") |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
555 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
556 # msg.getbody() is skipping over some headers that are |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
557 # required to be present for verification to succeed so |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
558 # we'll do this by hand |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
559 msg.fp.seek(0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
560 # according to rfc 3156 the data "MUST first be converted |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
561 # to its content-type specific canonical form. For |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
562 # text/plain this means conversion to an appropriate |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
563 # character set and conversion of line endings to the |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
564 # canonical <CR><LF> sequence." |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
565 # TODO: what about character set conversion? |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
566 canonical_msg = re.sub('(?<!\r)\n', '\r\n', msg.fp.read()) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
567 msg_data = pyme.core.Data(canonical_msg) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
568 sig_data = pyme.core.Data(sig.getbody()) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
569 |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
570 context = pyme.core.Context() |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
571 context.op_verify(sig_data, msg_data, None) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
572 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
573 # check all signatures for validity |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
574 result = context.op_verify_result() |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
575 check_pgp_sigs(result.signatures, context, author) |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
576 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
577 class parsedMessage: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
578 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
579 def __init__(self, mailgw, message): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
580 self.mailgw = mailgw |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
581 self.config = mailgw.instance.config |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
582 self.db = mailgw.db |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
583 self.message = message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
584 self.subject = message.getheader('subject', '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
585 self.has_prefix = False |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
586 self.matches = dict.fromkeys(['refwd', 'quote', 'classname', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
587 'nodeid', 'title', 'args', 'argswhole']) |
|
5045
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
588 self.keep_real_from = self.config['EMAIL_KEEP_REAL_FROM'] |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
589 if self.keep_real_from: |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
590 self.from_list = message.getaddrlist('from') |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
591 else: |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
592 self.from_list = message.getaddrlist('resent-from') \ |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
593 or message.getaddrlist('from') |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
594 self.pfxmode = self.config['MAILGW_SUBJECT_PREFIX_PARSING'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
595 self.sfxmode = self.config['MAILGW_SUBJECT_SUFFIX_PARSING'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
596 # these are filled in by subsequent parsing steps |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
597 self.classname = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
598 self.properties = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
599 self.cl = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
600 self.nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
601 self.author = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
602 self.recipients = None |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
603 self.msg_props = {} |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
604 self.props = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
605 self.content = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
606 self.attachments = None |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
607 self.crypt = False |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
608 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
609 def handle_ignore(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
610 ''' Check to see if message can be safely ignored: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
611 detect loops and |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
612 Precedence: Bulk, or Microsoft Outlook autoreplies |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
613 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
614 if self.message.getheader('x-roundup-loop', ''): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
615 raise IgnoreLoop |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
616 if (self.message.getheader('precedence', '') == 'bulk' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
617 or self.subject.lower().find("autoreply") > 0): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
618 raise IgnoreBulk |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
619 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
620 def handle_help(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
621 ''' Check to see if the message contains a usage/help request |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
622 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
623 if self.subject.strip().lower() == 'help': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
624 raise MailUsageHelp |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
625 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
626 def check_subject(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
627 ''' Check to see if the message contains a valid subject line |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
628 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
629 if not self.subject: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
630 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
631 Emails to Roundup trackers must include a Subject: line! |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
632 """) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
633 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
634 def parse_subject(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
635 ''' Matches subjects like: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
636 Re: "[issue1234] title of issue [status=resolved]" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
637 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
638 Each part of the subject is matched, stored, then removed from the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
639 start of the subject string as needed. The stored values are then |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
640 returned |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
641 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
642 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
643 tmpsubject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
644 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
645 sd_open, sd_close = self.config['MAILGW_SUBJECT_SUFFIX_DELIMITERS'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
646 delim_open = re.escape(sd_open) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
647 if delim_open in '[(': delim_open = '\\' + delim_open |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
648 delim_close = re.escape(sd_close) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
649 if delim_close in '[(': delim_close = '\\' + delim_close |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
650 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
651 # Look for Re: et. al. Used later on for MAILGW_SUBJECT_CONTENT_MATCH |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
652 re_re = r"(?P<refwd>%s)\s*" % self.config["MAILGW_REFWD_RE"].pattern |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
653 m = re.match(re_re, tmpsubject, re.IGNORECASE|re.VERBOSE|re.UNICODE) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
654 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
655 m = m.groupdict() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
656 if m['refwd']: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
657 self.matches.update(m) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
658 tmpsubject = tmpsubject[len(m['refwd']):] # Consume Re: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
659 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
660 # Look for Leading " |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
661 m = re.match(r'(?P<quote>\s*")', tmpsubject, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
662 re.IGNORECASE) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
663 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
664 self.matches.update(m.groupdict()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
665 tmpsubject = tmpsubject[len(self.matches['quote']):] # Consume quote |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
666 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
667 # Check if the subject includes a prefix |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
668 self.has_prefix = re.search(r'^%s(\w+)%s'%(delim_open, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
669 delim_close), tmpsubject.strip()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
670 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
671 # Match the classname if specified |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
672 class_re = r'%s(?P<classname>(%s))(?P<nodeid>\d+)?%s'%(delim_open, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
673 "|".join(self.db.getclasses()), delim_close) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
674 # Note: re.search, not re.match as there might be garbage |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
675 # (mailing list prefix, etc.) before the class identifier |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
676 m = re.search(class_re, tmpsubject, re.IGNORECASE) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
677 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
678 self.matches.update(m.groupdict()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
679 # Skip to the end of the class identifier, including any |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
680 # garbage before it. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
681 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
682 tmpsubject = tmpsubject[m.end():] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
683 |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
684 # Match any arguments specified *from the end* |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
685 # Optionally match and strip quote at the end that dumb mailers |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
686 # may put there, e.g. |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
687 # Re: "[issue1] bla blah [<args>]" |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
688 q = '' |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
689 if self.matches['quote']: |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
690 q = '"?' |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
691 args_re = r'(?P<argswhole>%s(?P<args>[^%s]*)%s)%s$'%(delim_open, |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
692 delim_close, delim_close, q) |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
693 m = re.search(args_re, tmpsubject.strip(), re.IGNORECASE|re.VERBOSE) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
694 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
695 self.matches.update(m.groupdict()) |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
696 tmpsubject = tmpsubject [:m.start()] |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
697 else: |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
698 self.matches['argswhole'] = self.matches['args'] = None |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
699 |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
700 # The title of the subject is the remaining tmpsubject. |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
701 self.matches ['title'] = tmpsubject.strip () |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
702 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
703 # strip off the quotes that dumb emailers put around the subject, like |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
704 # Re: "[issue1] bla blah" |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
705 # but only if we didn't match arguments at the end (which would |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
706 # already have consumed the quote after the subject) |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
707 if self.matches['quote'] and not self.matches['argswhole'] \ |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
708 and self.matches['title'].endswith('"'): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
709 self.matches['title'] = self.matches['title'][:-1] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
710 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
711 def rego_confirm(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
712 ''' Check for registration OTK and confirm the registration if found |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
713 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
714 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
715 if self.config['EMAIL_REGISTRATION_CONFIRMATION']: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
716 otk_re = re.compile('-- key (?P<otk>[a-zA-Z0-9]{32})') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
717 otk = otk_re.search(self.matches['title'] or '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
718 if otk: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
719 self.db.confirm_registration(otk.group('otk')) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
720 subject = 'Your registration to %s is complete' % \ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
721 self.config['TRACKER_NAME'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
722 sendto = [self.from_list[0][1]] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
723 self.mailgw.mailer.standard_message(sendto, subject, '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
724 return 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
725 return 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
726 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
727 def get_classname(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
728 ''' Determine the classname of the node being created/edited |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
729 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
730 subject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
731 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
732 # get the classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
733 if self.pfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
734 classname = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
735 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
736 classname = self.matches['classname'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
737 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
738 if not classname and self.has_prefix and self.pfxmode == 'strict': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
739 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
740 The message you sent to roundup did not contain a properly formed subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
741 line. The subject must contain a class name or designator to indicate the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
742 'topic' of the message. For example: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
743 Subject: [issue] This is a new issue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
744 - this will create a new issue in the tracker with the title 'This is |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
745 a new issue'. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
746 Subject: [issue1234] This is a followup to issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
747 - this will append the message's contents to the existing issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
748 in the tracker. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
749 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
750 Subject was: '%(subject)s' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
751 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
752 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
753 # try to get the class specified - if "loose" or "none" then fall |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
754 # back on the default |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
755 attempts = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
756 if classname: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
757 attempts.append(classname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
758 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
759 if self.mailgw.default_class: |
|
4477
9be284ce56b7
Fixed bug in mailgw refactoring, patch issue2550697 (thanks Hubert Touvet)
Richard Jones <richard@users.sourceforge.net>
parents:
4469
diff
changeset
|
760 attempts.append(self.mailgw.default_class) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
761 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
762 attempts.append(self.config['MAILGW_DEFAULT_CLASS']) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
763 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
764 # first valid class name wins |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
765 self.cl = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
766 for trycl in attempts: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
767 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
768 self.cl = self.db.getclass(trycl) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
769 classname = self.classname = trycl |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
770 break |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
771 except KeyError: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
772 pass |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
773 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
774 if not self.cl: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
775 validname = ', '.join(self.db.getclasses()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
776 if classname: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
777 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
778 The class name you identified in the subject line ("%(classname)s") does |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
779 not exist in the database. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
780 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
781 Valid class names are: %(validname)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
782 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
783 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
784 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
785 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
786 You did not identify a class name in the subject line and there is no |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
787 default set for this tracker. The subject must contain a class name or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
788 designator to indicate the 'topic' of the message. For example: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
789 Subject: [issue] This is a new issue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
790 - this will create a new issue in the tracker with the title 'This is |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
791 a new issue'. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
792 Subject: [issue1234] This is a followup to issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
793 - this will append the message's contents to the existing issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
794 in the tracker. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
795 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
796 Subject was: '%(subject)s' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
797 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
798 # get the class properties |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
799 self.properties = self.cl.getprops() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
800 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
801 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
802 def get_nodeid(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
803 ''' Determine the nodeid from the message and return it if found |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
804 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
805 title = self.matches['title'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
806 subject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
807 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
808 if self.pfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
809 nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
810 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
811 nodeid = self.matches['nodeid'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
812 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
813 # try in-reply-to to match the message if there's no nodeid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
814 inreplyto = self.message.getheader('in-reply-to') or '' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
815 if nodeid is None and inreplyto: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
816 l = self.db.getclass('msg').stringFind(messageid=inreplyto) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
817 if l: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
818 nodeid = self.cl.filter(None, {'messages':l})[0] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
819 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
820 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
821 # but we do need either a title or a nodeid... |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
822 if nodeid is None and not title: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
823 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
824 I cannot match your message to a node in the database - you need to either |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
825 supply a full designator (with number, eg "[issue123]") or keep the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
826 previous subject title intact so I can match that. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
827 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
828 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
829 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
830 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
831 # If there's no nodeid, check to see if this is a followup and |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
832 # maybe someone's responded to the initial mail that created an |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
833 # entry. Try to find the matching nodes with the same title, and |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
834 # use the _last_ one matched (since that'll _usually_ be the most |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
835 # recent...). The subject_content_match config may specify an |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
836 # additional restriction based on the matched node's creation or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
837 # activity. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
838 tmatch_mode = self.config['MAILGW_SUBJECT_CONTENT_MATCH'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
839 if tmatch_mode != 'never' and nodeid is None and self.matches['refwd']: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
840 l = self.cl.stringFind(title=title) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
841 limit = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
842 if (tmatch_mode.startswith('creation') or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
843 tmatch_mode.startswith('activity')): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
844 limit, interval = tmatch_mode.split(' ', 1) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
845 threshold = date.Date('.') - date.Interval(interval) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
846 for id in l: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
847 if limit: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
848 if threshold < self.cl.get(id, limit): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
849 nodeid = id |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
850 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
851 nodeid = id |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
852 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
853 # if a nodeid was specified, make sure it's valid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
854 if nodeid is not None and not self.cl.hasnode(nodeid): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
855 if self.pfxmode == 'strict': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
856 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
857 The node specified by the designator in the subject of your message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
858 ("%(nodeid)s") does not exist. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
859 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
860 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
861 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
862 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
863 nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
864 self.nodeid = nodeid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
865 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
866 def get_author_id(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
867 ''' Attempt to get the author id from the existing registered users, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
868 otherwise attempt to register a new user and return their id |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
869 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
870 # Don't create users if anonymous isn't allowed to register |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
871 create = 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
872 anonid = self.db.user.lookup('anonymous') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
873 if not (self.db.security.hasPermission('Register', anonid, 'user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
874 and self.db.security.hasPermission('Email Access', anonid)): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
875 create = 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
876 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
877 # ok, now figure out who the author is - create a new user if the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
878 # "create" flag is true |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
879 author = uidFromAddress(self.db, self.from_list[0], create=create) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
880 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
881 # if we're not recognised, and we don't get added as a user, then we |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
882 # must be anonymous |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
883 if not author: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
884 author = anonid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
885 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
886 # make sure the author has permission to use the email interface |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
887 if not self.db.security.hasPermission('Email Access', author): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
888 if author == anonid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
889 # we're anonymous and we need to be a registered user |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
890 from_address = self.from_list[0][1] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
891 registration_info = "" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
892 if self.db.security.hasPermission('Web Access', author) and \ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
893 self.db.security.hasPermission('Register', anonid, 'user'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
894 tracker_web = self.config.TRACKER_WEB |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
895 registration_info = """ Please register at: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
896 |
|
4580
782737d1a2d7
issue2431638 wrong registration link in bounce mail.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4579
diff
changeset
|
897 %(tracker_web)suser?@template=register |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
898 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
899 ...before sending mail to the tracker.""" % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
900 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
901 raise Unauthorized, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
902 You are not a registered user.%(registration_info)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
903 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
904 Unknown address: %(from_address)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
905 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
906 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
907 # we're registered and we're _still_ not allowed access |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
908 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
909 'You are not permitted to access this tracker.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
910 self.author = author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
911 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
912 def check_permissions(self): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
913 ''' Check if the author has permission to edit or create this |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
914 class of node |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
915 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
916 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
917 if not self.db.security.hasPermission('Edit', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
918 self.classname, itemid=self.nodeid): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
919 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
920 'You are not permitted to edit %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
921 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
922 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
923 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
924 self.classname): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
925 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
926 'You are not permitted to create %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
927 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
928 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
929 def commit_and_reopen_as_author(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
930 ''' the author may have been created - make sure the change is |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
931 committed before we reopen the database |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
932 then re-open the database as the author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
933 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
934 self.db.commit() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
935 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
936 # set the database user as the author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
937 username = self.db.user.get(self.author, 'username') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
938 self.db.setCurrentUser(username) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
939 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
940 # re-get the class with the new database connection |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
941 self.cl = self.db.getclass(self.classname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
942 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
943 def get_recipients(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
944 ''' Get the list of recipients who were included in message and |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
945 register them as users if possible |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
946 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
947 # Don't create users if anonymous isn't allowed to register |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
948 create = 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
949 anonid = self.db.user.lookup('anonymous') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
950 if not (self.db.security.hasPermission('Register', anonid, 'user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
951 and self.db.security.hasPermission('Email Access', anonid)): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
952 create = 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
953 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
954 # get the user class arguments from the commandline |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
955 user_props = self.mailgw.get_class_arguments('user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
956 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
957 # now update the recipients list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
958 recipients = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
959 tracker_email = self.config['TRACKER_EMAIL'].lower() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
960 msg_to = self.message.getaddrlist('to') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
961 msg_cc = self.message.getaddrlist('cc') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
962 for recipient in msg_to + msg_cc: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
963 r = recipient[1].strip().lower() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
964 if r == tracker_email or not r: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
965 continue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
966 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
967 # look up the recipient - create if necessary (and we're |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
968 # allowed to) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
969 recipient = uidFromAddress(self.db, recipient, create, **user_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
970 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
971 # if all's well, add the recipient to the list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
972 if recipient: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
973 recipients.append(recipient) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
974 self.recipients = recipients |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
975 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
976 def get_props(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
977 ''' Generate all the props for the new/updated node and return them |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
978 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
979 subject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
980 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
981 # get the commandline arguments for issues |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
982 issue_props = self.mailgw.get_class_arguments('issue', self.classname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
983 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
984 # |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
985 # handle the subject argument list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
986 # |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
987 # figure what the properties of this Class are |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
988 props = {} |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
989 args = self.matches['args'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
990 argswhole = self.matches['argswhole'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
991 title = self.matches['title'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
992 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
993 # Reform the title |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
994 if self.matches['nodeid'] and self.nodeid is None: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
995 title = subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
996 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
997 if args: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
998 if self.sfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
999 title += ' ' + argswhole |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1000 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1001 errors, props = setPropArrayFromString(self, self.cl, args, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1002 self.nodeid) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1003 # handle any errors parsing the argument list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1004 if errors: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1005 if self.sfxmode == 'strict': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1006 errors = '\n- '.join(map(str, errors)) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1007 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1008 There were problems handling your subject line argument list: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1009 - %(errors)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1010 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1011 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1012 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1013 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1014 title += ' ' + argswhole |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1015 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1016 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1017 # set the issue title to the subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1018 title = title.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1019 if (title and self.properties.has_key('title') and not |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1020 issue_props.has_key('title')): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1021 issue_props['title'] = title |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1022 if (self.nodeid and self.properties.has_key('title') and not |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1023 self.config['MAILGW_SUBJECT_UPDATES_TITLE']): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1024 issue_props['title'] = self.cl.get(self.nodeid,'title') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1025 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1026 # merge the command line props defined in issue_props into |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1027 # the props dictionary because function(**props, **issue_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1028 # is a syntax error. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1029 for prop in issue_props.keys() : |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1030 if not props.has_key(prop) : |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1031 props[prop] = issue_props[prop] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1032 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1033 self.props = props |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1034 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1035 def get_pgp_message(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1036 ''' If they've enabled PGP processing then verify the signature |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1037 or decrypt the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1038 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1039 def pgp_role(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1040 """ if PGP_ROLES is specified the user must have a Role in the list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1041 or we will skip PGP processing |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1042 """ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1043 if self.config.PGP_ROLES: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1044 return self.db.user.has_role(self.author, |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
1045 *iter_roles(self.config.PGP_ROLES)) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1046 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1047 return True |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1048 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1049 if self.config.PGP_ENABLE: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1050 if pgp_role() and self.config.PGP_ENCRYPT: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1051 self.crypt = True |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1052 assert pyme, 'pyme is not installed' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1053 # signed/encrypted mail must come from the primary address |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1054 author_address = self.db.user.get(self.author, 'address') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1055 if self.config.PGP_HOMEDIR: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1056 os.environ['GNUPGHOME'] = self.config.PGP_HOMEDIR |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1057 if self.config.PGP_REQUIRE_INCOMING in ('encrypted', 'both') \ |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1058 and pgp_role() and not self.message.pgp_encrypted(): |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1059 raise MailUsageError, _( |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1060 "This tracker has been configured to require all email " |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1061 "be PGP encrypted.") |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1062 if self.message.pgp_signed(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1063 self.message.verify_signature(author_address) |
| 4781 | 1064 # signature has been verified |
| 1065 self.db.tx_Source = "email-sig-openpgp" | |
| 1066 | |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1067 elif self.message.pgp_encrypted(): |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1068 # Replace message with the contents of the decrypted |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1069 # message for content extraction |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1070 # Note: the bounce-handling code now makes sure that |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1071 # either the encrypted mail received is sent back or |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1072 # that the error message is encrypted if needed. |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1073 encr_only = self.config.PGP_REQUIRE_INCOMING == 'encrypted' |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1074 encr_only = encr_only or not pgp_role() |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1075 self.crypt = True |
| 4781 | 1076 try: |
| 1077 # see if the message has a valid signature | |
| 1078 message = self.message.decrypt(author_address, | |
| 1079 may_be_unsigned = False) | |
| 1080 # only set if MailUsageError is not raised | |
| 1081 # indicating that we have a valid signature | |
| 1082 self.db.tx_Source = "email-sig-openpgp" | |
| 1083 except MailUsageError: | |
| 1084 # if there is no signature or an error in the message | |
| 1085 # we get here. Try decrypting it again if we don't | |
| 1086 # need signatures. | |
| 1087 if encr_only: | |
| 1088 message = self.message.decrypt(author_address, | |
| 1089 may_be_unsigned = encr_only) | |
| 1090 else: | |
| 1091 # something failed with the message decryption/sig | |
| 1092 # chain. Pass the error up. | |
| 1093 raise | |
| 1094 # store the decrypted message | |
| 1095 self.message = message | |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1096 elif pgp_role(): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1097 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1098 This tracker has been configured to require all email be PGP signed or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1099 encrypted.""") |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1100 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1101 def get_content_and_attachments(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1102 ''' get the attachments and first text part from the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1103 ''' |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1104 from roundup.dehtml import dehtml |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1105 html2text=dehtml(self.config['MAILGW_CONVERT_HTMLTOTEXT']).html2text |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1106 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1107 ig = self.config.MAILGW_IGNORE_ALTERNATIVES |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1108 self.message.instance = self.mailgw.instance |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1109 self.content, self.attachments, html_part = self.message.extract_content( |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1110 ignore_alternatives=ig, |
|
5305
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1111 unpack_rfc822=self.config.MAILGW_UNPACK_RFC822, |
|
e20f472fde7d
issue2550799: provide basic support for handling html only emails
John Rouillard <rouilj@ieee.org>
parents:
5264
diff
changeset
|
1112 html2text=html2text ) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1113 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1114 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1115 def create_files(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1116 ''' Create a file for each attachment in the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1117 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1118 if not self.properties.has_key('files'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1119 return |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1120 files = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1121 file_props = self.mailgw.get_class_arguments('file') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1122 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1123 if self.attachments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1124 for (name, mime_type, data) in self.attachments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1125 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1126 'file'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1127 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1128 'You are not permitted to create files.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1129 if not name: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1130 name = "unnamed" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1131 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1132 fileid = self.db.file.create(type=mime_type, name=name, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1133 content=data, **file_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1134 except exceptions.Reject: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1135 pass |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1136 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1137 files.append(fileid) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1138 # allowed to attach the files to an existing node? |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1139 if self.nodeid and not self.db.security.hasPermission('Edit', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1140 self.author, self.classname, 'files'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1141 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1142 'You are not permitted to add files to %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1143 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1144 |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
1145 self.msg_props['files'] = files |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1146 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1147 # extend the existing files list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1148 fileprop = self.cl.get(self.nodeid, 'files') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1149 fileprop.extend(files) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1150 files = fileprop |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1151 |
|
4498
8df9492c2746
Fix file-unlink bug in mailgw
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4486
diff
changeset
|
1152 self.props['files'] = files |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1153 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1154 def create_msg(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1155 ''' Create msg containing all the relevant information from the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1156 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1157 if not self.properties.has_key('messages'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1158 return |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1159 msg_props = self.mailgw.get_class_arguments('msg') |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
1160 self.msg_props.update (msg_props) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1161 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1162 # Get the message ids |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1163 inreplyto = self.message.getheader('in-reply-to') or '' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1164 messageid = self.message.getheader('message-id') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1165 # generate a messageid if there isn't one |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1166 if not messageid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1167 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(), |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1168 self.classname, self.nodeid, self.config['MAIL_DOMAIN']) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1169 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1170 if self.content is None: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1171 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1172 Roundup requires the submission to be plain text. The message parser could |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1173 not find a text/plain part to use. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1174 """) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1175 # parse the body of the message, stripping out bits as appropriate |
|
5117
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1176 summary, content = parseContent(self.content, config=self.config, is_new_issue = not bool(self.nodeid)) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1177 content = content.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1178 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1179 if content: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1180 if not self.db.security.hasPermission('Create', self.author, 'msg'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1181 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1182 'You are not permitted to create messages.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1183 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1184 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1185 message_id = self.db.msg.create(author=self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1186 recipients=self.recipients, date=date.Date('.'), |
|
4498
8df9492c2746
Fix file-unlink bug in mailgw
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4486
diff
changeset
|
1187 summary=summary, content=content, |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
1188 messageid=messageid, inreplyto=inreplyto, **self.msg_props) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1189 except exceptions.Reject as error: |
|
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1190 raise MailUsageError(_(""" |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1191 Mail message was rejected by a detector. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1192 %(error)s |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1193 """) % locals()) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1194 # allowed to attach the message to the existing node? |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1195 if self.nodeid and not self.db.security.hasPermission('Edit', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1196 self.author, self.classname, 'messages'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1197 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1198 'You are not permitted to add messages to %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1199 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1200 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1201 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1202 # add the message to the node's list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1203 messages = self.cl.get(self.nodeid, 'messages') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1204 messages.append(message_id) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1205 self.props['messages'] = messages |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1206 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1207 # pre-load the messages list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1208 self.props['messages'] = [message_id] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1209 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1210 def create_node(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1211 ''' Create/update a node using self.props |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1212 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1213 classname = self.classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1214 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1215 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1216 # Check permissions for each property |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1217 for prop in self.props.keys(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1218 if not self.db.security.hasPermission('Edit', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1219 classname, prop): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1220 raise Unauthorized, _('You are not permitted to edit ' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1221 'property %(prop)s of class %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1222 ) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1223 self.cl.set(self.nodeid, **self.props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1224 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1225 # Check permissions for each property |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1226 for prop in self.props.keys(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1227 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1228 classname, prop): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1229 raise Unauthorized, _('You are not permitted to set ' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1230 'property %(prop)s of class %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1231 ) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1232 self.nodeid = self.cl.create(**self.props) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1233 except (TypeError, IndexError, ValueError, exceptions.Reject) as message: |
|
5085
d3d9d1402763
issue2550823 Improve mailgw logging for node creation errors. Add a
John Rouillard <rouilj@ieee.org>
parents:
5056
diff
changeset
|
1234 self.mailgw.logger.exception("Rejecting email due to node creation error:") |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1235 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1236 There was a problem with the message you sent: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1237 %(message)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1238 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1239 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1240 return self.nodeid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1241 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1242 # XXX Don't enable. This doesn't work yet. |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1243 # "[^A-z.]tracker\+(?P<classname>[^\d\s]+)(?P<nodeid>\d+)\@some.dom.ain[^A-z.]" |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1244 # handle delivery to addresses like:tracker+issue25@some.dom.ain |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1245 # use the embedded issue number as our issue |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1246 # issue_re = config['MAILGW_ISSUE_ADDRESS_RE'] |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1247 # if issue_re: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1248 # for header in ['to', 'cc', 'bcc']: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1249 # addresses = message.getheader(header, '') |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1250 # if addresses: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1251 # # FIXME, this only finds the first match in the addresses. |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1252 # issue = re.search(issue_re, addresses, 'i') |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1253 # if issue: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1254 # classname = issue.group('classname') |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1255 # nodeid = issue.group('nodeid') |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1256 # break |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1257 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1258 # Default sequence of methods to be called on message. Use this for |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1259 # easier override of the default message processing |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1260 # list consists of tuples (method, return_if_true), the parsing |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1261 # returns if the return_if_true flag is set for a method *and* the |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1262 # method returns something that evaluates to True. |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1263 method_list = [ |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1264 # Filter out messages to ignore |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1265 ("handle_ignore", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1266 # Check for usage/help requests |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1267 ("handle_help", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1268 # Check if the subject line is valid |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1269 ("check_subject", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1270 # get importants parts from subject |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1271 ("parse_subject", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1272 # check for registration OTK |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1273 ("rego_confirm", True), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1274 # get the classname |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1275 ("get_classname", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1276 # get the optional nodeid: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1277 ("get_nodeid", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1278 # Determine who the author is: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1279 ("get_author_id", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1280 # allowed to edit or create this class? |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1281 ("check_permissions", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1282 # author may have been created: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1283 # commit author to database and re-open as author |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1284 ("commit_and_reopen_as_author", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1285 # Get the recipients list |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1286 ("get_recipients", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1287 # get the new/updated node props |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1288 ("get_props", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1289 # Handle PGP signed or encrypted messages |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1290 ("get_pgp_message", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1291 # extract content and attachments from message body: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1292 ("get_content_and_attachments", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1293 # put attachments into files linked to the issue: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1294 ("create_files", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1295 # create the message if there's a message body (content): |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1296 ("create_msg", False), |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1297 ] |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1298 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1299 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1300 def parse (self): |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1301 for methodname, flag in self.method_list: |
|
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1302 method = getattr (self, methodname) |
|
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1303 ret = method() |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1304 if flag and ret: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1305 return |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1306 # perform the node change / create: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1307 return self.create_node() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1308 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1309 |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
1310 class MailGW: |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1311 |
|
4469
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1312 # To override the message parsing, derive your own class from |
|
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1313 # parsedMessage and assign to parsed_message_class in a derived |
|
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1314 # class of MailGW |
|
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1315 parsed_message_class = parsedMessage |
|
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1316 |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1317 def __init__(self, instance, arguments=()): |
|
389
7d7cb5319fc0
re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents:
382
diff
changeset
|
1318 self.instance = instance |
|
1462
285934a04a6c
fix for [SF#691046]
Richard Jones <richard@users.sourceforge.net>
parents:
1409
diff
changeset
|
1319 self.arguments = arguments |
|
2672
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1320 self.default_class = None |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1321 for option, value in self.arguments: |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1322 if option == '-c': |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1323 self.default_class = value.strip() |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1324 |
|
1799
071ea6fc803f
Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1793
diff
changeset
|
1325 self.mailer = Mailer(instance.config) |
|
4420
9655a1b65974
- more logger fixes -- use correct hierarchical logger names...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4405
diff
changeset
|
1326 self.logger = logging.getLogger('roundup.mailgw') |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1327 |
|
824
34eacaa7e313
Added ability for unit tests to turn off exception handling in mailgw so
Richard Jones <richard@users.sourceforge.net>
parents:
753
diff
changeset
|
1328 # should we trap exceptions (normal usage) or pass them through |
|
34eacaa7e313
Added ability for unit tests to turn off exception handling in mailgw so
Richard Jones <richard@users.sourceforge.net>
parents:
753
diff
changeset
|
1329 # (for testing) |
|
34eacaa7e313
Added ability for unit tests to turn off exception handling in mailgw so
Richard Jones <richard@users.sourceforge.net>
parents:
753
diff
changeset
|
1330 self.trapExceptions = 1 |
|
34eacaa7e313
Added ability for unit tests to turn off exception handling in mailgw so
Richard Jones <richard@users.sourceforge.net>
parents:
753
diff
changeset
|
1331 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1332 def do_pipe(self): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1333 """ Read a message from standard input and pass it to the mail handler. |
|
1280
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1334 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1335 Read into an internal structure that we can seek on (in case |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1336 there's an error). |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1337 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1338 XXX: we may want to read this into a temporary file instead... |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1339 """ |
|
1280
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1340 s = cStringIO.StringIO() |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1341 s.write(sys.stdin.read()) |
|
1281
284a9d6b3cf9
bugfixes to pipe bugfix
Richard Jones <richard@users.sourceforge.net>
parents:
1280
diff
changeset
|
1342 s.seek(0) |
|
1280
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1343 self.main(s) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1344 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1345 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1346 def do_mailbox(self, filename): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1347 """ Read a series of messages from the specified unix mailbox file and |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1348 pass each to the mail handler. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1349 """ |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1350 # open the spool file and lock it |
|
1664
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1351 import fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1352 # FCNTL is deprecated in py2.3 and fcntl takes over all the symbols |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1353 if hasattr(fcntl, 'LOCK_EX'): |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1354 FCNTL = fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1355 else: |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1356 import FCNTL |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1357 f = open(filename, 'r+') |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1358 fcntl.flock(f.fileno(), FCNTL.LOCK_EX) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1359 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1360 # handle and clear the mailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1361 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1362 from mailbox import UnixMailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1363 mailbox = UnixMailbox(f, factory=Message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1364 # grab one message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1365 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1366 while message: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1367 # handle this message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1368 self.handle_Message(message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1369 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1370 # nuke the file contents |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1371 os.ftruncate(f.fileno(), 0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1372 except: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1373 import traceback |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1374 traceback.print_exc() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1375 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1376 fcntl.flock(f.fileno(), FCNTL.LOCK_UN) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1377 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1378 |
|
4345
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1379 def do_imap(self, server, user='', password='', mailbox='', ssl=0, |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1380 cram=0): |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1381 ''' Do an IMAP connection |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1382 ''' |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1383 import getpass, imaplib, socket |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1384 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1385 if not user: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1386 user = raw_input('User: ') |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1387 if not password: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1388 password = getpass.getpass() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1389 except (KeyboardInterrupt, EOFError): |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1390 # Ctrl C or D maybe also Ctrl Z under Windows. |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1391 print "\nAborted by user." |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1392 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1393 # open a connection to the server and retrieve all messages |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1394 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1395 if ssl: |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1396 self.logger.debug('Trying server %r with ssl'%server) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1397 server = imaplib.IMAP4_SSL(server) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1398 else: |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1399 self.logger.debug('Trying server %r without ssl'%server) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1400 server = imaplib.IMAP4(server) |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1401 except (imaplib.IMAP4.error, socket.error, socket.sslerror): |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1402 self.logger.exception('IMAP server error') |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1403 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1404 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1405 try: |
|
4345
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1406 if cram: |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1407 server.login_cram_md5(user, password) |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1408 else: |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1409 server.login(user, password) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1410 except imaplib.IMAP4.error as e: |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1411 self.logger.exception('IMAP login failure') |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1412 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1413 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1414 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1415 if not mailbox: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1416 (typ, data) = server.select() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1417 else: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1418 (typ, data) = server.select(mailbox=mailbox) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1419 if typ != 'OK': |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1420 self.logger.error('Failed to get mailbox %r: %s'%(mailbox, |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1421 data)) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1422 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1423 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1424 numMessages = int(data[0]) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1425 except ValueError as value: |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1426 self.logger.error('Invalid message count from mailbox %r'% |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1427 data[0]) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1428 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1429 for i in range(1, numMessages+1): |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1430 (typ, data) = server.fetch(str(i), '(RFC822)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1431 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1432 # mark the message as deleted. |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1433 server.store(str(i), '+FLAGS', r'(\Deleted)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1434 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1435 # process the message |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1436 s = cStringIO.StringIO(data[0][1]) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1437 s.seek(0) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1438 self.handle_Message(Message(s)) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1439 server.close() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1440 finally: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1441 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1442 server.expunge() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1443 except: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1444 pass |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1445 server.logout() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1446 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1447 return 0 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1448 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1449 |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1450 def do_apop(self, server, user='', password='', ssl=False): |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1451 ''' Do authentication POP |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1452 ''' |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1453 self._do_pop(server, user, password, True, ssl) |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1454 |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1455 def do_pop(self, server, user='', password='', ssl=False): |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1456 ''' Do plain POP |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1457 ''' |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1458 self._do_pop(server, user, password, False, ssl) |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1459 |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1460 def _do_pop(self, server, user, password, apop, ssl): |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1461 '''Read a series of messages from the specified POP server. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1462 ''' |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1463 import getpass, poplib, socket |
|
5331
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1464 # Monkey-patch poplib to have a large line-limit |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1465 # Seems that in python2.7 poplib applies a line-length limit not |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1466 # just to the lines that take care of the pop3 protocol but also |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1467 # to all email content |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1468 # See, e.g., |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1469 # https://readlist.com/lists/python.org/python-list/69/346982.html |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1470 # https://stackoverflow.com/questions/30976106/python-poplib-error-proto-line-too-+long?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1471 if 0 < getattr (poplib, '_MAXLINE', -1) < 100*1024: |
|
57caeefb2f81
Work around a line-length limit in poplib
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5306
diff
changeset
|
1472 poplib._MAXLINE = 100*1024 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1473 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1474 if not user: |
|
1982
23e5796a6b45
fix minor bug in mailgw POP handler
Richard Jones <richard@users.sourceforge.net>
parents:
1975
diff
changeset
|
1475 user = raw_input('User: ') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1476 if not password: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1477 password = getpass.getpass() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1478 except (KeyboardInterrupt, EOFError): |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1479 # Ctrl C or D maybe also Ctrl Z under Windows. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1480 print "\nAborted by user." |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1481 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1482 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1483 # open a connection to the server and retrieve all messages |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1484 try: |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1485 if ssl: |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1486 klass = poplib.POP3_SSL |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1487 else: |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1488 klass = poplib.POP3 |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1489 server = klass(server) |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1490 except socket.error: |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1491 self.logger.exception('POP server error') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1492 return 1 |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1493 if apop: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1494 server.apop(user, password) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1495 else: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1496 server.user(user) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1497 server.pass_(password) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1498 numMessages = len(server.list()[1]) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1499 for i in range(1, numMessages+1): |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1500 # retr: returns |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1501 # [ pop response e.g. '+OK 459 octets', |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1502 # [ array of message lines ], |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1503 # number of octets ] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1504 lines = server.retr(i)[1] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1505 s = cStringIO.StringIO('\n'.join(lines)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1506 s.seek(0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1507 self.handle_Message(Message(s)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1508 # delete the message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1509 server.dele(i) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1510 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1511 # quit the server to commit changes. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1512 server.quit() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1513 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1514 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1515 def main(self, fp): |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1516 ''' fp - the file from which to read the Message. |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1517 ''' |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
1518 return self.handle_Message(Message(fp)) |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1519 |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1520 def handle_Message(self, message): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1521 """Handle an RFC822 Message |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1522 |
|
391
399340646765
handle the case where there is no file attached
Richard Jones <richard@users.sourceforge.net>
parents:
389
diff
changeset
|
1523 Handle the Message object by calling handle_message() and then cope |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1524 with any errors raised by handle_message. |
|
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1525 This method's job is to make that call and handle any |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1526 errors in a sane manner. It should be replaced if you wish to |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1527 handle errors in a different manner. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1528 """ |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1529 # in some rare cases, a particularly stuffed-up e-mail will make |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1530 # its way into here... try to handle it gracefully |
|
2119
cc4667ef3f12
Added the ability to toggle where error messages go.
Eddie Parker <eparker@users.sourceforge.net>
parents:
2005
diff
changeset
|
1531 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1532 self.parsed_message = None |
|
4573
8b2ccf6f2cf7
Fix initialisation of crypt option.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4570
diff
changeset
|
1533 crypt = False |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
1534 sendto = message.getaddrlist('resent-from') |
|
5045
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
1535 if not sendto or self.instance.config['EMAIL_KEEP_REAL_FROM']: |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
1536 sendto = message.getaddrlist('from') |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1537 if not sendto: |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1538 # very bad-looking message - we don't even know who sent it |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1539 msg = ['Badly formed message from mail gateway. Headers:'] |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1540 msg.extend(message.headers) |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1541 msg = '\n'.join(map(str, msg)) |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1542 self.logger.error(msg) |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1543 return |
|
2119
cc4667ef3f12
Added the ability to toggle where error messages go.
Eddie Parker <eparker@users.sourceforge.net>
parents:
2005
diff
changeset
|
1544 |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1545 msg = 'Handling message' |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1546 if message.getheader('message-id'): |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1547 msg += ' (Message-id=%r)'%message.getheader('message-id') |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1548 self.logger.info(msg) |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1549 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1550 # try normal message-handling |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1551 if not self.trapExceptions: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1552 return self.handle_message(message) |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1553 |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1554 # no, we want to trap exceptions |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1555 # Note: by default we return the message received not the |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1556 # internal state of the parsedMessage -- except for |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1557 # MailUsageError, Unauthorized and for unknown exceptions. For |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1558 # the latter cases we make sure the error message is encrypted |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1559 # if needed (if it either was received encrypted or pgp |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1560 # processing is turned on for the user). |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1561 try: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1562 return self.handle_message(message) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1563 except MailUsageHelp: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1564 # bounce the message back to the sender with the usage message |
|
5240
86190260f077
Mailgw: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents:
5151
diff
changeset
|
1565 self.logger.debug("MailUsageHelp raised, bouncing.") |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1566 fulldoc = '\n'.join(string.split(__doc__, '\n')[2:]) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1567 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1568 m.append('\n\nMail Gateway Help\n=================') |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1569 m.append(fulldoc) |
|
2123
95da13c1bdbd
have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents:
2119
diff
changeset
|
1570 self.mailer.bounce_message(message, [sendto[0][1]], m, |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1571 subject="Mail Gateway Help") |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1572 except MailUsageError as value: |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1573 # bounce the message back to the sender with the usage message |
|
5240
86190260f077
Mailgw: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents:
5151
diff
changeset
|
1574 self.logger.debug("MailUsageError raised, bouncing.") |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1575 fulldoc = '\n'.join(string.split(__doc__, '\n')[2:]) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1576 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1577 m.append(str(value)) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1578 m.append('\n\nMail Gateway Help\n=================') |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1579 m.append(fulldoc) |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1580 if self.parsed_message: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1581 message = self.parsed_message.message |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1582 crypt = self.parsed_message.crypt |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1583 self.mailer.bounce_message(message, [sendto[0][1]], m, crypt=crypt) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1584 except Unauthorized as value: |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1585 # just inform the user that he is not authorized |
|
5240
86190260f077
Mailgw: Improves diagnostic messages for DEBUG.
Bernhard Reiter <bernhard@intevation.de>
parents:
5151
diff
changeset
|
1586 self.logger.debug("Unauthorized raised, bouncing.") |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1587 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1588 m.append(str(value)) |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1589 if self.parsed_message: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1590 message = self.parsed_message.message |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1591 crypt = self.parsed_message.crypt |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1592 self.mailer.bounce_message(message, [sendto[0][1]], m, crypt=crypt) |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1593 except IgnoreMessage: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1594 # do not take any action |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1595 # this exception is thrown when email should be ignored |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1596 msg = 'IgnoreMessage raised' |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1597 if message.getheader('message-id'): |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1598 msg += ' (Message-id=%r)'%message.getheader('message-id') |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1599 self.logger.info(msg) |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1600 return |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1601 except: |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1602 msg = 'Exception handling message' |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1603 if message.getheader('message-id'): |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1604 msg += ' (Message-id=%r)'%message.getheader('message-id') |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1605 self.logger.exception(msg) |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1606 |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1607 # bounce the message back to the sender with the error message |
|
2123
95da13c1bdbd
have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents:
2119
diff
changeset
|
1608 # let the admin know that something very bad is happening |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1609 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1610 m.append('An unexpected error occurred during the processing') |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1611 m.append('of your message. The tracker administrator is being') |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1612 m.append('notified.\n') |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1613 if self.parsed_message: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1614 message = self.parsed_message.message |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1615 crypt = self.parsed_message.crypt |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1616 self.mailer.bounce_message(message, [sendto[0][1]], m, crypt=crypt) |
|
3948
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1617 |
|
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1618 m.append('----------------') |
|
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1619 m.append(traceback.format_exc()) |
|
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1620 self.mailer.bounce_message(message, [self.instance.config.ADMIN_EMAIL], m) |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1621 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1622 def handle_message(self, message): |
|
110
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1623 ''' message - a Message instance |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1624 |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1625 Parse the message as per the module docstring. |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1626 ''' |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1627 # get database handle for handling one email |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1628 self.db = self.instance.open ('admin') |
| 4781 | 1629 |
| 1630 self.db.tx_Source = "email" | |
| 1631 | |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1632 try: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1633 return self._handle_message(message) |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1634 finally: |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1635 self.db.close() |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1636 |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1637 def _handle_message(self, message): |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1638 ''' message - a Message instance |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1639 |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1640 Parse the message as per the module docstring. |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1641 The following code expects an opened database and a try/finally |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1642 that closes the database. |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1643 ''' |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1644 self.parsed_message = self.parsed_message_class(self, message) |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1645 nodeid = self.parsed_message.parse () |
|
1217
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
1646 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1647 # commit the changes to the DB |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1648 self.db.commit() |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
1649 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1650 self.parsed_message = None |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1651 return nodeid |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
1652 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1653 def get_class_arguments(self, class_type, classname=None): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1654 ''' class_type - a valid node class type: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1655 - 'user' refers to the author of a message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1656 - 'issue' refers to an issue-type class (to which the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1657 message is appended) specified in parameter classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1658 Note that this need not be the real classname, we get |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1659 the real classname used as a parameter (from previous |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1660 message-parsing steps) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1661 - 'file' specifies a file-type class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1662 - 'msg' is the message-class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1663 classname - the name of the current issue-type class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1664 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1665 Parse the commandline arguments and retrieve the properties that |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1666 are relevant to the class_type. We now allow multiple -S options |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1667 per class_type (-C option). |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1668 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1669 allprops = {} |
|
286
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
1670 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1671 classname = classname or class_type |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1672 cls_lookup = { 'issue' : classname } |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1673 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1674 # Allow other issue-type classes -- take the real classname from |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1675 # previous parsing-steps of the message: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1676 clsname = cls_lookup.get (class_type, class_type) |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
1677 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1678 # check if the clsname is valid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1679 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1680 self.db.getclass(clsname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1681 except KeyError: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1682 mailadmin = self.instance.config['ADMIN_EMAIL'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1683 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1684 The mail gateway is not properly set up. Please contact |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1685 %(mailadmin)s and have them fix the incorrect class specified as: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1686 %(clsname)s |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1687 """) % locals() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1688 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1689 if self.arguments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1690 # The default type on the commandline is msg |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1691 if class_type == 'msg': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1692 current_type = class_type |
|
3417
07c696890f55
mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents:
3415
diff
changeset
|
1693 else: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1694 current_type = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1695 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1696 # Handle the arguments specified by the email gateway command line. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1697 # We do this by looping over the list of self.arguments looking for |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1698 # a -C to match the class we want, then use the -S setting string. |
|
1359
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
1699 for option, propstring in self.arguments: |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1700 if option in ( '-C', '--class'): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1701 current_type = propstring.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1702 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1703 if current_type != class_type: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1704 current_type = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1705 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1706 elif current_type and option in ('-S', '--set'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1707 cls = cls_lookup.get (current_type, current_type) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1708 temp_cl = self.db.getclass(cls) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1709 errors, props = setPropArrayFromString(self, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1710 temp_cl, propstring.strip()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1711 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1712 if errors: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1713 mailadmin = self.instance.config['ADMIN_EMAIL'] |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1714 raise MailUsageError, _(""" |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1715 The mail gateway is not properly set up. Please contact |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1716 %(mailadmin)s and have them fix the incorrect properties: |
|
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1717 %(errors)s |
|
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1718 """) % locals() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1719 allprops.update(props) |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
1720 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1721 return allprops |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
1722 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1723 |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1724 def setPropArrayFromString(self, cl, propString, nodeid=None): |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1725 ''' takes string of form prop=value,value;prop2=value |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1726 and returns (error, prop[..]) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1727 ''' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1728 props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1729 errors = [] |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1730 for prop in string.split(propString, ';'): |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1731 # extract the property name and value |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1732 try: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1733 propname, value = prop.split('=') |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1734 except ValueError as message: |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1735 errors.append(_('not of form [arg=value,value,...;' |
|
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1736 'arg=value,value,...]')) |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1737 return (errors, props) |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1738 # convert the value to a hyperdb-usable value |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1739 propname = propname.strip() |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1740 try: |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1741 props[propname] = hyperdb.rawToHyperdb(self.db, cl, nodeid, |
|
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1742 propname, value) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5240
diff
changeset
|
1743 except hyperdb.HyperdbValueError as message: |
|
2920
98e6219ddb83
merge maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents:
2906
diff
changeset
|
1744 errors.append(str(message)) |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1745 return errors, props |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1746 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1747 |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1748 def extractUserFromList(userClass, users): |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1749 '''Given a list of users, try to extract the first non-anonymous user |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1750 and return that user, otherwise return None |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1751 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1752 if len(users) > 1: |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1753 for user in users: |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1754 # make sure we don't match the anonymous or admin user |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1755 if userClass.get(user, 'username') in ('admin', 'anonymous'): |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1756 continue |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1757 # first valid match will do |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1758 return user |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1759 # well, I guess we have no choice |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1760 return user[0] |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1761 elif users: |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1762 return users[0] |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1763 return None |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1764 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1765 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1766 def uidFromAddress(db, address, create=1, **user_props): |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1767 ''' address is from the rfc822 module, and therefore is (name, addr) |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1768 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1769 user is created if they don't exist in the db already |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1770 user_props may supply additional user information |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1771 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1772 (realname, address) = address |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1773 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1774 # try a straight match of the address |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1775 user = extractUserFromList(db.user, db.user.stringFind(address=address)) |
|
1477
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1776 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1777 return user |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1778 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1779 # try the user alternate addresses if possible |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1780 props = db.user.getprops() |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1781 if props.has_key('alternate_addresses'): |
|
1249
6c24a86a12ae
Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents:
1244
diff
changeset
|
1782 users = db.user.filter(None, {'alternate_addresses': address}) |
|
4531
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1783 # We want an exact match of the email, not just a substring |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1784 # match. Otherwise e.g. support@example.com would match |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1785 # discuss-support@example.com which is not what we want. |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1786 found_users = [] |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1787 for u in users: |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1788 alt = db.user.get(u, 'alternate_addresses').split('\n') |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1789 for a in alt: |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1790 if a.strip().lower() == address.lower(): |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1791 found_users.append(u) |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1792 break |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1793 user = extractUserFromList(db.user, found_users) |
|
1477
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1794 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1795 return user |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1796 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1797 # try to match the username to the address (for local |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1798 # submissions where the address is empty) |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1799 user = extractUserFromList(db.user, db.user.stringFind(username=address)) |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1800 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1801 # couldn't match address or username, so create a new user |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1802 if create: |
|
1592
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1803 # generate a username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1804 if '@' in address: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1805 username = address.split('@')[0] |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1806 else: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1807 username = address |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1808 trying = username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1809 n = 0 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1810 while 1: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1811 try: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1812 # does this username exist already? |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1813 db.user.lookup(trying) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1814 except KeyError: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1815 break |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1816 n += 1 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1817 trying = username + str(n) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1818 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1819 # create! |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1820 try: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1821 return db.user.create(username=trying, address=address, |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1822 realname=realname, roles=db.config.NEW_EMAIL_USER_ROLES, |
|
4486
693c75d56ebe
Add new config-option 'password_pbkdf2_default_rounds'...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4477
diff
changeset
|
1823 password=password.Password(password.generatePassword(), config=db.config), |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1824 **user_props) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1825 except exceptions.Reject: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1826 return 0 |
|
905
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1827 else: |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1828 return 0 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1829 |
|
5117
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1830 def parseContent(content, keep_citations=None, keep_body=None, config=None, is_new_issue=False): |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1831 """Parse mail message; return message summary and stripped content |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1832 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1833 The message body is divided into sections by blank lines. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1834 Sections where the second and all subsequent lines begin with a ">" |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1835 or "|" character are considered "quoting sections". The first line of |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1836 the first non-quoting section becomes the summary of the message. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1837 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1838 Arguments: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1839 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1840 keep_citations: declared for backward compatibility. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1841 If omitted or None, use config["MAILGW_KEEP_QUOTED_TEXT"] |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1842 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1843 keep_body: declared for backward compatibility. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1844 If omitted or None, use config["MAILGW_LEAVE_BODY_UNCHANGED"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1845 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1846 config: tracker configuration object. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1847 If omitted or None, use default configuration. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1848 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1849 """ |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1850 if config is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1851 config = configuration.CoreConfig() |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1852 if keep_citations is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1853 keep_citations = config["MAILGW_KEEP_QUOTED_TEXT"] |
|
5117
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1854 if keep_citations == "new": |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1855 # don't strip citations if we are a new issue |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1856 if is_new_issue: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1857 keep_citations = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1858 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1859 keep_citations = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1860 elif keep_citations == "yes": |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1861 keep_citations = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1862 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1863 keep_citations = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1864 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1865 if keep_body is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1866 keep_body = config["MAILGW_LEAVE_BODY_UNCHANGED"] |
|
5117
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1867 if keep_body == "new": |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1868 # don't strip citations if we are a new issue |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1869 if is_new_issue: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1870 keep_body = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1871 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1872 keep_body = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1873 elif keep_body == "yes": |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1874 keep_body = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1875 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1876 keep_body = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1877 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1878 eol = config["MAILGW_EOL_RE"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1879 signature = config["MAILGW_SIGN_RE"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1880 original_msg = config["MAILGW_ORIGMSG_RE"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1881 |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1882 # strip off leading carriage-returns / newlines |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1883 i = 0 |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1884 for i in range(len(content)): |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1885 if content[i] not in '\r\n': |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1886 break |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1887 if i > 0: |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1888 sections = config["MAILGW_BLANKLINE_RE"].split(content[i:]) |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1889 else: |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1890 sections = config["MAILGW_BLANKLINE_RE"].split(content) |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1891 |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1892 # extract out the summary from the message |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1893 summary = '' |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1894 l = [] |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1895 # find last non-empty section for signature matching |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1896 last_nonempty = len(sections) -1 |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1897 while last_nonempty and not sections[last_nonempty]: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1898 last_nonempty -= 1 |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1899 for ns, section in enumerate(sections): |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1900 #section = section.strip() |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1901 if not section: |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1902 continue |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1903 lines = eol.split(section) |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1904 quote_1st = lines[0] and lines[0][0] in '>|' |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1905 quote_2nd = len(lines) > 1 and lines[1] and lines[1][0] in '>|' |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1906 if quote_1st or quote_2nd: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1907 # don't drop non-quoted first line of intermediate section: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1908 if ns and not quote_1st and lines[0] and not keep_citations: |
|
4581
f1d6e2b2eb64
Fix quote-stripping in mail gateway again.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4580
diff
changeset
|
1909 # we drop only first-lines ending in ':' (e.g. 'XXX wrote:') |
|
f1d6e2b2eb64
Fix quote-stripping in mail gateway again.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4580
diff
changeset
|
1910 if not lines[0].endswith(':'): |
|
f1d6e2b2eb64
Fix quote-stripping in mail gateway again.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4580
diff
changeset
|
1911 l.append(lines[0]) |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1912 # see if there's a response somewhere inside this section (ie. |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1913 # no blank line between quoted message and response) |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1914 for n, line in enumerate(lines[1:]): |
|
1209
e47d9bb1455b
[SF#614188] Exception in mailgw.py
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
1915 if line and line[0] not in '>|': |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1916 break |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1917 else: |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1918 # we keep quoted bits if specified in the config |
|
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1919 if keep_citations: |
|
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1920 l.append(section) |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1921 continue |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1922 # keep this section - it has reponse stuff in it |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1923 if not keep_citations: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1924 lines = lines[n+1:] |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1925 section = '\n'.join(lines) |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1926 |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1927 is_last = ns == last_nonempty |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1928 # and while we're at it, use the first non-quoted bit as |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1929 # our summary |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1930 if not summary: |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1931 # if we don't have our summary yet use the first line of this |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1932 # section |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1933 summary = section |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1934 # match signature only in last section |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1935 elif is_last and signature.match(lines[0]) and 2 <= len(lines) <= 10: |
|
706
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1936 # lose any signature |
|
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1937 break |
|
1344
f2f553611ce0
applied patches for handling Outlook quirks...
Richard Jones <richard@users.sourceforge.net>
parents:
1329
diff
changeset
|
1938 elif original_msg.match(lines[0]): |
|
706
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1939 # ditch the stupid Outlook quoting of the entire original message |
| 454 | 1940 break |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1941 |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1942 # and add the section to the output |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1943 l.append(section) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1944 |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1945 # figure the summary - find the first sentence-ending punctuation or the |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1946 # first whole line, whichever is longest |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1947 sentence = re.search(r'^([^!?\.]+[!?\.])', summary) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1948 if sentence: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1949 sentence = sentence.group(1) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1950 else: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1951 sentence = '' |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1952 first = eol.split(summary)[0] |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1953 summary = max(sentence, first) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1954 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1955 # Now reconstitute the message content minus the bits we don't care |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1956 # about. |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1957 if not keep_body: |
|
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1958 content = '\n\n'.join(l) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1959 |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1960 return summary, content |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1961 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1962 # vim: set filetype=python sts=4 sw=4 et si : |
