| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | |
|
| |
|
|
| |
message id was lost.
|
| |
|
|
| |
and 4.1 bounce formats.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
places. For held subscriptions, the displayed order of `subscribe'
and `refuse' is changed so that the refused button is right next to
the refusal explanation.
After suggestions by many people, split the headers and body into
different textboxes for held messages. Before held messages often got
truncated in their headers, and the bodies couldn't be seen.
Instead of providing a button to view the entire message (which would
be more difficult to implement through the admindb authentication
blockade), it is now possible to forward the message to a given
address. This defaults to the <listname>-admin address. Use this
combined with the new `Defer' action to get a copy of the full message
for review before deciding what to do with it.
In addition to the new `Defer' action, held messages can be
`preserved' for the site admin by copying the message to the
$PREFIX/spam directory. This is useful for abusive messages that need
closer or long term scrutiny.
Message rejection notices are taken from the
msgdata['rejection-notice'] value, placed their by the Hold.py
module.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
`forward', and `addr' which are passed in from admindb.py. These
are only useful for held postings, and are only passed on to
__handlepost().
preserve is a flag that says whether the held message should be copied
to the `spam' directory or not.
forward is a flag which says that the message should be forwarded on
to an addition email address, which is contained in the addr
parameter. Both most be set for forwarding to occur.
Finally, HandleRequest() only deletes the database entry if the status
of the sub-method is true. This is to support the new `deferred' flag
for held postings.
__handlepost(): Takes the three new parameters as described above.
Uses shutil to do the `preserve' copy, and HandlerAPI.DeliverToUser()
to do the forwarding (after inserting a `Resent-To' header).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
is used instead of the hardcoded string in the `reject explanation'
field of the admindb page. This means that the default rejection
notices are more closely tailored to the type of hold put on the
message.
Most are simple strings, although Administrivia and MessageTooBig have
more elaborate rejection_notice() methods to give some program
supplied details.
MessageTooBig holds also now include both the message body length and
the list-specific maximum body size in the hold reason.
hold_for_approval(): The rejection notice is placed in the
msgdata['rejection-notice'] key for extraction by the admindb.py
script.
|
| |
|
|
| |
to provide a better rejection notice suggestion in the admindb page.
|
| | |
|
| |
|
|
| |
match the change in admindb.py (`subscribe' comes before `refuse').
|
| |
|
|
| |
button is just to the left of the refusal-reason text box.
|
| | |
|
| |
|
|
|
| |
ZapOldVars(): Remove `num_spawns' attribute if the list object still
has it.
|
| |
|
|
| |
attribute.
|
| |
|
|
| |
None. The type of the return value must always be a string.
|
| |
|
|
|
|
|
|
|
|
|
| |
list's lock. This enables lock debugging if LIST_LOCK_DEBUGGING is
true (it's false by default).
InitVars(), GetConfigInfo(): Removed the `num_spawns' attribute. This
has been replaced by system-wide variables in Defaults.py.
HasExplicitDest(): Added Resent-To: in the list of headers we check
for explicit destinations.
|
| |
|
|
|
|
|
|
|
|
|
| |
global-lock followed by temp-lock. This means it is once again
illogical for the lock linkcount to be anything other than 0 or 2.
Specifically,
lock(): Remove the elif test for lincount == 1.
unlock(), __break(): First remove the global lock file, followed by
the temp lock file.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
new comments and some navigational aids. Also added some convenience
functions for better documenting values.
MAX_SPAWNS, DEFAULT_NUM_SPAWNS: Removed.
QRUNNER_LOCK_LIFETIME: moved here from cron/qrunner. Also cranked the
lifetime up to 10 hours.
LIST_LOCK_LIFETIME: cranked up to 5 hours.
LIST_LOCK_TIMEOUT: shortened to 10 seconds.
|
| |
|
|
|
| |
possible to get a multifile.Error not only on the mfile.next() call,
but also on the mfile.read() call. Return None in both cases.
|
| |
|
|
|
|
| |
which I suspect are Smail. They all have a very similar format that,
if they aren't Smail-based, are close enough for this detector to
score.
|
| | |
|
| |
|
|
| |
NNTP authentication values.
|
| |
|
|
|
|
| |
authentication information to the NNTP server for posting or reading.
Most sites don't need this and the defaults disable NNTP server
authentication.
|
| |
|
|
| |
lines in the mass subscribe field.
|
| |
|
|
| |
conditionalize on dont_respond_to_post_requests.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
bounces. These look like DSN mime messages, but don't contain
-Recipient: headers. :(
Caiwireless, Catchall, DSN, Exim, Postfix, Qmail, Smail, Yahoo:
Changed process() API to take just the message object, since the
MailList object isn't really required. Modified Catchall to use
mm_cfg.DEFAULT_HOST_NAME in the one place where mlist.host_name was
used. This module's deprecated anyway so it shouldn't matter much.
BouncerAPI.py: Use the new bouncer.process() API. Also improve the
unit testing code a bit.
|
| | |
|
| |
|
|
|
|
| |
Save/Unlock followed by a Lock call. Because deliveries don't touch
the list and can take a long time, this improves responsiveness of the
system during message delivery.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
must have been built with threading support, and MAX_DELIVERY_THREADS
must be > 0. It is not enabled by default because it's not clear this
is a performance win. This feature should be considered experimental
for now.
Specifically,
process(), deliver(): No longer needs the MailList object in it's
argument list. This allows us to multi-thread actual message
delivery. We also calculate the message's text and the admin address
only once. deliver() also takes a dictionary for failures, which it
updates with chunk failures.
Convert logging stuff to use new syslog() interface instead of
MailList.LogMsg().
Log total delivery time instead of chunk delivery time.
chunkify(): Instead of a separate bucket for each TLD, we now have
only 4 buckets for recipients:
.com
.net/.org
.edu/.ca/.us
everything else
buckets are not backfilled.
pre_deliver(), threaded_deliver(): New functions.
|
| |
|
|
|
|
| |
threads used to deliver messages when recipient lists are broken into
multiple chunks. Python must be built with threads support for this
to work. Read the comments for details.
|
| |
|
|
| |
logging.
|
| |
|
|
|
|
|
|
|
| |
Also,
__del__(), InitTempVars(): Remove all references to _log_files. Also,
remove the withlogging argument to InitTempVars().
LogMsg(), CloseLogs(): Removed.
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
process(): The argument to GetSender() is `use_envelope'.
|
| | |
|
| |
|
|
| |
syslog() interface.
|
| |
|
|
| |
be instantiated.
|
| |
|
|
|
|
| |
Syslog.py: New global logging class which replaces the
MailList.LogMsg() interface. This module also creates a global
instance which is callable and should be used for convenience.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
lock(): It is an expected condition that the global linkfile can have
a linkcount of 1. This can arise due to a race condition between
proc1 that is in the middle of unlocking, and proc2 which is trying to
acquire the lock. In this case, we simply log the condition and try
again later.
Also, if we're already locked, we should not unlink our tmpfname.
unlock(): We don't need to wrap self.locked() in a try/except.
__break(): Updated the comment at the head of the method based on
Harald's observation. Touching the lockfile doesn't eliminate the
race condition, just makes it more unlikely.
Also, we don't need to wrap the self.__read() in a try/except.
Finally, elaborate the unit test suit to use /dev/random if it exists
(i.e. on Linux).
|
| |
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
locking were just too messed up to use. And good 'ol built-in map()
is fine anyway. It's only used in one place currently --
handle_opts.py -- and that is soon to be changed.
|
| |
|
|
| |
from the function argument.
|
| |
|
|
|
|
| |
must make a copy of LIST_PIPELINE, otherwise subsequent calls to
DeliverToList() do nothing... e.g. qrunner on multiple message
deliveries.
|
| | |
|
| |
|
|
|
|
|
| |
config.db exists but is corrupt (i.e. doesn't unmarshal into a
dictionary).
__load(): Implements all the internal db loading logic.
|
| |
|
|
|
|
|
|
|
|
|
| |
There was a short discussion a month or so ago about the hyperarch
'mbox' archives having the wrong kind of date in the 'From '
lines... 'unixfrom' lines should have a very specific dateformat,
namely that which 'time.ctime' returns. The following patch fixes
Archiver/HyperArch.py.
One minor change. To be consistent with gate_news, there are two
spaces between the email address and the fromdate.
|
| |
|
|
| |
preserve the unixfrom line.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
composed of
- the unixfrom (i.e. From_ ) line
- the rfc822 headers
- a blank line
- the body of the message
This can be used to completely reconstruct the message as received by
the MTA (and as needed by Pipermail).
The __str__() still returns just the rfc822 headers and the body of
the message.
Enqueue(): Put the repr() in the .msg file, so that it can be
completely reproduced.
|
| |
|
|
|
|
| |
should fix problems where approved held messages weren't being
archived properly, and other problems. Thanks to Thomas Wouters for
tracking this problem.
|