Mercurial > p > roundup > code
annotate roundup/mailgw.py @ 2631:2bbcfc80ba5b
MailGW.handle_message():
as config is used many times in this method, have a local variable
instead of going through self.instance.config each time;
change config attribute access to container (item) access;
where possible, avoid duplicate computing of config settings;
fix MAILGW_KEEP_QUOTED_TEXT and MAILGW_LEAVE_BODY_UNCHANGED -
config values are boolean now;
trim trailing spaces, fix vim modeline
| author | Alexander Smishlajev <a1s@users.sourceforge.net> |
|---|---|
| date | Mon, 26 Jul 2004 09:29:22 +0000 |
| parents | 58848e3b6bb8 |
| children | 1df7d4a41da4 |
| rev | line source |
|---|---|
|
213
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
1 # |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
2 # 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
|
3 # 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
|
4 # 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
|
5 # 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
|
6 # |
| 214 | 7 # 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
|
8 # 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
|
9 # 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
|
10 # POSSIBILITY OF SUCH DAMAGE. |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
11 # |
|
d45384bc6420
Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents:
202
diff
changeset
|
12 # 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
|
13 # 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
|
14 # 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
|
15 # 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
|
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
|
406
bdc2ea127ae9
Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
391
diff
changeset
|
17 # |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
18 # vim: ts=4 sw=4 expandtab |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
19 # |
|
406
bdc2ea127ae9
Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
391
diff
changeset
|
20 |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1982
diff
changeset
|
21 """An e-mail gateway for Roundup. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
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
|
23 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
|
24 . 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
|
25 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
|
26 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
|
27 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
|
28 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
|
29 . 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
|
30 subpart and ignore the other 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
|
31 |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
32 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
|
33 ------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 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
|
35 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
|
36 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
|
37 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
|
38 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
|
39 |
|
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
|
40 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
|
41 --------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 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
|
43 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
|
44 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
|
45 header similarly determines the "author" property of the new "msg" |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 node. The default handling for addresses that don't have corresponding |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 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
|
48 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
|
49 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
|
50 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
|
51 nodes with no passwords. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 |
|
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
|
53 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
|
54 ------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 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
|
56 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
|
57 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
|
58 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
|
59 |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 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
|
61 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
|
62 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
|
63 |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 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
|
65 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
|
66 "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
|
67 nodes. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 |
|
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
|
69 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
|
70 -------- |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 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
|
75 explanatory message given in the exception. |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
77 $Id: mailgw.py,v 1.152 2004-07-26 09:29:22 a1s Exp $ |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
78 """ |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1982
diff
changeset
|
79 __docformat__ = 'restructuredtext' |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 |
|
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
|
81 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri |
|
1180
ba133c895f2d
missing import ... how odd
Richard Jones <richard@users.sourceforge.net>
parents:
1107
diff
changeset
|
82 import time, random, sys |
|
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
|
83 import traceback, MimeWriter, rfc822 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
84 |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
85 from roundup import hyperdb, date, password, rfc2822, exceptions |
|
1799
071ea6fc803f
Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1793
diff
changeset
|
86 from roundup.mailer import Mailer |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
87 |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
88 SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '') |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
89 |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
90 class MailGWError(ValueError): |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
91 pass |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
92 |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
93 class MailUsageError(ValueError): |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
94 pass |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
95 |
|
544
d32977eb8bd4
simple help command for mailgw
Richard Jones <richard@users.sourceforge.net>
parents:
537
diff
changeset
|
96 class MailUsageHelp(Exception): |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
97 """ 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
|
98 pass |
|
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
99 |
|
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
|
100 class Unauthorized(Exception): |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
101 """ Access denied """ |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
102 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
103 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
104 class IgnoreMessage(Exception): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
105 """ 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
|
106 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
107 class IgnoreBulk(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
108 """ 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
|
109 pass |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
110 class IgnoreLoop(IgnoreMessage): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
111 """ 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
|
112 pass |
|
467
103f521810f7
Features added:
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
464
diff
changeset
|
113 |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
114 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
|
115 ''' 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
|
116 |
|
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
117 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
|
118 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
|
119 ''' |
|
948
8d8db618c2c3
grant email access to admin too ;)
Richard Jones <richard@users.sourceforge.net>
parents:
928
diff
changeset
|
120 security.addPermission(name="Email Registration", |
|
902
b0d3d3535998
Bugger it. Here's the current shape of the new security implementation.
Richard Jones <richard@users.sourceforge.net>
parents:
880
diff
changeset
|
121 description="Anonymous may register through e-mail") |
|
948
8d8db618c2c3
grant email access to admin too ;)
Richard Jones <richard@users.sourceforge.net>
parents:
928
diff
changeset
|
122 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
|
123 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
|
124 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
|
125 |
|
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
|
126 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
|
127 ''' 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
|
128 ''' |
|
8dc60d87ab42
Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents:
1402
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 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
|
133 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
|
134 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
|
135 # 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 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
|
144 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
|
145 |
|
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
|
146 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
|
147 ''' 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
|
148 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
|
149 ''' |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
150 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
|
151 ''' 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
|
152 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
|
153 ''' |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
154 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
|
155 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
|
156 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
|
157 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
|
158 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
|
159 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
|
160 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
|
161 if line.strip() in (mid, end): |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 return Message(s) |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
168 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
169 def getparts(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
170 """Get all parts of this multipart message.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
171 # skip over the intro to the first boundary |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
172 self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
173 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
174 # accumulate the other parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
175 parts = [] |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
176 while 1: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
177 part = self.getpart() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
178 if part is None: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
179 break |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
180 parts.append(part) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
181 return parts |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
182 |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
183 def getheader(self, name, default=None): |
|
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
184 hdr = mimetools.Message.getheader(self, name, default) |
|
1712
f686c73fc5d1
The .replace in getheader would fail for absent headers (that return None).
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1711
diff
changeset
|
185 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
|
186 hdr = hdr.replace('\n','') # Inserted by rfc822.readheaders |
|
1383
f19dde90e473
applied unicode patch
Andrey Lebedev <kedder@users.sourceforge.net>
parents:
1359
diff
changeset
|
187 return rfc2822.decode_header(hdr) |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
188 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
189 def getname(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
190 """Find an appropriate name for this message.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
191 if self.gettype() == 'message/rfc822': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
192 # handle message/rfc822 specially - the name should be |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
193 # the subject of the actual e-mail embedded here |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
194 self.fp.seek(0) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
195 name = Message(self.fp).getheader('subject') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
196 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
197 # try name on Content-Type |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
198 name = self.getparam('name') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
199 if not name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
200 disp = self.getheader('content-disposition', None) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
201 if disp: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
202 name = getparam(disp, 'filename') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
203 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
204 if name: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
205 return name.strip() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
206 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
207 def getbody(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
208 """Get the decoded message body.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
209 self.rewindbody() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
210 encoding = self.getencoding() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
211 data = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
212 if encoding == 'base64': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
213 # BUG: is base64 really used for text encoding or |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
214 # are we inserting zip files here. |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
215 data = binascii.a2b_base64(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
216 elif encoding == 'quoted-printable': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
217 # the quopri module wants to work with files |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
218 decoded = cStringIO.StringIO() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
219 quopri.decode(self.fp, decoded) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
220 data = decoded.getvalue() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
221 elif encoding == 'uuencoded': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
222 data = binascii.a2b_uu(self.fp.read()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
223 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
224 # take it as text |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
225 data = self.fp.read() |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
226 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
227 # Encode message to unicode |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
228 charset = rfc2822.unaliasCharset(self.getparam("charset")) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
229 if charset: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
230 # Do conversion only if charset specified |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
231 edata = unicode(data, charset).encode('utf-8') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
232 # Convert from dos eol to unix |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
233 edata = edata.replace('\r\n', '\n') |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
234 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
235 # Leave message content as is |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
236 edata = data |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
237 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
238 return edata |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
239 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
240 # General multipart handling: |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
241 # 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
|
242 # attachment. |
| 2364 | 243 # multipart/mixed: |
| 244 # Multiple "unrelated" parts. | |
| 245 # multipart/Alternative (rfc 1521): | |
| 246 # Like multipart/mixed, except that we'd only want one of the | |
| 247 # alternatives. Generally a top-level part from MUAs sending HTML | |
| 248 # mail - there will be a text/plain version. | |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
249 # multipart/signed (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
250 # 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
|
251 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
252 # 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
|
253 # multipart/encrypted (rfc 1847): |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
254 # 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
|
255 # required body parts. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
256 # ACTION: Not handleable as the content is encrypted. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
257 # multipart/related (rfc 1872, 2112, 2387): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
258 # The Multipart/Related content-type addresses the MIME |
| 2364 | 259 # representation of compound objects, usually HTML mail with embedded |
| 260 # images. Usually appears as an alternative. | |
| 261 # ACTION: Default, if we must. | |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
262 # multipart/report (rfc 1892): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
263 # e.g. mail system delivery status reports. |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
264 # 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
|
265 # flagging. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
266 # multipart/form-data: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
267 # For web forms only. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
268 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
269 def extract_content(self, parent_type=None): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
270 """Extract the body and the attachments recursively.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
271 content_type = self.gettype() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
272 content = None |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
273 attachments = [] |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
274 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
275 if content_type == 'text/plain': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
276 content = self.getbody() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
277 elif content_type[:10] == 'multipart/': |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
278 for part in self.getparts(): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
279 new_content, new_attach = part.extract_content(content_type) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
280 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
281 # 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
|
282 # otherwise make it an attachment. |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
283 if not content: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
284 content = new_content |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
285 elif new_content: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
286 attachments.append(part.as_attachment()) |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
287 |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
288 attachments.extend(new_attach) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
289 elif (parent_type == 'multipart/signed' and |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
290 content_type == 'application/pgp-signature'): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
291 # 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
|
292 pass |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
293 else: |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
294 attachments.append(self.as_attachment()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
295 return content, attachments |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
296 |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
297 def as_attachment(self): |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
298 """Return this message as an attachment.""" |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
299 return (self.getname(), self.gettype(), self.getbody()) |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
300 |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
301 class MailGW: |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
302 |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
303 # Matches subjects like: |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
304 # Re: "[issue1234] title of issue [status=resolved]" |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
305 subject_re = re.compile(r''' |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
306 (?P<refwd>\s*\W?\s*(fw|fwd|re|aw)\W\s*)*\s* # Re: |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
307 (?P<quote>")? # Leading " |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
308 (\[(?P<classname>[^\d\s]+) # [issue.. |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
309 (?P<nodeid>\d+)? # ..1234] |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
310 \])?\s* |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
311 (?P<title>[^[]+)? # issue title |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
312 "? # Trailing " |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
313 (\[(?P<args>.+?)\])? # [prop=value] |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
314 ''', re.IGNORECASE|re.VERBOSE) |
|
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
315 |
|
1359
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
316 def __init__(self, instance, db, arguments={}): |
|
389
7d7cb5319fc0
re-open the database as the author in mail handling
Richard Jones <richard@users.sourceforge.net>
parents:
382
diff
changeset
|
317 self.instance = instance |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
318 self.db = db |
|
1462
285934a04a6c
fix for [SF#691046]
Richard Jones <richard@users.sourceforge.net>
parents:
1409
diff
changeset
|
319 self.arguments = arguments |
|
1799
071ea6fc803f
Extracted duplicated mail-sending code...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1793
diff
changeset
|
320 self.mailer = Mailer(instance.config) |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
321 self.logger = instance.config.logging.getLogger('mailgw') |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
322 |
|
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
|
323 # 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
|
324 # (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
|
325 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
|
326 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
327 def do_pipe(self): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
328 """ 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
|
329 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
330 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
|
331 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
|
332 |
|
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
333 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
|
334 """ |
|
1280
8b766547d4b8
store PIPE messages so we can re-send them on errors
Richard Jones <richard@users.sourceforge.net>
parents:
1249
diff
changeset
|
335 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
|
336 s.write(sys.stdin.read()) |
|
1281
284a9d6b3cf9
bugfixes to pipe bugfix
Richard Jones <richard@users.sourceforge.net>
parents:
1280
diff
changeset
|
337 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
|
338 self.main(s) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
339 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
340 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
341 def do_mailbox(self, filename): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
342 """ 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
|
343 pass each to the mail handler. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
344 """ |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
345 # 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
|
346 import fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
347 # 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
|
348 if hasattr(fcntl, 'LOCK_EX'): |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
349 FCNTL = fcntl |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
350 else: |
|
2ff95415ffb2
handle deprecation of FCNTL in python2.2+
Richard Jones <richard@users.sourceforge.net>
parents:
1620
diff
changeset
|
351 import FCNTL |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
352 f = open(filename, 'r+') |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
353 fcntl.flock(f.fileno(), FCNTL.LOCK_EX) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
354 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
355 # handle and clear the mailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
356 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
357 from mailbox import UnixMailbox |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
358 mailbox = UnixMailbox(f, factory=Message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
359 # grab one message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
360 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
361 while message: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
362 # handle this message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
363 self.handle_Message(message) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
364 message = mailbox.next() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
365 # nuke the file contents |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
366 os.ftruncate(f.fileno(), 0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
367 except: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
368 import traceback |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
369 traceback.print_exc() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
370 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
371 fcntl.flock(f.fileno(), FCNTL.LOCK_UN) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
372 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
373 |
|
2231
27ba128ab567
removed Boolean from source to make py <2.3 happy [SF#938790]
Richard Jones <richard@users.sourceforge.net>
parents:
2211
diff
changeset
|
374 def do_imap(self, server, user='', password='', mailbox='', ssl=0): |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
375 ''' Do an IMAP connection |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
376 ''' |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
377 import getpass, imaplib, socket |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
378 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
379 if not user: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
380 user = raw_input('User: ') |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
381 if not password: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
382 password = getpass.getpass() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
383 except (KeyboardInterrupt, EOFError): |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
384 # 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
|
385 print "\nAborted by user." |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
386 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
387 # 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
|
388 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
389 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
|
390 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
|
391 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
|
392 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
|
393 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
|
394 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
|
395 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
|
396 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
|
397 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
398 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
399 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
400 server.login(user, password) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
401 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
|
402 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
|
403 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
404 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
405 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
406 if not mailbox: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
407 (typ, data) = server.select() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
408 else: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
409 (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
|
410 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
|
411 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
|
412 data)) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
413 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
414 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
415 numMessages = int(data[0]) |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
416 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
|
417 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
|
418 data[0]) |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
419 return 1 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
420 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
|
421 (typ, data) = server.fetch(str(i), '(RFC822)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
422 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
423 # 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
|
424 server.store(str(i), '+FLAGS', r'(\Deleted)') |
|
2211
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
425 |
|
272b654b1227
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
2210
diff
changeset
|
426 # process the message |
|
2210
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
427 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
|
428 s.seek(0) |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
429 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
|
430 server.close() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
431 finally: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
432 try: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
433 server.expunge() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
434 except: |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
435 pass |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
436 server.logout() |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
437 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
438 return 0 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
439 |
|
b61640273061
added IMAP support to mail gateway (rfe [SF#934000])
Richard Jones <richard@users.sourceforge.net>
parents:
2129
diff
changeset
|
440 |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
441 def do_apop(self, server, user='', password=''): |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
442 ''' Do authentication POP |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
443 ''' |
|
1548
c36df13925f9
*** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents:
1547
diff
changeset
|
444 self.do_pop(server, user, password, apop=1) |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
445 |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
446 def do_pop(self, server, user='', password='', apop=0): |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
447 '''Read a series of messages from the specified POP server. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
448 ''' |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
449 import getpass, poplib, socket |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
450 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
451 if not user: |
|
1982
23e5796a6b45
fix minor bug in mailgw POP handler
Richard Jones <richard@users.sourceforge.net>
parents:
1975
diff
changeset
|
452 user = raw_input('User: ') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
453 if not password: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
454 password = getpass.getpass() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
455 except (KeyboardInterrupt, EOFError): |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
456 # Ctrl C or D maybe also Ctrl Z under Windows. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
457 print "\nAborted by user." |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
458 return 1 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
459 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
460 # open a connection to the server and retrieve all messages |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
461 try: |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
462 server = poplib.POP3(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
|
463 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
|
464 self.logger.exception('POP server error') |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
465 return 1 |
|
1547
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
466 if apop: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
467 server.apop(user, password) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
468 else: |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
469 server.user(user) |
|
f478c236b1f6
roundup mailgw now handles apop
Richard Jones <richard@users.sourceforge.net>
parents:
1477
diff
changeset
|
470 server.pass_(password) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
471 numMessages = len(server.list()[1]) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
472 for i in range(1, numMessages+1): |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
473 # retr: returns |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
474 # [ pop response e.g. '+OK 459 octets', |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
475 # [ array of message lines ], |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
476 # number of octets ] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
477 lines = server.retr(i)[1] |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
478 s = cStringIO.StringIO('\n'.join(lines)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
479 s.seek(0) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
480 self.handle_Message(Message(s)) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
481 # delete the message |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
482 server.dele(i) |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
483 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
484 # quit the server to commit changes. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
485 server.quit() |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
486 return 0 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
487 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
488 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
|
489 ''' 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
|
490 ''' |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
491 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
|
492 |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
493 def handle_Message(self, message): |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
494 """Handle an RFC822 Message |
|
343
ab16997d9cda
Started work on supporting a pop3-fetching server
Richard Jones <richard@users.sourceforge.net>
parents:
339
diff
changeset
|
495 |
|
391
399340646765
handle the case where there is no file attached
Richard Jones <richard@users.sourceforge.net>
parents:
389
diff
changeset
|
496 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
|
497 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
|
498 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
|
499 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
|
500 handle errors in a different manner. |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
501 """ |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
502 # 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
|
503 # 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
|
504 |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
505 sendto = message.getaddrlist('resent-from') |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
506 if not sendto: |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
507 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
|
508 if not sendto: |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
509 # 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
|
510 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
|
511 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
|
512 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
|
513 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
|
514 return |
|
2119
cc4667ef3f12
Added the ability to toggle where error messages go.
Eddie Parker <eparker@users.sourceforge.net>
parents:
2005
diff
changeset
|
515 |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 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
|
520 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
521 # try normal message-handling |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
522 if not self.trapExceptions: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
523 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
|
524 |
|
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
525 # 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
|
526 try: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
527 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
|
528 except MailUsageHelp: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
529 # 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
|
530 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
|
531 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
532 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
|
533 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
|
534 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
|
535 subject="Mail Gateway Help") |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
536 except MailUsageError, value: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
537 # 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
|
538 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
|
539 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
540 m.append(str(value)) |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
541 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
|
542 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
|
543 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
|
544 except Unauthorized, value: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
545 # 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
|
546 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
547 m.append(str(value)) |
|
2123
95da13c1bdbd
have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents:
2119
diff
changeset
|
548 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
|
549 except IgnoreMessage: |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
550 # 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
|
551 # 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
|
552 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
|
553 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
|
554 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
|
555 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
|
556 return |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
557 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
|
558 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
|
559 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
|
560 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
|
561 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
|
562 |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
563 # 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
|
564 # let the admin know that something very bad is happening |
|
95da13c1bdbd
have bounce_message do the error_messages_to heavy-lifting
Richard Jones <richard@users.sourceforge.net>
parents:
2119
diff
changeset
|
565 sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL] |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
566 m = [''] |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
567 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
|
568 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
|
569 m.append('notified.\n') |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
570 self.mailer.bounce_message(message, sendto, m) |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
571 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
572 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
|
573 ''' 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
|
574 |
|
19686b60e410
Multipart message class has the getPart method now. Added some tests for it.
Richard Jones <richard@users.sourceforge.net>
parents:
103
diff
changeset
|
575 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
|
576 ''' |
|
1321
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
577 # detect loops |
|
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
578 if message.getheader('x-roundup-loop', ''): |
|
1945
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
579 raise IgnoreLoop |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
580 |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
581 # detect Precedence: Bulk |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
582 if (message.getheader('precedence', '') == 'bulk'): |
|
7e4058dfb29b
ignore incoming email with "Precedence: bulk" (patch [SF#843489])
Richard Jones <richard@users.sourceforge.net>
parents:
1915
diff
changeset
|
583 raise IgnoreBulk |
|
1321
328d68db2ef8
- detect and break email loops [SF#640854]
Richard Jones <richard@users.sourceforge.net>
parents:
1320
diff
changeset
|
584 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
585 # config is used many times in this method. |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
586 # make local variable for easier access |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
587 config = self.instance.config |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
588 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
589 # XXX Don't enable. This doesn't work yet. |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
590 # "[^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
|
591 # 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
|
592 # use the embedded issue number as our issue |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
593 # issue_re = config['MAILGW_ISSUE_ADDRESS_RE'] |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
594 # if issue_re: |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
595 # for header in ['to', 'cc', 'bcc']: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
596 # addresses = message.getheader(header, '') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
597 # if addresses: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
598 # # FIXME, this only finds the first match in the addresses. |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
599 # issue = re.search(issue_re, addresses, 'i') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
600 # if issue: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
601 # classname = issue.group('classname') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
602 # nodeid = issue.group('nodeid') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
603 # break |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
604 |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
605 # determine the sender's address |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
606 from_list = message.getaddrlist('resent-from') |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
607 if not from_list: |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
608 from_list = message.getaddrlist('from') |
|
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
609 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
610 # handle the subject line |
|
226
8af4945246cb
Make the mail parser a little more robust.
Richard Jones <richard@users.sourceforge.net>
parents:
224
diff
changeset
|
611 subject = message.getheader('subject', '') |
|
544
d32977eb8bd4
simple help command for mailgw
Richard Jones <richard@users.sourceforge.net>
parents:
537
diff
changeset
|
612 |
|
1665
dc543c28a7d0
handle missing Subject: line [SF#755331]
Richard Jones <richard@users.sourceforge.net>
parents:
1664
diff
changeset
|
613 if not subject: |
|
dc543c28a7d0
handle missing Subject: line [SF#755331]
Richard Jones <richard@users.sourceforge.net>
parents:
1664
diff
changeset
|
614 raise MailUsageError, ''' |
|
dc543c28a7d0
handle missing Subject: line [SF#755331]
Richard Jones <richard@users.sourceforge.net>
parents:
1664
diff
changeset
|
615 Emails to Roundup trackers must include a Subject: line! |
|
dc543c28a7d0
handle missing Subject: line [SF#755331]
Richard Jones <richard@users.sourceforge.net>
parents:
1664
diff
changeset
|
616 ''' |
|
dc543c28a7d0
handle missing Subject: line [SF#755331]
Richard Jones <richard@users.sourceforge.net>
parents:
1664
diff
changeset
|
617 |
|
1347
350ad3dd6e63
better match for mailgw help "command" text
Richard Jones <richard@users.sourceforge.net>
parents:
1344
diff
changeset
|
618 if subject.strip().lower() == 'help': |
|
544
d32977eb8bd4
simple help command for mailgw
Richard Jones <richard@users.sourceforge.net>
parents:
537
diff
changeset
|
619 raise MailUsageHelp |
|
d32977eb8bd4
simple help command for mailgw
Richard Jones <richard@users.sourceforge.net>
parents:
537
diff
changeset
|
620 |
|
1677
d4e615fcbe04
Made subject_re an attribute of MailGW...
Jean Jordaan <neaj@users.sourceforge.net>
parents:
1665
diff
changeset
|
621 m = self.subject_re.match(subject) |
|
616
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
622 |
|
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
623 # check for well-formed subject line |
|
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
624 if m: |
|
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
625 # get the classname |
|
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
626 classname = m.group('classname') |
|
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
627 if classname is None: |
|
1792
2cd528577108
mailgw now accepts registration confirmation mail that uses otk
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1788
diff
changeset
|
628 # no classname, check if this a registration confirmation email |
|
2cd528577108
mailgw now accepts registration confirmation mail that uses otk
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1788
diff
changeset
|
629 # or fallback on the default class |
|
2cd528577108
mailgw now accepts registration confirmation mail that uses otk
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1788
diff
changeset
|
630 otk_re = re.compile('-- key (?P<otk>[a-zA-Z0-9]{32})') |
|
1793
dbe541c1aa39
Oops, forgot to run all tests. Fixed.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1792
diff
changeset
|
631 otk = otk_re.search(m.group('title')) |
|
1792
2cd528577108
mailgw now accepts registration confirmation mail that uses otk
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1788
diff
changeset
|
632 if otk: |
|
1793
dbe541c1aa39
Oops, forgot to run all tests. Fixed.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1792
diff
changeset
|
633 self.db.confirm_registration(otk.group('otk')) |
|
1804
f83f240b0610
Send a message confirming the confirmation.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1799
diff
changeset
|
634 subject = 'Your registration to %s is complete' % \ |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
635 config['TRACKER_NAME'] |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
636 sendto = [from_list[0][1]] |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
637 self.mailer.standard_message(sendto, subject, '') |
|
1792
2cd528577108
mailgw now accepts registration confirmation mail that uses otk
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1788
diff
changeset
|
638 return |
|
616
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
639 else: |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
640 classname = config['MAILGW_DEFAULT_CLASS'] |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
641 if not classname: |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
642 # fail |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
643 m = None |
|
616
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
644 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
645 if not m: |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
646 raise MailUsageError, """ |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
647 The message you sent to roundup did not contain a properly formed subject |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
648 line. The subject must contain a class name or designator to indicate the |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
649 'topic' of the message. For example: |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
650 Subject: [issue] This is a new issue |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
651 - this will create a new issue in the tracker with the title 'This is |
|
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
652 a new issue'. |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
653 Subject: [issue1234] This is a followup to issue 1234 |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
654 - this will append the message's contents to the existing issue 1234 |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
655 in the tracker. |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
656 |
|
1788
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
657 Subject was: '%s' |
|
e5a17d4dd2c2
Normalize multiline strings for emacs.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1712
diff
changeset
|
658 """%subject |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
659 |
|
616
08abec25b2c6
[SF#503204] mailgw needs a default class
Richard Jones <richard@users.sourceforge.net>
parents:
615
diff
changeset
|
660 # get the class |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
661 try: |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
662 cl = self.db.getclass(classname) |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
663 except KeyError: |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
664 raise MailUsageError, ''' |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
665 The class name you identified in the subject line ("%s") does not exist in the |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
666 database. |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
667 |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
668 Valid class names are: %s |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
669 Subject was: "%s" |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
670 '''%(classname, ', '.join(self.db.getclasses()), subject) |
|
286
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
671 |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
672 # get the optional nodeid |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
673 nodeid = m.group('nodeid') |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
674 |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
675 # title is optional too |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
676 title = m.group('title') |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
677 if title: |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
678 title = title.strip() |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
679 else: |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
680 title = '' |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
681 |
|
1217
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
682 # strip off the quotes that dumb emailers put around the subject, like |
|
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
683 # Re: "[issue1] bla blah" |
|
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
684 if m.group('quote') and title.endswith('"'): |
|
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
685 title = title[:-1] |
|
984c498e7deb
handle stupid mailers quoting subject lines
Richard Jones <richard@users.sourceforge.net>
parents:
1209
diff
changeset
|
686 |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
687 # but we do need either a title or a nodeid... |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
688 if nodeid is None and not title: |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
689 raise MailUsageError, ''' |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
690 I cannot match your message to a node in the database - you need to either |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
691 supply a full node identifier (with number, eg "[issue123]" or keep the |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
692 previous subject title intact so I can match that. |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
693 |
|
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
694 Subject was: "%s" |
|
438
9d97c1a4ddad
Notes from changes.
Richard Jones <richard@users.sourceforge.net>
parents:
434
diff
changeset
|
695 '''%subject |
|
411
a6088556e9ba
Features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
406
diff
changeset
|
696 |
|
286
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
697 # If there's no nodeid, check to see if this is a followup and |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
698 # maybe someone's responded to the initial mail that created an |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
699 # entry. Try to find the matching nodes with the same title, and |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
700 # use the _last_ one matched (since that'll _usually_ be the most |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
701 # recent...) |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
702 if nodeid is None and m.group('refwd'): |
|
286
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
703 l = cl.stringFind(title=title) |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
704 if l: |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
705 nodeid = l[-1] |
|
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
706 |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
707 # if a nodeid was specified, make sure it's valid |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
708 if nodeid is not None and not cl.hasnode(nodeid): |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
709 raise MailUsageError, ''' |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
710 The node specified by the designator in the subject of your message ("%s") |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
711 does not exist. |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
712 |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
713 Subject was: "%s" |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
714 '''%(nodeid, subject) |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
715 |
|
1359
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
716 # Handle the arguments specified by the email gateway command line. |
|
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
717 # We do this by looping over the list of self.arguments looking for |
|
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
718 # a -C to tell us what class then the -S setting string. |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
719 msg_props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
720 user_props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
721 file_props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
722 issue_props = {} |
|
1359
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
723 # so, if we have any arguments, use them |
|
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
724 if 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
|
725 current_class = 'msg' |
|
1359
ebfd8dd1cce7
missed this part of the patch, added doc
Richard Jones <richard@users.sourceforge.net>
parents:
1358
diff
changeset
|
726 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
|
727 if option in ( '-C', '--class'): |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
728 current_class = propstring.strip() |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
729 # XXX this is not flexible enough. |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
730 # we should chect for subclasses of these classes, |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
731 # not for the class name... |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
732 if current_class not in ('msg', 'file', 'user', 'issue'): |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
733 raise MailUsageError, ''' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
734 The mail gateway is not properly set up. Please contact |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
735 %s and have them fix the incorrect class specified as: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
736 %s |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
737 ''' % (config['ADMIN_EMAIL'], current_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
|
738 if option in ('-S', '--set'): |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
739 if current_class == 'issue' : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
740 errors, issue_props = setPropArrayFromString(self, |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
741 cl, propstring.strip(), nodeid) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
742 elif current_class == 'file' : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
743 temp_cl = self.db.getclass('file') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
744 errors, file_props = setPropArrayFromString(self, |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
745 temp_cl, propstring.strip()) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
746 elif current_class == 'msg' : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
747 temp_cl = self.db.getclass('msg') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
748 errors, msg_props = setPropArrayFromString(self, |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
749 temp_cl, propstring.strip()) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
750 elif current_class == 'user' : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
751 temp_cl = self.db.getclass('user') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
752 errors, user_props = setPropArrayFromString(self, |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
753 temp_cl, propstring.strip()) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
754 if errors: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
755 raise MailUsageError, ''' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
756 The mail gateway is not properly set up. Please contact |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
757 %s and have them fix the incorrect properties: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
758 %s |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
759 '''%(config['ADMIN_EMAIL'], errors) |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
760 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
761 # |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
762 # handle the users |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
763 # |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
764 # Don't create users if anonymous isn't allowed to register |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
765 create = 1 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
766 anonid = self.db.user.lookup('anonymous') |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
767 if not self.db.security.hasPermission('Email Registration', anonid): |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
768 create = 0 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
769 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
770 # ok, now figure out who the author is - create a new user if the |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
771 # "create" flag is true |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
772 author = uidFromAddress(self.db, from_list[0], create=create) |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
773 |
|
1234
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
774 # if we're not recognised, and we don't get added as a user, then we |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
775 # must be anonymous |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
776 if not author: |
|
1234
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
777 author = anonid |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
778 |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
779 # make sure the author has permission to use the email interface |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
780 if not self.db.security.hasPermission('Email Access', author): |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
781 if author == anonid: |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
782 # we're anonymous and we need to be a registered user |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
783 raise Unauthorized, ''' |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
784 You are not a registered user. |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
785 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
786 Unknown address: %s |
|
1915
20cfd25cffda
Resent-From: header
Richard Jones <richard@users.sourceforge.net>
parents:
1905
diff
changeset
|
787 '''%from_list[0][1] |
|
1234
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
788 else: |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
789 # we're registered and we're _still_ not allowed access |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
790 raise Unauthorized, 'You are not permitted to access '\ |
|
c0a3b1c49ef7
fixed the mailgw so that anonymous users may still access it
Richard Jones <richard@users.sourceforge.net>
parents:
1220
diff
changeset
|
791 'this tracker.' |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
792 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
793 # make sure they're allowed to edit this class of information |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
794 if not self.db.security.hasPermission('Edit', author, classname): |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
795 raise Unauthorized, 'You are not permitted to edit %s.'%classname |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
796 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
797 # the author may have been created - make sure the change is |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
798 # committed before we reopen the database |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
799 self.db.commit() |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
800 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
801 # reopen the database as the author |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
802 username = self.db.user.get(author, 'username') |
|
1204
b862bbf2067a
Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents:
1180
diff
changeset
|
803 self.db.close() |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
804 self.db = self.instance.open(username) |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
805 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
806 # re-get the class with the new database connection |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
807 cl = self.db.getclass(classname) |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
808 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
809 # now update the recipients list |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
810 recipients = [] |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
811 tracker_email = config['TRACKER_EMAIL'].lower() |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
812 for recipient in message.getaddrlist('to') + message.getaddrlist('cc'): |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
813 r = recipient[1].strip().lower() |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
814 if r == tracker_email or not r: |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
815 continue |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
816 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
817 # look up the recipient - create if necessary (and we're |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
818 # allowed to) |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
819 recipient = uidFromAddress(self.db, recipient, create, **user_props) |
|
1103
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
820 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
821 # if all's well, add the recipient to the list |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
822 if recipient: |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
823 recipients.append(recipient) |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
824 |
|
db787cef1385
handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents:
1096
diff
changeset
|
825 # |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
826 # handle the subject argument list |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
827 # |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
828 # figure what the properties of this Class are |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
829 properties = cl.getprops() |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
830 props = {} |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
831 args = m.group('args') |
|
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
832 if args: |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
833 errors, props = setPropArrayFromString(self, cl, args, nodeid) |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
834 # handle any errors parsing the argument list |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
835 if errors: |
|
1960
ca2dca3db172
fixed mailgw handling of subject-line errors
Richard Jones <richard@users.sourceforge.net>
parents:
1945
diff
changeset
|
836 errors = '\n- '.join(map(str, errors)) |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
837 raise MailUsageError, ''' |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
838 There were problems handling your subject line argument list: |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
839 - %s |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
840 |
|
560
d7b9751f8927
Mail gateway improvements.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
545
diff
changeset
|
841 Subject was: "%s" |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
842 '''%(errors, subject) |
|
434
2441743e335b
Removed generation of change note from "sendmessage" in roundupdb.py.
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
431
diff
changeset
|
843 |
|
1620
fc9dafcb62e0
set title on issues even when the email body is empty [SF#727430]
Richard Jones <richard@users.sourceforge.net>
parents:
1618
diff
changeset
|
844 |
|
fc9dafcb62e0
set title on issues even when the email body is empty [SF#727430]
Richard Jones <richard@users.sourceforge.net>
parents:
1618
diff
changeset
|
845 # set the issue title to the subject |
|
fc9dafcb62e0
set title on issues even when the email body is empty [SF#727430]
Richard Jones <richard@users.sourceforge.net>
parents:
1618
diff
changeset
|
846 if properties.has_key('title') and not issue_props.has_key('title'): |
|
fc9dafcb62e0
set title on issues even when the email body is empty [SF#727430]
Richard Jones <richard@users.sourceforge.net>
parents:
1618
diff
changeset
|
847 issue_props['title'] = title.strip() |
|
fc9dafcb62e0
set title on issues even when the email body is empty [SF#727430]
Richard Jones <richard@users.sourceforge.net>
parents:
1618
diff
changeset
|
848 |
|
264
a671e5917b33
Many features and fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
244
diff
changeset
|
849 # |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
850 # handle message-id and in-reply-to |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
851 # |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
852 messageid = message.getheader('message-id') |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
853 inreplyto = message.getheader('in-reply-to') or '' |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
854 # generate a messageid if there isn't one |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
855 if not messageid: |
|
499
9ad589d0a60f
Changed message-id format to "<%s.%s.%s%s@%s>" so it complies with RFC822
Richard Jones <richard@users.sourceforge.net>
parents:
476
diff
changeset
|
856 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(), |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
857 classname, nodeid, config['MAIL_DOMAIN']) |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
858 |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
859 # now handle the body - find the message |
|
1975
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
860 content, attachments = message.extract_content() |
|
30a444b7b212
*** empty log message ***
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1960
diff
changeset
|
861 if content is None: |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
862 raise MailUsageError, ''' |
|
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
863 Roundup requires the submission to be plain text. The message parser could |
|
286
2313560b8477
Initial cut at trying to handle people responding to CC'ed messages...
Richard Jones <richard@users.sourceforge.net>
parents:
270
diff
changeset
|
864 not find a text/plain part to use. |
|
221
152fedaab07c
Added better error handling to mailgw.
Richard Jones <richard@users.sourceforge.net>
parents:
218
diff
changeset
|
865 ''' |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
866 |
|
734
a55c0622dced
Added note to MIGRATION about new config vars.
Richard Jones <richard@users.sourceforge.net>
parents:
710
diff
changeset
|
867 # figure how much we should muck around with the email body |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
868 keep_citations = config['MAILGW_KEEP_QUOTED_TEXT'] |
|
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
869 keep_body = config['MAILGW_LEAVE_BODY_UNCHANGED'] |
|
734
a55c0622dced
Added note to MIGRATION about new config vars.
Richard Jones <richard@users.sourceforge.net>
parents:
710
diff
changeset
|
870 |
|
a55c0622dced
Added note to MIGRATION about new config vars.
Richard Jones <richard@users.sourceforge.net>
parents:
710
diff
changeset
|
871 # parse the body of the message, stripping out bits as appropriate |
|
2571
58848e3b6bb8
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
Richard Jones <richard@users.sourceforge.net>
parents:
2364
diff
changeset
|
872 summary, content = parseContent(content, keep_citations, |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
873 keep_body) |
|
1591
21312a7564fd
moving templates around
Richard Jones <richard@users.sourceforge.net>
parents:
1583
diff
changeset
|
874 content = content.strip() |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
875 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
876 # |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
877 # handle the attachments |
|
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
878 # |
|
1887
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
879 if properties.has_key('files'): |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
880 files = [] |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
881 for (name, mime_type, data) in attachments: |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
882 if not name: |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
883 name = "unnamed" |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
884 try: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
885 fileid = self.db.file.create(type=mime_type, name=name, |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
886 content=data, **file_props) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
887 except exceptions.Reject: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
888 pass |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
889 else: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
890 files.append(fileid) |
|
1887
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
891 # attach the files to the issue |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
892 if nodeid: |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
893 # extend the existing files list |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
894 fileprop = cl.get(nodeid, 'files') |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
895 fileprop.extend(files) |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
896 props['files'] = fileprop |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
897 else: |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
898 # pre-load the files list |
|
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
899 props['files'] = files |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
900 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
901 # |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
902 # create the message if there's a message body (content) |
|
475
a1a44636bace
Fix breakage caused by transaction changes.
Richard Jones <richard@users.sourceforge.net>
parents:
467
diff
changeset
|
903 # |
|
1887
9d8d5fa0d9ad
Don't rely on being about an issue...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1870
diff
changeset
|
904 if (content and properties.has_key('messages')): |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
905 try: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
906 message_id = self.db.msg.create(author=author, |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
907 recipients=recipients, date=date.Date('.'), |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
908 summary=summary, content=content, files=files, |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
909 messageid=messageid, inreplyto=inreplyto, **msg_props) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
910 except exceptions.Reject: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
911 pass |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
912 else: |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
913 # attach the message to the node |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
914 if nodeid: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
915 # add the message to the node's list |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
916 messages = cl.get(nodeid, 'messages') |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
917 messages.append(message_id) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
918 props['messages'] = messages |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
919 else: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
920 # pre-load the messages list |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
921 props['messages'] = [message_id] |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
922 |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
923 # |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
924 # perform the node change / create |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
925 # |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
926 try: |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
927 # merge the command line props defined in issue_props into |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
928 # the props dictionary because function(**props, **issue_props) |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
929 # is a syntax error. |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
930 for prop in issue_props.keys() : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
931 if not props.has_key(prop) : |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
932 props[prop] = issue_props[prop] |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
933 if nodeid: |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
934 cl.set(nodeid, **props) |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
935 else: |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
936 nodeid = cl.create(**props) |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
937 except (TypeError, IndexError, ValueError), message: |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
938 raise MailUsageError, ''' |
|
379
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
939 There was a problem with the message you sent: |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
940 %s |
|
c7b5b1aa6b4a
More error handling fixes.
Richard Jones <richard@users.sourceforge.net>
parents:
367
diff
changeset
|
941 '''%message |
|
25
4cf1daf2f2eb
More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
942 |
|
753
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
943 # commit the changes to the DB |
|
938edfdeac6e
Sorry about this huge checkin!
Richard Jones <richard@users.sourceforge.net>
parents:
736
diff
changeset
|
944 self.db.commit() |
|
430
350685601f37
Database transactions.
Richard Jones <richard@users.sourceforge.net>
parents:
419
diff
changeset
|
945 |
|
699
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
946 return nodeid |
|
676d4cfde9a5
Nosy list improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
694
diff
changeset
|
947 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
948 |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
949 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
|
950 ''' 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
|
951 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
|
952 ''' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
953 props = {} |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
954 errors = [] |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
955 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
|
956 # 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
|
957 try: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
958 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
|
959 except ValueError, message: |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
960 errors.append('not of form [arg=value,value,...;' |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
961 'arg=value,value,...]') |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
962 return (errors, props) |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
963 # 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
|
964 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
|
965 try: |
|
1905
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
966 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
|
967 propname, value) |
|
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
968 except hyperdb.HyperdbValueError, message: |
|
dc43e339e607
Centralised conversion of user-input data to hyperdb values
Richard Jones <richard@users.sourceforge.net>
parents:
1887
diff
changeset
|
969 errors.append(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
|
970 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
|
971 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
972 |
|
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
|
973 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
|
974 '''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
|
975 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
|
976 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
977 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
|
978 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
|
979 # 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
|
980 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
|
981 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
|
982 # 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
|
983 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
|
984 # 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
|
985 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
|
986 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
|
987 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
|
988 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
|
989 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
990 |
|
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
991 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
|
992 ''' 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
|
993 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
994 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
|
995 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
|
996 ''' |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
997 (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
|
998 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
999 # 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
|
1000 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
|
1001 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1002 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
|
1003 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1004 # 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
|
1005 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
|
1006 if props.has_key('alternate_addresses'): |
|
1249
6c24a86a12ae
Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents:
1244
diff
changeset
|
1007 users = db.user.filter(None, {'alternate_addresses': address}) |
|
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
|
1008 user = extractUserFromList(db.user, users) |
|
1477
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1009 if user is not None: |
|
ed725179953d
Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents:
1462
diff
changeset
|
1010 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
|
1011 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1012 # 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
|
1013 # 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
|
1014 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
|
1015 |
|
502a5ae11cc5
Very close now. The cgi and mailgw now use the new security API.
Richard Jones <richard@users.sourceforge.net>
parents:
902
diff
changeset
|
1016 # 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
|
1017 if create: |
|
1592
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1018 # generate a username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1019 if '@' in address: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1020 username = address.split('@')[0] |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1021 else: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1022 username = address |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1023 trying = username |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1024 n = 0 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1025 while 1: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1026 try: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1027 # does this username exist already? |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1028 db.user.lookup(trying) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1029 except KeyError: |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1030 break |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1031 n += 1 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1032 trying = username + str(n) |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1033 |
|
4074e2336eed
fixes to unit tests for recent changes
Richard Jones <richard@users.sourceforge.net>
parents:
1591
diff
changeset
|
1034 # create! |
|
2129
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1035 try: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1036 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
|
1037 realname=realname, roles=db.config.NEW_EMAIL_USER_ROLES, |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1038 password=password.Password(password.generatePassword()), |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1039 **user_props) |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1040 except exceptions.Reject: |
|
3fd672293712
add and use Reject exception [SF#700265]
Richard Jones <richard@users.sourceforge.net>
parents:
2123
diff
changeset
|
1041 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
|
1042 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
|
1043 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
|
1044 |
|
1358
e0bf31867fa5
support propety setting on message and file through web and email interface
Richard Jones <richard@users.sourceforge.net>
parents:
1347
diff
changeset
|
1045 |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1046 def parseContent(content, keep_citations, keep_body, |
|
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1047 blank_line=re.compile(r'[\r\n]+\s*[\r\n]+'), |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1048 eol=re.compile(r'[\r\n]+'), |
|
1870
ea63531ddeec
Don't be strict about the space following the two hyphens...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents:
1859
diff
changeset
|
1049 signature=re.compile(r'^[>|\s]*-- ?$'), |
|
1344
f2f553611ce0
applied patches for handling Outlook quirks...
Richard Jones <richard@users.sourceforge.net>
parents:
1329
diff
changeset
|
1050 original_msg=re.compile(r'^[>|\s]*-----\s?Original Message\s?-----$')): |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1051 ''' The message body is divided into sections by blank lines. |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1052 Sections where the second and all subsequent lines begin with a ">" |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1053 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
|
1054 the first non-quoting section becomes the summary of the message. |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1055 |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1056 If keep_citations is true, then we keep the "quoting sections" in the |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1057 content. |
|
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1058 If keep_body is true, we even keep the signature sections. |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1059 ''' |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1060 # strip off leading carriage-returns / newlines |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1061 i = 0 |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1062 for i in range(len(content)): |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1063 if content[i] not in '\r\n': |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1064 break |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1065 if i > 0: |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1066 sections = blank_line.split(content[i:]) |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1067 else: |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1068 sections = blank_line.split(content) |
|
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1069 |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1070 # 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
|
1071 summary = '' |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1072 l = [] |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1073 for section in sections: |
|
334
256776bfdfc5
fixed [SF#474749] Indentations lost
Richard Jones <richard@users.sourceforge.net>
parents:
321
diff
changeset
|
1074 #section = section.strip() |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1075 if not section: |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1076 continue |
|
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1077 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
|
1078 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
|
1079 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
|
1080 # 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
|
1081 # 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
|
1082 for line in lines[1:]: |
|
1209
e47d9bb1455b
[SF#614188] Exception in mailgw.py
Richard Jones <richard@users.sourceforge.net>
parents:
1204
diff
changeset
|
1083 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
|
1084 break |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1085 else: |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1086 # 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
|
1087 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
|
1088 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
|
1089 continue |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1090 # 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
|
1091 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
|
1092 section = '\n'.join(lines) |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1093 # 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
|
1094 # our summary |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1095 summary = section |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1096 |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1097 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
|
1098 # 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
|
1099 # section |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1100 summary = section |
|
706
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1101 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
|
1102 # lose any signature |
|
7ba403bffed5
Tweaking the signature deletion from mail messages.
Richard Jones <richard@users.sourceforge.net>
parents:
699
diff
changeset
|
1103 break |
|
1344
f2f553611ce0
applied patches for handling Outlook quirks...
Richard Jones <richard@users.sourceforge.net>
parents:
1329
diff
changeset
|
1104 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
|
1105 # ditch the stupid Outlook quoting of the entire original message |
| 454 | 1106 break |
|
510
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1107 |
|
3f6107488465
followup lines directly after a quoted section were being eaten.
Richard Jones <richard@users.sourceforge.net>
parents:
499
diff
changeset
|
1108 # 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
|
1109 l.append(section) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1110 |
|
1299
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1111 # figure the summary - find the first sentence-ending punctuation or the |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1112 # first whole line, whichever is longest |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1113 sentence = re.search(r'^([^!?\.]+[!?\.])', summary) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1114 if sentence: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1115 sentence = sentence.group(1) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1116 else: |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1117 sentence = '' |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1118 first = eol.split(summary)[0] |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1119 summary = max(sentence, first) |
|
b2d04ce03802
Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents:
1294
diff
changeset
|
1120 |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1121 # 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
|
1122 # about. |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1123 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
|
1124 content = '\n\n'.join(l) |
|
1107
1c1ccfc9673d
reorganised mailgw code
Richard Jones <richard@users.sourceforge.net>
parents:
1103
diff
changeset
|
1125 |
|
694
34dbcdfb2fe1
stripping of email message body can be controlled through config variables...
Roche Compaan <rochecompaan@users.sourceforge.net>
parents:
661
diff
changeset
|
1126 return summary, content |
|
198
eda506860b32
Implemented correct mail splitting (was taking a shortcut).
Richard Jones <richard@users.sourceforge.net>
parents:
172
diff
changeset
|
1127 |
|
2631
2bbcfc80ba5b
MailGW.handle_message():
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2571
diff
changeset
|
1128 # vim: set filetype=python sts=4 sw=4 et si : |
