| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
| |
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.
|
| |
|
|
| |
length 5 or length 6.
|
| |
|
|
|
|
|
|
|
| |
- The page title now contains the category label
- Slight changes to the H2 header at the top of the page
- I didn't like the => <= indicators, so these are gone, and the
currently selected page is rendnered in <em></em> tags.
|
| |
|
|
| |
to access the admin interface for a non-existent list.
|
| |
|
|
| |
warning on every page, put it on the admin login page.
|
| |
|
|
|
|
|
|
|
|
|
| |
take effect unless your browser supports cookies.
ChangeOptions(): Is called from within a try...finally in main(), with
the finally clause doing a (unconditional) mlist.Save(). Thus,
there's no need for ChangeOptions() to _also_ do a Save() -- meaning
the `dirty' housekeeping variable is superfluous, and therefore has
been removed.
All calls to mlist.SetUserOption() are now made with keyword
argument "save_list=0".
|
| |
|
|
|
|
| |
direction), mlist.usenet_watermark is set to None. This tells
gate_news to mass catchup the newsgroup, which avoids list flooding
when gating from Usenet is turned back on.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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?!)
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
AddOptionsTableItem(): nodetails => detailsp (with bit flip on default
value).
FormatOptionHelp(): All options now have details. If a config
attribute doesn't have an explicit details string, then the normal
description is used as the details. This simplifies the logic a bit
here and makes for a more consistent UI. Also, always include a link
back to the category options page (on the quest for no dead ends!)
GetItemGuiDescr(): Always include the "(Details)" link because now
they /all/ have details.
|
| |
|
|
| |
the top of this function.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
`multipart/form-data' if the category is autoreply (so far the only
admin category with file uploads).
GetItemGuiValue(): added support for the FileUpload widget. This sets
up both the TextArea and FileUpload widget, with some explanatory text
in between.
GetItemGuiDescr(): I've been persuaded. Don't pop up help text in
a separate window by default.
ChangeOptions(): Kludge in support for file upload widgets. If
there's a config variable called 'something_upload' then it's value is
used in preference to the 'something' config variable yanked off the
CGI information.
|
| | |
|
| |
|
|
| |
variable.
|
| |
|
|
| |
`obscure'
|
| |
|
|
| |
value here doesn't do anything.
|
| |
|
|
| |
form has no digest key, is to use the list's default value.
|
| |
|
|
|
| |
key, if the admin has mucked with the listinfo page. Default digest
mode to 0 in that case.
|
| |
|
|
|
| |
by anything other than letter case. This is a QND (quick 'n' dirty)
security patch when using an external archiver.
|
| |
|
|
|
| |
os._exit() appears to skip this, which will cause premature script
termination errors.
|
| | |
|
| |
|
|
|
|
|
| |
instead of getting handed it from the requests database. If we can't
open the file for reading, the message was lost, so print an
information message and tidy up the housekeeping (this last is a bit
of a kludge though).
|
| | |
|
| | |
|
| |
|
|
|
|
| |
programming constructs. Could still use a lot more work.
Make sure that lists are saved and unlocked when exiting.
|
| | |
|
| |
|
|
| |
programming constructs. Could still use a lot more work.
|
| |
|
|
|
|
| |
programming constructs. Could still use a lot more work.
Make sure the list is always saved and unlocked when exiting.
|
| |
|
|
|
|
| |
programming constructs. Could still use a lot more work.
Background is finally #ffffff like all other pages! :)
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
programming constructs. Could still use a lot more work.
main(): Most importantly, in the finally clause make sure the mailing
list is both Saved and Unlock()d.
|
| |
|
|
|
| |
HandleRequests(): Catch MMAlreadyAMember errors and print something
sensible.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
(i.e. ListAdmin.py). Also several changes to the layout of request
pages that I think make using them much nicer.
- There's a preamble which actually explains what you're supposed to
do on this page.
- There's only two "Submit All Data" buttons. I found the multiple
submit buttons just too darn confusing (hard to explain == hard to
use). Guido concurred.
- The tables have no cellpadding so they aren't as spread out.
- Each posting hold tells you "N of #" so you know how many more are
shown below.
- Layout of posting holds has changed so you see immediately 1) who
it's from; 2) why the message was held; 3) what the subject of the
message is. Next you see the action buttons, followed by the
explanation text box. Finally you see the full text of the message
in a separate text box. This should make handling extremely long
messages much easier because they don't clutter up the main page too
much.
Also, Guido had an excellent suggestion: Let the admin edit the full
text of the message in this box! Probably wouldn't be to hard to
do, actually.
|
| |
|
|
| |
one typo).
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* New method WebAuthenticate(). Takes up to three keyword arguments:
user-address, password and cookie-suffix. If password is supplied
(and authenticates OK), issue a cookie -- otherwise try to do
authentication based on cookies.
* MakeCookie(): Changed to actually return a finished Cookie object.
Takes one (non-optional) argument; the created cookie's name.
Fixed bug in setting of cookie's path.
* CheckCookie(): Now takes cookie's name as single argument, and can
raise various MMAuthenticationErrors if that cookie doesn't
authenticate OK.
admin.py: Do explicit re-authentication when changing list admin
password.
admin.py, admindb.py and private.py: Removed isAuthenticated()
function -- use MailList.WebAuthenticate() instead. This removed
the need to import Cookie, so now we don't.
|
| |
|
|
|
|
|
|
|
| |
SecurityManager: New functions MakeCookie() and CheckCookie(). These
functions work with cookies containing cookie creation and expire
time, the client's IP number, and a checksum hash of these values as
well as a secret (the lists (encrypted) admin password).
admin.py, admindb.py and private.py: isAuthenticated now uses these
new cookie functions.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
MailList.py:
Changed MailList.SetUserOption() to take a `save_list' keyword
argument (defaulting to true). When false, SetUserOption won't do
self.Save() after changing the option.
New function MailList.ApprovedAddMembers() (note plural) that takes
a list of prospective new list members (and possibly a list of
corresponding passwords), and does _all_ the necessary list changes
before saving the list configuration. Empty passwords are
substituted with randomly generated ones. Returns a dict with
{address: exception_tuple} entries -- exception_tuple is either None
or a two-element tuple containing the first exception type and value
raised when trying to add address. The exception traceback object
isn't included in the returned dict, because a) I don't think it is
very useful for the relevant exceptions, and b) using it wrongly
could cause some fuzz with Python's garbage collector -- i.e. we
would leak memory.
Changed MailList.ApprovedAddMember() to be a mere wrapper, calling
the new ApprovedAddMembers() function and reraising any exception in
the returned dict.
Also made the logic of the code doing subject prefixing a bit
clearer, and changed MailList.aside_new() so that list's config.db
files are saved with umask 007 (as they contain all list members'
passwords in clear text).
Utils.py:
New function MakeRandomPassword(length=4), used by
MailList.ApprovedAddMembers() whenever empty passwords are found.
The default random password length should possibly be made site
configurable.
Also, fixed an error in the _badchars regular expression -- the
final "," was probably meant to be inside the character set.
Cgi/admin.py:
Changed ChangeOptions() to use the new MailList.ApprovedAddMembers()
function.
|
| |
|
|
|
| |
envvar, but not HTTP_HOST. Thus, if HTTP_HOST is unset, try getting
SERVER_NAME.
|
| | |
|
| |
|
|
| |
MailmanLogo() function.
|
| |
|
|
| |
page.
|
| |
|
|
|
| |
from PATH_INFO, instead use Utils.GetPathPieces() like every other CGI
script.
|
| |
|
|
|
|
|
|
|
| |
always (repeatedly!) type in. This means that admins are going to
have to erase the message if they're rejecting for a different reason
- but the vast proportion of messages i reject are for this reason,
while for spammers i often discard, and who cares if they get a
confusing message, anyway?
Refined a few error messages ("intenting to visit"?).
|