| Index: third_party/twisted_8_1/twisted/test/test_strcred.py
|
| diff --git a/third_party/twisted_8_1/twisted/test/test_strcred.py b/third_party/twisted_8_1/twisted/test/test_strcred.py
|
| deleted file mode 100644
|
| index 07096ca22007143b67928569c7496235c1b83afe..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/test/test_strcred.py
|
| +++ /dev/null
|
| @@ -1,623 +0,0 @@
|
| -# Copyright (c) 2007-2008 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Tests for L{strcred}.
|
| -"""
|
| -
|
| -import os
|
| -import StringIO
|
| -
|
| -from twisted import plugin
|
| -from twisted.trial import unittest
|
| -from twisted.cred import credentials, checkers, error, strcred
|
| -from twisted.plugins import cred_file, cred_anonymous
|
| -from twisted.python import usage
|
| -
|
| -
|
| -try:
|
| - import crypt
|
| -except ImportError:
|
| - crypt = None
|
| -
|
| -try:
|
| - import pwd
|
| -except ImportError:
|
| - pwd = None
|
| -
|
| -try:
|
| - import spwd
|
| -except ImportError:
|
| - spwd = None
|
| -
|
| -
|
| -
|
| -def getInvalidAuthType():
|
| - """
|
| - Helper method to produce an auth type that doesn't exist.
|
| - """
|
| - invalidAuthType = 'ThisPluginDoesNotExist'
|
| - while (invalidAuthType in
|
| - [factory.authType for factory in strcred.findCheckerFactories()]):
|
| - invalidAuthType += '_'
|
| - return invalidAuthType
|
| -
|
| -
|
| -
|
| -class TestPublicAPI(unittest.TestCase):
|
| -
|
| - def test_emptyDescription(self):
|
| - """
|
| - Test that the description string cannot be empty.
|
| - """
|
| - iat = getInvalidAuthType()
|
| - self.assertRaises(strcred.InvalidAuthType, strcred.makeChecker, iat)
|
| - self.assertRaises(strcred.InvalidAuthType, strcred.findCheckerFactory, iat)
|
| -
|
| -
|
| - def test_invalidAuthType(self):
|
| - """
|
| - Test that an unrecognized auth type raises an exception.
|
| - """
|
| - iat = getInvalidAuthType()
|
| - self.assertRaises(strcred.InvalidAuthType, strcred.makeChecker, iat)
|
| - self.assertRaises(strcred.InvalidAuthType, strcred.findCheckerFactory, iat)
|
| -
|
| -
|
| -
|
| -class TestStrcredFunctions(unittest.TestCase):
|
| -
|
| - def test_findCheckerFactories(self):
|
| - """
|
| - Test that findCheckerFactories returns all available plugins.
|
| - """
|
| - availablePlugins = list(strcred.findCheckerFactories())
|
| - for plg in plugin.getPlugins(strcred.ICheckerFactory):
|
| - self.assertIn(plg, availablePlugins)
|
| -
|
| -
|
| - def test_findCheckerFactory(self):
|
| - """
|
| - Test that findCheckerFactory returns the first plugin
|
| - available for a given authentication type.
|
| - """
|
| - self.assertIdentical(strcred.findCheckerFactory('file'),
|
| - cred_file.theFileCheckerFactory)
|
| -
|
| -
|
| -
|
| -class TestMemoryChecker(unittest.TestCase):
|
| -
|
| - def setUp(self):
|
| - self.admin = credentials.UsernamePassword('admin', 'asdf')
|
| - self.alice = credentials.UsernamePassword('alice', 'foo')
|
| - self.badPass = credentials.UsernamePassword('alice', 'foobar')
|
| - self.badUser = credentials.UsernamePassword('x', 'yz')
|
| - self.checker = strcred.makeChecker('memory:admin:asdf:alice:foo')
|
| -
|
| -
|
| - def test_isChecker(self):
|
| - """
|
| - Verifies that strcred.makeChecker('memory') returns an object
|
| - that implements the L{ICredentialsChecker} interface.
|
| - """
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(self.checker))
|
| - self.assertIn(credentials.IUsernamePassword,
|
| - self.checker.credentialInterfaces)
|
| -
|
| -
|
| - def test_badFormatArgString(self):
|
| - """
|
| - Test that an argument string which does not contain user:pass
|
| - pairs (i.e., an odd number of ':' characters) raises an exception.
|
| - """
|
| - self.assertRaises(strcred.InvalidAuthArgumentString,
|
| - strcred.makeChecker, 'memory:a:b:c')
|
| -
|
| -
|
| - def test_memoryCheckerSucceeds(self):
|
| - """
|
| - Test that the checker works with valid credentials.
|
| - """
|
| - def _gotAvatar(username):
|
| - self.assertEquals(username, self.admin.username)
|
| - return (self.checker
|
| - .requestAvatarId(self.admin)
|
| - .addCallback(_gotAvatar))
|
| -
|
| -
|
| - def test_memoryCheckerFailsUsername(self):
|
| - """
|
| - Test that the checker fails with an invalid username.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badUser),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| - def test_memoryCheckerFailsPassword(self):
|
| - """
|
| - Test that the checker fails with an invalid password.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badPass),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| -
|
| -class TestAnonymousChecker(unittest.TestCase):
|
| -
|
| - def test_isChecker(self):
|
| - """
|
| - Verifies that strcred.makeChecker('anonymous') returns an object
|
| - that implements the L{ICredentialsChecker} interface.
|
| - """
|
| - checker = strcred.makeChecker('anonymous')
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(checker))
|
| - self.assertIn(credentials.IAnonymous, checker.credentialInterfaces)
|
| -
|
| -
|
| - def testAnonymousAccessSucceeds(self):
|
| - """
|
| - Test that we can log in anonymously using this checker.
|
| - """
|
| - checker = strcred.makeChecker('anonymous')
|
| - request = checker.requestAvatarId(credentials.Anonymous())
|
| - def _gotAvatar(avatar):
|
| - self.assertIdentical(checkers.ANONYMOUS, avatar)
|
| - return request.addCallback(_gotAvatar)
|
| -
|
| -
|
| -
|
| -class TestUnixChecker(unittest.TestCase):
|
| - users = {
|
| - 'admin': 'asdf',
|
| - 'alice': 'foo',
|
| - }
|
| -
|
| -
|
| - def _pwd(self, username):
|
| - return (username, crypt.crypt(self.users[username], 'F/'),
|
| - 1000, 1000, username, '/home/'+username, '/bin/sh')
|
| -
|
| -
|
| - def _spwd(self, username):
|
| - return (username, crypt.crypt(self.users[username], 'F/'),
|
| - 0, 0, 99999, 7, -1, -1, -1)
|
| -
|
| -
|
| - def setUp(self):
|
| - self.admin = credentials.UsernamePassword('admin', 'asdf')
|
| - self.alice = credentials.UsernamePassword('alice', 'foo')
|
| - self.badPass = credentials.UsernamePassword('alice', 'foobar')
|
| - self.badUser = credentials.UsernamePassword('x', 'yz')
|
| - self.checker = strcred.makeChecker('unix')
|
| - # Hack around the pwd and spwd modules, since we can't really
|
| - # go about reading your /etc/passwd or /etc/shadow files
|
| - if pwd:
|
| - self._pwd_getpwnam = pwd.getpwnam
|
| - pwd.getpwnam = self._pwd
|
| - if spwd:
|
| - self._spwd_getspnam = spwd.getspnam
|
| - spwd.getspnam = self._spwd
|
| -
|
| -
|
| - def tearDown(self):
|
| - if pwd:
|
| - pwd.getpwnam = self._pwd_getpwnam
|
| - if spwd:
|
| - spwd.getspnam = self._spwd_getspnam
|
| -
|
| -
|
| - def test_isChecker(self):
|
| - """
|
| - Verifies that strcred.makeChecker('unix') returns an object
|
| - that implements the L{ICredentialsChecker} interface.
|
| - """
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(self.checker))
|
| - self.assertIn(credentials.IUsernamePassword,
|
| - self.checker.credentialInterfaces)
|
| -
|
| -
|
| - def test_unixCheckerSucceeds(self):
|
| - """
|
| - Test that the checker works with valid credentials.
|
| - """
|
| - def _gotAvatar(username):
|
| - self.assertEquals(username, self.admin.username)
|
| - return (self.checker
|
| - .requestAvatarId(self.admin)
|
| - .addCallback(_gotAvatar))
|
| -
|
| -
|
| - def test_unixCheckerFailsUsername(self):
|
| - """
|
| - Test that the checker fails with an invalid username.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badUser),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| - def test_unixCheckerFailsPassword(self):
|
| - """
|
| - Test that the checker fails with an invalid password.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badPass),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| - if None in (pwd, spwd, crypt):
|
| - for method in (test_unixCheckerSucceeds,
|
| - test_unixCheckerFailsUsername,
|
| - test_unixCheckerFailsPassword):
|
| - method.skip = 'pwd and spwd are both unavailable'
|
| -
|
| -
|
| -
|
| -class TestFileDBChecker(unittest.TestCase):
|
| - """
|
| - Test for the --auth=file:... file checker.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.admin = credentials.UsernamePassword('admin', 'asdf')
|
| - self.alice = credentials.UsernamePassword('alice', 'foo')
|
| - self.badPass = credentials.UsernamePassword('alice', 'foobar')
|
| - self.badUser = credentials.UsernamePassword('x', 'yz')
|
| - self.filename = self.mktemp()
|
| - file(self.filename, 'w').write('admin:asdf\nalice:foo\n')
|
| - self.checker = strcred.makeChecker('file:' + self.filename)
|
| -
|
| -
|
| - def _fakeFilename(self):
|
| - filename = '/DoesNotExist'
|
| - while os.path.exists(filename):
|
| - filename += '_'
|
| - return filename
|
| -
|
| -
|
| - def test_isChecker(self):
|
| - """
|
| - Verifies that strcred.makeChecker('memory') returns an object
|
| - that implements the L{ICredentialsChecker} interface.
|
| - """
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(self.checker))
|
| - self.assertIn(credentials.IUsernamePassword,
|
| - self.checker.credentialInterfaces)
|
| -
|
| -
|
| - def test_fileCheckerSucceeds(self):
|
| - """
|
| - Test that the checker works with valid credentials.
|
| - """
|
| - def _gotAvatar(username):
|
| - self.assertEquals(username, self.admin.username)
|
| - return (self.checker
|
| - .requestAvatarId(self.admin)
|
| - .addCallback(_gotAvatar))
|
| -
|
| -
|
| - def test_fileCheckerFailsUsername(self):
|
| - """
|
| - Test that the checker fails with an invalid username.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badUser),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| - def test_fileCheckerFailsPassword(self):
|
| - """
|
| - Test that the checker fails with an invalid password.
|
| - """
|
| - return self.assertFailure(self.checker.requestAvatarId(self.badPass),
|
| - error.UnauthorizedLogin)
|
| -
|
| -
|
| - def test_failsWithEmptyFilename(self):
|
| - """
|
| - Test that an empty filename raises an error.
|
| - """
|
| - self.assertRaises(ValueError, strcred.makeChecker, 'file')
|
| - self.assertRaises(ValueError, strcred.makeChecker, 'file:')
|
| -
|
| -
|
| - def test_warnWithBadFilename(self):
|
| - """
|
| - When the file auth plugin is given a file that doesn't exist, it
|
| - should produce a warning.
|
| - """
|
| - oldOutput = cred_file.theFileCheckerFactory.errorOutput
|
| - newOutput = StringIO.StringIO()
|
| - cred_file.theFileCheckerFactory.errorOutput = newOutput
|
| - checker = strcred.makeChecker('file:' + self._fakeFilename())
|
| - cred_file.theFileCheckerFactory.errorOutput = oldOutput
|
| - self.assertIn(cred_file.invalidFileWarning, newOutput.getvalue())
|
| -
|
| -
|
| -
|
| -class DummyOptions(usage.Options, strcred.AuthOptionMixin):
|
| - """
|
| - Simple options for testing L{strcred.AuthOptionMixin}.
|
| - """
|
| -
|
| -
|
| -
|
| -class TestCheckerOptions(unittest.TestCase):
|
| -
|
| - def test_createsList(self):
|
| - """
|
| - Test that the --auth command line creates a list in the
|
| - Options instance and appends values to it.
|
| - """
|
| - options = DummyOptions()
|
| - options.parseOptions(['--auth', 'memory'])
|
| - self.assertEqual(len(options['credCheckers']), 1)
|
| - options = DummyOptions()
|
| - options.parseOptions(['--auth', 'memory', '--auth', 'memory'])
|
| - self.assertEqual(len(options['credCheckers']), 2)
|
| -
|
| -
|
| - def test_invalidAuthError(self):
|
| - """
|
| - Test that the --auth command line raises an exception when it
|
| - gets a parameter it doesn't understand.
|
| - """
|
| - options = DummyOptions()
|
| - # If someone adds a 'ThisPluginDoesNotExist' then this unit
|
| - # test should still run.
|
| - invalidParameter = getInvalidAuthType()
|
| - self.assertRaises(
|
| - usage.UsageError,
|
| - options.parseOptions, ['--auth', invalidParameter])
|
| - self.assertRaises(
|
| - usage.UsageError,
|
| - options.parseOptions, ['--help-auth-type', invalidParameter])
|
| -
|
| -
|
| - def test_createsDictionary(self):
|
| - """
|
| - Test that the --auth command line creates a dictionary
|
| - mapping supported interfaces to the list of credentials
|
| - checkers that support it.
|
| - """
|
| - options = DummyOptions()
|
| - options.parseOptions(['--auth', 'memory', '--auth', 'anonymous'])
|
| - chd = options['credInterfaces']
|
| - self.assertEquals(len(chd[credentials.IAnonymous]), 1)
|
| - self.assertEquals(len(chd[credentials.IUsernamePassword]), 1)
|
| - chdAnonymous = chd[credentials.IAnonymous][0]
|
| - chdUserPass = chd[credentials.IUsernamePassword][0]
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(chdAnonymous))
|
| - self.assertTrue(checkers.ICredentialsChecker.providedBy(chdUserPass))
|
| - self.assertIn(credentials.IAnonymous,
|
| - chdAnonymous.credentialInterfaces)
|
| - self.assertIn(credentials.IUsernamePassword,
|
| - chdUserPass.credentialInterfaces)
|
| -
|
| -
|
| - def test_credInterfacesProvidesLists(self):
|
| - """
|
| - Test that when two --auth arguments are passed along which
|
| - support the same interface, a list with both is created.
|
| - """
|
| - options = DummyOptions()
|
| - options.parseOptions(['--auth', 'memory', '--auth', 'unix'])
|
| - self.assertEquals(
|
| - options['credCheckers'],
|
| - options['credInterfaces'][credentials.IUsernamePassword])
|
| -
|
| -
|
| - def test_listDoesNotDisplayDuplicates(self):
|
| - """
|
| - Test that the list for --help-auth does not duplicate items.
|
| - """
|
| - authTypes = []
|
| - options = DummyOptions()
|
| - for cf in options._checkerFactoriesForOptHelpAuth():
|
| - self.assertNotIn(cf.authType, authTypes)
|
| - authTypes.append(cf.authType)
|
| -
|
| -
|
| - def test_displaysListCorrectly(self):
|
| - """
|
| - Test that the --help-auth argument correctly displays all
|
| - available authentication plugins, then exits.
|
| - """
|
| - newStdout = StringIO.StringIO()
|
| - options = DummyOptions()
|
| - options.authOutput = newStdout
|
| - self.assertRaises(SystemExit, options.parseOptions, ['--help-auth'])
|
| - for checkerFactory in strcred.findCheckerFactories():
|
| - self.assertIn(checkerFactory.authType, newStdout.getvalue())
|
| -
|
| -
|
| - def test_displaysHelpCorrectly(self):
|
| - """
|
| - Test that the --help-auth-for argument will correctly display
|
| - the help file for a particular authentication plugin.
|
| - """
|
| - newStdout = StringIO.StringIO()
|
| - options = DummyOptions()
|
| - options.authOutput = newStdout
|
| - self.assertRaises(
|
| - SystemExit, options.parseOptions, ['--help-auth-type', 'file'])
|
| - for line in cred_file.theFileCheckerFactory.authHelp:
|
| - if line.strip():
|
| - self.assertIn(line.strip(), newStdout.getvalue())
|
| -
|
| -
|
| - def test_unexpectedException(self):
|
| - """
|
| - When the checker specified by --auth raises an unexpected error, it
|
| - should be caught and re-raised within a L{usage.UsageError}.
|
| - """
|
| - options = DummyOptions()
|
| - err = self.assertRaises(usage.UsageError, options.parseOptions,
|
| - ['--auth', 'file'])
|
| - self.assertEquals(str(err),
|
| - "Unexpected error: 'file' requires a filename")
|
| -
|
| -
|
| -
|
| -class OptionsForUsernamePassword(usage.Options, strcred.AuthOptionMixin):
|
| - supportedInterfaces = (credentials.IUsernamePassword,)
|
| -
|
| -
|
| -
|
| -class OptionsForUsernameHashedPassword(usage.Options, strcred.AuthOptionMixin):
|
| - supportedInterfaces = (credentials.IUsernameHashedPassword,)
|
| -
|
| -
|
| -
|
| -class OptionsSupportsAllInterfaces(usage.Options, strcred.AuthOptionMixin):
|
| - supportedInterfaces = None
|
| -
|
| -
|
| -
|
| -class OptionsSupportsNoInterfaces(usage.Options, strcred.AuthOptionMixin):
|
| - supportedInterfaces = []
|
| -
|
| -
|
| -
|
| -class TestLimitingInterfaces(unittest.TestCase):
|
| - """
|
| - Tests functionality that allows an application to limit the
|
| - credential interfaces it can support. For the purposes of this
|
| - test, we use IUsernameHashedPassword, although this will never
|
| - really be used by the command line.
|
| -
|
| - (I have, to date, not thought of a half-decent way for a user to
|
| - specify a hash algorithm via the command-line. Nor do I think it's
|
| - very useful.)
|
| -
|
| - I should note that, at first, this test is counter-intuitive,
|
| - because we're using the checker with a pre-defined hash function
|
| - as the 'bad' checker. See the documentation for
|
| - L{twisted.cred.checkers.FilePasswordDB.hash} for more details.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.filename = self.mktemp()
|
| - file(self.filename, 'w').write('admin:asdf\nalice:foo\n')
|
| - self.goodChecker = checkers.FilePasswordDB(self.filename)
|
| - self.badChecker = checkers.FilePasswordDB(self.filename, hash=self._hash)
|
| - self.anonChecker = checkers.AllowAnonymousAccess()
|
| -
|
| -
|
| - def _hash(self, networkUsername, networkPassword, storedPassword):
|
| - """
|
| - A dumb hash that doesn't really do anything.
|
| - """
|
| - return networkPassword
|
| -
|
| -
|
| - def test_supportsInterface(self):
|
| - """
|
| - Test that the supportsInterface method behaves appropriately.
|
| - """
|
| - options = OptionsForUsernamePassword()
|
| - self.assertTrue(
|
| - options.supportsInterface(credentials.IUsernamePassword))
|
| - self.assertFalse(
|
| - options.supportsInterface(credentials.IAnonymous))
|
| - self.assertRaises(
|
| - strcred.UnsupportedInterfaces, options.addChecker, self.anonChecker)
|
| -
|
| -
|
| - def test_supportsAllInterfaces(self):
|
| - """
|
| - Test that the supportsInterface method behaves appropriately
|
| - when the supportedInterfaces attribute is None.
|
| - """
|
| - options = OptionsSupportsAllInterfaces()
|
| - self.assertTrue(
|
| - options.supportsInterface(credentials.IUsernamePassword))
|
| - self.assertTrue(
|
| - options.supportsInterface(credentials.IAnonymous))
|
| -
|
| -
|
| - def test_supportsCheckerFactory(self):
|
| - """
|
| - Test that the supportsCheckerFactory method behaves appropriately.
|
| - """
|
| - options = OptionsForUsernamePassword()
|
| - fileCF = cred_file.theFileCheckerFactory
|
| - anonCF = cred_anonymous.theAnonymousCheckerFactory
|
| - self.assertTrue(options.supportsCheckerFactory(fileCF))
|
| - self.assertFalse(options.supportsCheckerFactory(anonCF))
|
| -
|
| -
|
| - def test_canAddSupportedChecker(self):
|
| - """
|
| - Test that when addChecker is called with a checker that
|
| - implements at least one of the interfaces our application
|
| - supports, it is successful.
|
| - """
|
| - options = OptionsForUsernamePassword()
|
| - options.addChecker(self.goodChecker)
|
| - iface = options.supportedInterfaces[0]
|
| - # Test that we did get IUsernamePassword
|
| - self.assertIdentical(options['credInterfaces'][iface][0], self.goodChecker)
|
| - self.assertIdentical(options['credCheckers'][0], self.goodChecker)
|
| - # Test that we didn't get IUsernameHashedPassword
|
| - self.assertEquals(len(options['credInterfaces'][iface]), 1)
|
| - self.assertEquals(len(options['credCheckers']), 1)
|
| -
|
| -
|
| - def test_failOnAddingUnsupportedChecker(self):
|
| - """
|
| - Test that when addChecker is called with a checker that does
|
| - not implement any supported interfaces, it fails.
|
| - """
|
| - options = OptionsForUsernameHashedPassword()
|
| - self.assertRaises(strcred.UnsupportedInterfaces,
|
| - options.addChecker, self.badChecker)
|
| -
|
| -
|
| - def test_unsupportedInterfaceError(self):
|
| - """
|
| - Test that the --auth command line raises an exception when it
|
| - gets a checker we don't support.
|
| - """
|
| - options = OptionsSupportsNoInterfaces()
|
| - authType = cred_anonymous.theAnonymousCheckerFactory.authType
|
| - self.assertRaises(
|
| - usage.UsageError,
|
| - options.parseOptions, ['--auth', authType])
|
| -
|
| -
|
| - def test_helpAuthLimitsOutput(self):
|
| - """
|
| - Test that --help-auth will only list checkers that purport to
|
| - supply at least one of the credential interfaces our
|
| - application can use.
|
| - """
|
| - options = OptionsForUsernamePassword()
|
| - for factory in options._checkerFactoriesForOptHelpAuth():
|
| - invalid = True
|
| - for interface in factory.credentialInterfaces:
|
| - if options.supportsInterface(interface):
|
| - invalid = False
|
| - if invalid:
|
| - raise strcred.UnsupportedInterfaces()
|
| -
|
| -
|
| - def test_helpAuthTypeLimitsOutput(self):
|
| - """
|
| - Test that --help-auth-type will display a warning if you get
|
| - help for an authType that does not supply at least one of the
|
| - credential interfaces our application can use.
|
| - """
|
| - options = OptionsForUsernamePassword()
|
| - # Find an interface that we can use for our test
|
| - invalidFactory = None
|
| - for factory in strcred.findCheckerFactories():
|
| - if not options.supportsCheckerFactory(factory):
|
| - invalidFactory = factory
|
| - break
|
| - self.assertNotIdentical(invalidFactory, None)
|
| - # Capture output and make sure the warning is there
|
| - newStdout = StringIO.StringIO()
|
| - options.authOutput = newStdout
|
| - self.assertRaises(SystemExit, options.parseOptions,
|
| - ['--help-auth-type', 'anonymous'])
|
| - self.assertIn(strcred.notSupportedWarning, newStdout.getvalue())
|
| -
|
|
|