| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | |
|
| |
|
|
|
| |
its process() function. This doesn't require three nested getattr()
calls.
|
| |
|
|
|
| |
the deprecated regsub so as to quiet a Python 2.1 warning. The
standard cgi.escape() function does all this for us.
|
| |
|
|
|
|
| |
sponsor home pages). In practice, too many end-user list members were
following those links out of desperation to get unsubscribed from
deployed lists.
|
| |
|
|
|
|
| |
module with re. This quiets a Python 2.1 warning.
Also, de-string-module-ification.
|
| |
|
|
|
| |
Original patch by Juan Carlos Rey Anaya after bug report by Patrick
Timmons. Patch modified by Barry.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
redesign of the admin page. From the NEWS file:
- Redesign of the membership management page. The page is now
split into three subcategories (Membership List, Mass
Subscription, and Mass Removal). The Membership List
subcategory now supports searching for member addresses by
regular expression, and if necessary, it groups member addresses
first alphabetically, and then by chunks.
Mass Subscription and Mass Removal now alternatively support
file upload, with one address per line.
|
| |
|
|
| |
Form.set_action(): New method to retrospectively set the form action.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
footer. The rules now are:
- if the message is not a MIME, or is only a text/plain, then add the
header and footer the old way (concatenation).
- if the message is multipart/mixed, add the header and footer as
text/plain subparts (prepended and appended to the original
subparts).
- anything else goes through without headers and footers added. We
may elaborate on this last bit in the future.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
removals. Specifically,
AddMember(): Use the new Pending.new() function interface, which
requires that an appropriate operation key come first.
ProcessConfirmation(): Include more detail on the MMBadConfirmation
exceptions. Decode the operation key first to see whether we're doing
a SUBSCRIPTION or an UNSUBSCRIPTION confirmation. The latter is new
and simply calls DeleteMember() if confirmed.
ConfirmUnsubscription(): Similar to subscription confirmation, this
generates a response with the removal confirmation instructions and
url.
|
| |
|
|
|
| |
unprocessed pipeline module list wouldn't get saved in the message
metadata.
|
| |
|
|
| |
background color to white when there's no such member.
|
| |
|
|
| |
If missing, just arrange to have the unsubscription request confirmed.
|
| | |
|
| |
|
|
|
| |
inhibits wrapping of paragraphs with leading whitespace. When false,
all paragraphs are wrapped.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Entry eviction times are stored as a sub-dictionary under a separate
key called `evictions'. This leaves the cookie data as whatever was
given to the new() function. The keys of the eviction dictionary
are the cookies and the values are the time at which the entry
should be removed.
- Another new key `version' for future backwards compatibility <wink>.
- Each entry for the cookie should have a op key as its first element,
which currently should be either Pending.SUBSCRIPTION or
Pending.UNSUBSCRIPTION.
new(): Make sure the `evictions' dictionary is present.
confirm(): Don't strip off the last element of the tuple.
_load(): If there's no pending.db file, return a dictionary containing
an empty `evictions' sub-dictionary.
_save(): Check the eviction times in the `evictions' sub-dictionary.
Also, add the schema `version' entry.
_update(): Fix the conversion from pending_subscriptions.db to
pending.db file format so that SUBSCRIPTION entries include a default
language. Also move the eviction times (which in the old format are
the time the request was made) to the `evictions' sub-dictionary and
add the PENDING_REQUEST_LIFE value.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
"leave" are synonyms for "unsubscribe".
ProcessUnsubscribeCmd(): It is now legal to omit both the password and
email address when unsubscribing via the -request address. If the
password is omitted, a removal confirmation message is generated.
However if the password was given, it must match the user's password
or the removal fails. If the password matches, the removal is
performed immediately.
Note that there's an ambiguity if exactly one argument is given: is it
a password or an email address? Use FindUser() to decide giving
preference to email address.
|
| | |
|
| | |
|
| |
|
|
|
| |
number. Also, rewrite slightly the error message string, and other
messages.
|
| |
|
|
|
|
|
|
| |
new style verify.txt response message, which now also contains the
confirmation url.
ProcessConfirmation(): Use the new Pending module interface. Watch
for tuple unpack errors. Return the unpacked data when successful.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
inside a class; use the module as if a singleton instance.
The pending database is now stored in data/pending.db.
new(): Stores a new cookie in the pending.db with the key an sha
hexdigest based on the current time, a random number and the content.
The timestamp is now the point in the future at which this entry can
be evicted.
confirm(): Given a cookie, return the data (with the timestamp
stripped off), or None if the cookie is missing from the database.
_load(), _save(): Rewritten and simplified low-level marshal/unmarshal
of the database. Assumes lock is acquired.
_update(): For use by the bin/update script to convert from
pending_subscription.db to pending.db (the old keys ought to be
compatible).
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
bogus too. Fix these references to `user' instead.
|
| |
|
|
|
| |
"... confirm <number>" instead of "... request <number>". This goes
along with changes to MailCommandHandler.py.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
specifically:
ParseMailCommands(): Use a mimelib MsgReader idiom to get just the
body of the message, sans headers. This could be made easier with
Python 2.1's xreadlines module or a better interface on Message
objects.
Substitute one crufty parsing of the Subject: line for another.
Actually now, any command can appear anywhere on the Subject: line,
and confirmation messages are just another form of that (by changing
the Subject: text from "request" to "confirm" -- same as the body
command).
Fixed typos in language support (mlist -> self).
Rewrite the "errors-in-command" string so that the substitution keys
are actually the correct ones!
AddError(): Python 2.0-isms.
|
| | |
|
| |
|
|
| |
Errors.MMAlreadyMember. That's way too many M's and A's there!
|
| |
|
|
|
| |
(hostname) and fix the mailto:mailman_owner link to do interpolation
explicitly, since Link() does not do that.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
membership_options(): We have to urllib.quote() the value attribute on
the hidden input tag, otherwise it is impossible to unsubscribe
addresses with quotes in them (which are valid RFC822 addresses).
change_options(): Be sure to urllib.unquote() the user value field,
undoing the effects of membership_options() and allowing
unsubscription of addresses with quotes in them.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
i18n.set_language() and doc.set_language() to set up the proper
language for the response page.
Also, consistency with other CGI scripts in their use of
"from Mailman.htmlformater import *".
De-string-module-ification.
Other random code cleaning.
|
| |
|
|
|
|
| |
former does the proper urllib.quote()'ing of the email address.
Close SF bug #214161 (old Jitterbug PR#198).
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
someone who is already on the list. Since the person was added between the
subscription request and the approval, just drop the request.
|
| |
|
|
|
|
|
| |
Also, comment out `web_page_url' -- it's probably just too dangerous
to allow list admins to change this via the web. Making a mistake
breaks the list (for the rare situation where the base url needs
changing, it's up to the site admin to effect).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
ParseMailCommands(): add an extra argument `msgdata' since it's
convenient to have access to the message's metadata.
Mark some more strings as translatable.
Make sure messages getting sent back to the user have the proper
Content-Type: based on the language context.
msg.GetSender() -> msg.get_sender()
Close SF bug #405131, submitted by Chris Ryan.
|
| |
|
|
| |
Close SF bug #405131, submitted by Chris Ryan.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
send_digests() -> send_i18n_digests(): this does the bulk of the
digest crafting, but it's wrapped in send_digests() which first sets
up the language context for the digest (the list's preferred
language).
send_i18n_digests(): Also make sure that for text/plain parts, the
charset is set correctly to the list's preferred language character
set.
Mark more strings as translatable.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We have to play module global footsie with _() so that the rejection
notices are marked as translatable, but aren't actually translated
until later.
Administrivia.rejection_notice(), MessageTooBig.rejection_notice():
Convert to interpolating local variables.
hold_for_approval(): Conversion to the new way of i18n'ing. The
language context at this point is the user's preferred language, so we
craft his notification first before temporarily changing contexts to
the list's preferred (for the admin). We no longer need to duplicate
the code as was done before, but some things need to be re-translated
in the context of the list's preferred language.
Also, translate the exception str() and rejection_notice for real
here.
|
| | |
|