| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
| |
misconfigured in mm_cfg.py to be missing a trailing slash, one will be
added upon list creation.
|
| | |
|
| |
|
|
|
|
|
|
| |
into MMUnknownListError.
ProcessConfirmation(): Fix unpacking of the data coming back from
Pending.confirm(). op is always the first element, but data is the
1st through nth elements.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
removals. Specifically,
AddMember(): Use the new Pending.new() function interface, which
requires that an appropriate operation key come first.
ProcessConfirmation(): Include more detail on the MMBadConfirmation
exceptions. Decode the operation key first to see whether we're doing
a SUBSCRIPTION or an UNSUBSCRIPTION confirmation. The latter is new
and simply calls DeleteMember() if confirmed.
ConfirmUnsubscription(): Similar to subscription confirmation, this
generates a response with the removal confirmation instructions and
url.
|
| |
|
|
|
|
|
|
| |
new style verify.txt response message, which now also contains the
confirmation url.
ProcessConfirmation(): Use the new Pending module interface. Watch
for tuple unpack errors. Return the unpacked data when successful.
|
| |
|
|
|
| |
"... confirm <number>" instead of "... request <number>". This goes
along with changes to MailCommandHandler.py.
|
| |
|
|
|
|
|
| |
Also, comment out `web_page_url' -- it's probably just too dangerous
to allow list admins to change this via the web. Making a mistake
breaks the list (for the rare situation where the base url needs
changing, it's up to the site admin to effect).
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
| |
GetConfigInfo(): Move the setup of the language popup menu choices to
outside the setting of config_info.
Next round of big i18n patches.
Fix some _() wrappings to use local variables.
Fix the Utils.maketext() calls to pass the language in as a keyword
argument.
|
| |
|
|
| |
that differently now.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
References to HandlerAPI module removed.
Also, remove filter_prog attribute from the list object.
GetConfigInfo(): Add lots of i18n markup for translatable strings.
All the attribute descriptions and details are now marked.
AddMember(), ApprovedAddMember(), DeleteMember(): Use new Message
interface for sending internally crafted messages.
ApprovedAddMember(): Move the lang argument to the end for better
backwards compatibility.
HasExplicitDest(): Use new mimelib/Message interface.
HasMatchingHeader() -> hasMatchingHeader(), and simplify greatly.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
InitVars(): added `language' and `preferred_language' list attributes.
GetConfigInfo(): Show languages from the available languages.
SetPreferredLanguage(), GetPreferredLanguage(),
GetAvailableLanguages(): New methods to manipulate list language
options.
AddMember(), ApprovedAddMember(), ApprovedAddMembers(): Add new
optional argument `lang', which gets stored as the user's preferred
language.
Also, mark a bunch of strings as translatable.
|
| | |
|
| |
|
|
| |
and reply_to_address configuration options.
|
| |
|
|
| |
data_version attribute, unless the list is locked.
|
| | |
|
| |
|
|
| |
Simon Hill's dissenting opinion on Reply-To munging.
|
| |
|
|
|
|
| |
returned by getaddrlist() will return None. This happens if the
header value is simply not RFC822 compliant. In that case, ignore
this element.
|
| |
|
|
| |
final RFC 2369).
|
| |
|
|
|
| |
msg_header and msg_footer. Closes SF bug #114167, Jitterbug PR
#209.
|
| |
|
|
| |
(saves an extra leading space in that case).
|
| |
|
|
|
|
|
| |
which are legal re: RFC822, but aren't valid for URLs. urllib.quote()
the address part of the URL.
Closes SF bug #113787.
|
| |
|
|
|
|
|
|
|
| |
option. Changing web_page_url to an invalid base url will hose your
list royally, requiring the site administrator to fix the url.
There's no good way to sanity check the value entered, so the best we
can do is have a warning explaning the situation.
Closes SF bug #113739.
|
| |
|
|
|
|
|
| |
IOErrors. E.g. the marshal module doesn't actually check for write()
errors, so we dump the marshal to the string and write it in one fell
swoop using the file object's write() method. Thanks to GvR for
reviewing.
|
| |
|
|
| |
slash.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
response to SF Bug #110753. Specifically,
GetScriptURL(): Interface change; this now takes an `absolute' flag
defaulting to always use relative urls. This is now essentially just
a wrapper around Utils.ScriptURL() except that it tacks on the list's
name.
GetOptionsURL(): Same interface change.
GetAbsoluteScriptURL(), GetAbsoluteOptionsURL(): Removed. All uses
changed to GetScriptURL().
|
| |
|
|
|
| |
20-Jun-2000; Resent-CC: should also be considered an explicit
destination.
|
| |
|
|
|
| |
fix the missing To: line in admin notifications of subscribes and
unsubscribes.
|
| |
|
|
|
| |
Lock(): If the Load() call fails with an MMUnknownListError, be sure
to unlock the list before re-raising the exception.
|
| |
|
|
|
|
|
|
|
|
| |
here because that reloads the database as a side-effect - but the
config.db file doesn't exist at this point! This fixes the newlist
problem. Also, there's no need to create the LOCK_DIR file; and use a
safer way to create the next-digest and next-digest-topics files
(which I'm not sure are strictly necessary anymore).
CreateFiles(): Removed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Lock(): Always re-load the config.db file once the lock has been
acquired. This fixes a very serious data consistency bug, explained
briefly as:
- Process A opens a list unlocked, loading the marshaled
dictionary. Process A then tries to acquire the list lock.
- Meanwhile, Process B does the same, but it actually acquires the
lock first. Process B makes some changes, saves the list's
marshal and relinquishes the lock.
- Process A now acquires the lock. However, its database is now
out-of-date because of the Process B write. It does its work
and blithely rewrites the marshal, blowing away all of Process
B's changes.
The solution is to reload the marshal when the list lock is acquired.
__init__(): Use the new Lock() semantics more efficiently.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
|
|
|
|
|
| |
Also,
__del__(), InitTempVars(): Remove all references to _log_files. Also,
remove the withlogging argument to InitTempVars().
LogMsg(), CloseLogs(): Removed.
|
| |
|
|
|
|
|
| |
config.db exists but is corrupt (i.e. doesn't unmarshal into a
dictionary).
__load(): Implements all the internal db loading logic.
|
| |
|
|
|
|
| |
isn't found then we finally raise an exception. If config.db.last is
used, shutil.copy() it back to config.db so that the logic in __save()
doesn't need to change.
|
| | |
|
| |
|
|
| |
CheckVersion(): Only Save() if the list is already locked.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
scripts/post and other places to catch lock timeouts in a way that can
be reasonably handled. Specifically,
__init__(): Don't pass the lock flag to InitTempVars(). Instead, use
it directly in the constructor.
InitTempVars(): This doesn't get a lock argument anymore, but it still
creates the lock file. Also, the withlogging argument takes its
default from mm_cfg.LIST_LOCK_DEBUGGING so it's easier to turn on lock
debugging globally.
Load(): No longer lock the database here. Load() is essentially used
internally anyway.
Post(): Removed. All email generated internally is sent directly via
the HandlerAPI interface.
Lock(): Now has a timeout argument, which is passed to the underlying
LockFile.lock() method.
|
| |
|
|
|
| |
which controls whether a use should get an acknowledgement message
when they are unsubscribed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
acceptable_aliases, based on Harald's suggestion:
1) If the regexp does not contain an '@', first try matching it
against the localpart (i.e. the way things work now).
2) If 1) was skipped *or* if it didn't produce a match, try
matching against entire recip address (i.e. try this even if
the regexp does not contain any '@' signs).
GetConfigInfo(): Document the new semantics for acceptable_aliases.
|
| |
|
|
|
|
|
|
|
|
| |
HasExplicitDest(): extend the semantics of the acceptable_aliases
regular expression so that if the regexp includes an `@', the regexp
is match against the entire recipient address. Otherwise it's matched
just against the localpart, as before.
GetConfigInfo(): Document the extended semantics for
acceptable_aliases.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
list already exists.
Save(): Slightly better way to ignore ENOENT errors when unlinking a
potentially non-existant config.db.tmp file.
CheckValues(): cosmetic
ApprovedAddMembers(): Another couple of very minor performance hacks.
HasExplicitDest(): Harald undid my change of 1.146, dated 16-Dec-1999
which switched the order of the arguments to re.match. Harald is
correct: the "recip" is the string to match against the "stripped"
pattern. I /think/ my earlier problems were related to the use of
re.match instead of re.search, so I'm changing things here to use
re.search (i.e. the pattern can match anywhere inside recips, not just
at the beginning). Let's see if this works, but I'm most
uncomfortable about this change.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
mm_cfg.Email, not mm_cfg.String.
Create(): Use Utils.list_exists().
Save(): If writing to fname_tmp failed, only try unlinking fname_tmp
if it in fact does exist.
CheckValues(): Use urlparse module to verify that neither the scheme
("http") nor the network location ("www.python.org") of the
web_page_url are empty. If either one is found to be empty, set
self.web_page_url to mm_cfg.DEFAULT_URL.
ApprovedAddMembers(): Some very minor performance improvements.
HasExplicitDest(): Had the order of arguments to re.match() wrong.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
| |
|
|
| |
Utils.reraise() hack.
|
| |
|
|
| |
minutes, instead of hardcoding a value in place.
|
| | |
|