summaryrefslogtreecommitdiff
path: root/Mailman (follow)
Commit message (Collapse)AuthorAgeFilesLines
* ProcessUnsubscribeCmd(): Should use DeleteMember() instead ofbwarsaw2001-10-211-1/+1
| | | | | ApprovedDeleteMember() so that the request can go through admin approval if required.
* Support for admin approved unsubscribes. Specifically,bwarsaw2001-10-211-7/+56
| | | | | | | | | | | | | | GetUnsubscriptionIds(): Return all the pending admin requests that are UNSUBSCRIPTIONs. HandleRequest(): Add support for UNSUBSCRIPTION type records. HoldSubscription(): Use the list's internal name, not its real name in the message to the admin. HoldUnsubscription(), __handleunsubscription(): Support for holding unsubscription requests, as well as handling their disposition, which can be DEFER, DISCARD, REJECT, or UNSUBSCRIBE.
* SendUnsubscribeAck(): Use a better Subject: on the message that getsbwarsaw2001-10-211-3/+3
| | | | sent to the user when they're unsubscribed.
* DEFAULT_SEND_GOODBYE_MSG: Default flag for whether a goodbye messagebwarsaw2001-10-211-0/+21
| | | | | | | | | | | | is sent when a user gets unsubscribed. DEFAULT_UNSUBSCRIBE_POLICY: Default flag for whether unsubscriptions require admin approval or not. ALLOW_RFC2369_OVERRIDES: Site admin switch which, if true, will allow list owners to suppress RFC 2369 List-* headers. UNSUBSCRIBE: New ListAdmin request enum.
* process(): Reworked Reply-To: munging so list owners can establishbwarsaw2001-10-201-12/+31
| | | | | | | | their own policies. Specifically, added first_strip_reply_to which will control whether any additional Reply-To: headers override or extend an existing such field. Also, we no longer save the old Reply-To: header on X-Reply-To:
* GetConfigInfo(): Added first_strip_reply_to. Also, did somebwarsaw2001-10-201-9/+24
| | | | | rearranging of variables and added some section headers for clearer organization.
* option_help(): If there is no elaboration, don't display thebwarsaw2001-10-201-4/+2
| | | | description three times (two should be enough <wink>).
* NewVars(): Pick up new list attribute first_strip_reply_to.bwarsaw2001-10-201-0/+2
|
* DATA_FILE_VERSION: Bumping to pick up new list attribute first_strip_reply_tobwarsaw2001-10-201-1/+1
|
* InitVars(): New list attribute first_strip_reply_to.bwarsaw2001-10-201-0/+1
|
* DEFAULT_FIRST_STRIP_REPLY_TO: Default for new list attributebwarsaw2001-10-201-0/+5
| | | | first_strip_reply_to.
* HandleForm(): Added (essentially no-op) so that admin.py willbwarsaw2001-10-201-0/+4
| | | | short-circuit exit after processing password change.
* change_options(): A few code cleanups.bwarsaw2001-10-201-3/+1
|
* GetConfigInfo(): Rewrite the summary and details forbwarsaw2001-10-191-5/+8
| | | | default_member_moderation to clarify.
* Some reorganization of the Membership List page:bwarsaw2001-10-191-14/+47
| | | | | | | | | | | - Legend goes back on top of the member list - A new "Additional Member Tasks" section which contains the search button (rearranged), and a new set moderator flag button - You can now toggle all members' moderate flag either on or off (defaults to default_member_moderation), including those members not visible on the screen.
* We don't need this file any more, since everything's inlined withbwarsaw2001-10-181-229/+0
| | | | mailmanctl and qrunner.
* Added some internal methods to help with mailmanctl's transfer of lockbwarsaw2001-10-181-1/+42
| | | | | | | | | | | | | | | | | | | | | | | | ownership to its forked children. You shouldn't normally use these methods, but to make mailmanctl maximally convenient, we need to create a lock in a parent and manage the lock in the child. _transfer_to(): Called in the parent, this twiddles with lock internals to set the temp file name to include the pid of the child (passed in). It also transfers lock claims to the new temp file, i.e. the child, and removes the claim made by the parent (the previous winner). _take_possession(): Called by the child, this resets the temp file name to include the pid of the child. For this, it had the pid of the parent process prior to the fork. __del__(): Don't finalize() the lock if we don't own it (ownership is implied by creation, and relinquished by _transfer_to()). This way, when the parent transfers ownership to the child and then exits with sys.exit(), the act of destroying the lock instance in the parent won't unlock the lock. __init__(): Initialize __owned to 1.
* PIDFILE: Use master-qrunner.pid instead of qrunner.pidbwarsaw2001-10-181-1/+2
| | | | BIN_DIR: New convenience variable (used by mailmanctl).
* __handlepost(): Forward the message (i.e. `forward' is true) usingbwarsaw2001-10-151-10/+7
| | | | message/rfc822 MIME encapsulation rather than Resent-To: headers.
* De-string-module-ification.bwarsaw2001-10-151-37/+33
| | | | | | | import cPickle as pickle Convert to use email package so we're dealing with one kind of Message object.
* De-string-module-ification.bwarsaw2001-10-151-38/+40
| | | | Also, remove pickle import since it doesn't seem to be used anywhere.
* msgfactory(): Get rid of this, now that our own Mailbox class alreadybwarsaw2001-10-151-12/+2
| | | | | | uses a factory that produces our own Message objects. send_i18n_digests(): Use our Mailbox instead of mailbox.UnixMailbox.
* intermediatebwarsaw2001-10-151-0/+110
|
* process(): Remove the conditional tests for forbidden_posters,bwarsaw2001-10-151-46/+29
| | | | | | | | | | | | | | moderated, member_posting_only, and posters. All these are replaced by the new sender-centric moderation tests in Moderate.py. hold_for_approval(): When sending the hold notification to the list admin, structure the message into a 3-part multipart/mixed: - the text/plain hold notification message as before - an rfc822/message encapsulation of the original held message - an rfc822/message confirmation message, containing the hold cookie, to which the list admin can respond to approve or discard the held message.
* GetConfigInfo(): Update to the new signature, accepting category andbwarsaw2001-10-151-42/+131
| | | | | | | | | | | | | subcat argument. If the category doesn't apply to this gui component, None is returned, otherwise the config list is returned. Also (and more importantly), separate privacy filters into three subcategories: "subscribing" for general subscription and visibility options, "sender" for sender-centric moderation filters, and "spam" for anti-spam controls. And, add all the new sender-centric moderation variables while removing the old ones.
* GetConfigInfo(): Update to the new signature, accepting category andbwarsaw2001-10-151-3/+3
| | | | | | | | subcat argument. If the category doesn't apply to this gui component, None is returned, otherwise the config list is returned. Also: Add &nbsp; between the words so HTML won't break on word boundaries.
* GetConfigInfo(): Update to the new signature, accepting category andbwarsaw2001-10-159-9/+27
| | | | | subcat argument. If the category doesn't apply to this gui component, None is returned, otherwise the config list is returned.
* UpdateOldVars(): Handle the migration of the old privacy variables tobwarsaw2001-10-151-0/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | | the new ones. I think this is as close as we can get: - add default_member_moderation, accept_these_nonmembers, hold_these_nonmembers, reject_these_nonmembers, discard_these_nonmembers, forward_auto_discards, generic_nonmember_action - moderated -> generic_nonmember_action, also if we were moderating this list, then the generic_nonmember_action should be to hold the message, otherwise it should be to accept it. - for each address in forbidden_posters, if the address is a member, set their moderate flag to true, otherwise add them to hold_these_nonmembers. - posters (fun! not.) and member_posting_only: if member_posting_only == yes and there are posters, then they are members and non-members we automatically accept. So for members, turn off their moderation bit, and for non-members we add them to accept_these_nonmembers. BUT! if member_post_only == no, posters is the list of addresses we only accept, with all others being held. So, first turn the moderation bit on for all members, then for addresses in posters which are members, turn their moderation bit off, and for addresses which are nonmembers, add them to accept_these_nonmembers. Phew!
* DATA_FILE_VERSION: Bump to 38 to pick up the new sender-centricbwarsaw2001-10-151-1/+1
| | | | moderation attributes.
* List2Dict(): Add `foldcase' argument. When true, coerce all elementsbwarsaw2001-10-151-7/+10
| | | | in the dict to lowercase (yes they must be strings).
* get_sender(): Minor efficiency.bwarsaw2001-10-151-1/+1
|
* _factory(): A factory function for PortableUnixMailbox.__init__() sobwarsaw2001-10-151-0/+16
| | | | | | | that any new message objects it creates will be instances of our Message class instead of rfc822's. Mailbox.__init__(): Pass our _factory to base class constructor.
* InitVars(): Remove the initializations for the obsolete listbwarsaw2001-10-151-17/+71
| | | | | | | | | | | | | | | | | | | | | | | | | | | | attributes posters, forbidden_posters, moderated, and member_posting_only. Add initializations for the new sender-centric moderation attributes default_member_moderation, accept_these_nonmembers, hold_these_nonmembers, reject_these_nonmembers, discard_these_nonmembers, forward_auto_discards, generic_nonmember_action. GetConfigInfo(): Rework this framework so that it doesn't return a dictionary with keys being the category. Instead, pass the category and subcategory in as arguments and let the dispatched-to gui methods decide whether and what to return in response to these arguments. This allows the framework to be more robust, and to easily handle extensions via subcategories (as was done to the Privacy category). ApprovedAddMember(): Set the newly subscribed member's Moderate flag to self.default_member_moderation. ProcessConfirmation(): Argument userdesc_overrides -> context. In the SUBSCRIPTION clause, only add context to userdesc if context is an instance of UserDesc. Also, add a HELD_MESSAGE clause which handles admin approval/discard of held messages via email response. This code is a bit more elaborate than I'd like it to be, so perhaps it should be factored out. ;/
* main(): category_suffix -> category, and get subcat from parts[0]bwarsaw2001-10-151-40/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Pass subcat to change_options() and show_results() calls. option_help(): Get both category and subcat from varhelp. Include the standard footer when no valid variable name is found. Be sure the form action url includes any subcat. Pass subcat to add_options_table_item() call. show_results(): category_suffix -> subcat. Be sure to include the subcat in the form action url. Pass subcat to the show_variables() call. show_variables(): Accept subcat, and pass it along to the add_options_table_item() call. add_options_table_item(): Accept subcat and pass it along to the get_item_gui_description() call. get_item_gui_description(): Accept subcat, and make sure that the VARHELP query url extension includes any subcat, otherwise the variable lookup will fail. member_options(): Include another column which contains the mod user-specific moderation bit. change_options(): Accept subcat, and be sure to pass that into the GetConfigInfo() calls. Also, set the user's Moderate flag based on the value of the user_mod key.
* ProcessConfirmCmd(): Rename argument `mail' to `msg', and pass it asbwarsaw2001-10-151-2/+2
| | | | the second argument to ProcessConfirmation().
* RejectMessage: Add an __init__() to initialize the rejection noticebwarsaw2001-10-151-3/+10
| | | | message. Add a notice() method to return the rejection notice.
* GLOBAL_PIPELINE: Add the `Moderate' module right before the `Hold'bwarsaw2001-10-151-5/+16
| | | | | | | | | | | | | | | | | | | | | | module, so that sender-centric moderation can be performed before more general content-based moderation. DEFAULT_MODERATED: Removed DEFAULT_DEFAULT_MEMBER_MODERATION: New flag which determines what the default state of the member-moderation bit is for newly subscribed members. DEFAULT_FORWARD_AUTO_DISCARDS: New flag which describes the default for whether auto-discards should include a forward to the list administrator. DEFAULT_GENERIC_NONMEMBER_ACTION: What is the default action for the generic non-member filter? DEFAULT_MEMBER_POSTING_ONLY: Removed Moderate: New options flag implementing per-user moderate bit.
* BounceMessage(): Argument `e' is now either None or an instance with abwarsaw2001-10-151-2/+5
| | | | notice() method, which returns the notice as a string.
* FormatEditingOptions(): Make the text box's name "email" so as to hookbwarsaw2001-10-121-1/+1
| | | | up with what options.py expects.
* main(): When getting the FieldStorage, set keep_blank_values=1. Thisbwarsaw2001-10-121-1/+1
| | | | makes the "Authentication failed" tests work.
* prepare_message(): Support the cleaning of headers based onbwarsaw2001-10-121-20/+16
| | | | | NNTP_REMOVE_HEADERS and NNTP_REWRITE_DUPLICATE_HEADERS as a more general approach.
* send_i18n_digests(): Dan Mick noticed that the DisableDelivery flagbwarsaw2001-10-121-4/+5
| | | | was being ignored for digest delivery!
* process_form(): Lots of cleaning up of the code. Also, make this pagebwarsaw2001-10-121-88/+121
| | | | | | | | | | | | | | | | | | more bulletproof against membership mining for private rosters. If rosters are private, then we'll just put up a fairly generic acknowledgement that's the same regardless of what kind of approval is necessary, or whether the email address is already subscribed or not. Thus no information about private rosters can leak. Note also that if a subscription request comes in for an already subscribed address (using private rosters of course), then we send an alert to the address to let them know that somebody was trying to re-subscribe their address or mine the membership. I also rewrote a bunch of the results strings (sorry translators!) remote_addr(): Remove this. We can do it more cleanly inlined.
* main(): Make the options page a little more bulletproof againstbwarsaw2001-10-121-8/+17
| | | | | | | | | | | | | | | | | | | | | | membership mining when private rosters are being used. Also, fix a bug in the chopping up of the url parts. We now print the "Authentication failed" message in the authentication clause when the `password' key, not the `login' key is present (the latter won't be when the email address is given on the url, but the former will always be present). When mlist.private_roster is <> 0, this means we do have private rosters (either to the list membership or to the list admins). In that case, set user to None and continue on. The display will use the provided email address even if it's not a member, and we'll get a normal "Authentication failed" message, which doesn't reveal whether it was the email address or the password that mismatched. loginpage(): Always set the form action to .../mailman/options without the email address in the url. If the user was provided to the login script, hide it (obscured) in a Hidden input field. This way, we essentially clear any unauthorized emails from the url.
* AddMember(): When raising MMAlreadyAMember, include the email addressbwarsaw2001-10-121-1/+1
| | | | as the exception value.
* A first shot at configuration for cleaning headers before a messagebwarsaw2001-10-121-0/+20
| | | | | | | | | | | gets gated mail->news. Specifically, NNTP_REMOVE_HEADERS: This is a list of headers to remove from the message before posting to nntp. NNTP_REWRITE_DUPLICATE_HEADERS: A list of headers that should get moved if there are more than one in the message. Contains a tuple of the original field name and the new field name.
* send_i18n_digests(): When calling msg.get_all() for a KEEP header,bwarsaw2001-10-111-1/+1
| | | | | supply an empty list as the failobj so we can still iterate over the return value.
* The semantics of PUBLIC_ARCHIVE_URL are changed to be a template intobwarsaw2001-10-101-1/+8
| | | | | | which %(listname)s will be interpolated. This makes it possible to set PUBLIC_ARCHIVE_URL to something that's appropriate for (hopefully) any external archiver.
* GetBaseArchiveURL(): The semantics of PUBLIC_ARCHIVE_URL are changedbwarsaw2001-10-101-1/+3
| | | | | | to be a template into which %(listname)s will be interpolated. This makes it possible to set PUBLIC_ARCHIVE_URL to something that's appropriate for (hopefully) any external archiver.
* show_post_requests(): When deciding to show a smaller part of a heldbwarsaw2001-10-101-1/+2
| | | | | message (because of ADMINDB_PAGE_TEXT_LIMIT), join the strings with the empty string, not newlines.