Mercurial > p > roundup > code
annotate roundup/mailgw.py @ 5179:e8b3d3a14563
- issue2550796: Calendar and Classhelp selection tools don't cause
onchange event to be triggered.
Using the helper popups for modifying lists of users, lists of
issues, dates etc.. now trigger the change event on the form's
field. This allows onchange javascript to trigger to highlight
changes, recalculate other form values etc. See ``upgrading.txt``
for details on applying these changes to your tracker.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 28 Jan 2017 20:58:19 -0500 |
| parents | 6bbb6dd97458 |
| children | 86190260f077 |
| 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 |
|
3155
57b60bda9473
Python 2.3 minimum version - bye bye roundup.rlog, you had a short life.
Richard Jones <richard@users.sourceforge.net>
parents:
3023
diff
changeset
|
98 import time, random, 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 |
|
4575
c426cb251bc7
Be more tolerant when parsing RFC2047 encoded mail headers.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4573
diff
changeset
|
102 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
|
103 |
| 4981 | 104 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
|
105 from roundup.mailer import Mailer, MessageSendError |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
106 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
|
107 from roundup.hyperdb import iter_roles |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
108 |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
109 try: |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
110 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
|
111 except ImportError: |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
112 pyme = None |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
113 |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
114 SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '') |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
115 |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
116 class MailGWError(ValueError): |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
117 pass |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
118 |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
119 class MailUsageError(ValueError): |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
120 pass |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
121 |
|
544
d32977eb8bd4
simple help command for mailgw
Richard Jones <richard@users.sourceforge.net>
parents:
537
diff
changeset
|
122 class MailUsageHelp(Exception): |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
123 """ 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
|
124 pass |
|
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
125 |
|
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
|
126 class Unauthorized(Exception): |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
127 """ Access denied """ |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
128 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
129 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
130 class IgnoreMessage(Exception): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
131 """ 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
|
132 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
133 class IgnoreBulk(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
134 """ 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
|
135 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
136 class IgnoreLoop(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
137 """ 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
|
138 pass |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
139 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
140 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
|
141 ''' 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
|
142 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
143 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
|
144 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
|
145 ''' |
|
948
8d8db618c2c3
grant email access to admin too ;)
Richard Jones <richard@users.sourceforge.net>
parents:
928
diff
changeset
|
146 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
|
147 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
|
148 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
|
149 |
|
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
|
150 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
|
151 ''' 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
|
152 ''' |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 # 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
|
160 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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 if f[:i].strip().lower() == param: |
|
4980
13f8f88ad984
Replace rfc822 imports with email package (issue2550870)
John Kristensen <john@jerrykan.com>
parents:
4781
diff
changeset
|
167 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
|
168 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
|
169 |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
170 def gpgh_key_getall(key, attr): |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
171 ''' 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
|
172 a key |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
173 ''' |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
174 for u in key.uids: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
175 yield getattr(u, attr) |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
176 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
177 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
|
178 ''' Theoretically a PGP message can have several signatures. GPGME |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
179 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
|
180 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
|
181 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
|
182 invalid signature. |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
183 ''' |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
184 for sig in sigs: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
185 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
|
186 # 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
|
187 # submitted the email |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
188 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
|
189 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
|
190 return True |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
191 else: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
192 # 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
|
193 # message in our bounce |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
194 if sig.summary & pyme.constants.sigsum.KEY_MISSING: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
195 raise MailUsageError, \ |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
196 _("Message signed with unknown key: %s") % sig.fpr |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
197 elif sig.summary & pyme.constants.sigsum.KEY_EXPIRED: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
198 raise MailUsageError, \ |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
199 _("Message signed with an expired key: %s") % sig.fpr |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
200 elif sig.summary & pyme.constants.sigsum.KEY_REVOKED: |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
201 raise MailUsageError, \ |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
202 _("Message signed with a revoked key: %s") % sig.fpr |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
203 else: |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
204 raise MailUsageError, \ |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
205 _("Invalid PGP signature detected.") |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
206 |
|
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
207 # 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
|
208 if sigs: |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
209 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
|
210 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
|
211 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
|
212 |
|
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
|
213 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
|
214 ''' 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
|
215 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
|
216 ''' |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
217 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
|
218 ''' 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
|
219 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
|
220 ''' |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
221 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
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 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
|
228 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
|
229 # 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
|
230 # 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
|
231 length = s.tell() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
232 s.seek(-2, 1) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
233 lineending = s.read(2) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
234 if lineending == '\r\n': |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
235 s.truncate(length - 2) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
236 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
|
237 s.truncate(length - 1) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
238 else: |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
239 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
|
240 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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 return Message(s) |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
246 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
247 def getparts(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
248 """Get all parts of this multipart message.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
249 # 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
|
250 self.fp.seek(0) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
251 self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
252 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
253 # accumulate the other parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
254 parts = [] |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
255 while 1: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
256 part = self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
257 if part is None: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
258 break |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
259 parts.append(part) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
260 return parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
261 |
|
4505
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
262 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
|
263 l = [] |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
264 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
|
265 if encoding: |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
266 part = part.decode(encoding) |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
267 # 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
|
268 # 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
|
269 # 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
|
270 # 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
|
271 # 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
|
272 l.append(part) |
|
a00e0e73bb26
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4503
diff
changeset
|
273 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
|
274 |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
275 def getheader(self, name, default=None): |
|
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
276 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
|
277 # 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
|
278 # 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
|
279 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
|
280 return None |
|
4093
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
281 if not hdr: |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
282 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
|
283 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
|
284 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
|
285 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
|
286 |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
287 def getaddrlist(self, name): |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
288 # 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
|
289 l = [] |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
290 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
|
291 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
|
292 l.append((name, addr)) |
|
1ebab2e397d0
Add some new encoding tests to mailgw:
Richard Jones <richard@users.sourceforge.net>
parents:
4092
diff
changeset
|
293 return l |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
294 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
295 def getname(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
296 """Find an appropriate name for this message.""" |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
297 name = None |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
298 if self.gettype() == 'message/rfc822': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
299 # handle message/rfc822 specially - the name should be |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
300 # 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
|
301 # 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
|
302 self.fp.seek(0) |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
303 s = cStringIO.StringIO(self.getbody()) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
304 name = Message(s).getheader('subject') |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
305 if name: |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
306 name = name + '.eml' |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
307 if not name: |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
308 # try name on Content-Type |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
309 name = self.getparam('name') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
310 if not name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
311 disp = self.getheader('content-disposition', None) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
312 if disp: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
313 name = getparam(disp, 'filename') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
314 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
315 if name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
316 return name.strip() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
317 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
318 def getbody(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
319 """Get the decoded message body.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
320 self.rewindbody() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
321 encoding = self.getencoding() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
322 data = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
323 if encoding == 'base64': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
324 # BUG: is base64 really used for text encoding or |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
325 # are we inserting zip files here. |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
326 data = binascii.a2b_base64(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
327 elif encoding == 'quoted-printable': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
328 # the quopri module wants to work with files |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
329 decoded = cStringIO.StringIO() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
330 quopri.decode(self.fp, decoded) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
331 data = decoded.getvalue() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
332 elif encoding == 'uuencoded': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
333 data = binascii.a2b_uu(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
334 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
335 # take it as text |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
336 data = self.fp.read() |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
337 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
338 # Encode message to unicode |
| 4981 | 339 charset = self.getparam("charset") |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
340 if charset: |
| 4981 | 341 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
|
342 # 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
|
343 # badly-specified charsets |
|
4a228402b810
Handle invalidly-specified charsets in incoming email
Richard Jones <richard@users.sourceforge.net>
parents:
3371
diff
changeset
|
344 edata = unicode(data, charset, 'replace').encode('utf-8') |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
345 # Convert from dos eol to unix |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
346 edata = edata.replace('\r\n', '\n') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
347 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
348 # Leave message content as is |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
349 edata = data |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
350 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
351 return edata |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
352 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
353 # General multipart handling: |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
354 # 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
|
355 # attachment. |
| 2364 | 356 # multipart/mixed: |
| 357 # Multiple "unrelated" parts. | |
| 358 # multipart/Alternative (rfc 1521): | |
| 359 # Like multipart/mixed, except that we'd only want one of the | |
| 360 # alternatives. Generally a top-level part from MUAs sending HTML | |
| 361 # mail - there will be a text/plain version. | |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
362 # multipart/signed (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
363 # 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
|
364 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
365 # 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
|
366 # multipart/encrypted (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
367 # 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
|
368 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
369 # ACTION: Not handleable as the content is encrypted. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
370 # multipart/related (rfc 1872, 2112, 2387): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
371 # The Multipart/Related content-type addresses the MIME |
| 2364 | 372 # representation of compound objects, usually HTML mail with embedded |
| 373 # images. Usually appears as an alternative. | |
| 374 # ACTION: Default, if we must. | |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
375 # multipart/report (rfc 1892): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
376 # e.g. mail system delivery status reports. |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
377 # 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
|
378 # flagging. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
379 # multipart/form-data: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
380 # For web forms only. |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
381 # message/rfc822: |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
382 # Only if configured in [mailgw] unpack_rfc822 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
383 |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
384 def extract_content(self, parent_type=None, ignore_alternatives=False, |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
385 unpack_rfc822=False): |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
386 """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
|
387 |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
388 If the content is hidden inside a multipart/alternative part, |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
389 we use the *last* text/plain part of the *first* |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
390 multipart/alternative in the whole message. |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
391 """ |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
392 content_type = self.gettype() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
393 content = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
394 attachments = [] |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
395 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
396 if content_type == 'text/plain': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
397 content = self.getbody() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
398 elif content_type[:10] == 'multipart/': |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
399 content_found = bool (content) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
400 ig = ignore_alternatives and not content_found |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
401 for part in self.getparts(): |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
402 new_content, new_attach = part.extract_content(content_type, |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
403 not content and ig, unpack_rfc822) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
404 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
405 # 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
|
406 # otherwise make it an attachment. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
407 if not content: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
408 content = new_content |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
409 cpart = part |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
410 elif new_content: |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
411 if content_found or content_type != 'multipart/alternative': |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
412 attachments.append(part.text_as_attachment()) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
413 else: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
414 # if we have found a text/plain in the current |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
415 # multipart/alternative and find another one, we |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
416 # use the first as an attachment (if configured) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
417 # and use the second one because rfc 2046, sec. |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
418 # 5.1.4. specifies that later parts are better |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
419 # (thanks to Philipp Gortan for pointing this |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
420 # out) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
421 attachments.append(cpart.text_as_attachment()) |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
422 content = new_content |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
423 cpart = part |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
424 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
425 attachments.extend(new_attach) |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
426 if ig and content_type == 'multipart/alternative' and content: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
427 attachments = [] |
|
4424
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
428 elif unpack_rfc822 and content_type == 'message/rfc822': |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
429 s = cStringIO.StringIO(self.getbody()) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
430 m = Message(s) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
431 ig = ignore_alternatives and not content |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
432 new_content, attachments = m.extract_content(m.gettype(), ig, |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
433 unpack_rfc822) |
|
f1affb6b7a08
Mail gateway fixes and improvements.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4420
diff
changeset
|
434 attachments.insert(0, m.text_as_attachment()) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
435 elif (parent_type == 'multipart/signed' and |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
436 content_type == 'application/pgp-signature'): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
437 # 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
|
438 pass |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
439 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
440 attachments.append(self.as_attachment()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
441 return content, attachments |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
442 |
|
3945
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
443 def text_as_attachment(self): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
444 """Return first text/plain part as Message""" |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
445 if not self.gettype().startswith ('multipart/'): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
446 return self.as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
447 for part in self.getparts(): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
448 content_type = part.gettype() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
449 if content_type == 'text/plain': |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
450 return part.as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
451 elif content_type.startswith ('multipart/'): |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
452 p = part.text_as_attachment() |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
453 if p: |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
454 return p |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
455 return None |
|
1dd64778bc45
Mail improvements:
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
3922
diff
changeset
|
456 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
457 def as_attachment(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
458 """Return this message as an attachment.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
459 return (self.getname(), self.gettype(), self.getbody()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
460 |
|
3915
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
461 def pgp_signed(self): |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
462 ''' 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
|
463 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
464 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
|
465 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
|
466 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
467 def pgp_encrypted(self): |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
468 ''' 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
|
469 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
470 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
|
471 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
|
472 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
473 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
|
474 ''' 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
|
475 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
|
476 "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
|
477 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
|
478 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
479 (hdr, msg) = self.getparts() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
480 # 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
|
481 # 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
|
482 # 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
|
483 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
|
484 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
|
485 raise MailUsageError, \ |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
486 _("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
|
487 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
488 context = pyme.core.Context() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
489 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
|
490 plaintext = pyme.core.Data() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
491 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
492 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
|
493 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
494 if result: |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
495 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
|
496 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
497 # 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
|
498 # 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
|
499 # 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
|
500 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
|
501 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
|
502 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
|
503 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
504 plaintext.seek(0,0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
505 # 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
|
506 # 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
|
507 # 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
|
508 c = cStringIO.StringIO() |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
509 c.write(plaintext.read()) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
510 c.seek(0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
511 return Message(c) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
512 |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
513 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
|
514 ''' 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
|
515 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
|
516 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
|
517 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
|
518 ''' |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
519 # 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
|
520 # 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
|
521 (msg, sig) = self.getparts() |
|
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 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
|
524 raise MailUsageError, \ |
|
3917
1f3310c0a100
fix gettext markup
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3915
diff
changeset
|
525 _("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
|
526 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
527 # 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
|
528 # 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
|
529 # 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
|
530 msg.fp.seek(0) |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
531 # 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
|
532 # 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
|
533 # 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
|
534 # 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
|
535 # canonical <CR><LF> sequence." |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
536 # 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
|
537 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
|
538 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
|
539 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
|
540 |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
541 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
|
542 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
|
543 |
|
6b3919328381
support for receiving OpenPGP MIME messages (signed or encrypted)
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3876
diff
changeset
|
544 # 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
|
545 result = context.op_verify_result() |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
546 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
|
547 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
548 class parsedMessage: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
549 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
550 def __init__(self, mailgw, message): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
551 self.mailgw = mailgw |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
552 self.config = mailgw.instance.config |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
553 self.db = mailgw.db |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
554 self.message = message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
555 self.subject = message.getheader('subject', '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
556 self.has_prefix = False |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
557 self.matches = dict.fromkeys(['refwd', 'quote', 'classname', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
558 '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
|
559 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
|
560 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
|
561 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
|
562 else: |
|
a46d5d0fd5f8
Fix issue1615201: Added a new configuration option EMAIL_KEEP_REAL_FROM
Peter Funk <pf@artcom-gmbh.de>
parents:
4981
diff
changeset
|
563 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
|
564 or message.getaddrlist('from') |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
565 self.pfxmode = self.config['MAILGW_SUBJECT_PREFIX_PARSING'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
566 self.sfxmode = self.config['MAILGW_SUBJECT_SUFFIX_PARSING'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
567 # these are filled in by subsequent parsing steps |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
568 self.classname = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
569 self.properties = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
570 self.cl = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
571 self.nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
572 self.author = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
573 self.recipients = None |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
574 self.msg_props = {} |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
575 self.props = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
576 self.content = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
577 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
|
578 self.crypt = False |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
579 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
580 def handle_ignore(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
581 ''' Check to see if message can be safely ignored: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
582 detect loops and |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
583 Precedence: Bulk, or Microsoft Outlook autoreplies |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
584 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
585 if self.message.getheader('x-roundup-loop', ''): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
586 raise IgnoreLoop |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
587 if (self.message.getheader('precedence', '') == 'bulk' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
588 or self.subject.lower().find("autoreply") > 0): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
589 raise IgnoreBulk |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
590 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
591 def handle_help(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
592 ''' 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
|
593 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
594 if self.subject.strip().lower() == 'help': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
595 raise MailUsageHelp |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
596 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
597 def check_subject(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
598 ''' 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
|
599 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
600 if not self.subject: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
601 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
602 Emails to Roundup trackers must include a Subject: line! |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
603 """) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
604 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
605 def parse_subject(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
606 ''' Matches subjects like: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
607 Re: "[issue1234] title of issue [status=resolved]" |
|
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 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
|
610 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
|
611 returned |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
612 ''' |
|
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 tmpsubject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
615 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
616 sd_open, sd_close = self.config['MAILGW_SUBJECT_SUFFIX_DELIMITERS'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
617 delim_open = re.escape(sd_open) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
618 if delim_open in '[(': delim_open = '\\' + delim_open |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
619 delim_close = re.escape(sd_close) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
620 if delim_close in '[(': delim_close = '\\' + delim_close |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
621 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
622 # 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
|
623 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
|
624 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
|
625 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
626 m = m.groupdict() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
627 if m['refwd']: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
628 self.matches.update(m) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
629 tmpsubject = tmpsubject[len(m['refwd']):] # Consume Re: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
630 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
631 # Look for Leading " |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
632 m = re.match(r'(?P<quote>\s*")', tmpsubject, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
633 re.IGNORECASE) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
634 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
635 self.matches.update(m.groupdict()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
636 tmpsubject = tmpsubject[len(self.matches['quote']):] # Consume quote |
|
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 # Check if the subject includes a prefix |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
639 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
|
640 delim_close), tmpsubject.strip()) |
|
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 # Match the classname if specified |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
643 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
|
644 "|".join(self.db.getclasses()), delim_close) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
645 # 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
|
646 # (mailing list prefix, etc.) before the class identifier |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
647 m = re.search(class_re, tmpsubject, re.IGNORECASE) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
648 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
649 self.matches.update(m.groupdict()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
650 # Skip to the end of the class identifier, including any |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
651 # garbage before it. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
652 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
653 tmpsubject = tmpsubject[m.end():] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
654 |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
655 # Match any arguments specified *from the end* |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
656 # 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
|
657 # may put there, e.g. |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
658 # Re: "[issue1] bla blah [<args>]" |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
659 q = '' |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
660 if self.matches['quote']: |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
661 q = '"?' |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
662 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
|
663 delim_close, delim_close, q) |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
664 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
|
665 if m: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
666 self.matches.update(m.groupdict()) |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
667 tmpsubject = tmpsubject [:m.start()] |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
668 else: |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
669 self.matches['argswhole'] = self.matches['args'] = None |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
670 |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
671 # 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
|
672 self.matches ['title'] = tmpsubject.strip () |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
673 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
674 # 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
|
675 # Re: "[issue1] bla blah" |
|
5151
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
676 # 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
|
677 # already have consumed the quote after the subject) |
|
6bbb6dd97458
Fix subject parsing in mail gateway.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5117
diff
changeset
|
678 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
|
679 and self.matches['title'].endswith('"'): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
680 self.matches['title'] = self.matches['title'][:-1] |
|
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 def rego_confirm(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
683 ''' Check for registration OTK and confirm the registration if found |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
684 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
685 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
686 if self.config['EMAIL_REGISTRATION_CONFIRMATION']: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
687 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
|
688 otk = otk_re.search(self.matches['title'] or '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
689 if otk: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
690 self.db.confirm_registration(otk.group('otk')) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
691 subject = 'Your registration to %s is complete' % \ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
692 self.config['TRACKER_NAME'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
693 sendto = [self.from_list[0][1]] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
694 self.mailgw.mailer.standard_message(sendto, subject, '') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
695 return 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
696 return 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
697 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
698 def get_classname(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
699 ''' Determine the classname of the node being created/edited |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
700 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
701 subject = self.subject |
|
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 # get the classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
704 if self.pfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
705 classname = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
706 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
707 classname = self.matches['classname'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
708 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
709 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
|
710 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
711 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
|
712 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
|
713 'topic' of the message. For example: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
714 Subject: [issue] This is a new issue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
715 - 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
|
716 a new issue'. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
717 Subject: [issue1234] This is a followup to issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
718 - 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
|
719 in the tracker. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
720 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
721 Subject was: '%(subject)s' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
722 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
723 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
724 # 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
|
725 # back on the default |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
726 attempts = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
727 if classname: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
728 attempts.append(classname) |
|
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 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
|
731 attempts.append(self.mailgw.default_class) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
732 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
733 attempts.append(self.config['MAILGW_DEFAULT_CLASS']) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
734 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
735 # first valid class name wins |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
736 self.cl = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
737 for trycl in attempts: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
738 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
739 self.cl = self.db.getclass(trycl) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
740 classname = self.classname = trycl |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
741 break |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
742 except KeyError: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
743 pass |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
744 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
745 if not self.cl: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
746 validname = ', '.join(self.db.getclasses()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
747 if classname: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
748 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
749 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
|
750 not exist in the database. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
751 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
752 Valid class names are: %(validname)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
753 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
754 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
755 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
756 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
757 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
|
758 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
|
759 designator to indicate the 'topic' of the message. For example: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
760 Subject: [issue] This is a new issue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
761 - 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
|
762 a new issue'. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
763 Subject: [issue1234] This is a followup to issue 1234 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
764 - 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
|
765 in the tracker. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
766 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
767 Subject was: '%(subject)s' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
768 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
769 # get the class properties |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
770 self.properties = self.cl.getprops() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
771 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
772 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
773 def get_nodeid(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
774 ''' 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
|
775 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
776 title = self.matches['title'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
777 subject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
778 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
779 if self.pfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
780 nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
781 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
782 nodeid = self.matches['nodeid'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
783 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
784 # 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
|
785 inreplyto = self.message.getheader('in-reply-to') or '' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
786 if nodeid is None and inreplyto: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
787 l = self.db.getclass('msg').stringFind(messageid=inreplyto) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
788 if l: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
789 nodeid = self.cl.filter(None, {'messages':l})[0] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
790 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
791 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
792 # but we do need either a title or a nodeid... |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
793 if nodeid is None and not title: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
794 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
795 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
|
796 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
|
797 previous subject title intact so I can match that. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
798 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
799 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
800 """) % locals() |
|
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 # 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
|
803 # 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
|
804 # 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
|
805 # 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
|
806 # recent...). The subject_content_match config may specify an |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
807 # additional restriction based on the matched node's creation or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
808 # activity. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
809 tmatch_mode = self.config['MAILGW_SUBJECT_CONTENT_MATCH'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
810 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
|
811 l = self.cl.stringFind(title=title) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
812 limit = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
813 if (tmatch_mode.startswith('creation') or |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
814 tmatch_mode.startswith('activity')): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
815 limit, interval = tmatch_mode.split(' ', 1) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
816 threshold = date.Date('.') - date.Interval(interval) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
817 for id in l: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
818 if limit: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
819 if threshold < self.cl.get(id, limit): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
820 nodeid = id |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
821 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
822 nodeid = id |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
823 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
824 # if a nodeid was specified, make sure it's valid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
825 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
|
826 if self.pfxmode == 'strict': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
827 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
828 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
|
829 ("%(nodeid)s") does not exist. |
|
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 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
832 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
833 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
834 nodeid = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
835 self.nodeid = nodeid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
836 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
837 def get_author_id(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
838 ''' 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
|
839 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
|
840 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
841 # 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
|
842 create = 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
843 anonid = self.db.user.lookup('anonymous') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
844 if not (self.db.security.hasPermission('Register', anonid, 'user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
845 and self.db.security.hasPermission('Email Access', anonid)): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
846 create = 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
847 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
848 # 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
|
849 # "create" flag is true |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
850 author = uidFromAddress(self.db, self.from_list[0], create=create) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
851 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
852 # 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
|
853 # must be anonymous |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
854 if not author: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
855 author = anonid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
856 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
857 # 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
|
858 if not self.db.security.hasPermission('Email Access', author): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
859 if author == anonid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
860 # 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
|
861 from_address = self.from_list[0][1] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
862 registration_info = "" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
863 if self.db.security.hasPermission('Web Access', author) and \ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
864 self.db.security.hasPermission('Register', anonid, 'user'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
865 tracker_web = self.config.TRACKER_WEB |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
866 registration_info = """ Please register at: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
867 |
|
4580
782737d1a2d7
issue2431638 wrong registration link in bounce mail.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4579
diff
changeset
|
868 %(tracker_web)suser?@template=register |
|
4468
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 ...before sending mail to the tracker.""" % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
871 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
872 raise Unauthorized, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
873 You are not a registered user.%(registration_info)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
874 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
875 Unknown address: %(from_address)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
876 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
877 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
878 # we're registered and we're _still_ not allowed access |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
879 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
880 'You are not permitted to access this tracker.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
881 self.author = author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
882 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
883 def check_permissions(self): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
884 ''' 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
|
885 class of node |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
886 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
887 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
888 if not self.db.security.hasPermission('Edit', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
889 self.classname, itemid=self.nodeid): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
890 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
891 'You are not permitted to edit %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
892 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
893 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
894 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
895 self.classname): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
896 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
897 'You are not permitted to create %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
898 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
899 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
900 def commit_and_reopen_as_author(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
901 ''' 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
|
902 committed before we reopen the database |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
903 then re-open the database as the author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
904 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
905 self.db.commit() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
906 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
907 # set the database user as the author |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
908 username = self.db.user.get(self.author, 'username') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
909 self.db.setCurrentUser(username) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
910 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
911 # re-get the class with the new database connection |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
912 self.cl = self.db.getclass(self.classname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
913 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
914 def get_recipients(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
915 ''' 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
|
916 register them as users if possible |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
917 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
918 # 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
|
919 create = 1 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
920 anonid = self.db.user.lookup('anonymous') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
921 if not (self.db.security.hasPermission('Register', anonid, 'user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
922 and self.db.security.hasPermission('Email Access', anonid)): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
923 create = 0 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
924 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
925 # get the user class arguments from the commandline |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
926 user_props = self.mailgw.get_class_arguments('user') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
927 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
928 # now update the recipients list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
929 recipients = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
930 tracker_email = self.config['TRACKER_EMAIL'].lower() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
931 msg_to = self.message.getaddrlist('to') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
932 msg_cc = self.message.getaddrlist('cc') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
933 for recipient in msg_to + msg_cc: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
934 r = recipient[1].strip().lower() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
935 if r == tracker_email or not r: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
936 continue |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
937 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
938 # look up the recipient - create if necessary (and we're |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
939 # allowed to) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
940 recipient = uidFromAddress(self.db, recipient, create, **user_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
941 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
942 # if all's well, add the recipient to the list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
943 if recipient: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
944 recipients.append(recipient) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
945 self.recipients = recipients |
|
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 def get_props(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
948 ''' 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
|
949 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
950 subject = self.subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
951 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
952 # get the commandline arguments for issues |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
953 issue_props = self.mailgw.get_class_arguments('issue', self.classname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
954 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
955 # |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
956 # handle the subject argument list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
957 # |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
958 # figure what the properties of this Class are |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
959 props = {} |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
960 args = self.matches['args'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
961 argswhole = self.matches['argswhole'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
962 title = self.matches['title'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
963 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
964 # Reform the title |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
965 if self.matches['nodeid'] and self.nodeid is None: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
966 title = subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
967 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
968 if args: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
969 if self.sfxmode == 'none': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
970 title += ' ' + argswhole |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
971 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
972 errors, props = setPropArrayFromString(self, self.cl, args, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
973 self.nodeid) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
974 # handle any errors parsing the argument list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
975 if errors: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
976 if self.sfxmode == 'strict': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
977 errors = '\n- '.join(map(str, errors)) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
978 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
979 There were problems handling your subject line argument list: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
980 - %(errors)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
981 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
982 Subject was: "%(subject)s" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
983 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
984 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
985 title += ' ' + argswhole |
|
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 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
988 # set the issue title to the subject |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
989 title = title.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
990 if (title and self.properties.has_key('title') and not |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
991 issue_props.has_key('title')): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
992 issue_props['title'] = title |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
993 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
|
994 self.config['MAILGW_SUBJECT_UPDATES_TITLE']): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
995 issue_props['title'] = self.cl.get(self.nodeid,'title') |
|
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 # merge the command line props defined in issue_props into |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
998 # the props dictionary because function(**props, **issue_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
999 # is a syntax error. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1000 for prop in issue_props.keys() : |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1001 if not props.has_key(prop) : |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1002 props[prop] = issue_props[prop] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1003 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1004 self.props = props |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1005 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1006 def get_pgp_message(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1007 ''' If they've enabled PGP processing then verify the signature |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1008 or decrypt the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1009 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1010 def pgp_role(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1011 """ 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
|
1012 or we will skip PGP processing |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1013 """ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1014 if self.config.PGP_ROLES: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1015 return self.db.user.has_role(self.author, |
|
4540
bf67fed13ef9
Fix PGP implementation
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4539
diff
changeset
|
1016 *iter_roles(self.config.PGP_ROLES)) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1017 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1018 return True |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1019 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1020 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
|
1021 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
|
1022 self.crypt = True |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1023 assert pyme, 'pyme is not installed' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1024 # signed/encrypted mail must come from the primary address |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1025 author_address = self.db.user.get(self.author, 'address') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1026 if self.config.PGP_HOMEDIR: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1027 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
|
1028 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
|
1029 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
|
1030 raise MailUsageError, _( |
|
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1031 "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
|
1032 "be PGP encrypted.") |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1033 if self.message.pgp_signed(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1034 self.message.verify_signature(author_address) |
| 4781 | 1035 # signature has been verified |
| 1036 self.db.tx_Source = "email-sig-openpgp" | |
| 1037 | |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1038 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
|
1039 # Replace message with the contents of the decrypted |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1040 # 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
|
1041 # 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
|
1042 # 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
|
1043 # 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
|
1044 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
|
1045 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
|
1046 self.crypt = True |
| 4781 | 1047 try: |
| 1048 # see if the message has a valid signature | |
| 1049 message = self.message.decrypt(author_address, | |
| 1050 may_be_unsigned = False) | |
| 1051 # only set if MailUsageError is not raised | |
| 1052 # indicating that we have a valid signature | |
| 1053 self.db.tx_Source = "email-sig-openpgp" | |
| 1054 except MailUsageError: | |
| 1055 # if there is no signature or an error in the message | |
| 1056 # we get here. Try decrypting it again if we don't | |
| 1057 # need signatures. | |
| 1058 if encr_only: | |
| 1059 message = self.message.decrypt(author_address, | |
| 1060 may_be_unsigned = encr_only) | |
| 1061 else: | |
| 1062 # something failed with the message decryption/sig | |
| 1063 # chain. Pass the error up. | |
| 1064 raise | |
| 1065 # store the decrypted message | |
| 1066 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
|
1067 elif pgp_role(): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1068 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1069 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
|
1070 encrypted.""") |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1071 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1072 def get_content_and_attachments(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1073 ''' get the attachments and first text part from the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1074 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1075 ig = self.config.MAILGW_IGNORE_ALTERNATIVES |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1076 self.content, self.attachments = self.message.extract_content( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1077 ignore_alternatives=ig, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1078 unpack_rfc822=self.config.MAILGW_UNPACK_RFC822) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1079 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1080 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1081 def create_files(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1082 ''' Create a file for each attachment in the message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1083 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1084 if not self.properties.has_key('files'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1085 return |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1086 files = [] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1087 file_props = self.mailgw.get_class_arguments('file') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1088 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1089 if self.attachments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1090 for (name, mime_type, data) in self.attachments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1091 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1092 'file'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1093 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1094 'You are not permitted to create files.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1095 if not name: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1096 name = "unnamed" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1097 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1098 fileid = self.db.file.create(type=mime_type, name=name, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1099 content=data, **file_props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1100 except exceptions.Reject: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1101 pass |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1102 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1103 files.append(fileid) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1104 # allowed to attach the files to an existing node? |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1105 if self.nodeid and not self.db.security.hasPermission('Edit', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1106 self.author, self.classname, 'files'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1107 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1108 'You are not permitted to add files to %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1109 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1110 |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
1111 self.msg_props['files'] = files |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1112 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1113 # extend the existing files list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1114 fileprop = self.cl.get(self.nodeid, 'files') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1115 fileprop.extend(files) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1116 files = fileprop |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1117 |
|
4498
8df9492c2746
Fix file-unlink bug in mailgw
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4486
diff
changeset
|
1118 self.props['files'] = files |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1119 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1120 def create_msg(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1121 ''' Create msg containing all the relevant information from the message |
|
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 not self.properties.has_key('messages'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1124 return |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1125 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
|
1126 self.msg_props.update (msg_props) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1127 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1128 # Get the message ids |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1129 inreplyto = self.message.getheader('in-reply-to') or '' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1130 messageid = self.message.getheader('message-id') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1131 # generate a messageid if there isn't one |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1132 if not messageid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1133 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(), |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1134 self.classname, self.nodeid, self.config['MAIL_DOMAIN']) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1135 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1136 if self.content is None: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1137 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1138 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
|
1139 not find a text/plain part to use. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1140 """) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1141 # 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
|
1142 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
|
1143 content = content.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1144 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1145 if content: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1146 if not self.db.security.hasPermission('Create', self.author, 'msg'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1147 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1148 'You are not permitted to create messages.') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1149 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1150 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1151 message_id = self.db.msg.create(author=self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1152 recipients=self.recipients, date=date.Date('.'), |
|
4498
8df9492c2746
Fix file-unlink bug in mailgw
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4486
diff
changeset
|
1153 summary=summary, content=content, |
|
4503
9f488541802f
Yet another fix to the mail gateway...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4498
diff
changeset
|
1154 messageid=messageid, inreplyto=inreplyto, **self.msg_props) |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1155 except exceptions.Reject, error: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1156 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1157 Mail message was rejected by a detector. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1158 %(error)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1159 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1160 # allowed to attach the message to the existing node? |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1161 if self.nodeid and not self.db.security.hasPermission('Edit', |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1162 self.author, self.classname, 'messages'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1163 raise Unauthorized, _( |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1164 'You are not permitted to add messages to %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1165 ) % self.__dict__ |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1166 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1167 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1168 # add the message to the node's list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1169 messages = self.cl.get(self.nodeid, 'messages') |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1170 messages.append(message_id) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1171 self.props['messages'] = messages |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1172 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1173 # pre-load the messages list |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1174 self.props['messages'] = [message_id] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1175 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1176 def create_node(self): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1177 ''' Create/update a node using self.props |
|
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 classname = self.classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1180 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1181 if self.nodeid: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1182 # Check permissions for each property |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1183 for prop in self.props.keys(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1184 if not self.db.security.hasPermission('Edit', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1185 classname, prop): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1186 raise Unauthorized, _('You are not permitted to edit ' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1187 'property %(prop)s of class %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1188 ) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1189 self.cl.set(self.nodeid, **self.props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1190 else: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1191 # Check permissions for each property |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1192 for prop in self.props.keys(): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1193 if not self.db.security.hasPermission('Create', self.author, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1194 classname, prop): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1195 raise Unauthorized, _('You are not permitted to set ' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1196 'property %(prop)s of class %(classname)s.' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1197 ) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1198 self.nodeid = self.cl.create(**self.props) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1199 except (TypeError, IndexError, ValueError, exceptions.Reject), message: |
|
5085
d3d9d1402763
issue2550823 Improve mailgw logging for node creation errors. Add a
John Rouillard <rouilj@ieee.org>
parents:
5056
diff
changeset
|
1200 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
|
1201 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1202 There was a problem with the message you sent: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1203 %(message)s |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1204 """) % locals() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1205 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1206 return self.nodeid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1207 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1208 # 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
|
1209 # "[^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
|
1210 # 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
|
1211 # 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
|
1212 # 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
|
1213 # if issue_re: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1214 # 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
|
1215 # 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
|
1216 # if addresses: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1217 # # 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
|
1218 # 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
|
1219 # if issue: |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1220 # 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
|
1221 # 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
|
1222 # break |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1223 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1224 # 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
|
1225 # 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
|
1226 # 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
|
1227 # 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
|
1228 # 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
|
1229 method_list = [ |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1230 # Filter out messages to ignore |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1231 ("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
|
1232 # Check for usage/help requests |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1233 ("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
|
1234 # Check if the subject line is valid |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1235 ("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
|
1236 # get importants parts from subject |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1237 ("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
|
1238 # check for registration OTK |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1239 ("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
|
1240 # get the classname |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1241 ("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
|
1242 # get the optional nodeid: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1243 ("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
|
1244 # Determine who the author is: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1245 ("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
|
1246 # allowed to edit or create this class? |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1247 ("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
|
1248 # 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
|
1249 # 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
|
1250 ("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
|
1251 # Get the recipients list |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1252 ("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
|
1253 # get the new/updated node props |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1254 ("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
|
1255 # Handle PGP signed or encrypted messages |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1256 ("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
|
1257 # extract content and attachments from message body: |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1258 ("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
|
1259 # 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
|
1260 ("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
|
1261 # 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
|
1262 ("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
|
1263 ] |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1264 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1265 |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1266 def parse (self): |
|
4545
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1267 for methodname, flag in self.method_list: |
|
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1268 method = getattr (self, methodname) |
|
3f4179eb348f
- fix mailgw list of methods
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4541
diff
changeset
|
1269 ret = method() |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1270 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
|
1271 return |
|
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1272 # 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
|
1273 return self.create_node() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1274 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1275 |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
1276 class MailGW: |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1277 |
|
4469
90aae2faac72
Add parsedMessage class as class variable to MailGW to allow easier override
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4468
diff
changeset
|
1278 # 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
|
1279 # 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
|
1280 # 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
|
1281 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
|
1282 |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1283 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
|
1284 self.instance = instance |
|
1462
285934a04a6c
fix for [SF#691046]
Richard Jones <richard@users.sourceforge.net>
parents:
1409
diff
changeset
|
1285 self.arguments = arguments |
|
2672
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1286 self.default_class = None |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1287 for option, value in self.arguments: |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1288 if option == '-c': |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1289 self.default_class = value.strip() |
|
437775793d8e
mailgw can override the MAIL_DEFUALT_CLASS
Richard Jones <richard@users.sourceforge.net>
parents:
2670
diff
changeset
|
1290 |
|
1799
071ea6fc803f
Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1793
diff
changeset
|
1291 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
|
1292 self.logger = logging.getLogger('roundup.mailgw') |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1293 |
|
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
|
1294 # 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
|
1295 # (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
|
1296 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
|
1297 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1298 def do_pipe(self): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1299 """ 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
|
1300 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1301 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
|
1302 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
|
1303 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1304 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
|
1305 """ |
|
1280
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
1306 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
|
1307 s.write(sys.stdin.read()) |
|
1281
284a9d6b3cf9
bugfixes to pipe bugfix
Richard Jones <richard@users.sourceforge.net>
parents:
1280
diff
changeset
|
1308 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
|
1309 self.main(s) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1310 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1311 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1312 def do_mailbox(self, filename): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1313 """ 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
|
1314 pass each to the mail handler. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1315 """ |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1316 # 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
|
1317 import fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1318 # 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
|
1319 if hasattr(fcntl, 'LOCK_EX'): |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1320 FCNTL = fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1321 else: |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
1322 import FCNTL |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1323 f = open(filename, 'r+') |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1324 fcntl.flock(f.fileno(), FCNTL.LOCK_EX) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1325 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1326 # handle and clear the mailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1327 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1328 from mailbox import UnixMailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1329 mailbox = UnixMailbox(f, factory=Message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1330 # grab one message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1331 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1332 while message: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1333 # handle this message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1334 self.handle_Message(message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1335 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1336 # nuke the file contents |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1337 os.ftruncate(f.fileno(), 0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1338 except: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1339 import traceback |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1340 traceback.print_exc() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1341 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1342 fcntl.flock(f.fileno(), FCNTL.LOCK_UN) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1343 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1344 |
|
4345
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1345 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
|
1346 cram=0): |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1347 ''' Do an IMAP connection |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1348 ''' |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1349 import getpass, imaplib, socket |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1350 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1351 if not user: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1352 user = raw_input('User: ') |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1353 if not password: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1354 password = getpass.getpass() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1355 except (KeyboardInterrupt, EOFError): |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1356 # 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
|
1357 print "\nAborted by user." |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1358 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1359 # 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
|
1360 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1361 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
|
1362 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
|
1363 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
|
1364 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
|
1365 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
|
1366 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
|
1367 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
|
1368 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
|
1369 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1370 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1371 try: |
|
4345
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1372 if cram: |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1373 server.login_cram_md5(user, password) |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1374 else: |
|
38265325492a
support CRAM-MD5 for IMAPS
Richard Jones <richard@users.sourceforge.net>
parents:
4306
diff
changeset
|
1375 server.login(user, password) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1376 except imaplib.IMAP4.error, 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
|
1377 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
|
1378 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1379 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1380 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1381 if not mailbox: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1382 (typ, data) = server.select() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1383 else: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1384 (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
|
1385 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
|
1386 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
|
1387 data)) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1388 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1389 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1390 numMessages = int(data[0]) |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1391 except ValueError, 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
|
1392 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
|
1393 data[0]) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1394 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1395 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
|
1396 (typ, data) = server.fetch(str(i), '(RFC822)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1397 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1398 # 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
|
1399 server.store(str(i), '+FLAGS', r'(\Deleted)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1400 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
1401 # process the message |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1402 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
|
1403 s.seek(0) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1404 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
|
1405 server.close() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1406 finally: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1407 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1408 server.expunge() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1409 except: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1410 pass |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1411 server.logout() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1412 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1413 return 0 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1414 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
1415 |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1416 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
|
1417 ''' Do authentication POP |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1418 ''' |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1419 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
|
1420 |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1421 def do_pop(self, server, user='', password='', ssl=False): |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1422 ''' Do plain POP |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1423 ''' |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1424 self._do_pop(server, user, password, False, ssl) |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1425 |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1426 def _do_pop(self, server, user, password, apop, ssl): |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1427 '''Read a series of messages from the specified POP server. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1428 ''' |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1429 import getpass, poplib, socket |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1430 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1431 if not user: |
|
1982
23e5796a6b45
fix minor bug in mailgw POP handler
Richard Jones <richard@users.sourceforge.net>
parents:
1975
diff
changeset
|
1432 user = raw_input('User: ') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1433 if not password: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1434 password = getpass.getpass() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1435 except (KeyboardInterrupt, EOFError): |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1436 # Ctrl C or D maybe also Ctrl Z under Windows. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1437 print "\nAborted by user." |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1438 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1439 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1440 # open a connection to the server and retrieve all messages |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1441 try: |
|
3779
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1442 if ssl: |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1443 klass = poplib.POP3_SSL |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1444 else: |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1445 klass = poplib.POP3 |
|
ee73abcc95d2
Sorry, another mega-patch:
Richard Jones <richard@users.sourceforge.net>
parents:
3724
diff
changeset
|
1446 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
|
1447 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
|
1448 self.logger.exception('POP server error') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1449 return 1 |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1450 if apop: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1451 server.apop(user, password) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1452 else: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1453 server.user(user) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
1454 server.pass_(password) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1455 numMessages = len(server.list()[1]) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1456 for i in range(1, numMessages+1): |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1457 # retr: returns |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1458 # [ pop response e.g. '+OK 459 octets', |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1459 # [ array of message lines ], |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1460 # number of octets ] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1461 lines = server.retr(i)[1] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1462 s = cStringIO.StringIO('\n'.join(lines)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1463 s.seek(0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1464 self.handle_Message(Message(s)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1465 # delete the message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1466 server.dele(i) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1467 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1468 # quit the server to commit changes. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1469 server.quit() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1470 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1471 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1472 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
|
1473 ''' 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
|
1474 ''' |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
1475 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
|
1476 |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1477 def handle_Message(self, message): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1478 """Handle an RFC822 Message |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
1479 |
|
391
399340646765
handle the case where there is no file attached
Richard Jones <richard@users.sourceforge.net>
parents:
389
diff
changeset
|
1480 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
|
1481 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
|
1482 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
|
1483 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
|
1484 handle errors in a different manner. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
1485 """ |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1486 # 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
|
1487 # 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
|
1488 |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1489 self.parsed_message = None |
|
4573
8b2ccf6f2cf7
Fix initialisation of crypt option.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4570
diff
changeset
|
1490 crypt = False |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
1491 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
|
1492 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
|
1493 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
|
1494 if not sendto: |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
1495 # 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
|
1496 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
|
1497 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
|
1498 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
|
1499 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
|
1500 return |
|
2119
cc4667ef3f12
Added the ability to toggle where error messages go.
Eddie Parker <eparker@users.sourceforge.net>
parents:
2005
diff
changeset
|
1501 |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1502 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
|
1503 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
|
1504 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
|
1505 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
|
1506 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1507 # try normal message-handling |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1508 if not self.trapExceptions: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1509 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
|
1510 |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
1511 # 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
|
1512 # 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
|
1513 # 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
|
1514 # 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
|
1515 # 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
|
1516 # 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
|
1517 # 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
|
1518 try: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1519 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
|
1520 except MailUsageHelp: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1521 # bounce the message back to the sender with the usage message |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1522 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
|
1523 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1524 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
|
1525 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
|
1526 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
|
1527 subject="Mail Gateway Help") |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1528 except MailUsageError, value: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1529 # bounce the message back to the sender with the usage message |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1530 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
|
1531 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1532 m.append(str(value)) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1533 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
|
1534 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
|
1535 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
|
1536 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
|
1537 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
|
1538 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
|
1539 except Unauthorized, value: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1540 # just inform the user that he is not authorized |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1541 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1542 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
|
1543 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
|
1544 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
|
1545 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
|
1546 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
|
1547 except IgnoreMessage: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1548 # 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
|
1549 # 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
|
1550 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
|
1551 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
|
1552 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
|
1553 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
|
1554 return |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1555 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
|
1556 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
|
1557 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
|
1558 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
|
1559 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
|
1560 |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1561 # 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
|
1562 # 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
|
1563 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
1564 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
|
1565 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
|
1566 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
|
1567 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
|
1568 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
|
1569 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
|
1570 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
|
1571 |
|
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1572 m.append('----------------') |
|
81531a2aed59
Admin copy of error email from mailgw includes traceback
Richard Jones <richard@users.sourceforge.net>
parents:
3945
diff
changeset
|
1573 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
|
1574 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
|
1575 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
1576 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
|
1577 ''' 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
|
1578 |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
1579 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
|
1580 ''' |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1581 # 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
|
1582 self.db = self.instance.open ('admin') |
| 4781 | 1583 |
| 1584 self.db.tx_Source = "email" | |
| 1585 | |
|
4211
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1586 try: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1587 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
|
1588 finally: |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1589 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
|
1590 |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1591 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
|
1592 ''' 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
|
1593 |
|
61cf00ca920a
Process each message through the mail gateway as a separate transaction.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4101
diff
changeset
|
1594 Parse the message as per the module docstring. |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1595 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
|
1596 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
|
1597 ''' |
|
4539
c246f176e7bb
- put all methods for parsing a message into a list...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4531
diff
changeset
|
1598 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
|
1599 nodeid = self.parsed_message.parse () |
|
1217
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
1600 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1601 # commit the changes to the DB |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1602 self.db.commit() |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
1603 |
|
4541
62239a524beb
PGP support is again working (pyme API has changed significantly)...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4540
diff
changeset
|
1604 self.parsed_message = None |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1605 return nodeid |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
1606 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1607 def get_class_arguments(self, class_type, classname=None): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1608 ''' class_type - a valid node class type: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1609 - 'user' refers to the author of a message |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1610 - 'issue' refers to an issue-type class (to which the |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1611 message is appended) specified in parameter classname |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1612 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
|
1613 the real classname used as a parameter (from previous |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1614 message-parsing steps) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1615 - 'file' specifies a file-type class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1616 - 'msg' is the message-class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1617 classname - the name of the current issue-type class |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1618 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1619 Parse the commandline arguments and retrieve the properties that |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1620 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
|
1621 per class_type (-C option). |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1622 ''' |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1623 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
|
1624 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1625 classname = classname or class_type |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1626 cls_lookup = { 'issue' : classname } |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1627 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1628 # Allow other issue-type classes -- take the real classname from |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1629 # previous parsing-steps of the message: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1630 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
|
1631 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1632 # check if the clsname is valid |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1633 try: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1634 self.db.getclass(clsname) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1635 except KeyError: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1636 mailadmin = self.instance.config['ADMIN_EMAIL'] |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1637 raise MailUsageError, _(""" |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1638 The mail gateway is not properly set up. Please contact |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1639 %(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
|
1640 %(clsname)s |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1641 """) % locals() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1642 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1643 if self.arguments: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1644 # The default type on the commandline is msg |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1645 if class_type == 'msg': |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1646 current_type = class_type |
|
3417
07c696890f55
mailgw subject parsing has configurable levels of strictness
Richard Jones <richard@users.sourceforge.net>
parents:
3415
diff
changeset
|
1647 else: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1648 current_type = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1649 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1650 # Handle the arguments specified by the email gateway command line. |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1651 # 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
|
1652 # 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
|
1653 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
|
1654 if option in ( '-C', '--class'): |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1655 current_type = propstring.strip() |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1656 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1657 if current_type != class_type: |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1658 current_type = None |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1659 |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1660 elif current_type and option in ('-S', '--set'): |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1661 cls = cls_lookup.get (current_type, current_type) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1662 temp_cl = self.db.getclass(cls) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1663 errors, props = setPropArrayFromString(self, |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1664 temp_cl, propstring.strip()) |
|
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1665 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1666 if errors: |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1667 mailadmin = self.instance.config['ADMIN_EMAIL'] |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1668 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
|
1669 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
|
1670 %(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
|
1671 %(errors)s |
|
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1672 """) % locals() |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1673 allprops.update(props) |
|
3922
586679a314f7
role checking for PGP mail and docs
Justus Pendleton <jpend@users.sourceforge.net>
parents:
3917
diff
changeset
|
1674 |
|
4468
502a1a8620e6
Tests and fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4425
diff
changeset
|
1675 return allprops |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
1676 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1677 |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1678 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
|
1679 ''' 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
|
1680 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
|
1681 ''' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1682 props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1683 errors = [] |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1684 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
|
1685 # 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
|
1686 try: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1687 propname, value = prop.split('=') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1688 except ValueError, message: |
|
3600
1113e1456093
translate UI messages (patch [SF#1462491])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3583
diff
changeset
|
1689 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
|
1690 '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
|
1691 return (errors, props) |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1692 # 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
|
1693 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
|
1694 try: |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1695 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
|
1696 propname, value) |
|
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
1697 except hyperdb.HyperdbValueError, message: |
|
2920
98e6219ddb83
merge maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents:
2906
diff
changeset
|
1698 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
|
1699 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
|
1700 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1701 |
|
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
|
1702 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
|
1703 '''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
|
1704 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
|
1705 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1706 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
|
1707 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
|
1708 # 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
|
1709 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
|
1710 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
|
1711 # 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
|
1712 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
|
1713 # 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
|
1714 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
|
1715 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
|
1716 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
|
1717 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
|
1718 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1719 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1720 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
|
1721 ''' 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
|
1722 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1723 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
|
1724 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
|
1725 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1726 (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
|
1727 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1728 # 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
|
1729 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
|
1730 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1731 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
|
1732 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1733 # 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
|
1734 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
|
1735 if props.has_key('alternate_addresses'): |
|
1249
6c24a86a12ae
Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents:
1244
diff
changeset
|
1736 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
|
1737 # 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
|
1738 # 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
|
1739 # 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
|
1740 found_users = [] |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1741 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
|
1742 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
|
1743 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
|
1744 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
|
1745 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
|
1746 break |
|
ddff9669361b
Fix matching of incoming email addresses to the alternate_addresses field...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents:
4505
diff
changeset
|
1747 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
|
1748 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1749 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
|
1750 |
|
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 # 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
|
1752 # 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
|
1753 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
|
1754 |
|
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 # 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
|
1756 if create: |
|
1592
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1757 # generate a username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1758 if '@' in address: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1759 username = address.split('@')[0] |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1760 else: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1761 username = address |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1762 trying = username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1763 n = 0 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1764 while 1: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1765 try: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1766 # does this username exist already? |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1767 db.user.lookup(trying) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1768 except KeyError: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1769 break |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1770 n += 1 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1771 trying = username + str(n) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1772 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1773 # create! |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1774 try: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1775 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
|
1776 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
|
1777 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
|
1778 **user_props) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1779 except exceptions.Reject: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1780 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
|
1781 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
|
1782 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
|
1783 |
|
5117
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1784 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
|
1785 """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
|
1786 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1787 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
|
1788 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
|
1789 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
|
1790 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
|
1791 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1792 Arguments: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1793 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1794 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
|
1795 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
|
1796 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1797 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
|
1798 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
|
1799 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1800 config: tracker configuration object. |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1801 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
|
1802 |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1803 """ |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1804 if config is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1805 config = configuration.CoreConfig() |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1806 if keep_citations is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1807 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
|
1808 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
|
1809 # 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
|
1810 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
|
1811 keep_citations = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1812 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1813 keep_citations = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1814 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
|
1815 keep_citations = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1816 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1817 keep_citations = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1818 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1819 if keep_body is None: |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1820 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
|
1821 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
|
1822 # 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
|
1823 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
|
1824 keep_body = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1825 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1826 keep_body = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1827 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
|
1828 keep_body = True |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1829 else: |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1830 keep_body = False |
|
14abd0a67207
Fix issue934009: Have New Issues Submitted By Email *Not* Change Body!
John Rouillard <rouilj@ieee.org>
parents:
5085
diff
changeset
|
1831 |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1832 eol = config["MAILGW_EOL_RE"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1833 signature = config["MAILGW_SIGN_RE"] |
|
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1834 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
|
1835 |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1836 # strip off leading carriage-returns / newlines |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1837 i = 0 |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1838 for i in range(len(content)): |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1839 if content[i] not in '\r\n': |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1840 break |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1841 if i > 0: |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1842 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
|
1843 else: |
|
3836
5bc54cb1d5d0
parseContent API modified to take single config argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3833
diff
changeset
|
1844 sections = config["MAILGW_BLANKLINE_RE"].split(content) |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1845 |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1846 # 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
|
1847 summary = '' |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1848 l = [] |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1849 # 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
|
1850 last_nonempty = len(sections) -1 |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1851 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
|
1852 last_nonempty -= 1 |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1853 for ns, section in enumerate(sections): |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1854 #section = section.strip() |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1855 if not section: |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1856 continue |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1857 lines = eol.split(section) |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1858 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
|
1859 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
|
1860 if quote_1st or quote_2nd: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1861 # 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
|
1862 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
|
1863 # 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
|
1864 if not lines[0].endswith(':'): |
|
f1d6e2b2eb64
Fix quote-stripping in mail gateway again.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4580
diff
changeset
|
1865 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
|
1866 # 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
|
1867 # 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
|
1868 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
|
1869 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
|
1870 break |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1871 else: |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1872 # 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
|
1873 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
|
1874 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
|
1875 continue |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1876 # 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
|
1877 if not keep_citations: |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1878 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
|
1879 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
|
1880 |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1881 is_last = ns == last_nonempty |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1882 # 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
|
1883 # our summary |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1884 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
|
1885 # 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
|
1886 # section |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1887 summary = section |
|
4579
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1888 # match signature only in last section |
|
ba4c632143f6
issue2550535 Fix keep_quoted_text=yes setting.
Ralf Schlatterbeck <rsc@runtux.com>
parents:
4575
diff
changeset
|
1889 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
|
1890 # lose any signature |
|
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1891 break |
|
1344
f2f553611ce0
applied patches for handling Outlook quirks...
Richard Jones <richard@users.sourceforge.net>
parents:
1329
diff
changeset
|
1892 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
|
1893 # ditch the stupid Outlook quoting of the entire original message |
| 454 | 1894 break |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1895 |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1896 # 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
|
1897 l.append(section) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1898 |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1899 # figure the summary - find the first sentence-ending punctuation or the |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1900 # first whole line, whichever is longest |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1901 sentence = re.search(r'^([^!?\.]+[!?\.])', summary) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1902 if sentence: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1903 sentence = sentence.group(1) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1904 else: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1905 sentence = '' |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1906 first = eol.split(summary)[0] |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1907 summary = max(sentence, first) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1908 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1909 # 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
|
1910 # about. |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1911 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
|
1912 content = '\n\n'.join(l) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1913 |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1914 return summary, content |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1915 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1916 # vim: set filetype=python sts=4 sw=4 et si : |
