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