|
1 Index: Mailman/Archiver/pipermail.py |
|
2 --- Mailman/Archiver/pipermail.py.orig 2008-06-30 18:29:46 +0200 |
|
3 +++ Mailman/Archiver/pipermail.py 2008-07-01 20:48:10 +0200 |
|
4 @@ -122,9 +122,9 @@ |
|
5 parentID = article.parentID |
|
6 if parentID is not None and self.articleIndex.has_key(parentID): |
|
7 parent = self.getArticle(archive, parentID) |
|
8 - myThreadKey = parent.threadKey + article.date + '-' |
|
9 + myThreadKey = parent.threadKey + article.date + '/' + article.msgid + '-' |
|
10 else: |
|
11 - myThreadKey = article.date + '-' |
|
12 + myThreadKey = article.date + '/' + article.msgid + '-' |
|
13 article.threadKey = myThreadKey |
|
14 key = myThreadKey, article.msgid |
|
15 self.setThreadKey(archive, key, article.msgid) |
|
16 @@ -418,7 +418,7 @@ |
|
17 else: |
|
18 parent = self.database.getArticle(self.archive, |
|
19 article.parentID) |
|
20 - article.threadKey = parent.threadKey+article.date+'-' |
|
21 + article.threadKey = parent.threadKey + article.date + '/' + article.msgid + '-' |
|
22 self.database.setThreadKey(self.archive, |
|
23 (article.threadKey, article.msgid), |
|
24 msgid) |
|
25 @@ -632,9 +632,9 @@ |
|
26 article.parentID = parentID = self.get_parent_info(arch, article) |
|
27 if parentID: |
|
28 parent = self.database.getArticle(arch, parentID) |
|
29 - article.threadKey = parent.threadKey + article.date + '-' |
|
30 + article.threadKey = parent.threadKey + article.date + '/' + article.msgid + '-' |
|
31 else: |
|
32 - article.threadKey = article.date + '-' |
|
33 + article.threadKey = article.date + '/' + article.msgid + '-' |
|
34 key = article.threadKey, article.msgid |
|
35 |
|
36 self.database.setThreadKey(arch, key, article.msgid) |
|
37 Index: Mailman/Commands/cmd_subscribe.py |
|
38 --- Mailman/Commands/cmd_subscribe.py.orig 2008-06-30 18:29:46 +0200 |
|
39 +++ Mailman/Commands/cmd_subscribe.py 2008-07-01 20:48:10 +0200 |
|
40 @@ -84,6 +84,7 @@ |
|
41 if password is None: |
|
42 password = Utils.MakeRandomPassword() |
|
43 if address is None: |
|
44 + h = None |
|
45 realname, address = parseaddr(res.msg['from']) |
|
46 if not address: |
|
47 # Fall back to the sender address |
|
48 Index: Mailman/HTMLFormatter.py |
|
49 --- Mailman/HTMLFormatter.py.orig 2008-06-30 18:29:46 +0200 |
|
50 +++ Mailman/HTMLFormatter.py 2008-07-01 20:48:10 +0200 |
|
51 @@ -44,7 +44,7 @@ |
|
52 realname = self.real_name |
|
53 hostname = self.host_name |
|
54 listinfo_link = Link(self.GetScriptURL('listinfo'), realname).Format() |
|
55 - owner_link = Link('mailto:' + self.GetOwnerEmail(), ownertext).Format() |
|
56 + owner_link = Link('mailto:' + self.GetOwnerEmail(), realname + '-owner').Format() |
|
57 innertext = _('%(listinfo_link)s list run by %(owner_link)s') |
|
58 return Container( |
|
59 '<hr>', |
|
60 Index: Mailman/Handlers/Decorate.py |
|
61 --- Mailman/Handlers/Decorate.py.orig 2008-06-30 18:29:46 +0200 |
|
62 +++ Mailman/Handlers/Decorate.py 2008-07-01 20:48:10 +0200 |
|
63 @@ -197,6 +197,7 @@ |
|
64 del msg['content-transfer-encoding'] |
|
65 del msg['content-disposition'] |
|
66 msg['Content-Type'] = 'multipart/mixed' |
|
67 + msg['Mime-version'] = '1.0' |
|
68 |
|
69 |
|
70 |
|
71 Index: Mailman/Handlers/Scrubber.py |
|
72 --- Mailman/Handlers/Scrubber.py.orig 2008-06-30 18:29:46 +0200 |
|
73 +++ Mailman/Handlers/Scrubber.py 2008-07-01 20:48:10 +0200 |
|
74 @@ -385,6 +385,8 @@ |
|
75 t = unicode(t, 'ascii', 'replace') |
|
76 try: |
|
77 # Should use HTML-Escape, or try generalizing to UTF-8 |
|
78 + if len(charset) == 0: |
|
79 + charset = 'us-ascii' |
|
80 t = t.encode(charset, 'replace') |
|
81 except (UnicodeError, LookupError, ValueError, |
|
82 AssertionError): |
|
83 Index: Mailman/Queue/OutgoingRunner.py |
|
84 --- Mailman/Queue/OutgoingRunner.py.orig 2008-06-30 18:29:46 +0200 |
|
85 +++ Mailman/Queue/OutgoingRunner.py 2008-07-01 20:48:10 +0200 |
|
86 @@ -89,6 +89,7 @@ |
|
87 syslog('error', 'Cannot connect to SMTP server %s on port %s', |
|
88 mm_cfg.SMTPHOST, port) |
|
89 self.__logged = True |
|
90 + self._snooze(0) |
|
91 return True |
|
92 except Errors.SomeRecipientsFailed, e: |
|
93 # Handle local rejects of probe messages differently. |
|
94 Index: Mailman/htmlformat.py |
|
95 --- Mailman/htmlformat.py.orig 2008-06-30 18:29:46 +0200 |
|
96 +++ Mailman/htmlformat.py 2008-07-01 20:48:10 +0200 |
|
97 @@ -300,7 +300,8 @@ |
|
98 charset = 'us-ascii' |
|
99 if self.language: |
|
100 charset = Utils.GetCharSet(self.language) |
|
101 - output = ['Content-Type: text/html; charset=%s\n' % charset] |
|
102 + output = ['Content-Type: text/html; charset=%s' % charset] |
|
103 + output.append('Cache-control: no-cache\n') |
|
104 if not self.suppress_head: |
|
105 kws.setdefault('bgcolor', self.bgcolor) |
|
106 tab = ' ' * indent |
|
107 Index: bin/check_perms |
|
108 --- bin/check_perms.orig 2008-06-30 18:29:46 +0200 |
|
109 +++ bin/check_perms 2008-07-01 20:48:10 +0200 |
|
110 @@ -82,7 +82,7 @@ |
|
111 return os.stat(path)[ST_MODE] |
|
112 |
|
113 def statgidmode(path): |
|
114 - stat = os.stat(path) |
|
115 + stat = os.lstat(path) |
|
116 return stat[ST_MODE], stat[ST_GID] |
|
117 |
|
118 seen = {} |
|
119 Index: bin/config_list |
|
120 --- bin/config_list.orig 2008-06-30 18:29:46 +0200 |
|
121 +++ bin/config_list 2008-07-01 20:48:10 +0200 |
|
122 @@ -307,6 +307,11 @@ |
|
123 in mm_cfg.OPTINFO.items() |
|
124 if validval & bitval] |
|
125 gui._setValue(mlist, k, validval, fakedoc) |
|
126 + # Ugly hack, but seems to be needed since |
|
127 + # new_member_options isn't really a number in gui. |
|
128 + # -- tfheen, 2003-12-06 |
|
129 + if k == "new_member_options": |
|
130 + mlist.new_member_options = validval |
|
131 # BAW: when to do gui._postValidate()??? |
|
132 finally: |
|
133 if savelist and not checkonly: |
|
134 Index: bin/mailmanctl |
|
135 --- bin/mailmanctl.orig 2008-06-30 18:29:46 +0200 |
|
136 +++ bin/mailmanctl 2008-07-01 20:48:10 +0200 |
|
137 @@ -417,6 +417,13 @@ |
|
138 # won't be opening any terminal devices, don't do the ultra-paranoid |
|
139 # suggestion of doing a second fork after the setsid() call. |
|
140 os.setsid() |
|
141 + |
|
142 + # Be sure to close any open std{in,out,err} |
|
143 + devnull = os.open('/dev/null', 0) |
|
144 + os.dup2(devnull, 0) |
|
145 + os.dup2(devnull, 1) |
|
146 + os.dup2(devnull, 2) |
|
147 + |
|
148 # Instead of cd'ing to root, cd to the Mailman installation home |
|
149 os.chdir(mm_cfg.PREFIX) |
|
150 # Set our file mode creation umask |
|
151 Index: bin/newlist |
|
152 --- bin/newlist.orig 2008-06-30 18:29:46 +0200 |
|
153 +++ bin/newlist 2008-07-01 20:48:10 +0200 |
|
154 @@ -87,6 +87,9 @@ |
|
155 defined in your Defaults.py file or overridden by settings in mm_cfg.py). |
|
156 |
|
157 Note that listnames are forced to lowercase. |
|
158 + |
|
159 +The list admin address need to be a fully-qualified address, like |
|
160 +owner@example.com, not just owner. |
|
161 """ |
|
162 |
|
163 import sys |
|
164 @@ -94,6 +97,7 @@ |
|
165 import getpass |
|
166 import getopt |
|
167 import sha |
|
168 +import grp |
|
169 |
|
170 import paths |
|
171 from Mailman import mm_cfg |
|
172 @@ -122,6 +126,9 @@ |
|
173 |
|
174 |
|
175 def main(): |
|
176 + gid = grp.getgrnam(mm_cfg.MAILMAN_GROUP)[2] |
|
177 + if os.getgid() != mm_cfg.MAILMAN_GROUP: |
|
178 + os.setgid(gid) |
|
179 try: |
|
180 opts, args = getopt.getopt(sys.argv[1:], 'hql:u:e:', |
|
181 ['help', 'quiet', 'language=', |
|
182 @@ -203,7 +210,7 @@ |
|
183 except Errors.BadListNameError, s: |
|
184 usage(1, _('Illegal list name: %(s)s')) |
|
185 except Errors.EmailAddressError, s: |
|
186 - usage(1, _('Bad owner email address: %(s)s')) |
|
187 + usage(1, _('Bad owner email address: %(s)s. Owner addresses need to be fully-qualified names, like "owner@example.com", not just "owner".')) |
|
188 except Errors.MMListAlreadyExistsError: |
|
189 usage(1, _('List already exists: %(listname)s')) |
|
190 |
|
191 Index: bin/update |
|
192 --- bin/update.orig 2008-06-30 18:29:46 +0200 |
|
193 +++ bin/update 2008-07-01 20:48:10 +0200 |
|
194 @@ -552,9 +552,11 @@ |
|
195 file20 = os.path.join(mm_cfg.DATA_DIR, 'pending_subscriptions.db') |
|
196 file214 = os.path.join(mm_cfg.DATA_DIR, 'pending.pck') |
|
197 db = None |
|
198 + ver = None |
|
199 # Try to load the Mailman 2.0 file |
|
200 try: |
|
201 fp = open(file20) |
|
202 + ver = "20" |
|
203 except IOError, e: |
|
204 if e.errno <> errno.ENOENT: raise |
|
205 else: |
|
206 @@ -566,6 +568,7 @@ |
|
207 # Try to load the Mailman 2.1.x where x < 5, file |
|
208 try: |
|
209 fp = open(file214) |
|
210 + ver = "214" |
|
211 except IOError, e: |
|
212 if e.errno <> errno.ENOENT: raise |
|
213 else: |
|
214 @@ -599,8 +602,12 @@ |
|
215 # data[0] is the address being unsubscribed |
|
216 addrops_by_address.setdefault(data[0], []).append((key, val)) |
|
217 elif op == Pending.SUBSCRIPTION: |
|
218 - # data[0] is a UserDesc object |
|
219 - addr = data[0].address |
|
220 + if ver == "20": |
|
221 + # data is tuple (emailaddr, password, digest) |
|
222 + addr = data[0] |
|
223 + else: |
|
224 + # data[0] is a UserDesc object |
|
225 + addr = data[0].address |
|
226 subs_by_address.setdefault(addr, []).append((key, val)) |
|
227 elif op == Pending.RE_ENABLE: |
|
228 # data[0] is the mailing list's internal name |
|
229 Index: scripts/driver |
|
230 --- scripts/driver.orig 2008-06-30 18:29:46 +0200 |
|
231 +++ scripts/driver 2008-07-01 20:48:10 +0200 |
|
232 @@ -95,6 +95,15 @@ |
|
233 module = getattr(pkg, scriptname) |
|
234 main = getattr(module, 'main') |
|
235 try: |
|
236 + import os |
|
237 + request_method = os.environ.get('REQUEST_METHOD') |
|
238 + if not request_method in ['GET', 'POST', 'HEAD']: |
|
239 + print "Status: 405 Method not allowed" |
|
240 + print "Content-type: text/plain" |
|
241 + print |
|
242 + print "The method is not allowed" |
|
243 + sys.exit() |
|
244 + |
|
245 try: |
|
246 sys.stderr = logger |
|
247 sys.stdout = tempstdout |