summaryrefslogtreecommitdiff
path: root/Mailman
Commit message (Collapse)AuthorAgeFilesLines
...
* AddMember(), ChangeMemberAddress(), ConfirmUnsubscription(): Thebwarsaw2001-08-301-3/+3
| | | | | | subject text, which contains the robot command "confirm" should not be translated, otherwise MailCommandHandler will break. Reported by Daniel Buchmann.
* request_deletion(): Fixed missing markup. Caught by Szilard Vizi.bwarsaw2001-08-301-1/+1
|
* Stop: a unique global value that bounce detectors can return in orderbwarsaw2001-08-291-0/+6
| | | | | | to stop processing immediately. This in effect provides for the recognition of temporary problem bounce messages which shouldn't RegisterBounce(), but /should/ discard the message.
* GetConfigInfo(): Added missing </ul> tag. Caught by Daniel Buchmann.bwarsaw2001-08-291-0/+1
|
* decorate(): String interpolation can throw either a ValueError /or/ abwarsaw2001-08-291-2/+2
| | | | | | | | TypeError, but only ValueError was being caught. This means stray %'s can still crash Mailman. Also, when interpolation fails, instead of using [INVALID FOOTER], return the raw footer text template.
* setMemberOption(): Stupid typo preventing users from setting anybwarsaw2001-08-291-3/+3
| | | | options. Caught by Ben Gertzfield.
* change_options(): Give some feedback on who's been removed.bwarsaw2001-08-291-0/+6
|
* GetMailmanFooter(): Don't hyperlink each individual list owner with abwarsaw2001-08-291-8/+5
| | | | | | | mailto: to their personal email address. Instead, hyperlink the lot of them with a mailto: to the list's -owner address. That let's us do a spam detect on the message before forwarding on the owners.
* KNOWN_SPAMMERS: Move this here from Mailman/Handlers/SpamDetect.pybwarsaw2001-08-291-0/+17
|
* Move KNOWN_SPAMMERS out of this file and into Defaults.py.in so it canbwarsaw2001-08-291-17/+9
| | | | | | | be properly configured in mm_cfg.py. process(): Don't support the header == None semantics (it was broken anyway). We may have to add this back later.
* _dispose(): Factor out common code paths to _toadmins().bwarsaw2001-08-291-25/+36
| | | | | | | | | | | | | | | | _toadmins(): Run the message through SpamDetect to filter out known spam patterns in messages to the list owners/moderators. Log such detected spam to logs/spam and discard the message. Also, for every message to a list's -owner or -admin address, we always send it on to the list owners and moderators, even though the moderators can't access the admin pages (only the admindb pages). Note 1: this makes the `tomoderators' key in the message metadata obsolete. Note 2: this may not be the Right Thing To Do.
* run(): Add a note about a minor bogosity in the calls tobwarsaw2001-08-291-1/+3
| | | | _doperiodic().
* process_request(): Don't use WebAuthenticate() here because that willbwarsaw2001-08-201-5/+7
| | | | | | | allow deletion of list by anybody with a valid cookie authentication. We /want/ to force the admin to enter the password explicitly, as an extra confirmation step, so use Authenticate() instead.
* process_request(): After the list is created, set the web_page_url andbwarsaw2001-08-201-45/+51
| | | | | | | | | | | | host_name attributes based on the calculated values. web_page_url's host name comes from get_domain() interpolated into DEFAULT_URL_PATTERN, while host_name comes from a lookup in the VIRTUAL_HOSTS table, defaulting to get_domain() if not found. Also, we're now responsible for saving the list, and once we've done so, we can unlock it and do the rest of the task (which doesn't require the lock, so can be done outside the try/finally).
* admin_overview(): Use get_domain() instead of hardcodedbwarsaw2001-08-201-2/+11
| | | | | | | | | DEFAULT_HOST_NAME to get the hostname. Also, do the same kind of virtual host filtering for the admin overview as we do in the listinfo overview. This more clearly separates the virtual domains (there perhaps should be a site overview).
* ScriptURL(): Instead of using DEFAULT_URL directly, usebwarsaw2001-08-201-2/+2
| | | | | | | | | | DEFAULT_URL_PATTERN and interpolate in the calculated web-request based host name (via get_domain()). This should improve vhost support. get_site_email(): Calculate hostname by looking up get_domain() results in VIRTUAL_HOSTS, defaulting to get_domain() if no vhost information was set.
* Create(): Let any exceptions in the os.makedirs() call percolate up.bwarsaw2001-08-201-5/+2
| | | | | | | I.e. don't catch and transform OSErrors to MMUnknownListErrors. Also, don't do a Save() here. The caller is now responsible for saving the list.
* Some improvements for virtual host support.bwarsaw2001-08-201-13/+38
| | | | | | | | | | | | | | | | | | | | | | | VIRTUAL_HOSTS is a dictionary mapping url base hostnames to email base hostnames. E.g. "mail.python.org" -> "python.org". When a new list is created, we attempt to ascertain the web host from the web request. We use that for web_page_url and then we look it up in VIRTUAL_HOSTS to find host_name. If not found, we use the same host for web_page_url and host_name. DEAFULT_EMAIL_HOST is now the preferred way to specify the default email host_name. It is set by configure to @FQDN@. DEFAULT_URL_HOST is now the preferred way to specify the default host for web_page_url. It is set by configure to @URL@. DEFAULT_URL_PATTERN is how to convert DEFAULT_URL_HOST to web_page_url. It must contain a single %s expansion. For backwards compatibility, DEFAULT_HOST_NAME = DEFAULT_EMAIL_HOST and DEFAULT_URL = DEFAULT_URL_PATTERN % DEFAULT_URL_HOST. Also, added another commented out MAILMAN_URL mirror.
* Process(): When personalizing regular deliveries, set the To: headerbwarsaw2001-08-171-0/+13
| | | | to point at the recipient instead of the list.
* GetConfigInfo(): Rewrite the `personalize' details to describe the To:bwarsaw2001-08-171-10/+16
| | | | header munging.
* FormatSubscriptionMsg(): Use triple quoted strings instead ofbwarsaw2001-08-171-36/+25
| | | | multiline individual strings.
* hold_for_approval(): dont_respond_to_post_requests =>bwarsaw2001-08-171-1/+1
| | | | respond_to_post_requests
* GetConfigInfo(): Typo. Also, say "list moderator" instead ofbwarsaw2001-08-171-4/+5
| | | | | "administrator". Add a VARHELP link to member_posting_only when describing "Restrict..." in the posters option
* GetConfigInfo(): For the `owner' option, add a link to thebwarsaw2001-08-171-13/+14
| | | | | | | | | | general#passwords section, and to the `moderator' option where appropriate. Likewise for `moderator' option. Also, dont_respond_to_post_requests => respond_to_post_requests and switch the polarity of the No/Yes radio.
* Convert lots of split-line strings to triple-quoted strings. Yes,bwarsaw2001-08-171-21/+18
| | | | | | | this is ugly, but it makes the job much easier for translators of certain languages. Also say "list moderator" instead of "list administrator".
* option_help(): Simplify the error message when the VARHELP variable isbwarsaw2001-08-171-13/+12
| | | | | | | invalid. password_inputs(): Add a <a name...> tag here so we can create a <a href="general#passwords"> link directly to this section.
* Style nit.bwarsaw2001-08-171-1/+1
|
* DATA_FILE_VERSION: Bump to 35 to pick up thebwarsaw2001-08-171-1/+1
| | | | dont_respond_to_post_requests => respond_to_post_requests change.
* UpdateOldVars(): dont_respond_to_post_requests => respond_to_post_requestsbwarsaw2001-08-171-0/+7
|
* InitVars(): In order to make the General options consistently displaybwarsaw2001-08-171-3/+3
| | | | | | | | | | | binary radio options as "No" then "Yes", we had to change the polarity of dont_respond_to_post_requests. Rename the option respond_to_post_requests and use versions to update the attribute and value. AddMember(): In HoldSubscription() call, the local variable `name' holds the user's full name, not `fullname'. Also say "moderator" instead of "administrator".
* Convert lots of split-line strings to triple-quoted strings. Yes,bwarsaw2001-08-171-53/+52
| | | | | | | this is ugly, but it makes the job much easier for translators of certain languages. Also, consistancy for strings which have similar messages.
* subscription_confirm(): We have to convert the 'digests' value to anbwarsaw2001-08-161-3/+8
| | | | integer since that's what MemberAdaptor eventually wants.
* __repr__(): Useful for debugging.bwarsaw2001-08-161-0/+13
|
* MakeCookie(): If the secret isn't a string, raise MMBadUserError.bwarsaw2001-08-161-2/+2
| | | | | __checkone(): Likewise, if the secret isn't a string, return 0 (i.e. no the user isn't authenticated).
* confirm(): If we're purging this cookie, we should remove its entry inbwarsaw2001-08-161-0/+5
| | | | | | | | the evictions dictionary too. _save(): Go through and delete any evictions keys which don't appear in the pending dictionary (i.e. we're cleaning up after ourselves due to the above bug).
* getMemberOption(): Whether the user is a digest member or not is notbwarsaw2001-08-161-2/+6
| | | | | | | | | | | | | kept as a bitfield value in user_options, even though there's an mm_cfg.Digests `flag'. So special case asking for this option by checking the `where' value returned by __get_cp_member(). addNewMember(): Similarly, there's no point in setting user_options to mm_cfg.Digests if the member wants to receive digests, since the state of that flag is kept elsewhere. setMemberOption(): More of the same; we can always return from the "if flag == Digests" clause without touching user_options.
* ProcessSubscribeCmd(): Use keyword arguments for all parameters to thebwarsaw2001-08-161-1/+3
| | | | | | UserDesc constructor. Previously, we were assigning the password to the fullname, and the digest to the password, so users were ending up with a password of the integer 0. Very bogus.
* MailUserPassword(): Rip out the checks for isMember(user) andbwarsaw2001-08-161-28/+32
| | | | | | | | | | | | | | | | getMemberPassword(user). First, we assert that the user is a member because there should be no way to get here if that's not the case. Second, it is a nasty bug if the user does not have a valid password, but one that the list administrator really can do little about. Instead, if the user is found to have a `false' password, we simply assign them a new one, which is fine because they're asking for their password now, so we'll just ship them the new one. This means we no longer need templates/*/nopass.txt, soon to be deleted. It also means that we won't raise MMBadUserError here, which is fine because the caller never checked for that exception anyway. ;)
* MarshalSwitchboard._ext_read(): If the .db file is of version 2, justbwarsaw2001-08-151-0/+3
| | | | | delete the `filebase' key. That should be enough to update it to version 3.
* process(): Do not munge the Reply-To: field if reply_goes_to_list isbwarsaw2001-08-141-10/+15
| | | | | | `explicit' but the reply_to_address is invalid. Also, include some notes about better RFC 2369 support...
* Add import of Language module.bwarsaw2001-08-141-0/+1
|
* GetConfigCategory(): Make sure the spaces between the words arebwarsaw2001-08-144-4/+4
| | | | non-breaking. Also, consistency in capitalization.
* intermediatebwarsaw2001-08-141-0/+71
|
* GetConfigInfo(): Move preferred_language out of here and into thebwarsaw2001-08-141-20/+2
| | | | | | | | Language gui module. We'll group it with the available_languages option. Also, fix the category description so that it isn't specified as two adjacent strings, but instead one TQS.
* Support the ability to specify the initial list of available languagesbwarsaw2001-08-141-1/+34
| | | | | | | | | | when creating the mailing list. A checkbox array is displayed that contains all the server-supported languages, with the DEFAULT_SERVER_LANGUAGE checked by default. List preferred language still needs to be chosen after-the-fact through the admin pages (it defaults to DEFAULT_SERVER_LANGUAGE). process_request(): Make sure that the list name isn't the empty string!
* import types => from types import *bwarsaw2001-08-141-41/+58
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Make sure most tables have an explicit width of 100%, otherwise vertical Checkboxes cause the table to be squashed. show_results(): Split the "Configuration Categories" unordered list into two columns. Still not perfect, but better than having 11 members in one column on the left. "Edit the HTML for the public list pages" => "Edit the public HTML pages" get_item_gui_value(): Handle the new Checkbox widget. get_valid_value(): If widget type is Email, only attempt to validate the value if it is not the empty string. This fixes SF bug #219571, which prevented the reply_to_address field from being cleared. Also, teach this about the Checkbox widget type. Make sure that the value is a list. It'll be a scalar if exactly one of the checkboxes is selected, but we always treat it as a list. change_options(): When calling get_valid_value(), catch any EmailAddressErrors that can occur due to hostile or otherwise bad email addresses in the reply_to_address field. Print an error message in that case. add_error_message(): Change the way the `tag' argument is defaulted, so we can translate the default value.
* de-string-module-ificationbwarsaw2001-08-141-10/+9
| | | | NewVars(): Add available_languages attribute if missing.
* Add CheckBoxArray, a new class which implements an array of checkbwarsaw2001-08-141-16/+46
| | | | | | | | boxes (i.e. multiple selections). Refactor RadioButtonArray class into new base class WidgetArray which contains most of the logic. RadioButtonArray and CheckBoxArray inherit from WidgetArray. map(None, ...) => zip(...)
* DATA_FILE_VERSION: Bump to 34 to pick up the new available_languagesbwarsaw2001-08-141-1/+1
| | | | attribute.
* InitTempVars(): Removed the _ready attribute, as it really isn'tbwarsaw2001-08-141-16/+10
| | | | | | | | | | | | | | | | | | | | | | | | | used anywhere anymore. InitVars(): Added the available_languages attribute which will hold the list of language codes supported by this mailing list. Create(): Take an extra optional argument `langs' which holds a list of language codes that the mailing list should initially support. Default this to the list's preferred language (which in turn defaults to DEFAULT_SERVER_LANGUAGE). Save(): I don't think we need IsListInitialized() any more. Load(): Removed the _ready attribute. IsListInitialized(): Removed. GetAvailableLanguages(): Don't key the list of available languages off the subdirectories in lists/<mylist>. The tiered-template lookup only requires those directories to exist if there are site customizations of the templates. Instead, return the value of self.available_languages, but with DEFAULT_SERVER_LANGUAGE forced as a member.