From jafo-mailman-developers@tummy.com Fri Sep 1 07:28:10 2000 From: jafo-mailman-developers@tummy.com (Sean Reifschneider) Date: Fri, 1 Sep 2000 00:28:10 -0600 Subject: [Mailman-Developers] Mailman and virtual domains Message-ID: <20000901002810.O24800@tummy.com> Greetings. Now that I've got a spare box I can install the new mailman on, without having to worry about freaking out something that relies on the heavily hacked older copy of Mailman, i've finally started mucking around with it again. Looks good, though I do see that my QMail auto-detect patch didn't go in (for changing the format of the "aliases" list in newlist). ;-) So, I've been thinking some, and since the box that this is running on is going to be dealing with a bunch of virtual domains, the thinking has been about virtual domains. It would be nice if one could have lists with the same name in two different domains, handled by one instance of mailman. Perhaps instead of passing the wrapper "name" you'd pass it "name@domain"? Then instead of having "lists/name" the directory structure would be "lists/domain/name". Perhaps there would be a "lists/Default" that would hold all mailing lists that had no domain when passed to the wrapper (for backwards compatibility)? The only other thing I can think that it would have to hit is the archive code -- same sort of thing "archives/public/domain/name". Are there any other better approaches that could possibly be taken? Maybe now would be the time to split it up some more so that you'd have something like "lists/domain/first two letters of name/name" for anyone who wants to run more than a thousand lists per box? Sean -- Give me immortality or give me death! Sean Reifschneider, Inimitably Superfluous tummy.com - Linux Consulting since 1995. Qmail, KRUD, Firewalls, Python From jafo@tummy.com Fri Sep 1 08:58:29 2000 From: jafo@tummy.com (Sean Reifschneider) Date: Fri, 1 Sep 2000 01:58:29 -0600 Subject: [Mailman-Developers] Automatic list alises for QMail Message-ID: <20000901015829.U24800@tummy.com> --NDin8bjvE/0mNLFQ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline I'd like comments on the following program. The idea is that for QMail, new lists will automaticly be detected and there will be no need to do anything beyond "newlist". Goodbye having to translate the sendmail alias entries into .qmail files. Goodbye having to much with aliases ever again (as far as the list is concerned). Comments? Sean -- I like to be different, so I built a lowercase a-frame house. -- Sean Reifschneider, 2000 Sean Reifschneider, Inimitably Superfluous tummy.com - Linux Consulting since 1995. Qmail, KRUD, Firewalls, Python --NDin8bjvE/0mNLFQ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=mmvirtdlv #!/usr/bin/env python # # mmvirtdlv -- MailMan Virtual Deliver # # Sean Reifschneider, tummy.com, ltd. # Copyright, tummy.com, ltd. All Rights Reserved # # The current version of this program is for QMail only. # # The idea behind mmvirtdel is to allow automatic detection of new # mailman mailing lists. It uses the "EXT" environment variables # as provided by QMail to determine the name of the list and the # function (request, owner, post). If it can't determine the name # of the list or there is an invalid function specified, the message # is run through "forwardCmd" (default, forward to mailman-owner). # # Setup: # Change "mailmanHome" to the home directory for mailman. # ("lists/" and "mail/wrapper" must exist under that directory) # Go to the mailman home directory and create ".qmail-default" containing: # |/path/to/mmvirtdel # Make sure that mail for "list" is now sent to "mailman-domain.com-list": # Add "lists.domain.com:mailman-lists.domain.com" to # "/var/qmail/control/virtualdomains" # Set up the appropriate alias files which forward the mail to # "mailman-domain.com-list" (though that's what we're trying to get # away from) mailmanHome = '/home/mailman' forwardCmd = '/var/qmail/forward mailman-owner' destList = { 'owner' : 'mailowner %s', 'request' : 'mailcmd %s', 'admin' : 'mailowner %s', 'list' : 'post %s' } import os import string ############## def getExts(): '''Return a list of the extensions. Doing a string.join(list, '-') should result in the full extension of the local address.''' def addExt(l, e): s = os.environ.get(e, None) if s: rstrip = string.join(l, '-') if len(s) >= len(rstrip) and s[-len(rstrip):] == rstrip: s = s[:-(len(rstrip) + 1)] l.insert(0, s) l = [] addExt(l, 'EXT4') addExt(l, 'EXT3') addExt(l, 'EXT2') addExt(l, 'EXT') return(l) ################################ # determine destination of list extList = getExts() destName = extList[1] destCmd = None # if len(extList) == 2: destType = destList.get('list', None) # if len(extList) == 3: destType = destList.get(extList[2], None) # if unknown destination, send to mailman-owner if not destType: destCmd = forwardCmd # check for list existance if not destCmd: destDir = os.path.join(mailmanHome, 'lists', destName) if not os.path.exists(destDir): destCmd = forwardCmd # otherwise, create "forward to list" command if not destCmd: destCmd = os.path.join(mailmanHome, 'mail', 'wrapper') destCmd = destCmd + ' ' + (destType % destName) ret = os.system(destCmd) os.exit(ret) --NDin8bjvE/0mNLFQ-- From chuqui@plaidworks.com Fri Sep 1 14:59:52 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Fri, 1 Sep 2000 06:59:52 -0700 Subject: [Mailman-Developers] Fwd: Cron /usr/bin/python -S /home/mailman/cron/mailpasswds Message-ID: Ran into this with the password-sending stuff. As far as I can tell, I ran out of file descriptors on a system wide basis as it dealt with the deluge of returning bounces and vacation bots (it's Labor day! everyone's gone!) -- but Mailman needs to deal with this error gracefully, not bomb. Recommendation: if you run out trying to send a password reminder, go to sleep for a period of time to let the system settle. If you get this trying to suck in returned mail, send a DEFERRED error back to the MTA and try it again later. Also, Barry, you probably ought to double-check that you aren't leaking file descriptors in your password processing. I didn't see this in beta 4 on the same system, so it might be a new bug in b5. I'm looking to increase my file table limit, but that is working around the system, not the problem. --- begin forwarded text Date: Fri, 1 Sep 2000 05:31:14 -0700 From: root (Cron Daemon) To: mailman Subject: Cron /usr/bin/python -S /home/mailman/cron/mailpasswds X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Traceback (innermost last): File "/home/mailman/cron/mailpasswds", line 153, in ? File "/home/mailman/cron/mailpasswds", line 148, in main File "/home/mailman/cron/mailpasswds", line 84, in mail_passwords File "/home/mailman/Mailman/Handlers/HandlerAPI.py", line 181, in DeliverToUser File "/home/mailman/Mailman/Handlers/HandlerAPI.py", line 152, in DeliverToList File "/home/mailman/Mailman/Message.py", line 176, in Enqueue File "/home/mailman/Mailman/Utils.py", line 578, in open_ex IOError: [Errno 23] Too many open files in system: '/home/mailman/qfiles/2927df48866c7f7e7fb0221ea2168296955d66b8.db' --- end forwarded text -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From chuqui@plaidworks.com Fri Sep 1 20:06:02 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Fri, 1 Sep 2000 12:06:02 -0700 Subject: [Mailman-Developers] "too many files" problem. Message-ID: I've done more investigating, and I've been able to prove that it was a system table filling up, so it's definitely *not* a bug in mailman... -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From isheen@cosapisoft.com.pe Fri Sep 1 21:48:27 2000 From: isheen@cosapisoft.com.pe (Irma Sheen) Date: Fri, 1 Sep 2000 15:48:27 -0500 Subject: [Mailman-Developers] unsusbcribe Message-ID: <274A377A02C6D211BD1D00600892CCCA3C9D8D@INTI> From chuqui@plaidworks.com Mon Sep 4 18:03:59 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Mon, 4 Sep 2000 10:03:59 -0700 Subject: [Mailman-Developers] A couple of mailman problems (minor) Message-ID: A couple of things I've noticed about mailman recently: 1) remove_members doesn't have an option to unsubscribe a user without sending the "goodbye" message. it's not something I need often, but there are times when it's necessary. 2) more serious -- I've been running into some problems with passwords, and I've finally tracked down a major cause of user confusion with passwords. Mailman passwords use random strings of characters, but some of the characters can be confused with each other by users -- specifically the one (1), the upper case I and lower case l, and zero (0) and upper case o. In the cases I've been able to resolve, the password problems that weren't caused by not realizing each list's password is different were caused by the l/1/I problem. so I'd like to suggest that mailman not use potentially confusing letters in their passwords. -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From John_Larson@cargill.com Tue Sep 5 16:12:13 2000 From: John_Larson@cargill.com (John_Larson@cargill.com) Date: Tue, 5 Sep 2000 10:12:13 -0500 Subject: [Mailman-Developers] Low priority suggestion: addressing Message-ID: Handle "/" in usernames on mail addresses. HP Openmail uses a last_first/mnode@mnode.domain format for it's email addreses when referencing them from SMTP. The CGI uses the / as a delimiter for tokens so it thinks that the address is "last_first" instead of "last_first/mnode@mnode.domain". Emailing to lists and subscribing to addresses with this format DOES WORK. It's only the admin CGI that is broken because of the parsing. I did a quick hack to handle_opts.py and options.py that basically "looked" for more than the ones expected for the CGI and then appended the second parameter to the first, concatenating a "/" inbetween. This is nasy and site specific so I won't publish the code here. (or explain it really well :) What really should be done is to escape the / in the form or something like that. If I had more python and CGI background I would have submitted a patch but... Thanks! -John Larson / john_larson@cargill.com From ckolar@admin.aurora.edu Tue Sep 5 17:17:51 2000 From: ckolar@admin.aurora.edu (Christopher Kolar) Date: Tue, 05 Sep 2000 11:17:51 -0500 Subject: [Mailman-Developers] preview: v2 admin docs Message-ID: <4.3.2.7.2.20000905111226.02796da8@admin.aurora.edu> I have updated the Mailman administration documents in preparation for the upcoming v2.0 release. Right now the pages are not being promoted for public consumption and I will not link them in until the official release. I would appreciate it if members of the development team could take a look and let me know if there are any glaring errors. The new admin docs, based on beta 5, are at: http://www.aurora.edu/~ckolar/mailman/mailman-administration-v2.html I have also put together a short document showing the changes that have occurred since v1.1 as that is something that I am sure a lot of people will be asking about. The diffs document is at: http://www.aurora.edu/~ckolar/mailman/mailman-administration-v2-diffs.html Thanks in advance for any comments. --chris -- /////\\\\\/////\\\\\ Christopher G. Kolar Director, Department of Instructional Technology Aurora University, Aurora, Illinois ckolar@admin.aurora.edu -- www.aurora.edu/~ckolar [PGP Public Key ID: 0xC6492C72] From sgibson@digitalimpact.com Wed Sep 6 19:58:50 2000 From: sgibson@digitalimpact.com (Shane Y. Gibson) Date: Wed, 06 Sep 2000 11:58:50 -0700 Subject: [Mailman-Developers] Feature idea for Mailman 2.x Message-ID: <39B693EA.798371E0@digitalimpact.com> Hello, I use a small install of Mailman to manager our companies internal mailing lists. It works pretty well. However, I have an idea that may of interest. I've recently had lots of users ask what mailing lists they are members of (yeah, I know, but they **are** users!). I know this can be done with command line tools, but what about a *-request option? I.e. TO: genericlist-request@foobar.com Subject: show-lists Or something to that effect. v/r Shane -- Shane Y. Gibson sgibson@digitalimpact.com Sr. Network Engineer (650) 356-3432 work IT Data Center Operations (650) 444-8992 cellular Digital Impact, Inc. (888) 786-4863 pager "The Science of eMarketing!" (650) 356-3515 fax "The world is, for the most part, a collective mad- house, and practically everyone, however `normal' his facade, is faking sanity." -- John Astin From dgc@uchicago.edu Fri Sep 8 05:22:00 2000 From: dgc@uchicago.edu (David Champion) Date: Thu, 7 Sep 2000 23:22:00 -0500 Subject: [Mailman-Developers] patches Message-ID: <20000907232200.I17203@smack.uchicago.edu> --XMCwj5IQnwKtuyBG Content-Type: text/plain; charset=us-ascii Content-Disposition: inline I've been posting a big pile of patches on the Sourceforge repository. I think they're mostly stable now. They're largely cosmetic, so in case anyone wants to look at the results, please check out http://listtest.uchicago.edu/ The "dgctest1" list's archives are public, and completely uninteresting. I'm using the built-in pipermail for now. I'll probably change that in a few weeks to MHonArc. But first, I'll post more patches to drive the pipermail HTML into compliance with the rest of the pages, just to be thorough about it. All the customization on the site is done it mm_cfg.py or in the templates files. I've attached my mm_cfg.py so you can see the config parameters I've altered. With the default mm_cfg.py and templates, the whole thing looks identical to the current default mailman installation. In particular, one of my patches converts all the hard-coded HTML in listinfo.py and admin.py into templates. The "tone" of the document on this server is governed in mm_cfg, but the textual content, the "shortcuts" box, etc are in the template. These are configuration options I learned to want with our 1.0 installation. OK, just wanted this to be out there so people can see what I'm hoping for -- maybe it'll be helpful in deciding whether to incorporate the patches. Any thoughts? I probably should not go into production with this if there's strong sentiment against it. -- -D. dgc@uchicago.edu NSIT University of Chicago --XMCwj5IQnwKtuyBG Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mm_cfg.py" # -*- python -*- # Copyright (C) 1998,1999,2000 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """This module contains your site-specific settings. From a brand new distribution it should be copied to mm_cfg.py. If you already have an mm_cfg.py, be careful to add in only the new settings you want. Mailman's installation procedure will never overwrite your mm_cfg.py file. The complete set of distributed defaults, with documentation, are in the file Defaults.py. In mm_cfg.py, override only those you want to change, after the from Defaults import * line (see below). Note that these are just default settings; many can be overridden via the administrator and user interfaces on a per-list or per-user basis. """ ############################################### # Here's where we get the distributed defaults. from Defaults import * ################################################## # Put YOUR site-specific settings below this line. # dgc - Everything below here is in disagreement with stock defaults # Site-specific settings DEFAULT_HOST_NAME = 'listtest.uchicago.edu' DEFAULT_URL = 'https://listtest.uchicago.edu/mailman/' MAILMAN_OWNER = 'mailman-owner@%s' % DEFAULT_HOST_NAME # Default NNTP server for news gateways DEFAULT_NNTP_HOST = 'uchinews.uchicago.edu' # Archive defaults DEFAULT_ARCHIVE_PRIVATE = 1 # 0=public, 1=private # How many members to display at a time on the admin cgi to unsubscribe them # or change their options? DEFAULT_ADMIN_MEMBER_CHUNKSIZE = 40 # Should a list, by default be advertised? What is the default maximum number # of explicit recipients allowed? What is the default maximum message size # allowed? DEFAULT_LIST_ADVERTISED = 0 # This variable controlls whether monthly password reminders are sent. DEFAULT_SEND_REMINDERS = 0 # Default to MIME digests, if digests are used DEFAULT_MIME_IS_DEFAULT_DIGEST = 1 # Added message-id: DEFAULT_PLAIN_DIGEST_KEEP_HEADERS = ['message', 'date', 'from', 'subject', 'to', 'cc', 'reply-to', 'organization', 'message-id'] # How long should subscriptions requests await confirmation before being # dropped? PENDING_REQUEST_LIFE = days(7) # How long should messages which have delivery failures continue to be # retried? After this period of time, a message that has failed recipients # will be dequeued and those recipients will never receive the message. DELIVERY_RETRY_PERIOD = days(5) #BACKGD_COLOR = "#FFFFFF" # Page background #MAJOR_COLOR = "#99CCFF" # Major section headers #MINOR_COLOR = "#FFF0D0" # Minor section headers #UINFO_COLOR = "#DDDDDD" # User name and password changes #ADMPW_COLOR = "#99CCCC" # List admin password changes #FIELD_COLOR = "#CCCCCC" # List admin field descriptions #OPTION_COLOR = "#DCDCDC" # User option field descriptions #TEXT_COLOR = "#000000" # Primary text color #ERROR_COLOR = "#FF66CC" # Error text color #LINK_COLOR = "" # If nonnull, forces LINK= in Document() #ALINK_COLOR = "" # If nonnull, forces ALINK= in Document() #VLINK_COLOR = "" # If nonnull, forces VLINK= in Document() MAJOR_COLOR = "#FFFFFF" # Major section headers MINOR_COLOR = "#EEEEE3" # Minor section headers LINK_COLOR = "#0000FF" # If nonnull, forces LINK= in Document() ALINK_COLOR = "#FF0000" # If nonnull, forces ALINK= in Document() VLINK_COLOR = "#660000" # If nonnull, forces VLINK= in Document() HIGHLIGHT = "#EEEEEE" ## Wrap all documents up in this container. GLOBAL_HEADER = '''  
  ''' ## Close the container. ## (Which container do you mean, the small container or the blue container?) GLOBAL_FOOTER = '''
