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