| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
| |
ApprovedDeleteMember() so that the request can go through admin
approval if required.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
GetUnsubscriptionIds(): Return all the pending admin requests that are
UNSUBSCRIPTIONs.
HandleRequest(): Add support for UNSUBSCRIPTION type records.
HoldSubscription(): Use the list's internal name, not its real name in
the message to the admin.
HoldUnsubscription(), __handleunsubscription(): Support for holding
unsubscription requests, as well as handling their disposition, which
can be DEFER, DISCARD, REJECT, or UNSUBSCRIBE.
|
| |
|
|
| |
sent to the user when they're unsubscribed.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
is sent when a user gets unsubscribed.
DEFAULT_UNSUBSCRIBE_POLICY: Default flag for whether unsubscriptions
require admin approval or not.
ALLOW_RFC2369_OVERRIDES: Site admin switch which, if true, will allow
list owners to suppress RFC 2369 List-* headers.
UNSUBSCRIBE: New ListAdmin request enum.
|
| |
|
|
|
|
|
|
| |
their own policies. Specifically, added first_strip_reply_to which
will control whether any additional Reply-To: headers override or
extend an existing such field.
Also, we no longer save the old Reply-To: header on X-Reply-To:
|
| |
|
|
|
| |
rearranging of variables and added some section headers for clearer
organization.
|
| |
|
|
| |
description three times (two should be enough <wink>).
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
first_strip_reply_to.
|
| |
|
|
| |
short-circuit exit after processing password change.
|
| | |
|
| |
|
|
| |
default_member_moderation to clarify.
|
| |
|
|
|
|
|
|
|
|
|
| |
- Legend goes back on top of the member list
- A new "Additional Member Tasks" section which contains the search
button (rearranged), and a new set moderator flag button
- You can now toggle all members' moderate flag either on or off
(defaults to default_member_moderation), including those members not
visible on the screen.
|
| |
|
|
| |
mailmanctl and qrunner.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
ownership to its forked children. You shouldn't normally use these
methods, but to make mailmanctl maximally convenient, we need to
create a lock in a parent and manage the lock in the child.
_transfer_to(): Called in the parent, this twiddles with lock
internals to set the temp file name to include the pid of the child
(passed in). It also transfers lock claims to the new temp file,
i.e. the child, and removes the claim made by the parent (the previous
winner).
_take_possession(): Called by the child, this resets the temp file
name to include the pid of the child. For this, it had the pid of the
parent process prior to the fork.
__del__(): Don't finalize() the lock if we don't own it (ownership is
implied by creation, and relinquished by _transfer_to()). This way,
when the parent transfers ownership to the child and then exits with
sys.exit(), the act of destroying the lock instance in the parent
won't unlock the lock.
__init__(): Initialize __owned to 1.
|
| |
|
|
| |
BIN_DIR: New convenience variable (used by mailmanctl).
|
| |
|
|
| |
message/rfc822 MIME encapsulation rather than Resent-To: headers.
|
| |
|
|
|
|
|
| |
import cPickle as pickle
Convert to use email package so we're dealing with one kind of Message
object.
|
| |
|
|
| |
Also, remove pickle import since it doesn't seem to be used anywhere.
|
| |
|
|
|
|
| |
uses a factory that produces our own Message objects.
send_i18n_digests(): Use our Mailbox instead of mailbox.UnixMailbox.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
moderated, member_posting_only, and posters. All these are replaced
by the new sender-centric moderation tests in Moderate.py.
hold_for_approval(): When sending the hold notification to the list
admin, structure the message into a 3-part multipart/mixed:
- the text/plain hold notification message as before
- an rfc822/message encapsulation of the original held message
- an rfc822/message confirmation message, containing the hold cookie,
to which the list admin can respond to approve or discard the held
message.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
subcat argument. If the category doesn't apply to this gui component,
None is returned, otherwise the config list is returned.
Also (and more importantly), separate privacy filters into three
subcategories: "subscribing" for general subscription and visibility
options, "sender" for sender-centric moderation filters, and "spam"
for anti-spam controls.
And, add all the new sender-centric moderation variables while
removing the old ones.
|
| |
|
|
|
|
|
|
| |
subcat argument. If the category doesn't apply to this gui component,
None is returned, otherwise the config list is returned.
Also: Add between the words so HTML won't break on word
boundaries.
|
| |
|
|
|
| |
subcat argument. If the category doesn't apply to this gui component,
None is returned, otherwise the config list is returned.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
the new ones. I think this is as close as we can get:
- add default_member_moderation, accept_these_nonmembers,
hold_these_nonmembers, reject_these_nonmembers,
discard_these_nonmembers, forward_auto_discards,
generic_nonmember_action
- moderated -> generic_nonmember_action, also if we were moderating
this list, then the generic_nonmember_action should be to hold the
message, otherwise it should be to accept it.
- for each address in forbidden_posters, if the address is a member,
set their moderate flag to true, otherwise add them to
hold_these_nonmembers.
- posters (fun! not.) and member_posting_only: if member_posting_only
== yes and there are posters, then they are members and non-members
we automatically accept. So for members, turn off their moderation
bit, and for non-members we add them to accept_these_nonmembers.
BUT! if member_post_only == no, posters is the list of addresses we
only accept, with all others being held. So, first turn the
moderation bit on for all members, then for addresses in posters
which are members, turn their moderation bit off, and for addresses
which are nonmembers, add them to accept_these_nonmembers. Phew!
|
| |
|
|
| |
moderation attributes.
|
| |
|
|
| |
in the dict to lowercase (yes they must be strings).
|
| | |
|
| |
|
|
|
|
|
| |
that any new message objects it creates will be instances of our
Message class instead of rfc822's.
Mailbox.__init__(): Pass our _factory to base class constructor.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
attributes posters, forbidden_posters, moderated, and
member_posting_only. Add initializations for the new sender-centric
moderation attributes default_member_moderation,
accept_these_nonmembers, hold_these_nonmembers,
reject_these_nonmembers, discard_these_nonmembers,
forward_auto_discards, generic_nonmember_action.
GetConfigInfo(): Rework this framework so that it doesn't return a
dictionary with keys being the category. Instead, pass the category
and subcategory in as arguments and let the dispatched-to gui methods
decide whether and what to return in response to these arguments.
This allows the framework to be more robust, and to easily handle
extensions via subcategories (as was done to the Privacy category).
ApprovedAddMember(): Set the newly subscribed member's Moderate flag
to self.default_member_moderation.
ProcessConfirmation(): Argument userdesc_overrides -> context. In the
SUBSCRIPTION clause, only add context to userdesc if context is an
instance of UserDesc.
Also, add a HELD_MESSAGE clause which handles admin approval/discard
of held messages via email response. This code is a bit more
elaborate than I'd like it to be, so perhaps it should be factored
out. ;/
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Pass subcat to change_options() and show_results() calls.
option_help(): Get both category and subcat from varhelp.
Include the standard footer when no valid variable name is found.
Be sure the form action url includes any subcat.
Pass subcat to add_options_table_item() call.
show_results(): category_suffix -> subcat. Be sure to include the
subcat in the form action url. Pass subcat to the show_variables()
call.
show_variables(): Accept subcat, and pass it along to the
add_options_table_item() call.
add_options_table_item(): Accept subcat and pass it along to the
get_item_gui_description() call.
get_item_gui_description(): Accept subcat, and make sure that the VARHELP
query url extension includes any subcat, otherwise the variable lookup
will fail.
member_options(): Include another column which contains the mod
user-specific moderation bit.
change_options(): Accept subcat, and be sure to pass that into the
GetConfigInfo() calls. Also, set the user's Moderate flag based on
the value of the user_mod key.
|
| |
|
|
| |
the second argument to ProcessConfirmation().
|
| |
|
|
| |
message. Add a notice() method to return the rejection notice.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
module, so that sender-centric moderation can be performed before more
general content-based moderation.
DEFAULT_MODERATED: Removed
DEFAULT_DEFAULT_MEMBER_MODERATION: New flag which determines what the
default state of the member-moderation bit is for newly subscribed
members.
DEFAULT_FORWARD_AUTO_DISCARDS: New flag which describes the default
for whether auto-discards should include a forward to the list
administrator.
DEFAULT_GENERIC_NONMEMBER_ACTION: What is the default action for the
generic non-member filter?
DEFAULT_MEMBER_POSTING_ONLY: Removed
Moderate: New options flag implementing per-user moderate bit.
|
| |
|
|
| |
notice() method, which returns the notice as a string.
|
| |
|
|
| |
up with what options.py expects.
|
| |
|
|
| |
makes the "Authentication failed" tests work.
|
| |
|
|
|
| |
NNTP_REMOVE_HEADERS and NNTP_REWRITE_DUPLICATE_HEADERS as a more
general approach.
|
| |
|
|
| |
was being ignored for digest delivery!
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
more bulletproof against membership mining for private rosters.
If rosters are private, then we'll just put up a fairly generic
acknowledgement that's the same regardless of what kind of approval is
necessary, or whether the email address is already subscribed or not.
Thus no information about private rosters can leak.
Note also that if a subscription request comes in for an already
subscribed address (using private rosters of course), then we send an
alert to the address to let them know that somebody was trying to
re-subscribe their address or mine the membership.
I also rewrote a bunch of the results strings (sorry translators!)
remote_addr(): Remove this. We can do it more cleanly inlined.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
membership mining when private rosters are being used. Also, fix a
bug in the chopping up of the url parts.
We now print the "Authentication failed" message in the authentication
clause when the `password' key, not the `login' key is present (the
latter won't be when the email address is given on the url, but the
former will always be present).
When mlist.private_roster is <> 0, this means we do have private
rosters (either to the list membership or to the list admins). In
that case, set user to None and continue on. The display will use the
provided email address even if it's not a member, and we'll get a
normal "Authentication failed" message, which doesn't reveal whether
it was the email address or the password that mismatched.
loginpage(): Always set the form action to .../mailman/options
without the email address in the url. If the user was provided to the
login script, hide it (obscured) in a Hidden input field. This way,
we essentially clear any unauthorized emails from the url.
|
| |
|
|
| |
as the exception value.
|
| |
|
|
|
|
|
|
|
|
|
| |
gets gated mail->news. Specifically,
NNTP_REMOVE_HEADERS: This is a list of headers to remove from the
message before posting to nntp.
NNTP_REWRITE_DUPLICATE_HEADERS: A list of headers that should get
moved if there are more than one in the message. Contains a tuple of
the original field name and the new field name.
|
| |
|
|
|
| |
supply an empty list as the failobj so we can still iterate over the
return value.
|
| |
|
|
|
|
| |
which %(listname)s will be interpolated. This makes it possible to
set PUBLIC_ARCHIVE_URL to something that's appropriate for (hopefully)
any external archiver.
|
| |
|
|
|
|
| |
to be a template into which %(listname)s will be interpolated. This
makes it possible to set PUBLIC_ARCHIVE_URL to something that's
appropriate for (hopefully) any external archiver.
|
| |
|
|
|
| |
message (because of ADMINDB_PAGE_TEXT_LIMIT), join the strings with
the empty string, not newlines.
|