annotate roundup/mailgw.py @ 1550:905f92b97d4e maint-0.5

backport of mail address case problem from HEAD
author Richard Jones <richard@users.sourceforge.net>
date Mon, 24 Mar 2003 04:53:15 +0000
parents 3a853f1c20b5
children 5a2a89a2f4aa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # under the same terms as Python, so long as this copyright message and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # disclaimer are retained in their original form.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 An e-mail gateway for Roundup.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 Incoming messages are examined for multiple parts:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 . In a multipart/mixed message or part, each subpart is extracted and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 examined. The text/plain subparts are assembled to form the textual
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 body of the message, to be stored in the file associated with a "msg"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 class node. Any parts of other types are each stored in separate files
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 and given "file" class nodes that are linked to the "msg" node.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 . In a multipart/alternative message or part, we look for a text/plain
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 subpart and ignore the other parts.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 Summary
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 -------
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 The "summary" property on message nodes is taken from the first non-quoting
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 section in the message body. The message body is divided into sections by
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 blank lines. Sections where the second and all subsequent lines begin with
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 a ">" or "|" character are considered "quoting sections". The first line of
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 the first non-quoting section becomes the summary of the message.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 Addresses
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 ---------
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 All of the addresses in the To: and Cc: headers of the incoming message are
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 looked up among the user nodes, and the corresponding users are placed in
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 the "recipients" property on the new "msg" node. The address in the From:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 header similarly determines the "author" property of the new "msg"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 node. The default handling for addresses that don't have corresponding
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 users is to create new users with no passwords and a username equal to the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 address. (The web interface does not permit logins for users with no
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 passwords.) If we prefer to reject mail from outside sources, we can simply
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 register an auditor on the "user" class that prevents the creation of user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 nodes with no passwords.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 Actions
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 -------
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 The subject line of the incoming message is examined to determine whether
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 the message is an attempt to create a new item or to discuss an existing
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 item. A designator enclosed in square brackets is sought as the first thing
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 on the subject line (after skipping any "Fwd:" or "Re:" prefixes).
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 If an item designator (class name and id number) is found there, the newly
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 created "msg" node is added to the "messages" property for that item, and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 any new "file" nodes are added to the "files" property for the item.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 If just an item class name is found there, we attempt to create a new item
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 of that class with its "messages" property initialized to contain the new
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 "msg" node and its "files" property initialized to contain any new "file"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 nodes.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 Triggers
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 --------
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 Both cases may trigger detectors (in the first case we are calling the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 set() method to add the message to the item's spool; in the second case we
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 are calling the create() method to create a new node). If an auditor raises
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 an exception, the original message is bounced back to the sender with the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 explanatory message given in the exception.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75
1410
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
76 $Id: mailgw.py,v 1.104.2.1 2003-02-06 05:44:49 richard Exp $
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 import time, random, sys
1410
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
81 import traceback, MimeWriter, rfc822
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 import hyperdb, date, password
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 class MailGWError(ValueError):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 pass
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 class MailUsageError(ValueError):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 pass
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 class MailUsageHelp(Exception):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 pass
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 class MailLoop(Exception):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 ''' We've seen this message before... '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 pass
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 class Unauthorized(Exception):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 """ Access denied """
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 def initialiseSecurity(security):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 ''' Create some Permissions and Roles on the security object
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 This function is directly invoked by security.Security.__init__()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 as a part of the Security object instantiation.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 security.addPermission(name="Email Registration",
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 description="Anonymous may register through e-mail")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 p = security.addPermission(name="Email Access",
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 description="User may use the email interface")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 security.addPermissionToRole('Admin', p)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113
1410
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
114 def getparam(str, param):
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
115 ''' From the rfc822 "header" string, extract "param" if it appears.
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
116 '''
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
117 if ';' not in str:
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
118 return None
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
119 str = str[str.index(';'):]
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
120 while str[:1] == ';':
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
121 str = str[1:]
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
122 if ';' in str:
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
123 # XXX Should parse quotes!
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
124 end = str.index(';')
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
125 else:
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
126 end = len(str)
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
127 f = str[:end]
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
128 if '=' in f:
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
129 i = f.index('=')
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
130 if f[:i].strip().lower() == param:
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
131 return rfc822.unquote(f[i+1:].strip())
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
132 return None
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
133
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 class Message(mimetools.Message):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 ''' subclass mimetools.Message so we can retrieve the parts of the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 message...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 def getPart(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 ''' Get a single part of a multipart message and return it as a new
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 Message instance.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 boundary = self.getparam('boundary')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 mid, end = '--'+boundary, '--'+boundary+'--'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 s = cStringIO.StringIO()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 while 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 line = self.fp.readline()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 if not line:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 if line.strip() in (mid, end):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 s.write(line)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 if not s.getvalue().strip():
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 return None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 s.seek(0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 return Message(s)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 subject_re = re.compile(r'(?P<refwd>\s*\W?\s*(fw|fwd|re|aw)\W\s*)*'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 r'\s*(?P<quote>")?(\[(?P<classname>[^\d\s]+)(?P<nodeid>\d+)?\])?'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 r'\s*(?P<title>[^[]+)?"?(\[(?P<args>.+?)\])?', re.I)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 class MailGW:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 def __init__(self, instance, db):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 self.instance = instance
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 self.db = db
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 # should we trap exceptions (normal usage) or pass them through
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 # (for testing)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168 self.trapExceptions = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 def do_pipe(self):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 ''' Read a message from standard input and pass it to the mail handler.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 Read into an internal structure that we can seek on (in case
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 there's an error).
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 XXX: we may want to read this into a temporary file instead...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 s = cStringIO.StringIO()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 s.write(sys.stdin.read())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 s.seek(0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 self.main(s)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 def do_mailbox(self, filename):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 ''' Read a series of messages from the specified unix mailbox file and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 pass each to the mail handler.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 # open the spool file and lock it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 import fcntl, FCNTL
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 f = open(filename, 'r+')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 fcntl.flock(f.fileno(), FCNTL.LOCK_EX)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 # handle and clear the mailbox
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 from mailbox import UnixMailbox
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 mailbox = UnixMailbox(f, factory=Message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 # grab one message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 message = mailbox.next()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 while message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 # handle this message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 self.handle_Message(message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 message = mailbox.next()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 # nuke the file contents
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 os.ftruncate(f.fileno(), 0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 except:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 import traceback
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 traceback.print_exc()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 fcntl.flock(f.fileno(), FCNTL.LOCK_UN)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 def do_pop(self, server, user='', password=''):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 '''Read a series of messages from the specified POP server.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 import getpass, poplib, socket
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 if not user:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 user = raw_input(_('User: '))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 if not password:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 password = getpass.getpass()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 except (KeyboardInterrupt, EOFError):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 # Ctrl C or D maybe also Ctrl Z under Windows.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 print "\nAborted by user."
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 # open a connection to the server and retrieve all messages
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 server = poplib.POP3(server)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 except socket.error, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 print "POP server error:", message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 return 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 server.user(user)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 server.pass_(password)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 numMessages = len(server.list()[1])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 for i in range(1, numMessages+1):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 # retr: returns
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 # [ pop response e.g. '+OK 459 octets',
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 # [ array of message lines ],
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 # number of octets ]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 lines = server.retr(i)[1]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 s = cStringIO.StringIO('\n'.join(lines))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 s.seek(0)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 self.handle_Message(Message(s))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 # delete the message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 server.dele(i)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 # quit the server to commit changes.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 server.quit()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 def main(self, fp):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 ''' fp - the file from which to read the Message.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 return self.handle_Message(Message(fp))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 def handle_Message(self, message):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 '''Handle an RFC822 Message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 Handle the Message object by calling handle_message() and then cope
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 with any errors raised by handle_message.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 This method's job is to make that call and handle any
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 errors in a sane manner. It should be replaced if you wish to
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 handle errors in a different manner.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 # in some rare cases, a particularly stuffed-up e-mail will make
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 # its way into here... try to handle it gracefully
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 sendto = message.getaddrlist('from')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 if sendto:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 if not self.trapExceptions:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 return self.handle_message(message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 return self.handle_message(message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 except MailUsageHelp:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 # bounce the message back to the sender with the usage message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 sendto = [sendto[0][1]]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 m = ['']
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 m.append('\n\nMail Gateway Help\n=================')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 m.append(fulldoc)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 m = self.bounce_message(message, sendto, m,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 subject="Mail Gateway Help")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 except MailUsageError, value:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 # bounce the message back to the sender with the usage message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 sendto = [sendto[0][1]]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 m = ['']
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 m.append(str(value))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 m.append('\n\nMail Gateway Help\n=================')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 m.append(fulldoc)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 m = self.bounce_message(message, sendto, m)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 except Unauthorized, value:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 # just inform the user that he is not authorized
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 sendto = [sendto[0][1]]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 m = ['']
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 m.append(str(value))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 m = self.bounce_message(message, sendto, m)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 except MailLoop:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 # XXX we should use a log file here...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 return
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 except:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301 # bounce the message back to the sender with the error message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 # XXX we should use a log file here...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
304 m = ['']
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
305 m.append('An unexpected error occurred during the processing')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306 m.append('of your message. The tracker administrator is being')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
307 m.append('notified.\n')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308 m.append('---- traceback of failure ----')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
309 s = cStringIO.StringIO()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 import traceback
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 traceback.print_exc(None, s)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 m.append(s.getvalue())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
313 m = self.bounce_message(message, sendto, m)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
314 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
315 # very bad-looking message - we don't even know who sent it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
316 # XXX we should use a log file here...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317 sendto = [self.instance.config.ADMIN_EMAIL]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 m = ['Subject: badly formed message from mail gateway']
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 m.append('')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
320 m.append('The mail gateway retrieved a message which has no From:')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321 m.append('line, indicating that it is corrupt. Please check your')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322 m.append('mail gateway source. Failed message is attached.')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 m.append('')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
324 m = self.bounce_message(message, sendto, m,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325 subject='Badly formed message from mail gateway')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 # now send the message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 if SENDMAILDEBUG:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 open(SENDMAILDEBUG, 'w').write('From: %s\nTo: %s\n%s\n'%(
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 self.instance.config.ADMIN_EMAIL, ', '.join(sendto),
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 m.getvalue()))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 smtp = smtplib.SMTP(self.instance.config.MAILHOST)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 smtp.sendmail(self.instance.config.ADMIN_EMAIL, sendto,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 m.getvalue())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 except socket.error, value:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 raise MailGWError, "Couldn't send error email: "\
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 "mailhost %s"%value
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 except smtplib.SMTPException, value:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 raise MailGWError, "Couldn't send error email: %s"%value
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 def bounce_message(self, message, sendto, error,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 subject='Failed issue tracker submission'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 ''' create a message that explains the reason for the failed
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 issue submission to the author and attach the original
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 message.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
349 msg = cStringIO.StringIO()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350 writer = MimeWriter.MimeWriter(msg)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 writer.addheader('X-Roundup-Loop', 'hello')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 writer.addheader('Subject', subject)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353 writer.addheader('From', '%s <%s>'% (self.instance.config.TRACKER_NAME,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 self.instance.config.TRACKER_EMAIL))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 writer.addheader('To', ','.join(sendto))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 writer.addheader('Date', time.strftime("%a, %d %b %Y %H:%M:%S +0000",
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 time.gmtime()))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 writer.addheader('MIME-Version', '1.0')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 part = writer.startmultipartbody('mixed')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 part = writer.nextpart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
361 body = part.startbody('text/plain')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362 body.write('\n'.join(error))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 # attach the original message to the returned message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 part = writer.nextpart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 part.addheader('Content-Disposition','attachment')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367 part.addheader('Content-Description','Message you sent')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
368 body = part.startbody('text/plain')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369 for header in message.headers:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
370 body.write(header)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
371 body.write('\n')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
373 message.rewindbody()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
374 except IOError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
375 body.write("*** couldn't include message body: %s ***"%message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
376 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 body.write(message.fp.read())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
378
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
379 writer.lastpart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380 return msg
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
381
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382 def get_part_data_decoded(self,part):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
383 encoding = part.getencoding()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
384 data = None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385 if encoding == 'base64':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
386 # BUG: is base64 really used for text encoding or
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
387 # are we inserting zip files here.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
388 data = binascii.a2b_base64(part.fp.read())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
389 elif encoding == 'quoted-printable':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390 # the quopri module wants to work with files
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391 decoded = cStringIO.StringIO()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
392 quopri.decode(part.fp, decoded)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393 data = decoded.getvalue()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
394 elif encoding == 'uuencoded':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395 data = binascii.a2b_uu(part.fp.read())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
397 # take it as text
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 data = part.fp.read()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
399 return data
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 def handle_message(self, message):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 ''' message - a Message instance
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404 Parse the message as per the module docstring.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406 # detect loops
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407 if message.getheader('x-roundup-loop', ''):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 raise MailLoop
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
409
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
410 # handle the subject line
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
411 subject = message.getheader('subject', '')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413 if subject.strip().lower() == 'help':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414 raise MailUsageHelp
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
415
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
416 m = subject_re.match(subject)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
417
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
418 # check for well-formed subject line
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
419 if m:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
420 # get the classname
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
421 classname = m.group('classname')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
422 if classname is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
423 # no classname, fallback on the default
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
424 if hasattr(self.instance.config, 'MAIL_DEFAULT_CLASS') and \
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
425 self.instance.config.MAIL_DEFAULT_CLASS:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
426 classname = self.instance.config.MAIL_DEFAULT_CLASS
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
427 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
428 # fail
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
429 m = None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
430
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
431 if not m:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
432 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
433 The message you sent to roundup did not contain a properly formed subject
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
434 line. The subject must contain a class name or designator to indicate the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
435 "topic" of the message. For example:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 Subject: [issue] This is a new issue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 - this will create a new issue in the tracker with the title "This is
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
438 a new issue".
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439 Subject: [issue1234] This is a followup to issue 1234
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
440 - this will append the message's contents to the existing issue 1234
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
441 in the tracker.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
442
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
443 Subject was: "%s"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
444 '''%subject
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
445
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
446 # get the class
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
447 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
448 cl = self.db.getclass(classname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
449 except KeyError:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
450 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
451 The class name you identified in the subject line ("%s") does not exist in the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
452 database.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
453
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
454 Valid class names are: %s
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 Subject was: "%s"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
456 '''%(classname, ', '.join(self.db.getclasses()), subject)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
457
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
458 # get the optional nodeid
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
459 nodeid = m.group('nodeid')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
460
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
461 # title is optional too
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
462 title = m.group('title')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
463 if title:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464 title = title.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
465 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466 title = ''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 # strip off the quotes that dumb emailers put around the subject, like
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469 # Re: "[issue1] bla blah"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
470 if m.group('quote') and title.endswith('"'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
471 title = title[:-1]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
473 # but we do need either a title or a nodeid...
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474 if nodeid is None and not title:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
475 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
476 I cannot match your message to a node in the database - you need to either
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
477 supply a full node identifier (with number, eg "[issue123]" or keep the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
478 previous subject title intact so I can match that.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
479
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
480 Subject was: "%s"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
481 '''%subject
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
482
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
483 # If there's no nodeid, check to see if this is a followup and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
484 # maybe someone's responded to the initial mail that created an
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
485 # entry. Try to find the matching nodes with the same title, and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
486 # use the _last_ one matched (since that'll _usually_ be the most
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
487 # recent...)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488 if nodeid is None and m.group('refwd'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 l = cl.stringFind(title=title)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
490 if l:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
491 nodeid = l[-1]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
492
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
493 # if a nodeid was specified, make sure it's valid
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
494 if nodeid is not None and not cl.hasnode(nodeid):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
495 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 The node specified by the designator in the subject of your message ("%s")
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
497 does not exist.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
499 Subject was: "%s"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
500 '''%(nodeid, subject)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
501
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
502 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
503 # handle the users
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
504 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
505 # Don't create users if anonymous isn't allowed to register
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
506 create = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
507 anonid = self.db.user.lookup('anonymous')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
508 if not self.db.security.hasPermission('Email Registration', anonid):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
509 create = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
510
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
511 # ok, now figure out who the author is - create a new user if the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
512 # "create" flag is true
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
513 author = uidFromAddress(self.db, message.getaddrlist('from')[0],
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
514 create=create)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
515
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
516 # if we're not recognised, and we don't get added as a user, then we
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
517 # must be anonymous
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
518 if not author:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
519 author = anonid
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
520
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
521 # make sure the author has permission to use the email interface
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
522 if not self.db.security.hasPermission('Email Access', author):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
523 if author == anonid:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
524 # we're anonymous and we need to be a registered user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
525 raise Unauthorized, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
526 You are not a registered user.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
527
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
528 Unknown address: %s
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
529 '''%message.getaddrlist('from')[0][1]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
530 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
531 # we're registered and we're _still_ not allowed access
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
532 raise Unauthorized, 'You are not permitted to access '\
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
533 'this tracker.'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
534
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
535 # make sure they're allowed to edit this class of information
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
536 if not self.db.security.hasPermission('Edit', author, classname):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
537 raise Unauthorized, 'You are not permitted to edit %s.'%classname
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
538
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
539 # the author may have been created - make sure the change is
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
540 # committed before we reopen the database
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
541 self.db.commit()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
542
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
543 # reopen the database as the author
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
544 username = self.db.user.get(author, 'username')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
545 self.db.close()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
546 self.db = self.instance.open(username)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
547
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
548 # re-get the class with the new database connection
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
549 cl = self.db.getclass(classname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
550
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
551 # now update the recipients list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
552 recipients = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
553 tracker_email = self.instance.config.TRACKER_EMAIL.lower()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
554 for recipient in message.getaddrlist('to') + message.getaddrlist('cc'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
555 r = recipient[1].strip().lower()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
556 if r == tracker_email or not r:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
557 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
558
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 # look up the recipient - create if necessary (and we're
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560 # allowed to)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
561 recipient = uidFromAddress(self.db, recipient, create)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
562
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 # if all's well, add the recipient to the list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
564 if recipient:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
565 recipients.append(recipient)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
566
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
567 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
568 # extract the args
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
569 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
570 subject_args = m.group('args')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 # handle the subject argument list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
575 # figure what the properties of this Class are
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
576 properties = cl.getprops()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
577 props = {}
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
578 args = m.group('args')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 if args:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
580 errors = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
581 for prop in string.split(args, ';'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
582 # extract the property name and value
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
583 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
584 propname, value = prop.split('=')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
585 except ValueError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586 errors.append('not of form [arg=value,'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
587 'value,...;arg=value,value...]')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
589
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590 # ensure it's a valid property name
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 propname = propname.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 proptype = properties[propname]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 except KeyError:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595 errors.append('refers to an invalid property: '
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
596 '"%s"'%propname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
597 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
598
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
599 # convert the string value to a real property value
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 if isinstance(proptype, hyperdb.String):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
601 props[propname] = value.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
602 if isinstance(proptype, hyperdb.Password):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
603 props[propname] = password.Password(value.strip())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
604 elif isinstance(proptype, hyperdb.Date):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
605 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 props[propname] = date.Date(value.strip())
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607 except ValueError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
608 errors.append('contains an invalid date for '
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
609 '%s.'%propname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
610 elif isinstance(proptype, hyperdb.Interval):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
611 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
612 props[propname] = date.Interval(value)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
613 except ValueError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
614 errors.append('contains an invalid date interval'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
615 'for %s.'%propname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
616 elif isinstance(proptype, hyperdb.Link):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
617 linkcl = self.db.classes[proptype.classname]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
618 propkey = linkcl.labelprop(default_to_id=1)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
619 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
620 props[propname] = linkcl.lookup(value)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
621 except KeyError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
622 errors.append('"%s" is not a value for %s.'%(value,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
623 propname))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
624 elif isinstance(proptype, hyperdb.Multilink):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
625 # get the linked class
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
626 linkcl = self.db.classes[proptype.classname]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
627 propkey = linkcl.labelprop(default_to_id=1)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
628 if nodeid:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
629 curvalue = cl.get(nodeid, propname)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
630 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
631 curvalue = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
632
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633 # handle each add/remove in turn
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634 # keep an extra list for all items that are
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
635 # definitely in the new list (in case of e.g.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
636 # <propname>=A,+B, which should replace the old
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
637 # list with A,B)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
638 set = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
639 newvalue = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
640 for item in value.split(','):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
641 item = item.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
642
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
643 # handle +/-
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 remove = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
645 if item.startswith('-'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
646 remove = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
647 item = item[1:]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
648 elif item.startswith('+'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
649 item = item[1:]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
650 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
651 set = 1
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
652
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
653 # look up the value
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
654 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
655 item = linkcl.lookup(item)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
656 except KeyError, message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
657 errors.append('"%s" is not a value for %s.'%(item,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
658 propname))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
659 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
660
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
661 # perform the add/remove
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
662 if remove:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 curvalue.remove(item)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
665 except ValueError:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666 errors.append('"%s" is not currently in '
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
667 'for %s.'%(item, propname))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
668 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
669 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
670 newvalue.append(item)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
671 if item not in curvalue:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
672 curvalue.append(item)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
673
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 # that's it, set the new Multilink property value,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
675 # or overwrite it completely
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676 if set:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
677 props[propname] = newvalue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
678 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
679 props[propname] = curvalue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
680 elif isinstance(proptype, hyperdb.Boolean):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
681 value = value.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
682 props[propname] = value.lower() in ('yes', 'true', 'on', '1')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
683 elif isinstance(proptype, hyperdb.Number):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
684 value = value.strip()
1410
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
685 props[propname] = float(value)
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
686
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
687 # handle any errors parsing the argument list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
688 if errors:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
689 errors = '\n- '.join(errors)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
690 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
691 There were problems handling your subject line argument list:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
692 - %s
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
693
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
694 Subject was: "%s"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
695 '''%(errors, subject)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
696
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
697 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
698 # handle message-id and in-reply-to
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
699 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
700 messageid = message.getheader('message-id')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
701 inreplyto = message.getheader('in-reply-to') or ''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
702 # generate a messageid if there isn't one
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
703 if not messageid:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
704 messageid = "<%s.%s.%s%s@%s>"%(time.time(), random.random(),
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
705 classname, nodeid, self.instance.config.MAIL_DOMAIN)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
706
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
707 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
708 # now handle the body - find the message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
709 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 content_type = message.gettype()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
711 attachments = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
712 # General multipart handling:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 # Take the first text/plain part, anything else is considered an
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
714 # attachment.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
715 # multipart/mixed: multiple "unrelated" parts.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
716 # multipart/signed (rfc 1847):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
717 # The control information is carried in the second of the two
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
718 # required body parts.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
719 # ACTION: Default, so if content is text/plain we get it.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
720 # multipart/encrypted (rfc 1847):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
721 # The control information is carried in the first of the two
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
722 # required body parts.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
723 # ACTION: Not handleable as the content is encrypted.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
724 # multipart/related (rfc 1872, 2112, 2387):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
725 # The Multipart/Related content-type addresses the MIME
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
726 # representation of compound objects.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
727 # ACTION: Default. If we are lucky there is a text/plain.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
728 # TODO: One should use the start part and look for an Alternative
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729 # that is text/plain.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
730 # multipart/Alternative (rfc 1872, 1892):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
731 # only in "related" ?
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
732 # multipart/report (rfc 1892):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 # e.g. mail system delivery status reports.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
734 # ACTION: Default. Could be ignored or used for Delivery Notification
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
735 # flagging.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
736 # multipart/form-data:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737 # For web forms only.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
738 if content_type == 'multipart/mixed':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
739 # skip over the intro to the first boundary
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
740 part = message.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
741 content = None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
742 while 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
743 # get the next part
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
744 part = message.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
745 if part is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
746 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
747 # parse it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
748 subtype = part.gettype()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
749 if subtype == 'text/plain' and not content:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
750 # The first text/plain part is the message content.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
751 content = self.get_part_data_decoded(part)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
752 elif subtype == 'message/rfc822':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
753 # handle message/rfc822 specially - the name should be
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
754 # the subject of the actual e-mail embedded here
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
755 i = part.fp.tell()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
756 mailmess = Message(part.fp)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
757 name = mailmess.getheader('subject')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
758 part.fp.seek(i)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
759 attachments.append((name, 'message/rfc822', part.fp.read()))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
760 elif subtype == 'multipart/alternative':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
761 # Search for text/plain in message with attachment and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
762 # alternative text representation
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
763 part.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
764 while 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
765 # get the next part
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
766 subpart = part.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
767 if subpart is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
768 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
769 # parse it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
770 if subpart.gettype() == 'text/plain' and not content:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
771 content = self.get_part_data_decoded(subpart)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
772 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
773 # try name on Content-Type
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
774 name = part.getparam('name')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
775 if name:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
776 name = name.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
777 if not name:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
778 disp = part.getheader('content-disposition', None)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
779 if disp:
1410
3a853f1c20b5 backporting fixes from HEAD
Richard Jones <richard@users.sourceforge.net>
parents: 1356
diff changeset
780 name = getparam(disp, 'filename')
1356
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
781 if name:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
782 name = name.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
783 # this is just an attachment
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
784 data = self.get_part_data_decoded(part)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
785 attachments.append((name, part.gettype(), data))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
786 if content is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
787 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
788 Roundup requires the submission to be plain text. The message parser could
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
789 not find a text/plain part to use.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
790 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
791
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
792 elif content_type[:10] == 'multipart/':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
793 # skip over the intro to the first boundary
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
794 message.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
795 content = None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
796 while 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
797 # get the next part
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
798 part = message.getPart()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
799 if part is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
800 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
801 # parse it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
802 if part.gettype() == 'text/plain' and not content:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
803 content = self.get_part_data_decoded(part)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
804 if content is None:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
805 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
806 Roundup requires the submission to be plain text. The message parser could
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
807 not find a text/plain part to use.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
808 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
809
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
810 elif content_type != 'text/plain':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
811 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
812 Roundup requires the submission to be plain text. The message parser could
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
813 not find a text/plain part to use.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
814 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
815
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
816 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
817 content = self.get_part_data_decoded(message)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
818
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
819 # figure how much we should muck around with the email body
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
820 keep_citations = getattr(self.instance.config, 'EMAIL_KEEP_QUOTED_TEXT',
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
821 'no') == 'yes'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
822 keep_body = getattr(self.instance.config, 'EMAIL_LEAVE_BODY_UNCHANGED',
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
823 'no') == 'yes'
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
824
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
825 # parse the body of the message, stripping out bits as appropriate
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
826 summary, content = parseContent(content, keep_citations,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
827 keep_body)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
828
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
829 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
830 # handle the attachments
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
831 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
832 files = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
833 for (name, mime_type, data) in attachments:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
834 if not name:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
835 name = "unnamed"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
836 files.append(self.db.file.create(type=mime_type, name=name,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
837 content=data))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
838
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
839 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
840 # create the message if there's a message body (content)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
841 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
842 if content:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
843 message_id = self.db.msg.create(author=author,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
844 recipients=recipients, date=date.Date('.'), summary=summary,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
845 content=content, files=files, messageid=messageid,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
846 inreplyto=inreplyto)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
847
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
848 # attach the message to the node
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
849 if nodeid:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
850 # add the message to the node's list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
851 messages = cl.get(nodeid, 'messages')
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
852 messages.append(message_id)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
853 props['messages'] = messages
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
854 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
855 # pre-load the messages list
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
856 props['messages'] = [message_id]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
857
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
858 # set the title to the subject
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
859 if properties.has_key('title') and not props.has_key('title'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
860 props['title'] = title
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
861
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
862 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
863 # perform the node change / create
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
864 #
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
865 try:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
866 if nodeid:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
867 cl.set(nodeid, **props)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
868 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
869 nodeid = cl.create(**props)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
870 except (TypeError, IndexError, ValueError), message:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
871 raise MailUsageError, '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
872 There was a problem with the message you sent:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
873 %s
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
874 '''%message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
875
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
876 # commit the changes to the DB
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
877 self.db.commit()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
878
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
879 return nodeid
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
880
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
881 def extractUserFromList(userClass, users):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
882 '''Given a list of users, try to extract the first non-anonymous user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
883 and return that user, otherwise return None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
884 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
885 if len(users) > 1:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
886 for user in users:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
887 # make sure we don't match the anonymous or admin user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
888 if userClass.get(user, 'username') in ('admin', 'anonymous'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
889 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
890 # first valid match will do
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
891 return user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
892 # well, I guess we have no choice
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
893 return user[0]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
894 elif users:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
895 return users[0]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
896 return None
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
897
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
898 def uidFromAddress(db, address, create=1):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
899 ''' address is from the rfc822 module, and therefore is (name, addr)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
900
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
901 user is created if they don't exist in the db already
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
902 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
903 (realname, address) = address
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
904
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
905 # try a straight match of the address
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
906 user = extractUserFromList(db.user, db.user.stringFind(address=address))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
907 if user is not None: return user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
908
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
909 # try the user alternate addresses if possible
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
910 props = db.user.getprops()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
911 if props.has_key('alternate_addresses'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
912 users = db.user.filter(None, {'alternate_addresses': address})
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
913 user = extractUserFromList(db.user, users)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
914 if user is not None: return user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
915
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
916 # try to match the username to the address (for local
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
917 # submissions where the address is empty)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
918 user = extractUserFromList(db.user, db.user.stringFind(username=address))
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
919
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
920 # couldn't match address or username, so create a new user
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
921 if create:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
922 return db.user.create(username=address, address=address,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
923 realname=realname, roles=db.config.NEW_EMAIL_USER_ROLES)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
924 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
925 return 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
926
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
927 def parseContent(content, keep_citations, keep_body,
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
928 blank_line=re.compile(r'[\r\n]+\s*[\r\n]+'),
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
929 eol=re.compile(r'[\r\n]+'),
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
930 signature=re.compile(r'^[>|\s]*[-_]+\s*$'),
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
931 original_msg=re.compile(r'^[>|\s]*-----\s?Original Message\s?-----$')):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
932 ''' The message body is divided into sections by blank lines.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
933 Sections where the second and all subsequent lines begin with a ">"
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
934 or "|" character are considered "quoting sections". The first line of
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
935 the first non-quoting section becomes the summary of the message.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
936
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
937 If keep_citations is true, then we keep the "quoting sections" in the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
938 content.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
939 If keep_body is true, we even keep the signature sections.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940 '''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
941 # strip off leading carriage-returns / newlines
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
942 i = 0
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
943 for i in range(len(content)):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
944 if content[i] not in '\r\n':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
945 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
946 if i > 0:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
947 sections = blank_line.split(content[i:])
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
948 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
949 sections = blank_line.split(content)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
950
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
951 # extract out the summary from the message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
952 summary = ''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
953 l = []
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
954 for section in sections:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
955 #section = section.strip()
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
956 if not section:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
957 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
958 lines = eol.split(section)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
959 if (lines[0] and lines[0][0] in '>|') or (len(lines) > 1 and
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
960 lines[1] and lines[1][0] in '>|'):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
961 # see if there's a response somewhere inside this section (ie.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
962 # no blank line between quoted message and response)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
963 for line in lines[1:]:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
964 if line and line[0] not in '>|':
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
965 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
966 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
967 # we keep quoted bits if specified in the config
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
968 if keep_citations:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
969 l.append(section)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
970 continue
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
971 # keep this section - it has reponse stuff in it
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
972 lines = lines[lines.index(line):]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
973 section = '\n'.join(lines)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
974 # and while we're at it, use the first non-quoted bit as
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
975 # our summary
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
976 summary = section
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
977
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
978 if not summary:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
979 # if we don't have our summary yet use the first line of this
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
980 # section
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
981 summary = section
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
982 elif signature.match(lines[0]) and 2 <= len(lines) <= 10:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
983 # lose any signature
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
984 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
985 elif original_msg.match(lines[0]):
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
986 # ditch the stupid Outlook quoting of the entire original message
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
987 break
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
988
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
989 # and add the section to the output
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
990 l.append(section)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
991
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
992 # figure the summary - find the first sentence-ending punctuation or the
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
993 # first whole line, whichever is longest
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
994 sentence = re.search(r'^([^!?\.]+[!?\.])', summary)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
995 if sentence:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
996 sentence = sentence.group(1)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
997 else:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
998 sentence = ''
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
999 first = eol.split(summary)[0]
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1000 summary = max(sentence, first)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1001
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1002 # Now reconstitute the message content minus the bits we don't care
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1003 # about.
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1004 if not keep_body:
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1005 content = '\n\n'.join(l)
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1006
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1007 return summary, content
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1008
83f33642d220 [[Metadata associated with this commit was garbled during conversion from CVS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1009 # vim: set filetype=python ts=4 sw=4 et si

Roundup Issue Tracker: http://roundup-tracker.org/