action="callback", type=str,
help="Kerberos Credentials cache",
callback=self._set_krb5_ccache)
+ self._add_option("-A", "--authentication-file", metavar="AUTHFILE",
+ action="callback", type=str,
+ help="Authentication file",
+ callback=self._set_auth_file)
# LEGACY
self._add_option("-k", "--kerberos", metavar="KERBEROS",
self.creds.set_kerberos_state(MUST_USE_KERBEROS)
self.creds.set_named_ccache(arg)
+ def _set_auth_file(self, option, opt_str, arg, parser):
+ if os.path.exists(arg):
+ self.creds.parse_file(arg)
+ self.ask_for_password = False
+ self.machine_pass = False
+
def get_credentials(self, lp, fallback_machine=False):
"""Obtain the credentials set on the command-line.
"""
import optparse
+import os
+from contextlib import contextmanager
from samba.getopt import CredentialsOptions
import samba.tests
import setproctitle
password_opt = '--password=super_secret_password'
clear_password_opt = '--password=xxx'
+@contextmanager
+def auth_fle_opt(auth_file_path, long_opt=True):
+ old_argv = list(sys.argv)
+ try:
+ if long_opt:
+ sys.argv.append('--authentication-file=%s' % auth_file_path)
+ else:
+ sys.argv.append('-A')
+ sys.argv.append(auth_file_path)
+ yield
+ finally:
+ sys.argv = old_argv
+
class CredentialsOptionsTests(samba.tests.TestCase):
def setUp(self):
super(samba.tests.TestCase, self).tearDown()
setproctitle.setproctitle(self.old_proctitle)
sys.argv.pop()
+
+class AuthenticationFileTests(samba.tests.TestCaseInTempDir):
+
+ def setUp(self):
+ super(AuthenticationFileTests, self).setUp()
+
+ self.parser = optparse.OptionParser()
+ self.credopts = CredentialsOptions(self.parser)
+ self.parser.add_option_group(self.credopts)
+
+ self.auth_file_name = os.path.join(self.tempdir, 'auth.txt')
+
+ self.realm = 'realm.example.com'
+ self.domain = 'dom'
+ self.password = 'pass'
+ self.username = 'user'
+
+ auth_file_fd = open(self.auth_file_name, 'x')
+ auth_file_fd.write('realm=%s\n' % self.realm)
+ auth_file_fd.write('domain=%s\n' % self.domain)
+ auth_file_fd.write('username=%s\n' % self.username)
+ auth_file_fd.write('password=%s\n' % self.password)
+ auth_file_fd.close()
+
+ def tearDown(self):
+ super(AuthenticationFileTests, self).tearDown()
+
+ os.unlink(self.auth_file_name)
+
+ def test_long_option_valid_path(self):
+ with auth_fle_opt(self.auth_file_name):
+ self.parser.parse_args()
+ credopts = self.credopts
+ creds = credopts.creds
+
+ self.assertFalse(credopts.ask_for_password)
+ self.assertFalse(credopts.machine_pass)
+
+ self.assertEqual(self.username, creds.get_username())
+ self.assertEqual(self.password, creds.get_password())
+ self.assertEqual(self.domain.upper(), creds.get_domain())
+ self.assertEqual(self.realm.upper(), creds.get_realm())
+
+ def test_long_option_invalid_path(self):
+ with auth_fle_opt(self.auth_file_name + '.dontexist'):
+ self.parser.parse_args()
+ credopts = self.credopts
+ creds = credopts.creds
+
+ self.assertTrue(credopts.ask_for_password)
+ self.assertFalse(credopts.machine_pass)
+
+ self.assertIsNone(creds.get_username())
+ self.assertIsNone(creds.get_password())
+ self.assertIsNone(creds.get_domain())
+ self.assertIsNone(creds.get_realm())
+
+ def test_short_option_valid_path(self):
+ with auth_fle_opt(self.auth_file_name, long_opt=False):
+ self.parser.parse_args()
+ credopts = self.credopts
+ creds = credopts.creds
+
+ self.assertFalse(credopts.ask_for_password)
+ self.assertFalse(credopts.machine_pass)
+
+ self.assertEqual(self.username, creds.get_username())
+ self.assertEqual(self.password, creds.get_password())
+ self.assertEqual(self.domain.upper(), creds.get_domain())
+ self.assertEqual(self.realm.upper(), creds.get_realm())
+
+ def test_short_option_invalid_path(self):
+ with auth_fle_opt(self.auth_file_name + '.dontexist', long_opt=False):
+ self.parser.parse_args()
+ credopts = self.credopts
+ creds = credopts.creds
+
+ self.assertTrue(credopts.ask_for_password)
+ self.assertFalse(credopts.machine_pass)
+
+ self.assertIsNone(creds.get_username())
+ self.assertIsNone(creds.get_password())
+ self.assertIsNone(creds.get_domain())
+ self.assertIsNone(creds.get_realm())