Sat, 24 Mar 2012 21:40:49 +0100
Introduce many changes to the buildconf and source code including:
(01) clean up, update, and partially update default config files,
(02) seems that Melware is unable to perform release engineering so
update chan_capi to new daily snapshot to solve echo problems,
(03) correct Asterisk inadequate hard coded gmime version check,
(04) force postgresql pthreads linkage to solve build problem,
(05) remove buggy hard coded LibXML configure definitions,
(06) remove local architecture specification to allow GCC
internal logic to determine proper CPU type instead,
(07) remove vendor sound install target causing uncontrolled
downloads and non RPM managed file installation,
(08) solve long outstanding bug in tcptls causing Asterisk
to ignore any intermediate CA certificate signatures,
(09) back out Digium engineering team's bright idea of replacing the
very portable and pervasive POSIX rand(1) with ast_random(), and
then not even implementing it causing all references to fail in
platforms not providing the very new POSIX.1-2008 mkdtemp(3)
function only distributed by BSD and some Linux,
(10) withdraw advanced linker symbol manipulations from SVR5 builds
until either Binutils supports hybrid versioned and anonymous
linker scripts or GCC stops hard coding versioned linker scripts,
(11) correct missing library linkage, some tailored to a specific OS,
(12) remove outdated logic for the no longer distributed gmime-config(1),
(13) remove local gmime buildconf hacks now that Asterisk has corrected
their own build configuration to almost portably support gmime,
(14) solve build problems relating to undetected LibXML paths,
(15) correct erroneous out of tree include definitions,
(16) improve some variable and comment naming,
(17) simplify sound language path hierarchy creation,
and correct australian english installation logic.
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 @@ -368,6 +368,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/Queue/OutgoingRunner.py
86 --- Mailman/Queue/OutgoingRunner.py.orig 2009-02-23 22:23:35 +0100
87 +++ Mailman/Queue/OutgoingRunner.py 2009-03-27 11:55:18 +0100
88 @@ -89,6 +89,7 @@
89 syslog('error', 'Cannot connect to SMTP server %s on port %s',
90 mm_cfg.SMTPHOST, port)
91 self.__logged = True
92 + self._snooze(0)
93 return True
94 except Errors.SomeRecipientsFailed, e:
95 # Handle local rejects of probe messages differently.
96 Index: Mailman/htmlformat.py
97 --- Mailman/htmlformat.py.orig 2009-02-23 22:23:35 +0100
98 +++ Mailman/htmlformat.py 2009-03-27 11:55:18 +0100
99 @@ -300,7 +300,8 @@
100 charset = 'us-ascii'
101 if self.language:
102 charset = Utils.GetCharSet(self.language)
103 - output = ['Content-Type: text/html; charset=%s\n' % charset]
104 + output = ['Content-Type: text/html; charset=%s' % charset]
105 + output.append('Cache-control: no-cache\n')
106 if not self.suppress_head:
107 kws.setdefault('bgcolor', self.bgcolor)
108 tab = ' ' * indent
109 Index: bin/check_perms
110 --- bin/check_perms.orig 2009-02-23 22:23:35 +0100
111 +++ bin/check_perms 2009-03-27 11:55:18 +0100
112 @@ -82,7 +82,7 @@
113 return os.stat(path)[ST_MODE]
115 def statgidmode(path):
116 - stat = os.stat(path)
117 + stat = os.lstat(path)
118 return stat[ST_MODE], stat[ST_GID]
120 seen = {}
121 Index: bin/config_list
122 --- bin/config_list.orig 2009-02-23 22:23:35 +0100
123 +++ bin/config_list 2009-03-27 11:55:18 +0100
124 @@ -307,6 +307,11 @@
125 in mm_cfg.OPTINFO.items()
126 if validval & bitval]
127 gui._setValue(mlist, k, validval, fakedoc)
128 + # Ugly hack, but seems to be needed since
129 + # new_member_options isn't really a number in gui.
130 + # -- tfheen, 2003-12-06
131 + if k == "new_member_options":
132 + mlist.new_member_options = validval
133 # BAW: when to do gui._postValidate()???
134 finally:
135 if savelist and not checkonly:
136 Index: bin/mailmanctl
137 --- bin/mailmanctl.orig 2009-02-23 22:23:35 +0100
138 +++ bin/mailmanctl 2009-03-27 11:55:18 +0100
139 @@ -424,6 +424,12 @@
140 os.dup2(devnull, 1)
141 os.dup2(devnull, 2)
143 + # Be sure to close any open std{in,out,err}
144 + devnull = os.open('/dev/null', 0)
145 + os.dup2(devnull, 0)
146 + os.dup2(devnull, 1)
147 + os.dup2(devnull, 2)
148 +
149 # Instead of cd'ing to root, cd to the Mailman installation home
150 os.chdir(mm_cfg.PREFIX)
151 # Set our file mode creation umask
152 Index: bin/newlist
153 --- bin/newlist.orig 2009-02-23 22:23:35 +0100
154 +++ bin/newlist 2009-03-27 11:58:07 +0100
155 @@ -88,12 +88,16 @@
156 defined in your Defaults.py file or overridden by settings in mm_cfg.py).
158 Note that listnames are forced to lowercase.
159 +
160 +The list admin address need to be a fully-qualified address, like
161 +owner@example.com, not just owner.
162 """
164 import sys
165 import os
166 import getpass
167 import getopt
168 +import grp
170 import paths
171 from Mailman import mm_cfg
172 @@ -122,6 +126,9 @@
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 @@ -204,7 +211,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'))
191 Index: bin/update
192 --- bin/update.orig 2009-02-23 22:23:35 +0100
193 +++ bin/update 2009-03-27 11:55:18 +0100
194 @@ -554,9 +554,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 @@ -568,6 +570,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 @@ -601,8 +604,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 2009-02-23 22:23:35 +0100
231 +++ scripts/driver 2009-03-27 11:55:18 +0100
232 @@ -98,6 +98,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