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