| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
moved to the options.py file.
|
| | |
|
| |
|
|
| |
script was not setting up the i18n environment in the `blessed' way.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
main(): When the user hits the stop button on their browser during a
long running operation, Apache 1.3/mod_cgi will eventually catch a
SIGPIPE when output is written to the client. It then turns around
and SIGTERMs the cgi process, waits three seconds, then SIGKILLs the
cgi process. This patch fixes the stale lock file that can result
under this situation.
Since Python by default doesn't catch SIGTERM, and SIGKILL is
uncatchable, either signal would cause the cgi process to exit without
raising an exception, giving no chance for the script to clean up
after itself. We now open the MailList object in two phases: first,
open it unlocked, then lock it and install a SIGTERM handler. The
SIGTERM handler unlocks the list and exits, aborting any changes that
may have taken place. This is the safest way to ensure that stale
locks won't be left around causing other hits on the list to become
wedged for a long time.
Also, de-string-modulification.
|
| |
|
|
| |
If missing, just arrange to have the unsubscription request confirmed.
|
| |
|
|
| |
bogus too. Fix these references to `user' instead.
|
| |
|
|
|
|
| |
Fix some _() wrappings to use local variables.
Also convert to use mimelib interface.
|
| | |
|
| | |
|
| |
|
|
|
|
| |
the user is successfully unsubscribed. In that case there /is/ no
options for the user to continue to edit. Fixes SF bugs 122017 and
121591.
|
| |
|
|
|
|
|
|
|
|
|
| |
bomb with tracebacks if PATH_INFO environment variable wasn't defined.
Fixed this by making them all use Utils.GetPathPieces() and "doing
something sensible" when that returned a false value.
Also, edithtml is now hidden behind a login screen, so there's no need
to enter the list password to edit the html. You can't even get to
the list of files to edit unless you've admin authenticated. Closes
SF bug #114091, Jitterbug PR# 24.
|
| |
|
|
|
|
|
|
|
|
| |
results page. Obviates the need for using the `back' button after
changing your options.
process_form(): Call PrintResults() with the new `user' argument.
Catch MMMustDigestError and print a notification that the digest
option hasn't been set. Parallels what happens for
MMCantDigestError. Closes SF bug #113728.
|
| |
|
|
|
|
| |
to SF Bug #110753. Specifically,
optionslinks() Fix usage of GetOptionsURL() for new interface.
|
| |
|
|
| |
SF Patch #100556.
|
| | |
|
| |
|
|
| |
syslog() interface.
|
| |
|
|
|
|
|
| |
map_maillists() -- which has been removed anyway -- because the
locking semantics interacted poorly. optionslinks() has been modified
to take a listname instead of a MailList object, and it opens the list
unlocked. Good ol' built-in map() is used now instead.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
mailing list. In all cases, catch the base exception class
MMListError, and output HTML indicating the specified list doesn't
exist. A more detail message gets printed to logs/error (the str() of
the actual exception details).
Also:
admin.py - Don't catch MMBadConfigError around
mlist.parse_matching_header_opt() since this method doesn't ever
raise that exception. Actually, that exception isn't raised
anywhere in Mailman, so it's been removed.
|
| |
|
|
|
| |
password confirmation when the user doesn't have a password (and how
can that happen?!)
|
| | |
|
| |
|
|
| |
variable.
|
| | |
|
| |
|
|
|
|
| |
programming constructs. Could still use a lot more work.
Make sure the list is always saved and unlocked when exiting.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
address case matching. These changes require the DATA_FILE_VERSION to
be bumped, which should auto-update your config.db files. I sure hope
this works correctly! Details of changes:
MailList.GetUserSubscribedAddress(): New method. If the address is a
member, this returns the case-preserved address the user is subscribed
with. If not a member, None is returned.
MailList.GetUserCanonicalAddress(): New method. If the address is a
member, this returns the lowercased address the user is subscribed
with. If not a member, None is returned.
MailList.FindUser(): Wrote down, in a big comment, the constraints for
the dictionaries self.members, self.digest_members, self.passwords.
This wasn't always followed, but now it should be. FindUser() is now
also guaranteed to return the lowercased version of the subscribed
email address. This wasn't always the case. FindUser() also provides
a shortcut for the common case.
ApprovedAddMember(): Guarantee that passwords stored in self.passwords
are keyed off the lowercased address.
Deliverer.MailUserPassword(): Find the user's password using the
lowercased version of their address. However, be sure to use their
case-preserved address for the recipient of the password email.
Digester.SetUserDigest(): Fixed a fairly old bug where a user
switching from regular to digest membership (or vice versa) would get
their case-preserved address blown away. I don't think there's any
way to recover this information, but at least now we properly save it.
SecurityManager.ConfirmUserPassword(): Simplified address matching
stuff, since we now guarantee that FindUser() will return a lowercased
address, and that the passwords dictionary has lowercased keys.
FindUser() will return None if the address isn't found, and it also
has a built-in shortcut so that the more expensive
FindMatchingAddresses() isn't called in the common case. I eliminated
the case-insensitive password comparision that Ken rightly questioned
in his comment.
admin.py: In the list of members, display a member's case-preserved
address instead of their lowercased address. Also, obscure the URL in
the hyperlink (probably not terribly necessary).
handle_opts.py: When the password can't be found (when emailing it),
put the address we tried to find in the result message. Makes for
better debugging.
options.py: Use a better mechanism for finding if the member has a
case-preserved address different from their lowercased address.
|
| |
|
|
| |
script which does a much better job of reporting the error.
|
| |
|
|
| |
user may get one last digest.
|
| |
|
|
|
|
|
| |
should use FindMatchingAddresses(). I think it should, so I've made
that change.
Also, farther down, just changed some inconsistent indentation.
|
| | |
|
| |
|
|
|
|
|
|
|
| |
list admin has disabled digests, but the user selects to turn it on.
A better solution would be to not present this option to the user in
that case.
At least now, we give a more meaningful message instead of letting the
exception percolate!
|
| |
|
|
|
|
| |
the original, for each of the links - and also, needed to used the
Utils.ObscuredEmail() version of that, since that's the more common,
"normal" form.
|
| |
|
|
|
| |
- Add some (barely) explanatory text, and
- sort the list of names.
|
| |
|
|
|
| |
subscriptions, so people can, eg, see the number go down as they
unsubscribe, etc.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
subscribe to. I'm adding a button on the user options page that they
can click, as long as they provide their password, to get to a page of
links to the options pages for all their subscriptions on the current
system. It's not very pretty (options.py and handle_options.py are
even more packed with miscellaneous stuff, and the page they go to is
extremely unrefined), but i think it's not bad for an hour hack, and
is needed.
(The password protection is necessary since the user options page is
visible to anyone, and not having a password would give away the list
of private subscriptions.)
|
| |
|
|
|
| |
string (now using dict substitution, instead), plus the URL was
missing quotes, plus the URL was missing 'mailto:'.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
dicts instead of lists, which optimizes Utils.FindMatchingAddresses
and general membership management, especially for large lists.
MailList.py now supplies .GetMembers() and .GetDigestMembers() to
supply the data in list form to anything that needs it that way.
An new install showed this worked fine with some cursory testing of
the cgi's and interactive poking around.
A detailed listing of the changes follows:
Mailman/Defaults.py.in: change data version to 11
Mailman/Digester.py: initvars now instantiates digest_members as {}
instead of []
lines 113-114 and 121-122 now use del
This change implements storing list members and digest members as
dicts instead of lists, which optimizes Utils.FindMatchingAddresses
and general membership management, especially for large lists.
MailList.py now supplies .GetMembers() and .GetDigestMembers() to
supply the data in list form to anything that needs it that way.
Though INSTALL shows up on the changed files section, a diff a few
seconds ago didn't show any differences in that file, so I hope nobody
changed it in the interim.
An new install showed this worked fine with some cursory testing of
the cgi's and interactive poking around.
A detailed listing of the changes follows:
Mailman/Defaults.py.in: change data version to 11
Mailman/Digester.py: initvars now instantiates digest_members as {}
instead of []
lines 113-114 and 121-122 now use del
list.[digest_]member instead of
list.[digest_]members.remove
when figuring who to actually send digests to,
use list.GetDigestMembers() instead of
list.digest_members.
Mailman/HTMLFormatter: now uses list.Get[Digest]Members to get
subscribers, and length of digested subscribers
and regular members
MailCommandHandler, SecurityManager,Cgi/handle_opts, Cgi/options: all
simple replacements of list.[digest_]members with
list.Get[Digest]Members().
Mailman/Cgi/admin.py: mostly simple replacements of
list.[digest_]members with the Get..() methods, however, the
membership management section now works much quicker and changes
digest->nodigest subscriptions via dictionary manipulations.
Mailman/versions.py: updates lists to use dicts and changed
list.[digest_]members to use the list.Get[Digest]Members() methods.
Mailman/Utils.py: added a function "GetPossibleMatchingAddresses"
which when fed an address, returns the list of addresses that "smart"
address matching would match.
changed FindMatchingAddresses(name, list) to use a new signature:
FindMatchingAddresses(name, *dicts), where dicts is a list of
dictionaries keyed by addresses. Just realized that this would better
be FindMatchingAddresses(name, dict, *dicts) so that it enforces
atleast 2 args... I'll make that change in a sec.
All uses of FindMatchingAddresses have been changed to fit the new
arguments.
scott
----:**-F1 cvs30458aaa 1:12PM 0.98 Mail (Text Fill)--L59--32%-------------------------------------------
?
|
| |
|
|
|
|
|
| |
the Mailman package (using the semi-bogus, but quickly implemented
from ... import style).
main()-ify, but needed a few bogus global decls
|
|
|
handle logging to an error file, and no longer import paths. Also,
any checks for __main__ have been removed.
|