summaryrefslogtreecommitdiff
path: root/Mailman
Commit message (Collapse)AuthorAgeFilesLines
...
* HOLD_MESSAGES_AS_PICKLES: Flag to choose whether the held messages arebwarsaw2002-04-011-3/+19
| | | | | | | saved on disk as pickles or plaintext. I don't want to promote this to a mm_cfg.py variable. HoldMessage(): Optionally store the message in plain text.
* _dispose(): We need to iterate over the addrs list. Also, reload thebwarsaw2002-04-011-15/+17
| | | | | list's state via xlist.Load() -- conservative if the state hasn't changed.
* _dispose(): Since the runner doesn't normally need to lock the list,bwarsaw2002-04-012-3/+4
| | | | call mlist.Load() so we can be sure we've got the most current state.
* Update the big comment showing mail flow through the system.bwarsaw2002-04-011-40/+58
|
* _dispose(): Since the BounceRunner doesn't normally need to lock thebwarsaw2002-04-011-0/+2
| | | | | list, call mlist.Load() so we can be sure we've got the most current state.
* Make it much cheaper to call Load(), especially when the state hasn'tbwarsaw2002-04-011-5/+20
| | | | | | | | | | | | | | | | | | | | changed since the last Load(). This means it will be cost effective to reload the state when necessary in qrunners which don't lock the list (e.g. OutgoingRunner). Specifically, InitTempVars(): Set a temporary timestamp attribute, which gets the mtime of the config.pck file upon successful load. __save(): When we save the file, set the timestamp to the file's mtime (we just saved it so it must be up-to-date -- since this is done with the list lock acquired, there shouldn't be a race). __load(): If the file's mtime is <= the current timestamp, then we've got the most current state. This method can now return (None, None) meaning we didn't need to load anything. Load(): Watch for dict is None and e is None, meaning we didn't need to load anything.
* showresults(), membership_options(): A nicer placement and u/i for thebwarsaw2002-03-291-14/+14
| | | | "search for member" button.
* Forgot to add `ko' for Korean.bwarsaw2002-03-291-0/+1
|
* GetConfigInfo(): The comment says it all...bwarsaw2002-03-281-1/+7
| | | | | | | | # The description for new_member_options includes a kludge where # we add a hidden field so that even when all the checkboxes are # deselected, the form data will still have a new_member_options # key (it will always be a list). Otherwise, we'd never be able # to tell if all were deselected!
* show_pending_subs(), show_pending_unsubs(): Remove duplicates bothbwarsaw2002-03-271-2/+10
| | | | | | | from the web view of pending actions, and from the database. Arguably, we should do this when we add the subscriptions in the first place, but that's inconvenient because we don't maintain the proper data structures in the request.db database.
* _snooze(): Use self.SLEEPTIME instead of mm_cfg.QRUNNER_SLEEP_TIME forbwarsaw2002-03-261-2/+4
| | | | | additional indirection that's overridden by the BounceRunner. Defaults to QRUNNER_SLEEP_TIME for backwards compatibility.
* A significant rewrite of the main bounce runner logic to make itbwarsaw2002-03-261-112/+97
| | | | | | | | | | | | | | | | | | | | | | | | | | | perform better. In general there are two changes: 1) we never lock a list until and unless absolutely necessary, 2) we only run the bounce runner once every minute (as opposed to the normal runners' once-per-second sleep time). Specifically, SLEEPTIME: The base class now looks at this attribute to decide how long to sleep between loop iterations, and it defines a default. We override the bounce runner's value to lengthen the time it sleeps to 1 minute (we may eventually want to move this to Defaults.py). __scanbounce(): Gone. All its functionality is subsumed in the new ScanMessages() method and the new _dispose(). __verpbounce(): Renamed to the non-method verp_bounce(). Also, we rip out the code that iterates through all the lists if the bounce came to the site list's -bounces address. _dispose(): Simply calls verp_bounce() to find bouncing addresses, and if that returns a false value (empty list), calls ScanMessages() to see if the bounce detector can find some bouncing addresses. If not, we're done (after possibly forwarding the non-matching message). Otherwise, we register the bounce either on the target mailing list, or on all the mailing lists if this came to the site's -bounces address.
* ScanMessage(): This is an internal API change to make life much easierbwarsaw2002-03-261-59/+7
| | | | | | | | | | for the BounceRunner. Instead of actually registering the bounces here, it simply returns the list of addresses that have matched. It returns an empty list if none of the bounce detectors found any addresses. I'm also ripping out the test code. The unit test suite is more appropriate.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-6/+5
| | | | | | | | | | | GetBouncesEmail(): Return the list's -bounces address. GetAdminEmail(): Obsolete, removed. AddMember(), ChangeMemberAddress(), ConfirmUnsubscription(): Make the notification email appear to come from the -bounces address. When the sender is for human consumption, make it the -owner address (or in the case of Cleanse.py for anonymous lists, the list posting address).
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-1/+1
| | | | | process(): Make the notification email appear to come from the -bounces address.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-267-7/+7
| | | | | | | process(), hold_for_approval(), do_discard(): Make the notification email appear to come from the -bounces address. When the sender is for human consumption, make it the -owner address (or in the case of Cleanse.py for anonymous lists, the list posting address).
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-1/+1
| | | | | process_form(): Make the notification email appear to come from the -bounces address.
* show_helds_overview(): We can always guarantee that the length of thebwarsaw2002-03-261-5/+1
| | | | record in a message held request is always 6.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-8/+8
| | | | | | | ParseMailCommand(), ProcessSubscribeCmd(), AddApprovalMsg(), ProcessHelpCmd(): For human consumption, we should point people at the -owner address as the contact address, but when sending the message out, it should come from the -bounces address for bounce processing.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-4/+46
| | | | | | | | | | | | | | __handlepost(), __refuse(): Send messages from the -bounces address so that errors will get bounce processed. __refuse(): In the refuse.txt, use the -owner address as the %(adminaddr)s expansion so that when the human acts on this message, they'll contact a human without going through the bounce processor. _UpdateRecords(): This is will be used in bin/update to canonicalize all the request.db records. Specifically, the SUBSCRIPTION records will always be of length 6 and the HELDMSG records will also always be 6. For shorter records, provide reasonable defaults.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-1/+1
| | | | | | | | GetStandardReplacements(): Expand <mm-owner> tags to the -owner address. This is more appropriate than the -bounces address because it reaches the human without going through the bounce processor. Since this ends up in a message that a human will act on, it's the correct address to use.
* GetAdminEmail() eradication campaign.bwarsaw2002-03-261-2/+2
| | | | | | SendUnsubscribeAck(), MailUserPassword(): These now look like they're coming from the -bounces address instead of the -admin address, which is deprecated.
* change_options(): A kludge, but don't set the emergency attribute frombwarsaw2002-03-251-2/+4
| | | | | | the form data if we're logging in. Apparently, using a checkbox in this way doesn't get us tri-state (i.e. None for not present, 0 and 1); it just gets us None or 1.
* Feedback from Guido...bwarsaw2002-03-233-14/+28
| | | | | | | | | | | | | | | | | | | | listinfo.py list_listinfo(): If the list only has one language enabled, omit the language choice box. It's a waste of screen real-estate. HTMLFormatter GetStandardReplacements(): ditto options.py loginpage(): ditto. Also omit the paragraph that talks about session cookies. It's probably over the heads of most users. main(): Don't print the "No address given" if we're traveling here from the listinfo page and they left the address field blank, as per the instructions.
* Good suggestion by Fred Drake: the delivery of MIME vs. plain textbwarsaw2002-03-221-18/+41
| | | | | | | | | | | | | | | | | | should be settable globally, since you're probably using the same MUA for all your list traffic. Specifically: main(): Define a Global class as a bag of attributes, and use this instead of the separate global_* variables. Added the extraction of the mime-globally form variable which sets the MIME digest setting globally. Always call global_options(), which now does the "do we need to do anything" test before locking the list. options_page(): Replace <mm-global-mime-button> with a checkbox for setting the MIME/plain text flag. global_options(): Signature changed to take an instance. Make sure that all non _* attributes have a non-None value before locking the list. Also, set the DisableMime member option.
* GetStandardReplacements(): Add <mm-favicon> for a url replacement inbwarsaw2002-03-221-0/+1
| | | | the head's LINK SHORTCUT ICON.
* main(): Fix some of the messages so the end with a period and a space,bwarsaw2002-03-221-2/+2
| | | | | otherwise status for multiple actions may run together. Found by Fred Drake.
* Typo noticed by Dan Buchmann.bwarsaw2002-03-161-1/+1
|
* Remove obsolete files.bwarsaw2002-03-161-58/+0
|
* Update copyright years.bwarsaw2002-03-1660-60/+60
|
* process(): Add another predicate to the test for whether we can addbwarsaw2002-03-161-0/+1
| | | | | headers and footers by concatenation. Content-Transfer-Encoding: must not be base64.
* processUnixMailbox(): Add optional start and end arguments so that webwarsaw2002-03-161-3/+16
| | | | | | | can fast forward past a bunch of messages in the mailbox. This will be used by bin/arch to process a huge .mbox file in chunks (manually). Not fully tested, but it seems to work.
* We can simplify the logic here because Python 2.1 is a minimumbwarsaw2002-03-161-26/+3
| | | | | | requirement, and that comes with sys._getframe(). _x(): Removed.
* Bump the version number to 2.1b1 in preparation for the first betabwarsaw2002-03-161-3/+3
| | | | release.
* _dispose(): Fil correctly pointed out that each of thebwarsaw2002-03-151-9/+17
| | | | | ParseMailCommands() calls in this runner need to be wrapped around a catch of TimeOutError.
* _dispose(): Wrap the ParseMailCommands() call in a try/except. If thebwarsaw2002-03-151-1/+6
| | | | | acquisition of the shared pending.db database lock fails, we want to requeue the message for another try later.
* ProcessSubscribeCmd(): If the address isn't given in the command, trybwarsaw2002-03-151-3/+10
| | | | to dig the full name out of the From: header.
* send_i18n_digests(): Be robust in the face of messages with no From:bwarsaw2002-03-151-2/+2
| | | | | | header. It seems like only broken configurations (or bugs?) could cause this since the RFC requires From: to exist, but this is better than throwing an exception.
* Bump copyright years.bwarsaw2002-03-151-1/+1
|
* process(): If the Approved: header has a password match, also add thebwarsaw2002-03-151-0/+2
| | | | | | `adminapproved' metadata key. This is the only unspoofable way for the list owners to get a message through while the emergency hold is on.
* intermediatebwarsaw2002-03-151-0/+37
|
* show_results(): Add support for the emergency hold button. Whenbwarsaw2002-03-151-24/+37
| | | | | | | | | | | | enabled, it lights up a rude solo light, so there's no missing it. UI changes to make this work better: the form now includes the links table to pick up the emergency checkbox, which shows on all admin pages. Get rid of the duplicated links at the bottom of the page -- I didn't like them much anyway. change_options(): Look for the emergency form variable and enable mlist.emergency if found.
* GLOBAL_PIPELINE: Add the Emergency handler.bwarsaw2002-03-151-0/+1
|
* NewVars(): Add emergency attribute, if missing.bwarsaw2002-03-151-0/+2
|
* Bump DATA_FILE_VERSION to pick up the emergency attribute.bwarsaw2002-03-151-2/+2
|
* InitVars(): Add the `emergency' attribute for putting the brakes onbwarsaw2002-03-151-0/+2
| | | | list traffic.
* __handlepost(): When approving a message through the admindbbwarsaw2002-03-151-0/+2
| | | | | | interface, also add an `adminapproved' key to the metadata. This is used to tell the Emergency handler the message is okay to let through.
* process(): We don't want messages sent to the list's -owner[s] to bebwarsaw2002-03-141-1/+2
| | | | | personalized, so look for an existing 'personalize' key and don't VERP if this is false.
* Bump copyright yearsbwarsaw2002-03-141-1/+1
|
* process(): We don't want messages sent to the list's -owner[s] to bebwarsaw2002-03-141-0/+1
| | | | personalized, so explicitly set the metadata 'personalize' key to 0.