University of Chicago
''' ## Don't show that ugly GNU picture. IMAGE_LOGOS = "" ## Ignore virtual hosting, because we're transitionary. VIRTUAL_HOST_OVERVIEW = 0 --XMCwj5IQnwKtuyBG-- From chuqui@plaidworks.com Fri Sep 8 05:27:56 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 7 Sep 2000 21:27:56 -0700 Subject: [Mailman-Developers] patches In-Reply-To: <20000907232200.I17203@smack.uchicago.edu> References: <20000907232200.I17203@smack.uchicago.edu> Message-ID: At 11:22 PM -0500 9/7/00, David Champion wrote: >In particular, one of my patches converts all the hard-coded HTML in >listinfo.py and admin.py into templates. neat! Today, out of need, I was hacking in standard header/footer entries across mailman. it's (mostly) working, but not ready to submit to sourceforge yet. but this stuff really needs some cleanup. I have some ideas, but no time to implement them yet.. -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From dgc@uchicago.edu Fri Sep 8 05:36:42 2000 From: dgc@uchicago.edu (David Champion) Date: Thu, 7 Sep 2000 23:36:42 -0500 Subject: [Mailman-Developers] Re: patches In-Reply-To: ; from chuqui@plaidworks.com on Thu, Sep 07, 2000 at 09:27:56PM -0700 References: <20000907232200.I17203@smack.uchicago.edu> Message-ID: <20000907233642.K17203@smack.uchicago.edu> On 2000.09.07, in , "Chuq Von Rospach" wrote: > > Today, out of need, I was hacking in standard header/footer entries > across mailman. it's (mostly) working, but not ready to submit to > sourceforge yet. but this stuff really needs some cleanup. I have > some ideas, but no time to implement them yet.. Yeah, what you see on my server has that, too. Want to look at patch 101383? Maybe there's some useful integration to be done. http://sourceforge.net/patch/?func=detailpatch&patch_id=101383&group_id=103 -- -D. dgc@uchicago.edu NSIT University of Chicago From chuqui@plaidworks.com Fri Sep 8 05:41:17 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 7 Sep 2000 21:41:17 -0700 Subject: [Mailman-Developers] Re: patches In-Reply-To: <20000907233642.K17203@smack.uchicago.edu> References: <20000907232200.I17203@smack.uchicago.edu> <20000907233642.K17203@smack.uchicago.edu> Message-ID: At 11:36 PM -0500 9/7/00, David Champion wrote: >Yeah, what you see on my server has that, too. Want to look at patch >101383? Maybe there's some useful integration to be done. > > http://sourceforge.net/patch/?func=detailpatch&patch_id=101383&group_id=103 > Nice. Cleaner than my hack. I think I'll go back-patch this into my hack tomorrow. one quick thought: if GLOBAL_HEADER and GLOBAL_FOOTER are paths to files, include the content of the files.... I may try that tomorrow. -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From dgc@uchicago.edu Fri Sep 8 05:49:19 2000 From: dgc@uchicago.edu (David Champion) Date: Thu, 7 Sep 2000 23:49:19 -0500 Subject: [Mailman-Developers] Re: patches In-Reply-To: ; from chuqui@plaidworks.com on Thu, Sep 07, 2000 at 09:41:17PM -0700 References: <20000907232200.I17203@smack.uchicago.edu> <20000907233642.K17203@smack.uchicago.edu> Message-ID: <20000907234919.L17203@smack.uchicago.edu> On 2000.09.07, in , "Chuq Von Rospach" wrote: > > one quick thought: if GLOBAL_HEADER and GLOBAL_FOOTER are paths to > files, include the content of the files.... > > I may try that tomorrow. That's a good idea. Currently I'm concatenating it with other variables, like the color values that I created in another patch, or the value of MAILMAN_OWNER, etc. It should be done with Utils.maketext(), I guess. But offhand, I don't know whether the values in mm_cfg are automatically part of any available dictionary. If so, that's quite convenient. I'll be very interested in anything you come up with. -- -D. dgc@uchicago.edu NSIT University of Chicago From chuqui@plaidworks.com Fri Sep 8 05:57:41 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 7 Sep 2000 21:57:41 -0700 Subject: [Mailman-Developers] Re: patches In-Reply-To: <20000907234919.L17203@smack.uchicago.edu> References: <20000907232200.I17203@smack.uchicago.edu> <20000907233642.K17203@smack.uchicago.edu> <20000907234919.L17203@smack.uchicago.edu> Message-ID: At 11:49 PM -0500 9/7/00, David Champion wrote: >I'll be very interested in anything you come up with. Basically, I plan on splitting content out from mailman completely on a functional basis, and derive it through an API. The API is basically defined as "GetThing(thing, list, language)", which returns a hunk 'o text. Now, "thing" is any hunk of text, for instance, "unsubscribe_message" or "listinfo_page". A certain set of these would have to be defined as standard entry points, and can include other things. embedded things are expanded within GetThing, so the mailman program doesn't even need to think about it. Now, behind the scenes, it can get funky, since many of these things are configurable on a list-specific or global basis, some are meta-things based on system config or state, etc. But conceptually, I want to pull out all of the messaging content from the rest of mailman, because it makes it (a) infinitely easier to administer, change and user, (b) cuts the complexity of the code completely, (c) makes stuffing it in a database for management trivial (and database independent, in theory), and (d) you basically get multi-language support for free (well, in theory) because you can define parallel sets of content in each language, and let the end-user define which their preferred language is. It needs some fleshing out, but that's the 10,000 foot level. it'd need an administrative interface in the API, and databasing in the back-end, and administrative controls such that the site admin can lock down some values so that a list-administrator can't change them, something not currently possible with Mailman. -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From claw@nuron.com Fri Sep 8 18:20:16 2000 From: claw@nuron.com (J C Lawrence) Date: Fri, 08 Sep 2000 10:20:16 -0700 Subject: [Mailman-Developers] patches In-Reply-To: Message from David Champion of "Thu, 07 Sep 2000 23:22:00 CDT." <20000907232200.I17203@smack.uchicago.edu> References: <20000907232200.I17203@smack.uchicago.edu> Message-ID: <1750.968433616@nuron.com> ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <1727.968433595.1@nuron.com> On Thu, 7 Sep 2000 23:22:00 -0500 David Champion wrote: > I've been posting a big pile of patches on the Sourceforge > repository. I think they're mostly stable now. They're largely > cosmetic, so in case anyone wants to look at the results, please > check out A very small detail in your documentation: Don't camelcase "Mailman" as "MailMan" (I used to too). MailMan is a different commercial product. Mailman is the list server we all know and love. You might also want to touch up the table handling at: https://listtest.uchicago.edu/mailman/listinfo It displays badly when the browser window is narrow (as mine is). I've attached a JPEG to show. Very nice job BTW. -- J C Lawrence Home: claw@kanga.nu ---------(*) Work: claw@nuron.com http://www.kanga.nu/~claw/ Keys etc: finger claw@kanga.nu --=| A man is as sane as he is dangerous to his environment |=-- ------- =_aaaaaaaaaa0 Content-Type: image/jpeg Content-ID: <1727.968433595.2@nuron.com> Content-Description: netscape.jpg Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQAAAQABAAD//gBaCgpDUkVBVE9SOiBYViBWZXJzaW9uIDMuMTBhICBSZXY6 IDEyLzI5Lzk0IChQTkcgcGF0Y2ggMS4yKSAgUXVhbGl0eSA9IDc1LCBTbW9vdGhpbmcgPSAwCv/b AEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQf Jzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAV0CJwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA AAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG BwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS 8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri 4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APf6KKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiuIHjl4b/xhZ3dlaQP4fSFkkk1BUjuTKjNGpd1URE4ReSQC3U4ydm08 U6ZJb6Wt9qOnWWoajbwzR2TX0bsxkHAQg/vBuyAy8NjigDeoriJvin4Rj0fV9VTVI5LbS7j7O/ll WaeQrlREucsGO4BuAdjnO0bq6SXXNHh+w+bqllH/AGhj7FuuEH2nOMeXz8+dy9M/eHrQBp0VkT+J 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 YEA/NiDwj4W8T6VceAI73w7dxpoT3y3cv2m2ZcXBO1lxLkhc5bjPHANe2UUAeHnwf4i1D/Q7vwvO La48af23Mbie2eMWjcMrqJSS2CcqAQR3NVL3TtX8L+JhqJ0rUW1NfEWpX9iltaC9WaznjCPIY45F bKsIR8zJjzR97BA97qhqWk6drNutvqdha3sCuHWO5hWVQ2CMgMCM4JGfc0Acp8NTZ2Hw8h0/T7bV Wk03zIpra9txb3JmP70rsYhV3eYCvzYAZctnJrE8GW/i/wAOeCNA8Or4buobuC8QXl21zamKO3a5 MkhUCRmYlDtxtB5JByBn0qwsLTTLKOzsbSC1to87IYIxGi5JJwo4GSSfxq3QB4NN4R8Vkale2vh3 VbLWF1q91bS7+G7tT5Xm+WBFIhmwyuFYN1xhcBwzCuk1fwt4iTxJa30Wiade2k/hhtIvbW2n8mKN lPmNGgJUhH/1SEH5N25hhcN6rRQBwPw20PXNCg1C11ONxYxPHDpj3nlNeC3UMRHK0TMpRC5Cc55f hQVA76iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArzbQ/+RT0v/tr/AOjD XpNebaH/AMinpf8A21/9GGgCTSP+R2b/ALBx/wDRgoo0j/kdm/7Bx/8ARgooA9FooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigArzbQ/+RT0v/tr/wCjDXpNebaH/wAinpf/AG1/9GGgCTSP+R2b/sHH/wBGCijSP+R2 b/sHH/0YKKAPRaKKKACiiigAooooAKKKKAPH7+8/six1fRr7WNVWS01iG5im+13ayNZMBM/7zeSy rDHdJgHkw5xvIzrJrcllf+JvExmvri1iuotLs7QNceW0gKRu4QlgczPsJjjJAiO0MWO7pToVkfEy eIAri/WzayJDfK0RcOMj1BBwRj7xznjFKHwbpdt4Mj8LwG6jsYlHlyxzlZkkD+YJQ46OH+fpjPbH FZ3AzYtbvNWv/Dl3LBfafKNUmtZYS88cUyG0lkyFkWMuuVTlkGGVgOOTYsvGOpTaLJr17orW2ifY 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 AJCb/wDXE/zFFAH/2Q== ------- =_aaaaaaaaaa0-- From tneff@bigfoot.com Fri Sep 8 18:27:43 2000 From: tneff@bigfoot.com (Tom Neff) Date: Fri, 8 Sep 2000 13:27:43 -0400 Subject: [Mailman-Developers] Re: attached files In-Reply-To: <20000908172204.35E991CF7F@dinsdale.python.org> Message-ID: Scanning the yards of WaeQrlREucsGO4BuAdjnO0bq6SXXNHh+w+bqllH/AGhj7F... in my latest mailman-developers DIGEST (thanks J C) reminded me of something I really wish Mailman would add: the ability to detach binary attachments, STORE them on the site server, and insert URL's into the plain text of the original messages/Digests, so that interested readers (and ONLY interested readers) could pull them up on demand, rather than be forced to take them in the Inbox unconditionally and even then maybe not see them properly. From dgc@uchicago.edu Fri Sep 8 21:09:39 2000 From: dgc@uchicago.edu (David Champion) Date: Fri, 8 Sep 2000 15:09:39 -0500 Subject: [Mailman-Developers] Re: patches In-Reply-To: <1750.968433616@nuron.com>; from claw@nuron.com on Fri, Sep 08, 2000 at 10:20:16AM -0700 References: <20000907232200.I17203@smack.uchicago.edu> <1750.968433616@nuron.com> Message-ID: <20000908150939.W17203@smack.uchicago.edu> On 2000.09.08, in <1750.968433616@nuron.com>, "J C Lawrence" wrote: > > A very small detail in your documentation: Don't camelcase "Mailman" > as "MailMan" (I used to too). MailMan is a different commercial I think you must be talking about the link to Chris Kolar's stuff at Aurora. I mention this because Chris might want to check on it.... "Camelcase" -- I like that. > product. Mailman is the list server we all know and love. You > might also want to touch up the table handling at: > > https://listtest.uchicago.edu/mailman/listinfo > > It displays badly when the browser window is narrow (as mine is). > I've attached a JPEG to show. Yeah, I've noticed that, although I haven't tried it with as small a window as yours. Frankly, I can't figure out how to make that "shortcuts" box as dimunitive as possible without wrecking alignment within the table. I'd be most pleased to fix it if I can figure anything out, though. > Very nice job BTW. Thanks! -- -D. dgc@uchicago.edu NSIT University of Chicago From tkikuchi@is.kochi-u.ac.jp Mon Sep 11 12:29:34 2000 From: tkikuchi@is.kochi-u.ac.jp (Tokio Kikuchi) Date: Mon, 11 Sep 2000 20:29:34 +0900 Subject: [Mailman-Developers] pipermail -- time zone in date info Message-ID: <39BCC21E.14D9816D@is.kochi-u.ac.jp> Hi, I was a little bit uneasy on that pipermail's index pages show `Starting:', `Ending:', and `Last message date:' information in GMT time zone, while `Archived on:' in the Local Time. I was able to make a dirty hack to set the time zone value in mm_cfg.py but feel like not to publish it because the server (platform/OS) should have the time zone info in itself. Can someone make a better patch for it and upload ? Thanks in advance. Tokio Kikuchi From tkikuchi@is.kochi-u.ac.jp Tue Sep 12 02:37:10 2000 From: tkikuchi@is.kochi-u.ac.jp (Tokio Kikuchi) Date: Tue, 12 Sep 2000 10:37:10 +0900 Subject: [Mailman-Developers] pipermail -- time zone in date info References: <39BCC21E.14D9816D@is.kochi-u.ac.jp> Message-ID: <39BD88C6.4F74DDCD@is.kochi-u.ac.jp> Hi, again. Well, I think I learned a little bit more from python library documentation. Following patch makes the dates in archive index pages in Local Time, instead of mix of GMT/Local. (in Mailman/Archive directory) mailman@ice% diff -u HyperDatabase.py.old HyperDatabase.py --- HyperDatabase.py.old Fri Jun 23 13:30:10 2000 +++ HyperDatabase.py Tue Sep 12 10:28:11 2000 @@ -199,7 +199,7 @@ date='None' try: date, msgid = self.dateIndex.first() - date=time.asctime(time.localtime(string.atof(date))) + date=time.asctime(time.localtime(string.atof(date)-time.timezone)) except KeyError: pass return date @@ -209,7 +209,7 @@ date='None' try: date, msgid = self.dateIndex.last() - date=time.asctime(time.localtime(string.atof(date))) + date=time.asctime(time.localtime(string.atof(date)-time.timezone)) except KeyError: pass return date Tokio Kikuchi wrote: > > Hi, > > I was a little bit uneasy on that pipermail's index pages > show `Starting:', `Ending:', and `Last message date:' > information in GMT time zone, while `Archived on:' in > the Local Time. I was able to make a dirty hack to set > the time zone value in mm_cfg.py but feel like not to > publish it because the server (platform/OS) should have > the time zone info in itself. Can someone make a better > patch for it and upload ? > From jdub@aphid.net Tue Sep 12 15:09:59 2000 From: jdub@aphid.net (Jeff Waugh) Date: Wed, 13 Sep 2000 01:09:59 +1100 Subject: [Mailman-Developers] Itchy, and thus subscribing Message-ID: <20000913010959.A14713@aphid.net> Hi all, I'm just kicking in with Python, having had an insane Python devotee whispering it in my ear for the past six months, so I've been looking for code to peruse, and hopefully contribute to. Given that I use mailman on a daily basis (actively and passively), and I have a couple of itches, I thought I should join up, and read up. One thing I'd like to do, that doesn't seem to appear on the TODO list, is provide an extra option for moderators: bouncing to another address. Dealing with a few lists, I find that some useful emails are sent to inappropriate addresses, and it would be cool to just bounce 'em out instead of cutting them off. Anyhow, I have to go read the code before I get all ambitious, don't I? Of course, I ought to thank you all for a kickarse piece of software too. :) - Jeff -- jdub@aphid.net ----------------------------------- http://slug.org.au/ -- Ye shall be cursed to fall in love so easily, and yet be so cold of heart as never to express it. From bwarsaw@beopen.com Tue Sep 12 15:49:56 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Tue, 12 Sep 2000 10:49:56 -0400 (EDT) Subject: [Mailman-Developers] Itchy, and thus subscribing References: <20000913010959.A14713@aphid.net> Message-ID: <14782.17044.337048.929318@anthem.concentric.net> >>>>> "JW" == Jeff Waugh writes: JW> One thing I'd like to do, that doesn't seem to appear on the JW> TODO list, is provide an extra option for moderators: bouncing JW> to another address. Dealing with a few lists, I find that some JW> useful emails are sent to inappropriate addresses, and it JW> would be cool to just bounce 'em out instead of cutting them JW> off. It's not on the TODO list, because it's already in the codebase. :) Moderators can optionally forward a held message to any address they want. Welcome aboard though, there's plenty of other itches that need scratching. -Barry From jdub@aphid.net Tue Sep 12 15:52:20 2000 From: jdub@aphid.net (Jeff Waugh) Date: Wed, 13 Sep 2000 01:52:20 +1100 Subject: [Mailman-Developers] Itchy, and thus subscribing In-Reply-To: <14782.17044.337048.929318@anthem.concentric.net>; from bwarsaw@beopen.com on Tue, Sep 12, 2000 at 10:49:56AM -0400 References: <20000913010959.A14713@aphid.net> <14782.17044.337048.929318@anthem.concentric.net> Message-ID: <20000913015220.E14713@aphid.net> > Barry A. Warsaw wrote: > > It's not on the TODO list, because it's already in the codebase. :) > Moderators can optionally forward a held message to any address they > want. *blush* Tell me that's in the 2.0 releases and not 1.1... please! :) > Welcome aboard though, there's plenty of other itches that need > scratching. Danke! Am I better off perusing the SourceForge CVS code, or the current beta5 release? - Jeff -- jdub@aphid.net ----------------------------------- http://slug.org.au/ -- Ye shall be cursed to fall in love so easily, and yet be so cold of heart as never to express it. From bwarsaw@beopen.com Tue Sep 12 16:03:40 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Tue, 12 Sep 2000 11:03:40 -0400 (EDT) Subject: [Mailman-Developers] Itchy, and thus subscribing References: <20000913010959.A14713@aphid.net> <14782.17044.337048.929318@anthem.concentric.net> <20000913015220.E14713@aphid.net> Message-ID: <14782.17868.907073.26528@anthem.concentric.net> >>>>> "JW" == Jeff Waugh writes: >> Barry A. Warsaw wrote: It's not on the TODO list, because it's >> already in the codebase. :) Moderators can optionally forward a >> held message to any address they want. JW> *blush* JW> Tell me that's in the 2.0 releases and not 1.1... please! :) Yup 2.0! I don't ever remember what was(n't) in 1.1 anymore :) >> Welcome aboard though, there's plenty of other itches that need >> scratching. JW> Danke! JW> Am I better off perusing the SourceForge CVS code, or the JW> current beta5 release? They're pretty close. I think beta5 is quite stable and useful. The current CVS snapshot has a few more bug fixes, but mostly minor I believe. I've sucked all the old Jitterbug bugs into SF and am in the process of doing triage on them. After that, I'll make a swing through the patches page and as much of the mailing list traffic as possible. -Barry From chuqui@plaidworks.com Tue Sep 12 16:26:42 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Tue, 12 Sep 2000 08:26:42 -0700 Subject: [Mailman-Developers] Itchy, and thus subscribing In-Reply-To: <14782.17868.907073.26528@anthem.concentric.net> References: <20000913010959.A14713@aphid.net> <14782.17044.337048.929318@anthem.concentric.net> <20000913015220.E14713@aphid.net> <14782.17868.907073.26528@anthem.concentric.net> Message-ID: At 11:03 AM -0400 9/12/00, Barry A. Warsaw wrote: >They're pretty close. I think beta5 is quite stable and useful. It is. > The >current CVS snapshot has a few more bug fixes, but mostly minor I >believe. They are -- unless you run OpenBSD. There's one key fix for that platform. If you're starting, start from the CVS. But at the very least, get up to speed on b5 before worrying about reporting bugs or writing code, because it's a whole new universe. chuq -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From bwarsaw@beopen.com Thu Sep 14 05:57:06 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 14 Sep 2000 00:57:06 -0400 (EDT) Subject: [Mailman-Developers] Re: Error in scripts/driver? References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> Message-ID: <14784.23202.487093.880960@anthem.concentric.net> >>>>> "DC" == David Champion writes: | Looks like line 121 of scripts/driver needs to say | from Mailman.Version import VERSION | instead of | from Mailman.mm_cfg import VERSION DC> I know enough python to club myself in the head, but I think I DC> hit this one because I had a bug (since resolved) in DC> Defaults.py.[1] If Defaults.py or mm_cfg.py have a traceback DC> error, this looks like it will come up. By importing VERSION DC> explicitly as below, you at least can get the trace DC> informationon the _original_ problem. If it's inherited from DC> Defaults.py, then you still get this problem. DC> [1] If you're curious, I modify Defaults.py to have a separate DC> data area from the mailman installation directory. Please note that you should never edit Defaults.py. Put all your site configurations in mm_cfg.py, which will override the settings in Defaults.py. -Barry From dgc@uchicago.edu Thu Sep 14 07:33:05 2000 From: dgc@uchicago.edu (David Champion) Date: Thu, 14 Sep 2000 01:33:05 -0500 Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? In-Reply-To: <14784.23202.487093.880960@anthem.concentric.net>; from bwarsaw@beopen.com on Thu, Sep 14, 2000 at 12:57:06AM -0400 References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> Message-ID: <20000914013305.B21972@smack.uchicago.edu> On 2000.09.13, in <14784.23202.487093.880960@anthem.concentric.net>, "Barry A. Warsaw" wrote: > > >>>>> "DC" == David Champion writes: > > | Looks like line 121 of scripts/driver needs to say > | from Mailman.Version import VERSION > | instead of > | from Mailman.mm_cfg import VERSION > > DC> I know enough python to club myself in the head, but I think I > DC> hit this one because I had a bug (since resolved) in > DC> Defaults.py.[1] If Defaults.py or mm_cfg.py have a traceback > DC> error, this looks like it will come up. By importing VERSION > DC> explicitly as below, you at least can get the trace > DC> informationon the _original_ problem. If it's inherited from > DC> Defaults.py, then you still get this problem. > > DC> [1] If you're curious, I modify Defaults.py to have a separate > DC> data area from the mailman installation directory. > > Please note that you should never edit Defaults.py. Put all your site > configurations in mm_cfg.py, which will override the settings in > Defaults.py. I disagree, but now's not the time to debate that. It's not the issue I was raising, anyway. You said in the patch followup that "the problem stemmed from an error introduced in Defaults.py by the user." Not exactly; changes to Defaults.py illuminated what seemed already to be a problem. The bug I created caused a traceback report, but that traceback itself was faulty. *That* is what this patch tried to fix. I don't know whether that makes any difference, though. -- -D. dgc@uchicago.edu NSIT University of Chicago From bwarsaw@beopen.com Thu Sep 14 07:48:00 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 14 Sep 2000 02:48:00 -0400 (EDT) Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> Message-ID: <14784.29856.537110.212157@anthem.concentric.net> >>>>> "DC" == David Champion writes: DC> I disagree, but now's not the time to debate that. It's not DC> the issue I was raising, anyway. You said in the patch DC> followup that "the problem stemmed from an error introduced in DC> Defaults.py by the user." Not exactly; changes to Defaults.py DC> illuminated what seemed already to be a problem. DC> The bug I created caused a traceback report, but that DC> traceback itself was faulty. *That* is what this patch tried DC> to fix. DC> I don't know whether that makes any difference, though. Sorry, my message didn't give enough detail. If you edit mm_cfg.py instead of Default.py, any errors will of course, still cause a traceback. But the proper traceback will show up in the web page as opposed to getting hidden by the missing import of VERSION. That makes it much easier for you to spot the problem and fix it. In that case, the patch isn't necessary. I still claim the site admin should never edit Defaults.py. Why do you disagree? Cheers, -Barry From dgc@uchicago.edu Thu Sep 14 08:04:36 2000 From: dgc@uchicago.edu (David Champion) Date: Thu, 14 Sep 2000 02:04:36 -0500 Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? In-Reply-To: <14784.29856.537110.212157@anthem.concentric.net>; from bwarsaw@beopen.com on Thu, Sep 14, 2000 at 02:48:00AM -0400 References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> <14784.29856.537110.212157@anthem.concentric.net> Message-ID: <20000914020436.D21972@smack.uchicago.edu> On 2000.09.14, in <14784.29856.537110.212157@anthem.concentric.net>, "Barry A. Warsaw" wrote: > > If you edit mm_cfg.py instead of Default.py, any errors will of > course, still cause a traceback. But the proper traceback will show > up in the web page as opposed to getting hidden by the missing import > of VERSION. That makes it much easier for you to spot the problem and > fix it. In that case, the patch isn't necessary. Right, my argument is that this is not so in the case that you *do* edit Defaults.py -- and it doesn't seem harmful if you don't. > I still claim the site admin should never edit Defaults.py. Why do > you disagree? I'm building packages for use with multiple [virtual] servers. I make most changes in mm_cfg.py, but a) some changes should affect all servers b) some changes are dependent on the software installation, not just on the site's list preferences c) some changes (the paths at the end) depend on other settings, and changing them in every mm_cfg.py file is *messy*. I think of Defaults.py as the set of defaults for this build of the software, not just a canonical reference of what's settable. I don't set site information there, but I do set build/installation information. Requiring this knowledge of someone installing a pre-packaged copy is unnecessary. So, the short answer is that I'm not doing it as the site admin, so we agree. :) -- -D. dgc@uchicago.edu NSIT University of Chicago From chuqui@plaidworks.com Thu Sep 14 07:55:26 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Wed, 13 Sep 2000 23:55:26 -0700 Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? In-Reply-To: <14784.29856.537110.212157@anthem.concentric.net> References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> <14784.29856.537110.212157@anthem.concentric.net> Message-ID: At 2:48 AM -0400 9/14/00, Barry A. Warsaw wrote: >I still claim the site admin should never edit Defaults.py. Why do >you disagree? Oh, heck, Barry, what do you know, anyway? It's not like you wrote this system or anything.. chuq (ducking and running) -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From chuqui@plaidworks.com Thu Sep 14 08:05:57 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 14 Sep 2000 00:05:57 -0700 Subject: [Mailman-Developers] some more futures on mailman... Message-ID: Just want to toss these into the archives for future consideration... I'm currently trying (desperately) to get a system into production that involves mailman. Or more correctly, a site with multiple virtual hosts. My medium-term plan is to run mailing lists across three domains (www.plaidworks.com, www.hockeyfanz.com, www.chuqui.com). And using mailman, I'm finding it's simply impossible to create a consistent look/feel on a single domain, because it doesn't (yet) easily let me do things like footers/headers (and yes, I know there's a patch pending for that) -- but when we start talking about running a single instance of mailman across multiple virtual hosts, this all dies a horrible death. The only real way t do this now is to run an instance of mailman for each virtual host. That's really, really gnarly from a maintenance standpoit, nt to mention just rife with the ability to get it wrong on deadline -- and even then, mailman isn't really cooperative about living within a site's look/feel yet.. So it's beginning to look like we need to find a way present a look/feel based on domain name, defining sets of headers/footers on a per domain basis, but there are also other pages that generally need tweaking (most especially, every domain probably needs to tweak /mailman/listinfo to some degree, even if it's changing the introductory text....) I don't have time to figure out how to fix this yet, but I wanted to throw it into the mix until I do. Right now, I'm dealing with it the way you normally do on deadline -- by punting and going production without an integrated look/feel (don't feel bad, I have the same problem with my discussion forums, albeit those don't cross domains so the solutions are in theory easier). This is all clearly post 2.0 stuff, but it needs to go On The List.... Hmm. If we take the pending patch for global headers/footers, add a tweak so we can define them by domain (header-hockeyfanz.com-html, et al), we might be able to fake this. But we still need to add another tweak to allow us to store that listinfo intro paragraph into a file, and do the same vhosting hack to it, too. Maybe it *can* be done, or at least hide enough of it. But I'll look at this further after I go live. Running out of time... chuq (here I go again...) -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From chuqui@plaidworks.com Thu Sep 14 08:10:23 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 14 Sep 2000 00:10:23 -0700 Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? In-Reply-To: <20000914020436.D21972@smack.uchicago.edu> References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> <14784.29856.537110.212157@anthem.concentric.net> <20000914020436.D21972@smack.uchicago.edu> Message-ID: At 2:04 AM -0500 9/14/00, David Champion wrote: >I think of Defaults.py as the set of defaults for this build of the >software, not just a canonical reference of what's settable. This is a flawed assumption, but given what you're doing and how mailman does things, probably a necessary one. In reality, what we're starting to talk about is building in multiple levels of configuration -- there's the release configuration, the site configuration, the vhost configuration, list configurations, and at some point, admin and user configurations driven out of the subscriber records. Oh, yeah. something else mailman needs, although not exactly difficult but not a high priority: a single list living on multiple domains. For instance, I currently have some lists living on plaidworks.com. They'll soon move to hockeyfanz.com. But -- there are existing pointers to the old place, and it'd be nice if I could have them visible in both places for at least some period of time during transitions. That seems to be fairly easy to add (I just don't have time to do it now... sigh) chuq -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From bwarsaw@beopen.com Thu Sep 14 19:48:32 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 14 Sep 2000 14:48:32 -0400 (EDT) Subject: [Mailman-Developers] some more futures on mailman... References: Message-ID: <14785.7552.807091.862918@anthem.concentric.net> Chuq, I agree that the virtual host support needs some major work, and I'd definitely like to see that addressed in a future version. I'm putting your message On The List. Thanks, -Barry From bwarsaw@beopen.com Thu Sep 14 19:50:32 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 14 Sep 2000 14:50:32 -0400 (EDT) Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> <14784.29856.537110.212157@anthem.concentric.net> <20000914020436.D21972@smack.uchicago.edu> Message-ID: <14785.7672.524634.739467@anthem.concentric.net> >>>>> "CVR" == Chuq Von Rospach writes: CVR> In reality, what we're starting to talk about is building in CVR> multiple levels of configuration -- there's the release CVR> configuration, the site configuration, the vhost CVR> configuration, list configurations, and at some point, admin CVR> and user configurations driven out of the subscriber records. Don't forget language/locale configurations! The Mailman I18N effort will be revived too, especially now that Python 2.0 should have the necessary primitive support for i18n. -Barry From chuqui@plaidworks.com Thu Sep 14 19:53:09 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Thu, 14 Sep 2000 11:53:09 -0700 Subject: [Mailman-Developers] Re: Re: Error in scripts/driver? In-Reply-To: <14785.7672.524634.739467@anthem.concentric.net> References: <200008290346.UAA14923@utopia.west.sun.com> <20000828225821.E4729@smack.uchicago.edu> <14784.23202.487093.880960@anthem.concentric.net> <20000914013305.B21972@smack.uchicago.edu> <14784.29856.537110.212157@anthem.concentric.net> <20000914020436.D21972@smack.uchicago.edu> <14785.7672.524634.739467@anthem.concentric.net> Message-ID: > CVR> In reality, what we're starting to talk about is building in > CVR> multiple levels of configuration -- there's the release > CVR> configuration, the site configuration, the vhost > CVR> configuration, list configurations, and at some point, admin > CVR> and user configurations driven out of the subscriber records. > >Don't forget language/locale configurations! The Mailman I18N effort >will be revived too, especially now that Python 2.0 should have the >necessary primitive support for i18n. yup. Which goes back to my idea of completely separating the content issues out of mailman and accessing it through it's own API, so you can say something like "get_message(UNSUB,LISTNAME, SPANISH) and whatever you get back is the the proper piece -- so that all this stuff can be added to mailman without mailman actually having to worry about it. (I've actually fleshed this out to some level of detail, I just haven't had time to write it down... And to add to the joy, I've just agreed to stand for vice president of the Science Fiction Writers of America, so I may have a new time sink pending sometime next year...) -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From jafo@tummy.com Thu Sep 14 20:00:55 2000 From: jafo@tummy.com (Sean Reifschneider) Date: Thu, 14 Sep 2000 13:00:55 -0600 Subject: [Mailman-Developers] some more futures on mailman... In-Reply-To: ; from chuqui@plaidworks.com on Thu, Sep 14, 2000 at 12:05:57AM -0700 References: Message-ID: <20000914130055.G9984@tummy.com> On Thu, Sep 14, 2000 at 12:05:57AM -0700, Chuq Von Rospach wrote: >So it's beginning to look like we need to find a way present a >look/feel based on domain name, defining sets of headers/footers on a >per domain basis, but there are also other pages that generally need I sent out a request for comments for doing virtual domains a couple of weeks ago. My main concern was allowing "list@domain.com" be a different list from "list@example.com". I hadn't considered making adjustments for list look and feel (part of the reason I asked for comments :-). I'm thinking it might be nice to have a sort of "search path" where mailman would look for certain files in say "/home/mailman/domain/templates" then go on to a system-wide location if they weren't found there. Sean -- If you talk to God, you are praying; if God talks to you, you have schizophrenia. -- Thomas Szasz Sean Reifschneider, Inimitably Superfluous tummy.com - Linux Consulting since 1995. Qmail, KRUD, Firewalls, Python From jafo@tummy.com Fri Sep 15 20:15:05 2000 From: jafo@tummy.com (Sean Reifschneider) Date: Fri, 15 Sep 2000 13:15:05 -0600 Subject: [Mailman-Developers] some more futures on mailman... In-Reply-To: ; from chuqui@plaidworks.com on Thu, Sep 14, 2000 at 12:13:02PM -0700 References: <20000914130055.G9984@tummy.com> Message-ID: <20000915131505.O6190@tummy.com> On Thu, Sep 14, 2000 at 12:13:02PM -0700, Chuq Von Rospach wrote: >Yah. That one gets really interesting, really fast. There are all >sorts of wrinkles here, because even with sendmail, you start having >to tweak all sorts of files and keep them in coordination, and that I think that's beyond the scope of Mailman... Besides, if your MTA doesn't do these things well, you haven't really lost anything, you're just back where you are now (except maybe you want to upgrade to a bit more modern of an MTA ;-). I'm sure that other MTAs handle it well, but I know that QMail does. Basicly, e-mail for "list@lists.domain.com" on my box gets forwarded the local user "mailman-lists.domain.com-list". I have a "default" processing program set up for the mailman user which strips out the domain name and destination, and sends it to the correct program with the correct arguments. At the moment it simply ignores the domain portion. >ignores the database backend details within mailman -- and how do you >resolve issues where the vhosting fails (for instance, not all web Again, I think that's beyond the scope of what we expect Mailman to handle. Garbage in, garbage out... If the web server doesn't pass the URL to the CGI, or uses an unknown domain, I'd expect mailman to treat it as if it does now -- listing all domains/lists for the admin page, and none on the listinfo page if the "show only this domain" option is set... >If you are on such a host, how do you get to the right pages if they >overload on top of each other in the namespace? ugh. Are you talking about if they're using name-based virtual hosting, or ??? If you are running Mailman under a broken web server, I wouldn't expect Mailman to do anything meaningful. ;-) Crippling people who ARE using functional web servers (I mean, Apache is well over half the "market", right?) just because somone might have a broken server doesn't help anyone... I don't see my changes as HINDERING people who use broken servers, they just couldn't do the extra domain-based functionality. They'd probably HAVE to set it so that all domains lists were shown on listinfo and the like. >At some point, you almost have ot start running multiple instances of Why? There's a difference between installing multiple binaries, and having a single set of binaries being able to access multiple sets of data. The latter is not evil. ;-) >mailman. You take the basic problem of trying to have >"chuqui@plaidworks.com" and "chuqui@chuqui.com" going to different >people on the same machine -- and throw gasoline on the problem. As I said, with QMail at least it's not really an issue. The mail goes to "mailman-plaidworks.com-chuqui" and "mailman-chuqui.com-chuqui", which my delivery program would then be able to handle to the list processing program with the arguments "plaidworks.com" and "chuqui". In sendmail you'd have to do more work to set up the individual accounts, but it shoudl be doable there as well: chuqui@plaidworks.com: |/home/mailman/bin/whatever chuqui plaidworks.com >Me -- I handle it by not allowing it. I *could* figure out a way, but >it just plain old isn't worth the hassle. Maybe not to you, but IMHO there is good reason to have it in Mailman. I don't run into it being a problem right now, but as I add more domains it's likely to be. As we're hosting the lists for free as a community service, nobody is likely to complain, but it's still worth doing IMHO. >What we're talking about (and need) instead is a hierarchic >inheritance system. you send off a request for "the unsubscribe >message", and mailman goes off and finds it. Starting at the most >specific place in the hierarchy and working down to distribution >definitions, it returns the first one it finds. Yeah, like a search path. ;-) Why are you mapping the concept "searching a list of locations" onto the OOP domain? >The hierarchy would look something like: >user->list->host->site->distribution. And the trick is to define each >object (like 'unsubscribe message') in terms of other objects, and >customize each object at whatever level in the hierarchy is >appropriate. That way, list-specific stuff lives iwth the list, not >the host. and the two can be changed independently, or list stuff can >override host stuff. How are you defining the objects based on other objects? Are you saying that the host "unsub message" would be a concatenation of the distribution and site messages? >defining what objects you need and what the hierarchy is, and also >who the owner is -- because there are going to objects that CAN'T be >overridden higher in the hierarchy, or that an site-owner will want >to tie down and not let a host owner or list owner override. Presumably, if you read a "list unsub message" it may search back up the heirarchy searching for that message, but if you write it it would write directly to the list context, not search upwards. Sean -- [...] who asked "Why do we do it, this science?" No one had an answer until I stood up and said "Isn't there money in a Nobel?" -- Steve Martin Sean Reifschneider, Inimitably Superfluous tummy.com - Linux Consulting since 1995. Qmail, KRUD, Firewalls, Python From chuqui@plaidworks.com Sat Sep 16 05:38:00 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Fri, 15 Sep 2000 21:38:00 -0700 Subject: [Mailman-Developers] some more futures on mailman... In-Reply-To: <20000915131505.O6190@tummy.com> References: <20000914130055.G9984@tummy.com> <20000915131505.O6190@tummy.com> Message-ID: At 1:15 PM -0600 9/15/00, Sean Reifschneider wrote: >On Thu, Sep 14, 2000 at 12:13:02PM -0700, Chuq Von Rospach wrote: >>Yah. That one gets really interesting, really fast. There are all >>sorts of wrinkles here, because even with sendmail, you start having >>to tweak all sorts of files and keep them in coordination, and that > >I think that's beyond the scope of Mailman... Right now, yes. Inherently, there's no reason why it can't be handled. > >If you are on such a host, how do you get to the right pages if they >>overload on top of each other in the namespace? ugh. > >Are you talking about if they're using name-based virtual hosting, or ??? >If you are running Mailman under a broken web server, I'm talking about using name-based vhosting, and clients that don't deal with the HOST: support cleanly, or which come in via IP addressing. >I wouldn't expect >Mailman to do anything meaningful. ;-) But it can, so why not? >Crippling people who ARE using >functional web servers problem is, I'm not talking about broken servers, but client-side issues that aren't under the control of the site admin, but which have to be dealt with. > >At some point, you almost have ot start running multiple instances of > >Why? There's a difference between installing multiple binaries, and >having a single set of binaries being able to access multiple sets of >data. The latter is not evil. ;-) That latter is not evil if you're running three or four or five sets of data. But, oh, 200? >Maybe not to you, but IMHO there is good reason to have it in Mailman. agreed. I just don't see it as a high priority. >Yeah, like a search path. ;-) Why are you mapping the concept >"searching a list of locations" onto the OOP domain? because it buys you a lot of stuff that goes with this. For instance, international support, since you can build languages and language preferences into the hierarchy. Also, administrative flexibility and authentication, since it gives you much ability to define which level of admin has permission to change what fields. Monolithic control isn't useful in larger sites, because the site admin ends up getting nibbled to death by the ducks. >How are you defining the objects based on other objects? Are you saying >that the host "unsub message" would be a concatenation of the >distribution and site messages? I'm saying you define a suite of objects, plus the ability to define custom objects if you want, and you resolve them through the hierarchy. So an unsub message would likely be defined as a header, some unsub text, and a footer. And the unsub text will be some ascii text with embedded objects that resolve to information, and those objects might refere to other objects, and... so when you end up, you have the full, customized text of the unsub message with the appropriate user information, but you do it by defining things and plugging them in through the hierarchy recursively. Very simple, very powerful. Exceptionalyl flexible. >Presumably, if you read a "list unsub message" it may search back up >the heirarchy searching for that message, but if you write it it would >write directly to the list context, not search upwards. Basically, yes. you ask for this "list unsub message" thing, and it goes and finds the definition of what that is, and recursively tracks down and fills in all of the embedded objects until none fo them are left -- whether those items are defined at the list level (like the list name), but user level (the user address) or the site level (the host name). Think of a big mail-merge system on steroids, and you get the basic drift. -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From ckolar@admin.aurora.edu Sun Sep 17 15:43:57 2000 From: ckolar@admin.aurora.edu (Christopher Kolar) Date: Sun, 17 Sep 2000 09:43:57 -0500 Subject: [Mailman-Developers] last min sugg: admin add user option Message-ID: <4.3.2.7.2.20000917094050.00b7fac0@kolar.aurora.il.us> Yes, I know this is late. I had some non-member postings this morning on one of my lists and it occurred to me that it would be nice if there were an additional action available: "approve and add user" -- though I have not figured out if it would be better to add the user as a subscriber or to add the user to the implicit approval list. Most of the lists that I run are in a university, where people are often posting from other than their "official" address that is part of a list. It would be helpful here anyway. Just a thought, --chris From tneff@bigfoot.com Sun Sep 17 17:22:11 2000 From: tneff@bigfoot.com (Tom Neff) Date: Sun, 17 Sep 2000 12:22:11 -0400 Subject: [Mailman-Developers] RE: approve and add user In-Reply-To: <20000917160143.079651CFBE@dinsdale.python.org> Message-ID: Christopher Kolar wrote: > Yes, I know this is late. I had some non-member postings this morning on > one of my lists and it occurred to me that it would be nice if there were > an additional action available: "approve and add user" -- though > I have not > figured out if it would be better to add the user as a subscriber > or to add > the user to the implicit approval list. It would be best to have the option of which kind of add to do when you do it. Actually I am not a fan of adding "users" for these aliases, nor of adding them to an independent "flat" approval list, because (a) all they are is aliases, which shouldn't be allocated the same resources as a real user, and (b) when the user really does disappear, the aliases ought to go with them. The best solution would be to associate an array of aliases and/or alias regexps WITH a real user. (a) The user could be given some friendly-formatted checkboxes and/or text fields on their profile to indicate other places or known addresses that they post from, but just as importantly, (b) when an admin sees a non-member message, she or he could [i] search for a matching user and [ii] opt to associate the new address with that user as an exact alias, or as a "smart" regexp. So let's say a non-member message arrives from tom_neff@mail3.grassyhill.org Mailman could, at the admin's request, do a "smart search" and pop up a selection list saying * ADD A MEMBER ALIAS * We found these possible member matches: ( ) tom_neff@dismal.com ( ) tneff@grassyhill.org ( ) edjones@grassyhill.org Select one or enter another member: ________________ This new alias for the selected member will be: ( ) An exact match: tom_neff@mail3.grassyhill.org ( ) A "smart host" match: tom_neff@(.+\.)?grassyhill.org Or enter your own match expression: ____________________ [ADD ALIAS] [RESET] [CANCEL] If you took this approach, managing peripatetic members and capricious institutional postmasters would be a snap. From aidan@kublai.com Mon Sep 18 01:42:42 2000 From: aidan@kublai.com (Aidan Cully) Date: Sun, 17 Sep 2000 20:42:42 -0400 Subject: [Mailman-Developers] multi-lingual mailing lists Message-ID: <20000917204242.A15089@ozymandias.kublai.com> Forgive me for taking a while to get to the point... I feel the need to give some background. For the impatient, scroll down to the block labeled 'THE POINT'. On the Gnome development list, there's been some discussion, lately, about allowing the non-English speaking world to communicate in their native tongues on the list. There's probably some English chauvinism in my attitude, but I don't like the idea of having people send messages in non-English languages to an English list... It seems to me that the project is global enough that if people start communicating in non-"standard" languages, without necessarily providing a mechanism for allowing people that don't speak the language to filter out those messages, the signal/noise can get pretty bad. At the same time, I agree with the need for people to be able to participate in a large community, without necessarily needing to speak English. By having one-language mailing lists, a large percentage of the community might be excluded from the discussion. Right now, almost all discussions take place in English, and if a French list were to fork off, I suspect that, even though a good chunk of Aussies, Brits, Americans, &c. probably speak French, they would still just subscribe to the English list, and the French list would be nigh useless. THE POINT: I think it would be a good idea for mailing-list software to manage multiple language support. The mechanism I'm imagining involves setting up a bunch of '-@.org' submission addresses for the same list. The list server would then use a per-user preference setting to decide which members of the list want to receive mail in the message's language. The message is then sent out using that , and the Reply-To: header is set to -@.org. Maybe also have an X-Language: header, automatically inserted by the list server. By default, subscribe people to all languages. Does this make sense? Or sound like a good idea? Please CC: me in all replies, as I'm not a subscriber. --aidan From Gerhard den Hollander Mon Sep 18 19:56:39 2000 From: Gerhard den Hollander (Gerhard den Hollander) Date: Mon, 18 Sep 2000 20:56:39 +0200 Subject: [Mailman-Developers] Re: [Mailman-Users] Re: Editing the posting In-Reply-To: ; from tneff@bigfoot.com on Mon, Sep 18, 2000 at 02:25:04PM -0400 References: <20000918160146.7AB871D059@dinsdale.python.org> Message-ID: <20000918205639.H4343@zeus.jason.nl> Apologies is this is a duplicate , I didn't receive a confirmation that this one made it to the list (and yes, I did turn the confirmation on ;) ) Situation: I maintain (with mailman) a number (20-ish going to be 100-ish) mailinglists for our internal users. When I create a new mailinglist I usually add a number of users This means that these users get yet another default mailman passwd. What I want is to synchronise all user:passwd combinations over all the lists. e.g. currently I have List 1 (user:passwd) A:asdf B:sdfg C:dfgh List 2 A:erty C:rtyu D:ytur List 3 A:lkjh D:moiu What I want is someway to get this to be List 1 (user:passwd) A:asdf B:sdfg C:dfgh List 2 A:asdf C:dfgh D:ytur List 3 A:asdf D:ytur Unfortunately I have 0 experience in programming python. I looked through the clone_member program in the bin directory and it looks like what I want is indeed possible provided I know enough python. If some kind soul could give me 2 scripts 1 : that lists (given a mailinglist) all users and passwords and 2 : that given a mailinglist, and a list of username/passwords sets the password for the listed user to be the one listed in that file. than I would already be fuly helped. Of course, ideally someone else has already bumped into this problem and solved it the python way, in which case I'd be very grateful for this program. Thanks in advance (and I guess this goes whitout saying on this list, but apart from the above, Im pretty impressed with mailman) Kind regards, -- Gerhard den Hollander Phone +31-10.280.1515 Technical Support Jason Geosystems BV Fax +31-10.280.1511 (When calling please note: we are in GMT+1) gdenhollander@jasongeo.com POBox 1573 visit us at http://www.jasongeo.com 3000 BN Rotterdam "TeamWare" for finding Oil & Gas...The Smart Way The Netherlands This e-mail and any attachment is/are intended solely for the named addressee(s) and may contain information that is confidential and privileged. If you are not the intended recipient, we request that you do not disseminate, forward, distribute or copy this e-mail message. If you have received this e-mail message in error, please notify us immediately by telephone and destroy the original message. From Gerhard den Hollander Tue Sep 19 07:48:55 2000 From: Gerhard den Hollander (Gerhard den Hollander) Date: Tue, 19 Sep 2000 08:48:55 +0200 Subject: [Mailman-Developers] Syncing passwords over mailinglists Message-ID: <20000919084855.B9189@zeus.jason.nl> > Apologies is this is a duplicate , > I didn't receive a confirmation that this one made it to the list > (and yes, I did turn the confirmation on ;) ) > Situation: > I maintain (with mailman) a number (20-ish going to be 100-ish) > mailinglists for our internal users. > When I create a new mailinglist I usually add a number of users > This means that these users get yet another default mailman passwd. > What I want is to synchronise all user:passwd combinations over all the > lists. > e.g. currently I have > List 1 (user:passwd) > A:asdf > B:sdfg > C:dfgh > List 2 > A:erty > C:rtyu > D:ytur > List 3 > A:lkjh > D:moiu > What I want is someway to get this to be > List 1 (user:passwd) > A:asdf > B:sdfg > C:dfgh > List 2 > A:asdf > C:dfgh > D:ytur > List 3 > A:asdf > D:ytur > > Unfortunately I have 0 experience in programming python. > I looked through the clone_member program in the bin directory and it > looks like what I want is indeed possible provided I know enough python. > If some kind soul could give me 2 scripts > 1 : that lists (given a mailinglist) all users and passwords > and > 2 : that given a mailinglist, and a list of username/passwords > sets the password for the listed user to be the one listed in that > file. > than I would already be fuly helped. > Of course, ideally someone else has already bumped into this problem and > solved it the python way, in which case I'd be very grateful for this > program. > Thanks in advance > (and I guess this goes whitout saying on this list, > but apart from the above, Im pretty impressed with mailman) Kind regards, -- Gerhard den Hollander Phone +31-10.280.1515 Technical Support Jason Geosystems BV Fax +31-10.280.1511 (When calling please note: we are in GMT+1) gdenhollander@jasongeo.com POBox 1573 visit us at http://www.jasongeo.com 3000 BN Rotterdam "TeamWare" for finding Oil & Gas...The Smart Way The Netherlands This e-mail and any attachment is/are intended solely for the named addressee(s) and may contain information that is confidential and privileged. If you are not the intended recipient, we request that you do not disseminate, forward, distribute or copy this e-mail message. If you have received this e-mail message in error, please notify us immediately by telephone and destroy the original message. From chuqui@plaidworks.com Wed Sep 20 18:08:01 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Wed, 20 Sep 2000 10:08:01 -0700 Subject: [Mailman-Developers] NULL characters in e-mail. Message-ID: Here's a fun one that I think Mailman ought to worry about. I've started getting reports of truncated digests coming out of my site. It always seemed to truncate after a specific user's posting in the digest. When I went looking, it turns out that user had a signature that happened to have a NULL (ascii 0) character at the end -- and that causes some mail clients (Netscape for one) to think it's hit EOF and it stops reading the message. This has a couple of implications for Mailman: it hoses digests, which is a big problem. And it would cause all mailman footers on individual messages to be missing. I'll bet (but haven't looked yet) that it casues problems in the archives, too. Because of this, I think Mailman needs to be sensitive to NULL characters and strip them from messages during processing. If they exist in a message, they need to be deleted. chuq -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From Dan Mick Thu Sep 21 00:43:38 2000 From: Dan Mick (Dan Mick) Date: Wed, 20 Sep 2000 16:43:38 -0700 (PDT) Subject: [Mailman-Developers] NULL characters in e-mail. Message-ID: <200009202342.QAA07530@utopia.west.sun.com> Just out of curiosity, why is this not the MTA's job? (actually I'm really surprised it made it through the MTA unscathed) I suppose maybe the RFC says something about it...hmm... > Here's a fun one that I think Mailman ought to worry about. > > I've started getting reports of truncated digests coming out of my > site. It always seemed to truncate after a specific user's posting in > the digest. > > When I went looking, it turns out that user had a signature that > happened to have a NULL (ascii 0) character at the end -- and that > causes some mail clients (Netscape for one) to think it's hit EOF and > it stops reading the message. > > This has a couple of implications for Mailman: it hoses digests, > which is a big problem. And it would cause all mailman footers on > individual messages to be missing. I'll bet (but haven't looked yet) > that it casues problems in the archives, too. > > Because of this, I think Mailman needs to be sensitive to NULL > characters and strip them from messages during processing. If they > exist in a message, they need to be deleted. > > chuq > -- > Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) > Apple Mail List Gnome (mailto:chuq@apple.com) > > And they sit at the bar and put bread in my jar > and say 'Man, what are you doing here?'" > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://www.python.org/mailman/listinfo/mailman-developers From chuqui@plaidworks.com Thu Sep 21 00:53:08 2000 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Wed, 20 Sep 2000 16:53:08 -0700 Subject: [Mailman-Developers] NULL characters in e-mail. In-Reply-To: <200009202342.QAA07530@utopia.west.sun.com> References: <200009202342.QAA07530@utopia.west.sun.com> Message-ID: At 4:43 PM -0700 9/20/00, Dan Mick wrote: >Just out of curiosity, why is this not the MTA's job? >(actually I'm really surprised it made it through the MTA unscathed) > >I suppose maybe the RFC says something about it...hmm... the MTA probably has to be transparent here. I can't think of anything in the RFCs that'd cover it, so I wouldn't depend on it. More importantly, since the MTAs clearly don't do anything about this, the MLM can't simply say "not my problem" and wait for all of the MTAs to get "fixed". -- Chuq Von Rospach - Plaidworks Consulting (mailto:chuqui@plaidworks.com) Apple Mail List Gnome (mailto:chuq@apple.com) And they sit at the bar and put bread in my jar and say 'Man, what are you doing here?'" From Dan Mick Thu Sep 21 01:01:59 2000 From: Dan Mick (Dan Mick) Date: Wed, 20 Sep 2000 17:01:59 -0700 (PDT) Subject: [Mailman-Developers] NULL characters in e-mail. Message-ID: <200009210000.RAA08471@utopia.west.sun.com> > At 4:43 PM -0700 9/20/00, Dan Mick wrote: > >Just out of curiosity, why is this not the MTA's job? > >(actually I'm really surprised it made it through the MTA unscathed) > > > >I suppose maybe the RFC says something about it...hmm... > > the MTA probably has to be transparent here. I can't think of > anything in the RFCs that'd cover it, so I wouldn't depend on it. > More importantly, since the MTAs clearly don't do anything about > this, the MLM can't simply say "not my problem" and wait for all of > the MTAs to get "fixed". But I could make the same argument about MLMs (of which there are more than one) or MUAs (same). The question of "whose responsibility is it" is a useful one. For instance, if indeed it was the MTA's violation, maybe it's only this one MTA, or one revision of the MTA, that had the bug. So fixing MLMs would be the wrong thing to do. Maybe you know something more about the set of MTAs involved than I do, since you say "the MTAs cleaerly don't do anything". From andrewm@connect.com.au Thu Sep 21 02:09:44 2000 From: andrewm@connect.com.au (Andrew McNamara) Date: Thu, 21 Sep 2000 12:09:44 +1100 Subject: [Mailman-Developers] NULL characters in e-mail. In-Reply-To: Your message of "Wed, 20 Sep 2000 17:01:59 PDT." <200009210000.RAA08471@utopia.west.sun.com> Message-ID: <20000921010944.B2F6228600@wawura.off.connect.com.au> >But I could make the same argument about MLMs (of which >there are more than one) or MUAs (same). The question of "whose >responsibility is it" is a useful one. > >For instance, if indeed it was the MTA's violation, maybe it's only >this one MTA, or one revision of the MTA, that had the bug. So fixing >MLMs would be the wrong thing to do. > >Maybe you know something more about the set of MTAs involved than >I do, since you say "the MTAs cleaerly don't do anything". Speaking for the Postfix MTA, it attempts to be as transparent as possible. NULL's will be passed through in the body (although headers are a different matter). I would suggest this is not going to change. If we were just talking about individual postings, I would say "fair enough - if the sender includes crap, let it through", but digests are a different matter, as the bogosity will effect other people's postings (for similar reasons, list admins often want to remove attachments when building a digest). --- Andrew McNamara (System Architect) connect.com.au Pty Ltd Lvl 3, 213 Miller St, North Sydney, NSW 2060, Australia Phone: +61 2 9409 2117, Fax: +61 2 9409 2111 From neves@samba-choro.com.br Thu Sep 21 02:15:35 2000 From: neves@samba-choro.com.br (Paulo Eduardo Neves) Date: Wed, 20 Sep 2000 22:15:35 -0300 Subject: [Mailman-Developers] Building a boucing detector Message-ID: <39C96137.F84BD172@samba-choro.com.br> Hi, In my site, I send a lot of emails to users. I'd like to build a software to detect bouncing email, and automatically take some actions, like removing the user from the database. I'm considering using mailman code to do it. Why build, if you can steal?:-) I have two options: 1. Do a hack, copying and pasting some of mailman code to do it. 2. Build some auxiliary classes around mailman code so other people can also use it. Sure, I prefer number 2. It also has the technical advantage that I can incorporate mailman improvements in bounce detection. I'm writing to hear some opinions about it. Is it feasible? After a quick look in the code, here is my approach. I would like very much to hear people more knowledgeable about Mailman code criticize it. There's two spots that handle bouncing email. The files in directory Bouncers/ identify if a message is a bounce. Calling BounceAPI.py with a message instance and a list instance calls the RegisterBounce method in list if the email is a bounce. Bouncer.py is the mix-in class that handle the bounces and calls some methods of its sibiling and subclasses (e.g. IsMember and Save). I'd put a pipe in the alias file to pass it to a simple program that builds the message object, the list object and pass them to BounceAPI. Subclass Bouncer class in Bouncer.py to redefine list objects methods that would be defined in other classes. Some would be dummy methods, others do the real action. Any opinions? Is there any trap? thanks in advance, -- Paulo Eduardo Neves maito:neves@samba-choro.com.br From thomas@xs4all.net Thu Sep 21 12:16:13 2000 From: thomas@xs4all.net (Thomas Wouters) Date: Thu, 21 Sep 2000 13:16:13 +0200 Subject: [Mailman-Developers] NULL characters in e-mail. In-Reply-To: <200009210000.RAA08471@utopia.west.sun.com>; from Dan.Mick@West.Sun.COM on Wed, Sep 20, 2000 at 05:01:59PM -0700 References: <200009210000.RAA08471@utopia.west.sun.com> Message-ID: <20000921131612.A4088@xs4all.nl> On Wed, Sep 20, 2000 at 05:01:59PM -0700, Dan Mick wrote: [about NUL's in message bodies] > For instance, if indeed it was the MTA's violation, maybe it's only > this one MTA, or one revision of the MTA, that had the bug. So fixing > MLMs would be the wrong thing to do. We have a fair bit of problems with NUL characters in message bodies. Not because our mailer rejects it, but quite the opposite: a large section of the half-arsed SMTP servers for Windows can't handle it. Customers of ours have a SMTP queue waiting for them when they dial in, one Sendmail is started to deliver the queue, and the remote server crashes or freezes or otherwise misbehaves while sending the mail with a NUL in it. And the queue is not re-ordered, so any new mail is kept waiting, too. We end up doing a lot of manual repair in those cases, either removing the messages or editing them (usually the first, unless the customer wants to save the mail.) Curiously enough, those NULs often come from similar half-arsed Windows MTAs or perhaps MUAs ;P I don't think we can make assumptions about those NULs, but it would probably be a good idea to mask them. I doubt Mailman itself has any problems with the NULs, since Mailman is written in Python, and Python handles NULs in strings just fine. The same goes for the archives. The archives may look truncated when using some browser or MUA, but all the data is in there just fine. -- Thomas Wouters Hi! I'm a .signature virus! copy me into your .signature file to help me spread! From bwarsaw@beopen.com Thu Sep 21 20:11:53 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 21 Sep 2000 15:11:53 -0400 (EDT) Subject: [Mailman-Developers] NULL characters in e-mail. References: Message-ID: <14794.23929.957092.731537@anthem.concentric.net> >>>>> "CVR" == Chuq Von Rospach writes: CVR> Because of this, I think Mailman needs to be sensitive to CVR> NULL characters and strip them from messages during CVR> processing. If they exist in a message, they need to be CVR> deleted. I'm not sure what to do about this. On the one hand, I believe Mailman should be as transparent as possible so that what comes in is what goes out. On the other hand, perhaps it should try to be more friendly than that. On the third hand (okay, I'll start using my feet), going down that road can be a slippery slope, and may mask problems in other components in the chain (MTA, web server, MUA). On the other foot, how common is this problem? It's hard for me to know because the tools I use mean I have to deliberately stick that NUL in there so I don't know how common accidental NULs are in the Real World. And I haven't become aware of any /practical/ problem with any of the admittedly geek-loaded lists on python.org. >>>>> "AM" == Andrew McNamara writes: AM> Speaking for the Postfix MTA, it attempts to be as transparent AM> as possible. NULL's will be passed through in the body AM> (although headers are a different matter). I would suggest AM> this is not going to change. AM> If we were just talking about individual postings, I would say AM> "fair enough - if the sender includes crap, let it through", AM> but digests are a different matter, as the bogosity will AM> effect other people's postings (for similar reasons, list AM> admins often want to remove attachments when building a AM> digest). I did some of my own testing here, with some hand-crafted messages containing NUL bytes, e.g. in Python: msg = '''\ Subject: testing NULs To: testlist testing hello! There is a null byte coming up ==>\000<== Did you see it? -Barry ''' This message gets sent through the system and arrives in my inbox unmangled (except of course that the \000 gets printed as ^@ in the message -- it's still NUL). I'm using Postfix as my MTA and XEmacs/VM as my MUA. So mail delivery seems fine from my POV. The archives are a different matter. The first problem seems to be that the indexes don't contain every message, although the mbox files clearly do, and if you guess at the missing message's URL, you can access it. The individual message .html pages also seem complete, although what you end up seeing depends on your browser. NS appears to truncate the
 tag contents (body of message) right at the NUL although it does
start displaying again at the 
tag. On MSIE 5.5, although the NUL byte isn't displayed, it seems to show as "==><==" with the rest of the message being displayed just fine. So I'd have to say at this point that if there's a bug anywhere, it's in Pipermail's generation of the indexes. Oddly enough, the subject index seems fine, but thread, date, and author seem hosed. I'll submit a bug report on SF for this. Other than that, I think Mailman is doing what it should be doing. -Barry From bwarsaw@beopen.com Thu Sep 21 20:46:29 2000 From: bwarsaw@beopen.com (Barry A. Warsaw) Date: Thu, 21 Sep 2000 15:46:29 -0400 (EDT) Subject: [Mailman-Developers] Building a boucing detector References: <39C96137.F84BD172@samba-choro.com.br> Message-ID: <14794.26005.166676.432115@anthem.concentric.net> >>>>> "PEN" == Paulo Eduardo Neves writes: PEN> Hi, In my site, I send a lot of emails to users. I'd like to PEN> build a software to detect bouncing email, and automatically PEN> take some actions, like removing the user from the PEN> database. I'm considering using mailman code to do it. Why PEN> build, if you can steal?:-) Absolutely! And feel free to contribute back any new bounce dectectors you develop; it's a never ending battle with MTA authors who feel the need to be clever and unique. ;/ PEN> After a quick look in the code, here is my approach. I would PEN> like very much to hear people more knowledgeable about PEN> Mailman code criticize it. PEN> There's two spots that handle bouncing email. The files in PEN> directory Bouncers/ identify if a message is a PEN> bounce. Calling BounceAPI.py with a message instance and a PEN> list instance calls the RegisterBounce method in list if the PEN> email is a bounce. PEN> Bouncer.py is the mix-in class that handle the bounces and PEN> calls some methods of its sibiling and subclasses PEN> (e.g. IsMember and Save). PEN> I'd put a pipe in the alias file to pass it to a simple PEN> program that builds the message object, the list object and PEN> pass them to BounceAPI. PEN> Subclass Bouncer class in Bouncer.py to redefine list objects PEN> methods that would be defined in other classes. Some would be PEN> dummy methods, others do the real action. PEN> Any opinions? Is there any trap? I think this is more work than you need to do actually. If you look at ScanMessages() in BouncerAPI.py, it really does two things: 1) iterate through the list of bounce detectors until one of them returns a match 2) calls into the MailList object to "register" the bouncing addresses #2 probably has little use for you outside the context of Mailman, so if all you're interested in is the bounce detection framework, I'd say you should just re-implement ScanMessages() to do something more useful for your application. Forget the MailList instance; all you really need is a Message object. I think, but am not positive, that Python's standard rfc822.Message class should suffice here, although you'll need to be sure that file object you pass to the constructor is rewindable. Some sys.stdins are not, and if that's the case for you, I suggest reading all of sys.stdin into a StringIO instance and passing /that/ to the rfc822.Message constructor. You'll probably need to change the __import__() call in ScanMessages() because your copy probably won't live in the Mailman.Bouncers package. The API to the individual bounce detectors is this: - the module must have a module-global function called process() - process() must take a single argument, the Message object - process() returns None (or any false value) to indicate it could not find a matching address in the message - process() returns a list of matching addresses if it does find a match The algorithm in ScanMessages() simply iterates through every bounce detector until one of them returns a non-false value. Given that list of addresses, you can then do whatever is appropriate for your application. Hope that helps, -Barry From R.Barrett@ftel.co.uk Fri Sep 22 11:53:28 2000 From: R.Barrett@ftel.co.uk (Richard Barrett) Date: Fri, 22 Sep 2000 11:53:28 +0100 Subject: [Mailman-Developers] internal mail archiver/htdig integration Message-ID: In commissioning Mailman I needed to provide a per mail list search facility which fully honored private list access constraints (i.e. if the use cannot read it then do not tell him it even exists in search results). In implementing this I have made some changes to the mailman-2.0beta5 source. What I have done is hardly rocket-science. That said it would be good for me if the work was integrated with the standard releases of Mailman so I do not have to keep applying my own unique patches to any subsequent releases. I don't know the protocol for doing this nor whether other developers think my work is worth incorporating into the mainline of Mailman's code. I've outlined the changes below and would appreciate some advice. btw: If there's a better way to achieve the same objectives then I'm more than happy to throw my changes away. I've integrated Mailman's internal archiver with htdig. Use of htdig is conditional on a new Mailman configuration variable being set, the use of the internal archiver and a list being subject to archiving. If these conditions are met then the relevant list-specific htdig conf files and such are created and maintained automatically. If you don't want the integration then turning of a single Mailman config variable makes this integration completely transparent. For qualifying lists the htsearch form is embedded in the list's archive index page, when that is generated by HyperArch.py, and hence is downstream of user authentication for accessing a private archive. Access to URL's returned by htsearch are all mediated by an additional wrapped cgi script called htdig.py which is similar to private.py. Similar in the sense that for private lists it requires the presence of a list authentication cookie or it rejects the access. For public lists it just responds with the html page requested. In the normal course of events the user's browser gets the authentication cookie on board while reaching the archive index page, to do a search, in the normal fashion. This approach means that changing a list from public to private or vice versa does not invalidate the htdig search files as access to archive html files in either type of list uses a common root in their URLs. An additional directory called htdig is created under each .../mailman/archives/private/ in which the htdig search files and configuration file for each list are stored. An additional directory called .../mailman/archives/htdig holds symlinks to the list-specific htdig configuration files. .../mailman/archives/htdig is itself the target of a symlink in the directory in which htdig is configured to find its configuration files. [These symlinks are to allow htsearch to locate the list specific htdig conf files.] This directory arrangement meets that deleting a list in the normal fashion also disposes of related search stuff without any further effort or thought. The whole is rounded off with a cron initiated script which uses rundig to update list-specific search files on a regular basis iff each given list archive has had more data added to it since the script last ran. Changes have been made to the following mailman-2.0beta5 source files: Hyperarch.py 1. extra function to set up list-specific htdig creates list's htdig directory and generates list's htdig conf file in that directory. Logic added so that this function is called when archiving for the list is commenced. 2. added meta tags and and