| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| | |
|
| | |
|
| |
|
|
|
| |
list admin contact address, instead of trusting the MMNeedApproval
exception to have been raised with the correct address as argument.
|
| |
|
|
|
| |
message) might contain '%' chars, quote them before they reach
MailList.LogMsg().
|
| |
|
|
| |
in the 100-1899 range. Coerce these to current GMT time.
|
| |
|
|
| |
happen during the nntplib.NNTP() call.
|
| |
|
|
|
|
| |
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.
|
| |
|
|
|
|
| |
the Mailman version number. This will always be linearly increasing
with each release. Modelled after PY_VERSION_HEX in Python's
patchlevel.h.
|
| | |
|
| | |
|
| |
|
|
| |
ProcessSubscribeCmd(): MMListNotReady => MMListNotReadError
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
resulted in a huge number of useless stats (i.e. list_lists or blank
listinfo could result in n**2 stats). Instead, exceptions raised in
Load() are passed through the constructor, where essentially the same
checks are made anyway (caught by Ted Cabeen).
Load(): Several changes resulting from consistency in list-opening
exceptions:
- If an IOError occurs when opening the list's config.db file,
transform the exception into MMUnknownListError. Also unlock
the list before the exception is raised!
- If the unmarshalled object is not a dictionary, raise
MMCorruptListDatabaseError. Again, unlock the list first.
- If unmarshalling raises an EOFError, ValueError, or TypeError,
transform these into MMCorruptListDatabaseError -- after
unlocking of course.
IsListInitialized(): RAise MMListNotReadyError instead of
MMListNotReady.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
MMListError: new base class for all list-opening related exceptions.
MMUnknownListError: Change to class-based exception inheriting from
MMListError.
MMBadListError: Becomes class MMCorruptListDatabaseError
MMListNotReady: Becomes class MMListNotReadyError
MMBadConfigError: removed.
|
| |
|
|
| |
missing Subject: header will cause a NameError.
|
| |
|
|
|
|
|
| |
Utils.reraise() hack.
Also, use import statements which are more consistent with the rest of
Mailman.
|
| |
|
|
|
|
|
|
| |
Archiver.__archive_to_mbox(): Since Python 1.5.2 is now required, we
can get rid of the Utils.reraise() hack.
Also, use import statements which are more consistent with the rest of
Mailman.
|
| |
|
|
|
|
| |
Utils.reraise() hack.
reraise(): removed.
|
| |
|
|
| |
Utils.reraise() hack.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
552, as described in draft-ietf-drums-smtpupd-11.txt:
[RFC-821] incorrectly listed the error where an SMTP server exhausts
its implementation limit on the number of RCPT commands ("too many
recipients") as having reply code 552. The correct reply code for this
condition is 452. Clients SHOULD treat a 552 code in this case as a
temporary, rather than permanent failure so the logic below works.
Handle code 552 as a temporary failure.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Specifically,
process(): move smptlib.SMTP() into the try/except so that
socket.errors on the connection can be flagged and dealt with as total
delivery failures.
Better error logging.
If the connection goes through but smtplib throws an
SMTPRecipientsRefused exception, then Only persistent transient
failures are queued, i.e. those with error code < 500. For failed
recipients with codes >= 500, these are permanent failures and we
do a bounce registration instead.
queue_message(): handles all the actual queuing of files for future
re-delivery attempts. Two files per message are written to
$prefix/qfiles: one is a .txt containing the full text of the message,
the other is a .db file containing a marshal of this information:
listname - Python string naming the list for delivery
recips - Python list of addr strings
attepts - number of total delivery attempts for this queued message
last_recip_count - number of recips the last time this delivery
was re-tried (not sure how useful that will
be).
The base name of the two files is the SHA hexdigest hash of the
message text.
|
| |
|
|
|
|
|
| |
DeliverToList(), DeliverToUser(): Use pipeline_delivery
RedeliverMessage(): New delivery top-level function which is used by
qrunner to attempt re-delivery.
|
| |
|
|
| |
minutes, instead of hardcoding a value in place.
|
| |
|
|
|
|
|
|
|
|
| |
default it to @URL@, but using 'localhost' doesn't seem to break
anything.
LIST_LOCK_LIFETIME: new variable which controls the default list lock
lifetime, with an explanation adapted from Thomas Wouters'.
QUEUE_DIR: Variable containing the location to the qfiles directory.
|
| |
|
|
|
| |
this function, otherwise the "import nntplib" we forgot about whacks
the one we wanted!
|
| |
|
|
|
| |
password confirmation when the user doesn't have a password (and how
can that happen?!)
|
| |
|
|
| |
wasn't set.
|
| |
|
|
|
|
|
|
|
|
|
| |
My /mailman/listinfo page was missing a </BODY> tag. It looks
like it is missing from all pages generated by
mailman/htmlformat.py
As long as I was looking at the HTML source, I noticed that it
quoted the attribute values for some of the tags (like for the
BODY tag), but not those for table, table rows, and cells. That
led to things like 100% and #99CCFF not being quoted literals.
|
| |
|
|
|
| |
latter config variable is misnamed: @URL@ really contains the complete
fqdn for the host.
|
| |
|
|
|
|
|
| |
Jim Tittsler writes:
Posting also requires the server to be in 'mode reader' (at least
our INN does). I think you only updated the cron/gatenews...
|
| |
|
|
| |
longer necessary.
|
| | |
|
| |
|
|
|
|
| |
member_posting_only to 0 unconditionally -- which could whack the
value on every schema update. Now we only do this when upgrading from
data_version 10 or earlier.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
requests.db database. This should be the last major hurdle for the
new version. Specifically,
NewRequestsDatabase(): This knows about the 1.1 style mlist.requests
dictionary, which served as the pending requests database. It sucks
everything out of this dict and resubmits the requests using the new
APIs. Worst thing that happens its that the timestamps get blown
away. Oh well.
older(): Removed since it's not used anywhere.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Mailman, Python, and GNU are displayed. I'm not 100% sure I like
this...
Specifically,
Container.Format(): More efficient text generator which uses [].append
and string.join instead of operator add.
MailmanLogo(): New definition of standard footer as described above.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Mailman, Python, and GNU are displayed. I'm not 100% sure I like
this...
Specifically,
MAILMAN_URL: point this to the gnu.org subpage, instead of the
list.org mirror.
IMAGE_LOGOS: flag to specify whether logos are displayed or not (if
not, then slogan alone in linked text is displayed).
|
| |
|
|
| |
reader from the NNTP class constructor.
|
| |
|
|
|
|
| |
address of the message. GetEnvelopeSender() no longer exists (and
GetSender() keys off of USE_ENVELOPE_SENDER, so it still has the same
basic functionality).
|
| |
|
|
|
|
|
|
|
| |
go through this one method. This consolidates and makes consistent
the use of the From:, Sender:, and envelope-sender headers, and the
search order based on USE_ENVELOPE_SENDER. The docstring explains the
semantics of this method.
GetEnvelopeSender(): Removed.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| | |
|
| |
|
|
|
| |
to handle the case where the header is set to an explicit address, as
specified in mlist.reply_to_address.
|
| | |
|
| |
|
|
| |
attribute.
|