diff options
Diffstat (limited to 'Mailman/testing')
| -rw-r--r-- | Mailman/testing/base.py | 42 | ||||
| -rw-r--r-- | Mailman/testing/emailbase.py | 9 | ||||
| -rw-r--r-- | Mailman/testing/test_handlers.py | 7 | ||||
| -rw-r--r-- | Mailman/testing/test_membership.py | 26 | ||||
| -rw-r--r-- | Mailman/testing/test_security_mgr.py | 42 |
5 files changed, 65 insertions, 61 deletions
diff --git a/Mailman/testing/base.py b/Mailman/testing/base.py index cb0a78819..a61740956 100644 --- a/Mailman/testing/base.py +++ b/Mailman/testing/base.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -18,6 +18,8 @@ """Test base class which handles creating and deleting a test list.""" import os +import grp +import pwd import stat import shutil import difflib @@ -25,19 +27,25 @@ import tempfile import unittest from cStringIO import StringIO +from sqlalchemy.orm import clear_mappers from Mailman import MailList from Mailman import Utils from Mailman.bin import rmlist from Mailman.configuration import config +from Mailman.database.dbcontext import dbcontext NL = '\n' -PERMISSIONS = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH class TestBase(unittest.TestCase): def _configure(self, fp): + # Make sure that we don't pollute the real database with our test + # mailing list. + test_engine_url = 'sqlite:///' + self._dbfile + print >> fp, 'SQLALCHEMY_ENGINE_URL = "%s"' % test_engine_url + config.SQLALCHEMY_ENGINE_URL = test_engine_url print >> fp, 'add_domain("example.com", "www.example.com")' # Only add this domain once to the current process if 'example.com' not in config.domains: @@ -54,24 +62,37 @@ class TestBase(unittest.TestCase): raise self.failureException(fp.getvalue()) def setUp(self): + mailman_uid = pwd.getpwnam(config.MAILMAN_USER).pw_uid + mailman_gid = grp.getgrnam(config.MAILMAN_GROUP).gr_gid # Write a temporary configuration file, but allow for subclasses to - # add additional data. - fd, self._config = tempfile.mkstemp(suffix='.cfg') + # add additional data. Make sure the config and db files, which + # mkstemp creates, has the proper ownership and permissions. + fd, self._config = tempfile.mkstemp(dir=config.DATA_DIR, suffix='.cfg') os.close(fd) + os.chmod(self._config, 0440) + os.chown(self._config, mailman_uid, mailman_gid) + fd, self._dbfile = tempfile.mkstemp(dir=config.DATA_DIR, suffix='.db') + os.close(fd) + os.chmod(self._dbfile, 0660) + os.chown(self._dbfile, mailman_uid, mailman_gid) fp = open(self._config, 'w') try: self._configure(fp) finally: fp.close() - os.chmod(self._config, PERMISSIONS) + # Be sure to close the connection to the current database, and then + # reconnect to the new temporary SQLite database. Otherwise we end up + # with turds in the main database and our qrunner subprocesses won't + # find the mailing list. Because our global config object's + # SQLALCHEMY_ENGINE_URL variable has already been updated, the + # connect() call will open the database file the qrunners will be + # rendezvousing on. + dbcontext.close() + clear_mappers() + dbcontext.connect() mlist = MailList.MailList() mlist.Create('_xtest@example.com', 'owner@example.com', 'xxxxx') mlist.Save() - # We need to reload the mailing list to ensure that the member - # adaptors are all sync'd up. This isn't strictly necessary with the - # OldStyleMemberships adaptor, but it may be required for other - # adaptors - mlist.Load() # This leaves the list in a locked state self._mlist = mlist @@ -80,3 +101,4 @@ class TestBase(unittest.TestCase): rmlist.delete_list(self._mlist.fqdn_listname, self._mlist, archives=True, quiet=True) os.unlink(self._config) + os.unlink(self._dbfile) diff --git a/Mailman/testing/emailbase.py b/Mailman/testing/emailbase.py index 3421efb4b..e033195de 100644 --- a/Mailman/testing/emailbase.py +++ b/Mailman/testing/emailbase.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -56,6 +56,10 @@ class EmailBase(TestBase): TestBase._configure(self, fp) print >> fp, 'SMTPPORT =', TESTPORT config.SMTPPORT = TESTPORT + # Don't go nuts on mailmanctl restarts. If a qrunner fails once, it + # will keep failing. + print >> fp, 'MAX_RESTARTS = 1' + config.MAX_RESTARTS = 1 def setUp(self): TestBase.setUp(self) @@ -86,7 +90,7 @@ class EmailBase(TestBase): time.sleep(3) except socket.error, e: # IWBNI e had an errno attribute - if e[0] == errno.ECONNREFUSED: + if e[0] in (errno.ECONNREFUSED, errno.ETIMEDOUT): break else: raise @@ -105,6 +109,7 @@ class EmailBase(TestBase): MSGTEXT = None except asyncore.ExitNow: pass + asyncore.close_all() return MSGTEXT finally: self._mlist.Lock() diff --git a/Mailman/testing/test_handlers.py b/Mailman/testing/test_handlers.py index 09ca56c29..2e964389e 100644 --- a/Mailman/testing/test_handlers.py +++ b/Mailman/testing/test_handlers.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -30,6 +30,7 @@ from email.Generator import Generator from Mailman import Errors from Mailman import Message from Mailman import Version +from Mailman import passwords from Mailman.MailList import MailList from Mailman.Queue.Switchboard import Switchboard from Mailman.configuration import config @@ -57,8 +58,8 @@ from Mailman.Handlers import ToUsenet -def password(plaintext): - return sha.new(plaintext).hexdigest() +def password(cleartext): + return passwords.make_secret(cleartext, 'ssha') diff --git a/Mailman/testing/test_membership.py b/Mailman/testing/test_membership.py index b98e1b187..ed8ebb1f4 100644 --- a/Mailman/testing/test_membership.py +++ b/Mailman/testing/test_membership.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,6 +24,7 @@ import unittest from Mailman import MailList from Mailman import MemberAdaptor from Mailman import Utils +from Mailman import passwords from Mailman.Errors import NotAMemberError from Mailman.UserDesc import UserDesc from Mailman.configuration import config @@ -31,6 +32,11 @@ from Mailman.testing.base import TestBase +def password(cleartext): + return passwords.make_secret(cleartext, 'ssha') + + + class TestNoMembers(TestBase): def test_no_member(self): eq = self.assertEqual @@ -78,9 +84,10 @@ class TestNoMembers(TestBase): class TestMembers(TestBase): def setUp(self): TestBase.setUp(self) + self._member_password = password('xxXXxx') self._mlist.addNewMember('person@dom.ain', digest=0, - password='xxXXxx', + password=self._member_password, language='xx', realname='A. Nice Person') @@ -95,7 +102,7 @@ class TestMembers(TestBase): eq(mlist.getMemberCPAddress('person@dom.ain'), 'person@dom.ain') eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')), ['person@dom.ain', None]) - eq(mlist.getMemberPassword('person@dom.ain'), 'xxXXxx') + eq(mlist.getMemberPassword('person@dom.ain'), self._member_password) eq(mlist.getMemberLanguage('person@dom.ain'), 'en') eq(mlist.getMemberOption('person@dom.ain', config.Digests), 0) eq(mlist.getMemberOption('person@dom.ain', config.AcknowledgePosts), 0) @@ -106,7 +113,7 @@ class TestMembers(TestBase): mlist = self._mlist self.failIf(mlist.authenticateMember('person@dom.ain', 'xxx')) self.assertEqual(mlist.authenticateMember('person@dom.ain', 'xxXXxx'), - 'xxXXxx') + self._member_password) def test_remove_member(self): eq = self.assertEqual @@ -161,7 +168,7 @@ class TestMembers(TestBase): eq(mlist.getMemberCPAddress('nice@dom.ain'), 'nice@dom.ain') eq(mlist.getMemberCPAddresses(('nice@dom.ain', 'nonice@dom.ain')), ['nice@dom.ain', None]) - eq(mlist.getMemberPassword('nice@dom.ain'), 'xxXXxx') + eq(mlist.getMemberPassword('nice@dom.ain'), self._member_password) eq(mlist.getMemberLanguage('nice@dom.ain'), 'en') eq(mlist.getMemberOption('nice@dom.ain', config.Digests), 0) eq(mlist.getMemberOption('nice@dom.ain', config.AcknowledgePosts), 0) @@ -188,9 +195,10 @@ class TestMembers(TestBase): def test_set_password(self): eq = self.assertEqual mlist = self._mlist - mlist.setMemberPassword('person@dom.ain', 'yyYYyy') - eq(mlist.getMemberPassword('person@dom.ain'), 'yyYYyy') - eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), 'yyYYyy') + new_password = password('yyYYyy') + mlist.setMemberPassword('person@dom.ain', new_password) + eq(mlist.getMemberPassword('person@dom.ain'), new_password) + eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), new_password) self.failIf(mlist.authenticateMember('person@dom.ain', 'xxXXxx')) def test_set_language(self): @@ -200,7 +208,7 @@ class TestMembers(TestBase): odesc = config.LC_DESCRIPTIONS.copy() try: config.add_language('xx', 'Xxian', 'utf-8') - self._mlist.available_languages.append('xx') + self._mlist.add_language('xx') self._mlist.setMemberLanguage('person@dom.ain', 'xx') self.assertEqual(self._mlist.getMemberLanguage('person@dom.ain'), 'xx') diff --git a/Mailman/testing/test_security_mgr.py b/Mailman/testing/test_security_mgr.py index a8b056464..543330aed 100644 --- a/Mailman/testing/test_security_mgr.py +++ b/Mailman/testing/test_security_mgr.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2006 by the Free Software Foundation, Inc. +# Copyright (C) 2001-2007 by the Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -24,23 +24,19 @@ import errno import Cookie import unittest -try: - import crypt -except ImportError: - crypt = None - # Don't use cStringIO because we're going to inherit from StringIO import StringIO from Mailman import Errors from Mailman import Utils +from Mailman import passwords from Mailman.configuration import config from Mailman.testing.base import TestBase -def password(plaintext): - return sha.new(plaintext).hexdigest() +def password(cleartext): + return passwords.make_secret(cleartext, 'ssha') @@ -130,34 +126,6 @@ class TestAuthenticate(TestBase): self.assertEqual(self._mlist.Authenticate( [config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized) - def test_list_admin_upgrade(self): - eq = self.assertEqual - mlist = self._mlist - mlist.password = md5.new('ssSSss').digest() - eq(mlist.Authenticate( - [config.AuthListAdmin], 'ssSSss'), config.AuthListAdmin) - eq(mlist.password, password('ssSSss')) - # Test crypt upgrades if crypt is supported - if crypt: - mlist.password = crypt.crypt('rrRRrr', 'zc') - eq(self._mlist.Authenticate( - [config.AuthListAdmin], 'rrRRrr'), config.AuthListAdmin) - eq(mlist.password, password('rrRRrr')) - - def test_list_admin_oldstyle_unauth(self): - eq = self.assertEqual - mlist = self._mlist - mlist.password = md5.new('ssSSss').digest() - eq(mlist.Authenticate( - [config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized) - eq(mlist.password, md5.new('ssSSss').digest()) - # Test crypt upgrades if crypt is supported - if crypt: - mlist.password = crypted = crypt.crypt('rrRRrr', 'zc') - eq(self._mlist.Authenticate( - [config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized) - eq(mlist.password, crypted) - def test_list_moderator(self): self._mlist.mod_password = password('mmMMmm') self.assertEqual(self._mlist.Authenticate( @@ -165,7 +133,7 @@ class TestAuthenticate(TestBase): def test_user(self): mlist = self._mlist - mlist.addNewMember('aperson@dom.ain', password='nosrepa') + mlist.addNewMember('aperson@dom.ain', password=password('nosrepa')) self.assertEqual(mlist.Authenticate( [config.AuthUser], 'nosrepa', 'aperson@dom.ain'), config.AuthUser) |
