| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
| |
saved on disk as pickles or plaintext. I don't want to promote this
to a mm_cfg.py variable.
HoldMessage(): Optionally store the message in plain text.
|
| |
|
|
|
| |
list's state via xlist.Load() -- conservative if the state hasn't
changed.
|
| |
|
|
| |
call mlist.Load() so we can be sure we've got the most current state.
|
| | |
|
| |
|
|
|
| |
list, call mlist.Load() so we can be sure we've got the most current
state.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
changed since the last Load(). This means it will be cost effective
to reload the state when necessary in qrunners which don't lock the
list (e.g. OutgoingRunner). Specifically,
InitTempVars(): Set a temporary timestamp attribute, which gets the
mtime of the config.pck file upon successful load.
__save(): When we save the file, set the timestamp to the file's mtime
(we just saved it so it must be up-to-date -- since this is done with
the list lock acquired, there shouldn't be a race).
__load(): If the file's mtime is <= the current timestamp, then we've
got the most current state. This method can now return (None, None)
meaning we didn't need to load anything.
Load(): Watch for dict is None and e is None, meaning we didn't need
to load anything.
|
| |
|
|
| |
"search for member" button.
|
| | |
|
| |
|
|
|
|
|
|
| |
# The description for new_member_options includes a kludge where
# we add a hidden field so that even when all the checkboxes are
# deselected, the form data will still have a new_member_options
# key (it will always be a list). Otherwise, we'd never be able
# to tell if all were deselected!
|
| |
|
|
|
|
|
| |
from the web view of pending actions, and from the database.
Arguably, we should do this when we add the subscriptions in the first
place, but that's inconvenient because we don't maintain the proper
data structures in the request.db database.
|
| |
|
|
|
| |
additional indirection that's overridden by the BounceRunner.
Defaults to QRUNNER_SLEEP_TIME for backwards compatibility.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
perform better. In general there are two changes: 1) we never lock a
list until and unless absolutely necessary, 2) we only run the bounce
runner once every minute (as opposed to the normal runners'
once-per-second sleep time). Specifically,
SLEEPTIME: The base class now looks at this attribute to decide how
long to sleep between loop iterations, and it defines a default. We
override the bounce runner's value to lengthen the time it sleeps to 1
minute (we may eventually want to move this to Defaults.py).
__scanbounce(): Gone. All its functionality is subsumed in the new
ScanMessages() method and the new _dispose().
__verpbounce(): Renamed to the non-method verp_bounce(). Also, we rip
out the code that iterates through all the lists if the bounce came to
the site list's -bounces address.
_dispose(): Simply calls verp_bounce() to find bouncing addresses, and
if that returns a false value (empty list), calls ScanMessages() to
see if the bounce detector can find some bouncing addresses. If not,
we're done (after possibly forwarding the non-matching message).
Otherwise, we register the bounce either on the target mailing list,
or on all the mailing lists if this came to the site's -bounces
address.
|
| |
|
|
|
|
|
|
|
|
| |
for the BounceRunner. Instead of actually registering the bounces
here, it simply returns the list of addresses that have matched. It
returns an empty list if none of the bounce detectors found any
addresses.
I'm also ripping out the test code. The unit test suite is more
appropriate.
|
| |
|
|
|
|
|
|
|
|
|
| |
GetBouncesEmail(): Return the list's -bounces address.
GetAdminEmail(): Obsolete, removed.
AddMember(), ChangeMemberAddress(), ConfirmUnsubscription(): Make the
notification email appear to come from the -bounces address. When the
sender is for human consumption, make it the -owner address (or in the
case of Cleanse.py for anonymous lists, the list posting address).
|
| |
|
|
|
| |
process(): Make the notification email appear to come from the
-bounces address.
|
| |
|
|
|
|
|
| |
process(), hold_for_approval(), do_discard(): Make the notification
email appear to come from the -bounces address. When the sender is
for human consumption, make it the -owner address (or in the case of
Cleanse.py for anonymous lists, the list posting address).
|
| |
|
|
|
| |
process_form(): Make the notification email appear to come from the
-bounces address.
|
| |
|
|
| |
record in a message held request is always 6.
|
| |
|
|
|
|
|
| |
ParseMailCommand(), ProcessSubscribeCmd(), AddApprovalMsg(),
ProcessHelpCmd(): For human consumption, we should point people at the
-owner address as the contact address, but when sending the message
out, it should come from the -bounces address for bounce processing.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
__handlepost(), __refuse(): Send messages from the -bounces address so
that errors will get bounce processed.
__refuse(): In the refuse.txt, use the -owner address as the
%(adminaddr)s expansion so that when the human acts on this message,
they'll contact a human without going through the bounce processor.
_UpdateRecords(): This is will be used in bin/update to canonicalize
all the request.db records. Specifically, the SUBSCRIPTION records
will always be of length 6 and the HELDMSG records will also always be
6. For shorter records, provide reasonable defaults.
|
| |
|
|
|
|
|
|
| |
GetStandardReplacements(): Expand <mm-owner> tags to the -owner
address. This is more appropriate than the -bounces address because
it reaches the human without going through the bounce processor.
Since this ends up in a message that a human will act on, it's the
correct address to use.
|
| |
|
|
|
|
| |
SendUnsubscribeAck(), MailUserPassword(): These now look like they're
coming from the -bounces address instead of the -admin address, which
is deprecated.
|
| |
|
|
|
|
| |
the form data if we're logging in. Apparently, using a checkbox in
this way doesn't get us tri-state (i.e. None for not present, 0 and
1); it just gets us None or 1.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
listinfo.py
list_listinfo(): If the list only has one language enabled, omit
the language choice box. It's a waste of screen real-estate.
HTMLFormatter
GetStandardReplacements(): ditto
options.py
loginpage(): ditto. Also omit the paragraph that talks about
session cookies. It's probably over the heads of most users.
main(): Don't print the "No address given" if we're traveling here
from the listinfo page and they left the address field blank, as
per the instructions.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
should be settable globally, since you're probably using the same MUA
for all your list traffic. Specifically:
main(): Define a Global class as a bag of attributes, and use this
instead of the separate global_* variables. Added the extraction of
the mime-globally form variable which sets the MIME digest setting
globally. Always call global_options(), which now does the "do we
need to do anything" test before locking the list.
options_page(): Replace <mm-global-mime-button> with a checkbox for
setting the MIME/plain text flag.
global_options(): Signature changed to take an instance. Make sure
that all non _* attributes have a non-None value before locking the
list. Also, set the DisableMime member option.
|
| |
|
|
| |
the head's LINK SHORTCUT ICON.
|
| |
|
|
|
| |
otherwise status for multiple actions may run together. Found by Fred
Drake.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
headers and footers by concatenation. Content-Transfer-Encoding: must
not be base64.
|
| |
|
|
|
|
|
| |
can fast forward past a bunch of messages in the mailbox. This will
be used by bin/arch to process a huge .mbox file in chunks (manually).
Not fully tested, but it seems to work.
|
| |
|
|
|
|
| |
requirement, and that comes with sys._getframe().
_x(): Removed.
|
| |
|
|
| |
release.
|
| |
|
|
|
| |
ParseMailCommands() calls in this runner need to be wrapped around a
catch of TimeOutError.
|
| |
|
|
|
| |
acquisition of the shared pending.db database lock fails, we want to
requeue the message for another try later.
|
| |
|
|
| |
to dig the full name out of the From: header.
|
| |
|
|
|
|
| |
header. It seems like only broken configurations (or bugs?) could
cause this since the RFC requires From: to exist, but this is better
than throwing an exception.
|
| | |
|
| |
|
|
|
|
| |
`adminapproved' metadata key. This is the only unspoofable way for
the list owners to get a message through while the emergency hold is
on.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
enabled, it lights up a rude solo light, so there's no missing it.
UI changes to make this work better: the form now includes the links
table to pick up the emergency checkbox, which shows on all admin
pages. Get rid of the duplicated links at the bottom of the page -- I
didn't like them much anyway.
change_options(): Look for the emergency form variable and enable
mlist.emergency if found.
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
list traffic.
|
| |
|
|
|
|
| |
interface, also add an `adminapproved' key to the metadata. This is
used to tell the Emergency handler the message is okay to let
through.
|
| |
|
|
|
| |
personalized, so look for an existing 'personalize' key and don't VERP
if this is false.
|
| | |
|
| |
|
|
| |
personalized, so explicitly set the metadata 'personalize' key to 0.
|