mailman/mailman.patch

Fri, 16 Jan 2009 10:58:21 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2009 10:58:21 +0100
changeset 92
645923d1e875
child 371
3d7d8c68b2fc
permissions
-rw-r--r--

Correct and improve code logic, buildconf, and packaging. In particular:
1. Use descriptive variable names <var>libs instead of just <var>.
2. Although Nokia states in all Qt builds that 'NOTE: When linking
against OpenSSL, you can override the default library names
through OPENSSL_LIBS.' and even gives an example, their own
configuration logic rejects such an attempt. Correct this by
hard coding the OpenSSL library string in the configure script.
3. Consistently use the whitespace substitution [\t ] throughout.
4. Patch the buggy INCPATH of SQL plugin Qmake project files.
5. Add the 'x11' configuration variable to the qtconfig Qmake
project using the src/gui/gui.pro file as a model. This is
needed for qtconfig although not in other tools, because
the qtconfig buildconf indirectly includes qt_x11_p.h which
is dependent on X11 headers.
6. Avoid 'ld.so: fatal: hardware capability unsupported: SSE2 AMD_3DNow'
on platforms for which the config.tests/unix/[3dnow|sse2] succeed
although unsopported at run time by testing for the x86-64
instruction set at build time and regulating hardware capabilities.
7. Correctly install the desinger plugin by explicitly building it.
8. Remove custom plugin installation logic which is unnecessary.
9. Correct removal of temporary paths from shared object files.

     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
    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'
    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]
   113  def statgidmode(path):
   114 -    stat = os.stat(path)
   115 +    stat = os.lstat(path)
   116      return stat[ST_MODE], stat[ST_GID]
   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).
   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  """
   163  import sys
   164 @@ -94,6 +97,7 @@
   165  import getpass
   166  import getopt
   167  import sha
   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 @@ -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'))
   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

mercurial