diff options
Diffstat (limited to 'source4/scripting/python/samba/tests')
53 files changed, 0 insertions, 7489 deletions
diff --git a/source4/scripting/python/samba/tests/__init__.py b/source4/scripting/python/samba/tests/__init__.py deleted file mode 100644 index 2df30a641b..0000000000 --- a/source4/scripting/python/samba/tests/__init__.py +++ /dev/null @@ -1,237 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2010 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Samba Python tests.""" - -import os -import ldb -import samba -import samba.auth -from samba import param -from samba.samdb import SamDB -import subprocess -import tempfile - -samba.ensure_external_module("testtools", "testtools") - -# Other modules import these two classes from here, for convenience: -from testtools.testcase import ( - TestCase as TesttoolsTestCase, - TestSkipped, - ) - - -class TestCase(TesttoolsTestCase): - """A Samba test case.""" - - def setUp(self): - super(TestCase, self).setUp() - test_debug_level = os.getenv("TEST_DEBUG_LEVEL") - if test_debug_level is not None: - test_debug_level = int(test_debug_level) - self._old_debug_level = samba.get_debug_level() - samba.set_debug_level(test_debug_level) - self.addCleanup(samba.set_debug_level, test_debug_level) - - def get_loadparm(self): - return env_loadparm() - - def get_credentials(self): - return cmdline_credentials - - -class LdbTestCase(TesttoolsTestCase): - """Trivial test case for running tests against a LDB.""" - - def setUp(self): - super(LdbTestCase, self).setUp() - self.filename = os.tempnam() - self.ldb = samba.Ldb(self.filename) - - def set_modules(self, modules=[]): - """Change the modules for this Ldb.""" - m = ldb.Message() - m.dn = ldb.Dn(self.ldb, "@MODULES") - m["@LIST"] = ",".join(modules) - self.ldb.add(m) - self.ldb = samba.Ldb(self.filename) - - -class TestCaseInTempDir(TestCase): - - def setUp(self): - super(TestCaseInTempDir, self).setUp() - self.tempdir = tempfile.mkdtemp() - self.addCleanup(self._remove_tempdir) - - def _remove_tempdir(self): - self.assertEquals([], os.listdir(self.tempdir)) - os.rmdir(self.tempdir) - self.tempdir = None - - -def env_loadparm(): - lp = param.LoadParm() - try: - lp.load(os.environ["SMB_CONF_PATH"]) - except KeyError: - raise Exception("SMB_CONF_PATH not set") - return lp - - -def env_get_var_value(var_name): - """Returns value for variable in os.environ - - Function throws AssertionError if variable is defined. - Unit-test based python tests require certain input params - to be set in environment, otherwise they can't be run - """ - assert var_name in os.environ.keys(), "Please supply %s in environment" % var_name - return os.environ[var_name] - - -cmdline_credentials = None - -class RpcInterfaceTestCase(TestCase): - """DCE/RPC Test case.""" - - -class ValidNetbiosNameTests(TestCase): - - def test_valid(self): - self.assertTrue(samba.valid_netbios_name("FOO")) - - def test_too_long(self): - self.assertFalse(samba.valid_netbios_name("FOO"*10)) - - def test_invalid_characters(self): - self.assertFalse(samba.valid_netbios_name("*BLA")) - - -class BlackboxProcessError(Exception): - """This is raised when check_output() process returns a non-zero exit status - - Exception instance should contain the exact exit code (S.returncode), - command line (S.cmd), process output (S.stdout) and process error stream - (S.stderr) - """ - - def __init__(self, returncode, cmd, stdout, stderr): - self.returncode = returncode - self.cmd = cmd - self.stdout = stdout - self.stderr = stderr - - def __str__(self): - return "Command '%s'; exit status %d; stdout: '%s'; stderr: '%s'" % (self.cmd, self.returncode, - self.stdout, self.stderr) - -class BlackboxTestCase(TestCase): - """Base test case for blackbox tests.""" - - def _make_cmdline(self, line): - bindir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../bin")) - parts = line.split(" ") - if os.path.exists(os.path.join(bindir, parts[0])): - parts[0] = os.path.join(bindir, parts[0]) - line = " ".join(parts) - return line - - def check_run(self, line): - line = self._make_cmdline(line) - p = subprocess.Popen(line, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - retcode = p.wait() - if retcode: - raise BlackboxProcessError(retcode, line, p.stdout.read(), p.stderr.read()) - - def check_output(self, line): - line = self._make_cmdline(line) - p = subprocess.Popen(line, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, close_fds=True) - retcode = p.wait() - if retcode: - raise BlackboxProcessError(retcode, line, p.stdout.read(), p.stderr.read()) - return p.stdout.read() - -def connect_samdb(samdb_url, lp=None, session_info=None, credentials=None, - flags=0, ldb_options=None, ldap_only=False): - """Create SamDB instance and connects to samdb_url database. - - :param samdb_url: Url for database to connect to. - :param lp: Optional loadparm object - :param session_info: Optional session information - :param credentials: Optional credentials, defaults to anonymous. - :param flags: Optional LDB flags - :param ldap_only: If set, only remote LDAP connection will be created. - - Added value for tests is that we have a shorthand function - to make proper URL for ldb.connect() while using default - parameters for connection based on test environment - """ - samdb_url = samdb_url.lower() - if not "://" in samdb_url: - if not ldap_only and os.path.isfile(samdb_url): - samdb_url = "tdb://%s" % samdb_url - else: - samdb_url = "ldap://%s" % samdb_url - # use 'paged_search' module when connecting remotely - if samdb_url.startswith("ldap://"): - ldb_options = ["modules:paged_searches"] - elif ldap_only: - raise AssertionError("Trying to connect to %s while remote " - "connection is required" % samdb_url) - - # set defaults for test environment - if lp is None: - lp = env_loadparm() - if session_info is None: - session_info = samba.auth.system_session(lp) - if credentials is None: - credentials = cmdline_credentials - - return SamDB(url=samdb_url, - lp=lp, - session_info=session_info, - credentials=credentials, - flags=flags, - options=ldb_options) - - -def connect_samdb_ex(samdb_url, lp=None, session_info=None, credentials=None, - flags=0, ldb_options=None, ldap_only=False): - """Connects to samdb_url database - - :param samdb_url: Url for database to connect to. - :param lp: Optional loadparm object - :param session_info: Optional session information - :param credentials: Optional credentials, defaults to anonymous. - :param flags: Optional LDB flags - :param ldap_only: If set, only remote LDAP connection will be created. - :return: (sam_db_connection, rootDse_record) tuple - """ - sam_db = connect_samdb(samdb_url, lp, session_info, credentials, - flags, ldb_options, ldap_only) - # fetch RootDse - res = sam_db.search(base="", expression="", scope=ldb.SCOPE_BASE, - attrs=["*"]) - return (sam_db, res[0]) - - -def delete_force(samdb, dn): - try: - samdb.delete(dn) - except ldb.LdbError, (num, _): - assert(num == ldb.ERR_NO_SUCH_OBJECT) diff --git a/source4/scripting/python/samba/tests/auth.py b/source4/scripting/python/samba/tests/auth.py deleted file mode 100644 index f71e1a784d..0000000000 --- a/source4/scripting/python/samba/tests/auth.py +++ /dev/null @@ -1,31 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for the Auth Python bindings. - -Note that this just tests the bindings work. It does not intend to test -the functionality, that's already done in other tests. -""" - -from samba import auth -import samba.tests - -class AuthTests(samba.tests.TestCase): - - def test_system_session(self): - auth.system_session() - diff --git a/source4/scripting/python/samba/tests/blackbox/__init__.py b/source4/scripting/python/samba/tests/blackbox/__init__.py deleted file mode 100644 index 361e5cfe5e..0000000000 --- a/source4/scripting/python/samba/tests/blackbox/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Blackbox tests. """ diff --git a/source4/scripting/python/samba/tests/blackbox/ndrdump.py b/source4/scripting/python/samba/tests/blackbox/ndrdump.py deleted file mode 100644 index fca9a93153..0000000000 --- a/source4/scripting/python/samba/tests/blackbox/ndrdump.py +++ /dev/null @@ -1,49 +0,0 @@ -# Blackbox tests for ndrdump -# Copyright (C) 2008 Andrew Tridgell <tridge@samba.org> -# Copyright (C) 2008 Andrew Bartlett <abartlet@samba.org> -# Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org> -# based on test_smbclient.sh - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Blackbox tests for ndrdump.""" - -import os -from samba.tests import BlackboxTestCase - -for p in [ "../../../../../source4/librpc/tests", "../../../../../librpc/tests"]: - data_path_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), p)) - print data_path_dir - if os.path.exists(data_path_dir): - break - - -class NdrDumpTests(BlackboxTestCase): - """Blackbox tests for ndrdump.""" - - def data_path(self, name): - return os.path.join(data_path_dir, name) - - def test_ndrdump_with_in(self): - self.check_run("ndrdump samr samr_CreateUser in %s" % (self.data_path("samr-CreateUser-in.dat"))) - - def test_ndrdump_with_out(self): - self.check_run("ndrdump samr samr_CreateUser out %s" % (self.data_path("samr-CreateUser-out.dat"))) - - def test_ndrdump_context_file(self): - self.check_run("ndrdump --context-file %s samr samr_CreateUser out %s" % (self.data_path("samr-CreateUser-in.dat"), self.data_path("samr-CreateUser-out.dat"))) - - def test_ndrdump_with_validate(self): - self.check_run("ndrdump --validate samr samr_CreateUser in %s" % (self.data_path("samr-CreateUser-in.dat"))) diff --git a/source4/scripting/python/samba/tests/blackbox/samba_tool_drs.py b/source4/scripting/python/samba/tests/blackbox/samba_tool_drs.py deleted file mode 100644 index 62d7bf123b..0000000000 --- a/source4/scripting/python/samba/tests/blackbox/samba_tool_drs.py +++ /dev/null @@ -1,97 +0,0 @@ -# Blackbox tests for "samba-tool drs" command -# Copyright (C) Kamen Mazdrashki <kamenim@samba.org> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Blackbox tests for samba-tool drs.""" - -import samba.tests - - -class SambaToolDrsTests(samba.tests.BlackboxTestCase): - """Blackbox test case for samba-tool drs.""" - - def setUp(self): - super(SambaToolDrsTests, self).setUp() - - self.dc1 = samba.tests.env_get_var_value("DC1") - self.dc2 = samba.tests.env_get_var_value("DC2") - - creds = self.get_credentials() - self.cmdline_creds = "-U%s/%s%%%s" % (creds.get_domain(), - creds.get_username(), creds.get_password()) - - def _get_rootDSE(self, dc): - samdb = samba.tests.connect_samdb(dc, lp=self.get_loadparm(), - credentials=self.get_credentials(), - ldap_only=True) - return samdb.search(base="", scope=samba.tests.ldb.SCOPE_BASE)[0] - - def test_samba_tool_bind(self): - """Tests 'samba-tool drs bind' command - Output should be like: - Extensions supported: - <list-of-supported-extensions> - Site GUID: <GUID> - Repl epoch: 0""" - out = self.check_output("samba-tool drs bind %s %s" % (self.dc1, - self.cmdline_creds)) - self.assertTrue("Site GUID:" in out) - self.assertTrue("Repl epoch:" in out) - - def test_samba_tool_kcc(self): - """Tests 'samba-tool drs kcc' command - Output should be like 'Consistency check on <DC> successful.'""" - out = self.check_output("samba-tool drs kcc %s %s" % (self.dc1, - self.cmdline_creds)) - self.assertTrue("Consistency check on" in out) - self.assertTrue("successful" in out) - - def test_samba_tool_showrepl(self): - """Tests 'samba-tool drs showrepl' command - Output should be like: - <site-name>/<domain-name> - DSA Options: <hex-options> - DSA object GUID: <DSA-object-GUID> - DSA invocationId: <DSA-invocationId> - <Inbound-connections-list> - <Outbound-connections-list> - <KCC-objects> - ... - TODO: Perhaps we should check at least for - DSA's objectGUDI and invocationId""" - out = self.check_output("samba-tool drs showrepl %s %s" % (self.dc1, - self.cmdline_creds)) - self.assertTrue("DSA Options:" in out) - self.assertTrue("DSA object GUID:" in out) - self.assertTrue("DSA invocationId:" in out) - - def test_samba_tool_options(self): - """Tests 'samba-tool drs options' command - Output should be like 'Current DSA options: IS_GC <OTHER_FLAGS>'""" - out = self.check_output("samba-tool drs options %s %s" % (self.dc1, - self.cmdline_creds)) - self.assertTrue("Current DSA options:" in out) - - def test_samba_tool_replicate(self): - """Tests 'samba-tool drs replicate' command - Output should be like 'Replicate from <DC-SRC> to <DC-DEST> was successful.'""" - nc_name = self._get_rootDSE(self.dc1)["defaultNamingContext"] - out = self.check_output("samba-tool drs replicate %s %s %s %s" % (self.dc1, - self.dc2, - nc_name, - self.cmdline_creds)) - self.assertTrue("Replicate from" in out) - self.assertTrue("was successful" in out) diff --git a/source4/scripting/python/samba/tests/common.py b/source4/scripting/python/samba/tests/common.py deleted file mode 100644 index 8794e9dc8b..0000000000 --- a/source4/scripting/python/samba/tests/common.py +++ /dev/null @@ -1,40 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for common.py routines -# Copyright (C) Andrew Tridgell 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.common""" - -import samba, os -import samba.tests -from samba.common import * -from samba.samdb import SamDB - - -class CommonTests(samba.tests.TestCase): - - def test_normalise_int32(self): - self.assertEquals('17', normalise_int32(17)) - self.assertEquals('17', normalise_int32('17')) - self.assertEquals('-123', normalise_int32('-123')) - self.assertEquals('-1294967296', normalise_int32('3000000000')) - - def test_dsdb_Dn(self): - sam = samba.Ldb(url='dntest.ldb') - dn1 = dsdb_Dn(sam, "DC=foo,DC=bar") - dn2 = dsdb_Dn(sam, "B:8:0000000D:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;DC=samba,DC=example,DC=com") - self.assertEquals(dn2.binary, "0000000D") - self.assertEquals(13, dn2.get_binary_integer()) - os.unlink('dntest.ldb') diff --git a/source4/scripting/python/samba/tests/core.py b/source4/scripting/python/samba/tests/core.py deleted file mode 100644 index 8206e68d4f..0000000000 --- a/source4/scripting/python/samba/tests/core.py +++ /dev/null @@ -1,63 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Samba Python tests.""" - -import ldb -import os -import samba -from samba.tests import TestCase, TestCaseInTempDir - -class SubstituteVarTestCase(TestCase): - - def test_empty(self): - self.assertEquals("", samba.substitute_var("", {})) - - def test_nothing(self): - self.assertEquals("foo bar", - samba.substitute_var("foo bar", {"bar": "bla"})) - - def test_replace(self): - self.assertEquals("foo bla", - samba.substitute_var("foo ${bar}", {"bar": "bla"})) - - def test_broken(self): - self.assertEquals("foo ${bdkjfhsdkfh sdkfh ", - samba.substitute_var("foo ${bdkjfhsdkfh sdkfh ", {"bar": "bla"})) - - def test_unknown_var(self): - self.assertEquals("foo ${bla} gsff", - samba.substitute_var("foo ${bla} gsff", {"bar": "bla"})) - - def test_check_all_substituted(self): - samba.check_all_substituted("nothing to see here") - self.assertRaises(Exception, samba.check_all_substituted, - "Not subsituted: ${FOOBAR}") - - -class LdbExtensionTests(TestCaseInTempDir): - - def test_searchone(self): - path = self.tempdir + "/searchone.ldb" - l = samba.Ldb(path) - try: - l.add({"dn": "foo=dc", "bar": "bla"}) - self.assertEquals("bla", - l.searchone(basedn=ldb.Dn(l, "foo=dc"), attribute="bar")) - finally: - del l - os.unlink(path) diff --git a/source4/scripting/python/samba/tests/credentials.py b/source4/scripting/python/samba/tests/credentials.py deleted file mode 100644 index 95ee0fa0de..0000000000 --- a/source4/scripting/python/samba/tests/credentials.py +++ /dev/null @@ -1,98 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for the Credentials Python bindings. - -Note that this just tests the bindings work. It does not intend to test -the functionality, that's already done in other tests. -""" - -from samba import credentials -import samba.tests - -class CredentialsTests(samba.tests.TestCase): - - def setUp(self): - super(CredentialsTests, self).setUp() - self.creds = credentials.Credentials() - - def test_set_username(self): - self.creds.set_username("somebody") - self.assertEquals("somebody", self.creds.get_username()) - - def test_set_password(self): - self.creds.set_password("S3CreT") - self.assertEquals("S3CreT", self.creds.get_password()) - - def test_set_domain(self): - self.creds.set_domain("ABMAS") - self.assertEquals("ABMAS", self.creds.get_domain()) - - def test_set_realm(self): - self.creds.set_realm("myrealm") - self.assertEquals("MYREALM", self.creds.get_realm()) - - def test_parse_string_anon(self): - self.creds.parse_string("%") - self.assertEquals("", self.creds.get_username()) - self.assertEquals(None, self.creds.get_password()) - - def test_parse_string_user_pw_domain(self): - self.creds.parse_string("dom\\someone%secr") - self.assertEquals("someone", self.creds.get_username()) - self.assertEquals("secr", self.creds.get_password()) - self.assertEquals("DOM", self.creds.get_domain()) - - def test_bind_dn(self): - self.assertEquals(None, self.creds.get_bind_dn()) - self.creds.set_bind_dn("dc=foo,cn=bar") - self.assertEquals("dc=foo,cn=bar", self.creds.get_bind_dn()) - - def test_is_anon(self): - self.creds.set_username("") - self.assertTrue(self.creds.is_anonymous()) - self.creds.set_username("somebody") - self.assertFalse(self.creds.is_anonymous()) - self.creds.set_anonymous() - self.assertTrue(self.creds.is_anonymous()) - - def test_workstation(self): - # FIXME: This is uninitialised, it should be None - #self.assertEquals(None, self.creds.get_workstation()) - self.creds.set_workstation("myworksta") - self.assertEquals("myworksta", self.creds.get_workstation()) - - def test_get_nt_hash(self): - self.creds.set_password("geheim") - self.assertEquals('\xc2\xae\x1f\xe6\xe6H\x84cRE>\x81o*\xeb\x93', - self.creds.get_nt_hash()) - - def test_guess(self): - # Just check the method is there and doesn't raise an exception - self.creds.guess() - - def test_set_cmdline_callbacks(self): - self.creds.set_cmdline_callbacks() - - def test_authentication_requested(self): - self.creds.set_username("") - self.assertFalse(self.creds.authentication_requested()) - self.creds.set_username("somebody") - self.assertTrue(self.creds.authentication_requested()) - - def test_wrong_password(self): - self.assertFalse(self.creds.wrong_password()) diff --git a/source4/scripting/python/samba/tests/dcerpc/__init__.py b/source4/scripting/python/samba/tests/dcerpc/__init__.py deleted file mode 100644 index d84cb57a09..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Unix SMB/CIFS implementation. -# Copyright © Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -"""Tests for the DCE/RPC Python bindings.""" - diff --git a/source4/scripting/python/samba/tests/dcerpc/bare.py b/source4/scripting/python/samba/tests/dcerpc/bare.py deleted file mode 100644 index 3efbf9d4cf..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/bare.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Unix SMB/CIFS implementation. -# Copyright © Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.tests.dcerpc.bare.""" - -from samba.dcerpc import ClientConnection -import samba.tests - -class BareTestCase(samba.tests.TestCase): - - def test_bare(self): - # Connect to the echo pipe - x = ClientConnection("ncalrpc:localhost[DEFAULT]", - ("60a15ec5-4de8-11d7-a637-005056a20182", 1), - lp_ctx=samba.tests.env_loadparm()) - self.assertEquals("\x01\x00\x00\x00", x.request(0, chr(0) * 4)) - - def test_alter_context(self): - x = ClientConnection("ncalrpc:localhost[DEFAULT]", - ("12345778-1234-abcd-ef00-0123456789ac", 1), - lp_ctx=samba.tests.env_loadparm()) - y = ClientConnection("ncalrpc:localhost", - ("60a15ec5-4de8-11d7-a637-005056a20182", 1), - basis_connection=x, lp_ctx=samba.tests.env_loadparm()) - x.alter_context(("60a15ec5-4de8-11d7-a637-005056a20182", 1)) - # FIXME: self.assertEquals("\x01\x00\x00\x00", x.request(0, chr(0) * 4)) - - def test_two_connections(self): - x = ClientConnection("ncalrpc:localhost[DEFAULT]", - ("60a15ec5-4de8-11d7-a637-005056a20182", 1), - lp_ctx=samba.tests.env_loadparm()) - y = ClientConnection("ncalrpc:localhost", - ("60a15ec5-4de8-11d7-a637-005056a20182", 1), - basis_connection=x, lp_ctx=samba.tests.env_loadparm()) - self.assertEquals("\x01\x00\x00\x00", y.request(0, chr(0) * 4)) diff --git a/source4/scripting/python/samba/tests/dcerpc/dnsserver.py b/source4/scripting/python/samba/tests/dcerpc/dnsserver.py deleted file mode 100644 index 59d6eee761..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/dnsserver.py +++ /dev/null @@ -1,241 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Amitay Isaacs <amitay@gmail.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.dnsserver""" - -from samba.dcerpc import dnsp, dnsserver -from samba.tests import RpcInterfaceTestCase, env_get_var_value -from samba.netcmd.dns import ARecord - -class DnsserverTests(RpcInterfaceTestCase): - - def setUp(self): - super(DnsserverTests, self).setUp() - self.server = env_get_var_value("SERVER_IP") - self.zone = env_get_var_value("REALM").lower() - self.conn = dnsserver.dnsserver("ncacn_ip_tcp:%s" % (self.server), - self.get_loadparm(), - self.get_credentials()) - - def test_operation2(self): - pass - - - def test_query2(self): - typeid, result = self.conn.DnssrvQuery2(dnsserver.DNS_CLIENT_VERSION_W2K, - 0, - self.server, - None, - 'ServerInfo') - self.assertEquals(dnsserver.DNSSRV_TYPEID_SERVER_INFO_W2K, typeid) - - typeid, result = self.conn.DnssrvQuery2(dnsserver.DNS_CLIENT_VERSION_DOTNET, - 0, - self.server, - None, - 'ServerInfo') - self.assertEquals(dnsserver.DNSSRV_TYPEID_SERVER_INFO_DOTNET, typeid) - - typeid, result = self.conn.DnssrvQuery2(dnsserver.DNS_CLIENT_VERSION_LONGHORN, - 0, - self.server, - None, - 'ServerInfo') - self.assertEquals(dnsserver.DNSSRV_TYPEID_SERVER_INFO, typeid) - - def test_operation2(self): - client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN - rev_zone = '1.168.192.in-addr.arpa' - - zone_create = dnsserver.DNS_RPC_ZONE_CREATE_INFO_LONGHORN() - zone_create.pszZoneName = rev_zone - zone_create.dwZoneType = dnsp.DNS_ZONE_TYPE_PRIMARY - zone_create.fAllowUpdate = dnsp.DNS_ZONE_UPDATE_SECURE - zone_create.fAging = 0 - zone_create.dwDpFlags = dnsserver.DNS_DP_DOMAIN_DEFAULT - - # Create zone - self.conn.DnssrvOperation2(client_version, - 0, - self.server, - None, - 0, - 'ZoneCreate', - dnsserver.DNSSRV_TYPEID_ZONE_CREATE, - zone_create) - - request_filter = (dnsserver.DNS_ZONE_REQUEST_REVERSE | - dnsserver.DNS_ZONE_REQUEST_PRIMARY) - typeid, zones = self.conn.DnssrvComplexOperation2(client_version, - 0, - self.server, - None, - 'EnumZones', - dnsserver.DNSSRV_TYPEID_DWORD, - request_filter) - self.assertEquals(1, zones.dwZoneCount) - - # Delete zone - self.conn.DnssrvOperation2(client_version, - 0, - self.server, - rev_zone, - 0, - 'DeleteZoneFromDs', - dnsserver.DNSSRV_TYPEID_NULL, - None) - - typeid, zones = self.conn.DnssrvComplexOperation2(client_version, - 0, - self.server, - None, - 'EnumZones', - dnsserver.DNSSRV_TYPEID_DWORD, - request_filter) - self.assertEquals(0, zones.dwZoneCount) - - - def test_complexoperation2(self): - client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN - request_filter = (dnsserver.DNS_ZONE_REQUEST_FORWARD | - dnsserver.DNS_ZONE_REQUEST_PRIMARY) - typeid, zones = self.conn.DnssrvComplexOperation2(client_version, - 0, - self.server, - None, - 'EnumZones', - dnsserver.DNSSRV_TYPEID_DWORD, - request_filter) - self.assertEquals(dnsserver.DNSSRV_TYPEID_ZONE_LIST, typeid) - self.assertEquals(2, zones.dwZoneCount) - - request_filter = (dnsserver.DNS_ZONE_REQUEST_REVERSE | - dnsserver.DNS_ZONE_REQUEST_PRIMARY) - typeid, zones = self.conn.DnssrvComplexOperation2(client_version, - 0, - self.server, - None, - 'EnumZones', - dnsserver.DNSSRV_TYPEID_DWORD, - request_filter) - self.assertEquals(dnsserver.DNSSRV_TYPEID_ZONE_LIST, typeid) - self.assertEquals(0, zones.dwZoneCount) - - - def test_enumrecords2(self): - client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN - record_type = dnsp.DNS_TYPE_NS - select_flags = (dnsserver.DNS_RPC_VIEW_ROOT_HINT_DATA | - dnsserver.DNS_RPC_VIEW_ADDITIONAL_DATA) - buflen, roothints = self.conn.DnssrvEnumRecords2(client_version, - 0, - self.server, - '..RootHints', - '.', - None, - record_type, - select_flags, - None, - None) - self.assertEquals(14, roothints.count) # 1 NS + 13 A records (a-m) - - - def test_updaterecords2(self): - client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN - record_type = dnsp.DNS_TYPE_A - select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA - - name = 'dummy' - rec = ARecord('1.2.3.4') - rec2 = ARecord('5.6.7.8') - - # Add record - add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF() - add_rec_buf.rec = rec - self.conn.DnssrvUpdateRecord2(client_version, - 0, - self.server, - self.zone, - name, - add_rec_buf, - None) - - buflen, result = self.conn.DnssrvEnumRecords2(client_version, - 0, - self.server, - self.zone, - name, - None, - record_type, - select_flags, - None, - None) - self.assertEquals(1, result.count) - self.assertEquals(1, result.rec[0].wRecordCount) - self.assertEquals(dnsp.DNS_TYPE_A, result.rec[0].records[0].wType) - self.assertEquals('1.2.3.4', result.rec[0].records[0].data) - - # Update record - add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF() - add_rec_buf.rec = rec2 - del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF() - del_rec_buf.rec = rec - self.conn.DnssrvUpdateRecord2(client_version, - 0, - self.server, - self.zone, - name, - add_rec_buf, - del_rec_buf) - - buflen, result = self.conn.DnssrvEnumRecords2(client_version, - 0, - self.server, - self.zone, - name, - None, - record_type, - select_flags, - None, - None) - self.assertEquals(1, result.count) - self.assertEquals(1, result.rec[0].wRecordCount) - self.assertEquals(dnsp.DNS_TYPE_A, result.rec[0].records[0].wType) - self.assertEquals('5.6.7.8', result.rec[0].records[0].data) - - # Delete record - del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF() - del_rec_buf.rec = rec2 - self.conn.DnssrvUpdateRecord2(client_version, - 0, - self.server, - self.zone, - name, - None, - del_rec_buf) - - self.assertRaises(RuntimeError, self.conn.DnssrvEnumRecords2, - client_version, - 0, - self.server, - self.zone, - name, - None, - record_type, - select_flags, - None, - None) diff --git a/source4/scripting/python/samba/tests/dcerpc/misc.py b/source4/scripting/python/samba/tests/dcerpc/misc.py deleted file mode 100644 index 11e14aadfa..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/misc.py +++ /dev/null @@ -1,62 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.misc.""" - -from samba.dcerpc import misc -import samba.tests - -text1 = "76f53846-a7c2-476a-ae2c-20e2b80d7b34" -text2 = "344edffa-330a-4b39-b96e-2c34da52e8b1" - -class GUIDTests(samba.tests.TestCase): - - def test_str(self): - guid = misc.GUID(text1) - self.assertEquals(text1, str(guid)) - - def test_repr(self): - guid = misc.GUID(text1) - self.assertEquals("GUID('%s')" % text1, repr(guid)) - - def test_compare_different(self): - guid1 = misc.GUID(text1) - guid2 = misc.GUID(text2) - self.assertTrue(cmp(guid1, guid2) > 0) - - def test_compare_same(self): - guid1 = misc.GUID(text1) - guid2 = misc.GUID(text1) - self.assertEquals(0, cmp(guid1, guid2)) - self.assertEquals(guid1, guid2) - - -class PolicyHandleTests(samba.tests.TestCase): - - def test_init(self): - x = misc.policy_handle(text1, 1) - self.assertEquals(1, x.handle_type) - self.assertEquals(text1, str(x.uuid)) - - def test_repr(self): - x = misc.policy_handle(text1, 42) - self.assertEquals("policy_handle(%d, '%s')" % (42, text1), repr(x)) - - def test_str(self): - x = misc.policy_handle(text1, 42) - self.assertEquals("%d, %s" % (42, text1), str(x)) - diff --git a/source4/scripting/python/samba/tests/dcerpc/registry.py b/source4/scripting/python/samba/tests/dcerpc/registry.py deleted file mode 100644 index c7bcbfd530..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/registry.py +++ /dev/null @@ -1,51 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.registry.""" - -from samba.dcerpc import winreg -from samba.tests import RpcInterfaceTestCase - - -class WinregTests(RpcInterfaceTestCase): - - def setUp(self): - super(WinregTests, self).setUp() - self.conn = winreg.winreg("ncalrpc:", self.get_loadparm(), - self.get_credentials()) - - def get_hklm(self): - return self.conn.OpenHKLM(None, - winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) - - def test_hklm(self): - handle = self.conn.OpenHKLM(None, - winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) - self.conn.CloseKey(handle) - - def test_getversion(self): - handle = self.get_hklm() - version = self.conn.GetVersion(handle) - self.assertEquals(int, version.__class__) - self.conn.CloseKey(handle) - - def test_getkeyinfo(self): - handle = self.conn.OpenHKLM(None, - winreg.KEY_QUERY_VALUE | winreg.KEY_ENUMERATE_SUB_KEYS) - x = self.conn.QueryInfoKey(handle, winreg.String()) - self.assertEquals(9, len(x)) # should return a 9-tuple - self.conn.CloseKey(handle) diff --git a/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py b/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py deleted file mode 100644 index c091f26c1b..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/rpc_talloc.py +++ /dev/null @@ -1,84 +0,0 @@ -# test generated python code from pidl -# Copyright (C) Andrew Tridgell August 2010 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -# -# to run this test, use one of these: -# -# python -m testtools.run samba.tests.dcerpc.rpc_talloc -# -# or if you have trial installed (from twisted), use -# -# trial samba.tests.dcerpc.rpc_talloc - -"""Tests for the talloc handling in the generated Python DCE/RPC bindings.""" - -import sys - -sys.path.insert(0, "bin/python") - -import samba -import samba.tests -from samba.dcerpc import drsuapi -import talloc - -talloc.enable_null_tracking() - - -class TallocTests(samba.tests.TestCase): - '''test talloc behaviour of pidl generated python code''' - - def check_blocks(self, object, num_expected): - '''check that the number of allocated blocks is correct''' - nblocks = talloc.total_blocks(object) - if object is None: - nblocks -= self.initial_blocks - self.assertEquals(nblocks, num_expected) - - def get_rodc_partial_attribute_set(self): - '''get a list of attributes for RODC replication''' - partial_attribute_set = drsuapi.DsPartialAttributeSet() - - # we expect one block for the object, and one for the structure - self.check_blocks(partial_attribute_set, 2) - - attids = [1, 2, 3] - partial_attribute_set.version = 1 - partial_attribute_set.attids = attids - partial_attribute_set.num_attids = len(attids) - - # we expect one block object, a structure, an ARRAY, and a - # reference to the array - self.check_blocks(partial_attribute_set, 3) - - return partial_attribute_set - - def pas_test(self): - pas = self.get_rodc_partial_attribute_set() - self.check_blocks(pas, 3) - req8 = drsuapi.DsGetNCChangesRequest8() - self.check_blocks(req8, 2) - self.check_blocks(None, 5) - req8.partial_attribute_set = pas - if req8.partial_attribute_set.attids[1] != 2: - raise Exception("Wrong value in attids[2]") - # we now get an additional reference - self.check_blocks(None, 6) - - def test_run(self): - self.initial_blocks = talloc.total_blocks(None) - self.check_blocks(None, 0) - self.pas_test() - self.check_blocks(None, 0) diff --git a/source4/scripting/python/samba/tests/dcerpc/rpcecho.py b/source4/scripting/python/samba/tests/dcerpc/rpcecho.py deleted file mode 100644 index 099f8f619c..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/rpcecho.py +++ /dev/null @@ -1,71 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dceprc.rpcecho.""" - -from samba.dcerpc import echo -from samba.ndr import ndr_pack, ndr_unpack -from samba.tests import RpcInterfaceTestCase, TestCase - - -class RpcEchoTests(RpcInterfaceTestCase): - - def setUp(self): - super(RpcEchoTests, self).setUp() - self.conn = echo.rpcecho("ncalrpc:", self.get_loadparm()) - - def test_two_contexts(self): - self.conn2 = echo.rpcecho("ncalrpc:", self.get_loadparm(), basis_connection=self.conn) - self.assertEquals(3, self.conn2.AddOne(2)) - - def test_abstract_syntax(self): - self.assertEquals(("60a15ec5-4de8-11d7-a637-005056a20182", 1), - self.conn.abstract_syntax) - - def test_addone(self): - self.assertEquals(2, self.conn.AddOne(1)) - - def test_echodata(self): - self.assertEquals([1,2,3], self.conn.EchoData([1, 2, 3])) - - def test_call(self): - self.assertEquals(u"foobar", self.conn.TestCall(u"foobar")) - - def test_surrounding(self): - surrounding_struct = echo.Surrounding() - surrounding_struct.x = 4 - surrounding_struct.surrounding = [1,2,3,4] - y = self.conn.TestSurrounding(surrounding_struct) - self.assertEquals(8 * [0], y.surrounding) - - def test_manual_request(self): - self.assertEquals("\x01\x00\x00\x00", self.conn.request(0, chr(0) * 4)) - - def test_server_name(self): - self.assertEquals(None, self.conn.server_name) - - -class NdrEchoTests(TestCase): - - def test_info1_push(self): - x = echo.info1() - x.v = 42 - self.assertEquals("\x2a", ndr_pack(x)) - - def test_info1_pull(self): - x = ndr_unpack(echo.info1, "\x42") - self.assertEquals(x.v, 66) diff --git a/source4/scripting/python/samba/tests/dcerpc/sam.py b/source4/scripting/python/samba/tests/dcerpc/sam.py deleted file mode 100644 index 0e09323adb..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/sam.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Unix SMB/CIFS implementation. -# Copyright © Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.sam.""" - -from samba.dcerpc import samr, security -from samba.tests import RpcInterfaceTestCase - -# FIXME: Pidl should be doing this for us -def toArray((handle, array, num_entries)): - ret = [] - for x in range(num_entries): - ret.append((array.entries[x].idx, array.entries[x].name)) - return ret - - -class SamrTests(RpcInterfaceTestCase): - - def setUp(self): - super(SamrTests, self).setUp() - self.conn = samr.samr("ncalrpc:", self.get_loadparm()) - - def test_connect5(self): - (level, info, handle) = self.conn.Connect5(None, 0, 1, samr.ConnectInfo1()) - - def test_connect2(self): - handle = self.conn.Connect2(None, security.SEC_FLAG_MAXIMUM_ALLOWED) - self.assertTrue(handle is not None) - - def test_EnumDomains(self): - handle = self.conn.Connect2(None, security.SEC_FLAG_MAXIMUM_ALLOWED) - domains = toArray(self.conn.EnumDomains(handle, 0, -1)) - self.conn.Close(handle) - diff --git a/source4/scripting/python/samba/tests/dcerpc/srvsvc.py b/source4/scripting/python/samba/tests/dcerpc/srvsvc.py deleted file mode 100644 index 3206a27e67..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/srvsvc.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Unix SMB/CIFS implementation. -# Copyright © Dhananjay Sathe <dhanajaysathe@gmail.com> 2011 -# Copyright © Jelmer Vernooij <jelmer@samba.org> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.srvsvc.""" - -from samba.dcerpc import srvsvc -from samba.tests import RpcInterfaceTestCase - - -class SrvsvcTests(RpcInterfaceTestCase): - - def setUp(self): - super(SrvsvcTests, self).setUp() - self.conn = srvsvc.srvsvc("ncalrpc:", self.get_loadparm()) - self.server_unc = "\\\\." - - def getDummyShareObject(self): - share = srvsvc.NetShareInfo2() - - share.name = u'test' - share.comment = u'test share' - share.type = srvsvc.STYPE_DISKTREE - share.current_users = 0x00000000 - share.max_users = -1 - share.password = None - share.path = u'C:\\tmp' # some random path - share.permissions = 123434566 - return share - - def test_NetShareAdd(self): - self.skip("Dangerous test") - share = self.getDummyShareObject() - self.conn.NetShareAdd(self.server_unc, 2, share, None) - - def test_NetShareSetInfo(self): - self.skip("Dangerous test") - share = self.getDummyShareObject() - parm_error = 0x00000000 - self.conn.NetShareAdd(self.server_unc, 502, share, parm_error) - name = share.name - share.comment = "now sucessfully modified " - parm_error = self.pipe.NetShareSetInfo(self.server_unc, name, - 502, share, parm_error) - - def test_NetShareDel(self): - self.skip("Dangerous test") - share = self.getDummyShareObject() - parm_error = 0x00000000 - self.expectFailure("NetShareAdd doesn't work properly from Python", - self.conn.NetShareAdd, self.server_unc, 502, share, parm_error) - self.conn.NetShareDel(self.server_unc, share.name, 0) diff --git a/source4/scripting/python/samba/tests/dcerpc/testrpc.py b/source4/scripting/python/samba/tests/dcerpc/testrpc.py deleted file mode 100644 index e35d6b5544..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/testrpc.py +++ /dev/null @@ -1,141 +0,0 @@ -# test generated python code from pidl -# Copyright (C) Andrew Tridgell August 2010 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -import sys - -sys.path.insert(0, "bin/python") - -import samba -import samba.tests -from samba.dcerpc import drsuapi -import talloc - -talloc.enable_null_tracking() - -class RpcTests(object): - '''test type behaviour of pidl generated python RPC code''' - - def check_blocks(self, object, num_expected): - '''check that the number of allocated blocks is correct''' - nblocks = talloc.total_blocks(object) - if object is None: - nblocks -= self.initial_blocks - leaked_blocks = (nblocks - num_expected) - if leaked_blocks != 0: - print "Leaked %d blocks" % leaked_blocks - - def check_type(self, interface, typename, type): - print "Checking type %s" % typename - v = type() - for n in dir(v): - if n[0] == '_': - continue - try: - value = getattr(v, n) - except TypeError, errstr: - if str(errstr) == "unknown union level": - print "ERROR: Unknown union level in %s.%s" % (typename, n) - self.errcount += 1 - continue - print str(errstr)[1:21] - if str(errstr)[0:21] == "Can not convert C Type": - print "ERROR: Unknown C type for %s.%s" % (typename, n) - self.errcount += 1 - continue - else: - print "ERROR: Failed to instantiate %s.%s" % (typename, n) - self.errcount += 1 - continue - except Exception: - print "ERROR: Failed to instantiate %s.%s" % (typename, n) - self.errcount += 1 - continue - - # now try setting the value back - try: - print "Setting %s.%s" % (typename, n) - setattr(v, n, value) - except Exception, e: - if isinstance(e, AttributeError) and str(e).endswith("is read-only"): - # readonly, ignore - continue - else: - print "ERROR: Failed to set %s.%s: %r: %s" % (typename, n, e.__class__, e) - self.errcount += 1 - continue - - # and try a comparison - try: - if value != getattr(v, n): - print "ERROR: Comparison failed for %s.%s: %r != %r" % (typename, n, value, getattr(v, n)) - continue - except Exception, e: - print "ERROR: compare exception for %s.%s: %r: %s" % (typename, n, e.__class__, e) - continue - - def check_interface(self, interface, iname): - errcount = self.errcount - for n in dir(interface): - if n[0] == '_' or n == iname: - # skip the special ones - continue - value = getattr(interface, n) - if isinstance(value, str): - #print "%s=\"%s\"" % (n, value) - pass - elif isinstance(value, int) or isinstance(value, long): - #print "%s=%d" % (n, value) - pass - elif isinstance(value, type): - try: - initial_blocks = talloc.total_blocks(None) - self.check_type(interface, n, value) - self.check_blocks(None, initial_blocks) - except Exception, e: - print "ERROR: Failed to check_type %s.%s: %r: %s" % (iname, n, e.__class__, e) - self.errcount += 1 - elif callable(value): - pass # Method - else: - print "UNKNOWN: %s=%s" % (n, value) - if self.errcount - errcount != 0: - print "Found %d errors in %s" % (self.errcount - errcount, iname) - - def check_all_interfaces(self): - for iname in dir(samba.dcerpc): - if iname[0] == '_': - continue - if iname == 'ClientConnection' or iname == 'base': - continue - print "Checking interface %s" % iname - iface = getattr(samba.dcerpc, iname) - initial_blocks = talloc.total_blocks(None) - self.check_interface(iface, iname) - self.check_blocks(None, initial_blocks) - - def run(self): - self.initial_blocks = talloc.total_blocks(None) - self.errcount = 0 - self.check_all_interfaces() - return self.errcount - -tests = RpcTests() -errcount = tests.run() -if errcount == 0: - sys.exit(0) -else: - print "%d failures" % errcount - sys.exit(1) diff --git a/source4/scripting/python/samba/tests/dcerpc/unix.py b/source4/scripting/python/samba/tests/dcerpc/unix.py deleted file mode 100644 index e8ef4da863..0000000000 --- a/source4/scripting/python/samba/tests/dcerpc/unix.py +++ /dev/null @@ -1,49 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.unixinfo.""" - - -from samba.dcerpc import unixinfo -from samba.tests import RpcInterfaceTestCase - -class UnixinfoTests(RpcInterfaceTestCase): - - def setUp(self): - super(UnixinfoTests, self).setUp() - self.conn = unixinfo.unixinfo("ncalrpc:", self.get_loadparm()) - - def test_getpwuid_int(self): - infos = self.conn.GetPWUid(range(512)) - self.assertEquals(512, len(infos)) - self.assertEquals("/bin/false", infos[0].shell) - self.assertTrue(isinstance(infos[0].homedir, unicode)) - - def test_getpwuid(self): - infos = self.conn.GetPWUid(map(long, range(512))) - self.assertEquals(512, len(infos)) - self.assertEquals("/bin/false", infos[0].shell) - self.assertTrue(isinstance(infos[0].homedir, unicode)) - - def test_gidtosid(self): - self.conn.GidToSid(1000L) - - def test_uidtosid(self): - self.conn.UidToSid(1000) - - def test_uidtosid_fail(self): - self.assertRaises(TypeError, self.conn.UidToSid, "100") diff --git a/source4/scripting/python/samba/tests/dns.py b/source4/scripting/python/samba/tests/dns.py deleted file mode 100644 index 49d699edb7..0000000000 --- a/source4/scripting/python/samba/tests/dns.py +++ /dev/null @@ -1,622 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Kai Blin <kai@samba.org> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -import struct -import random -from samba import socket -import samba.ndr as ndr -import samba.dcerpc.dns as dns -from samba.tests import TestCase - -class DNSTest(TestCase): - - def errstr(self, errcode): - "Return a readable error code" - string_codes = [ - "OK", - "FORMERR", - "SERVFAIL", - "NXDOMAIN", - "NOTIMP", - "REFUSED", - "YXDOMAIN", - "YXRRSET", - "NXRRSET", - "NOTAUTH", - "NOTZONE", - ] - - return string_codes[errcode] - - - def assert_dns_rcode_equals(self, packet, rcode): - "Helper function to check return code" - p_errcode = packet.operation & 0x000F - self.assertEquals(p_errcode, rcode, "Expected RCODE %s, got %s" % - (self.errstr(rcode), self.errstr(p_errcode))) - - def assert_dns_opcode_equals(self, packet, opcode): - "Helper function to check opcode" - p_opcode = packet.operation & 0x7800 - self.assertEquals(p_opcode, opcode, "Expected OPCODE %s, got %s" % - (opcode, p_opcode)) - - def make_name_packet(self, opcode, qid=None): - "Helper creating a dns.name_packet" - p = dns.name_packet() - if qid is None: - p.id = random.randint(0x0, 0xffff) - p.operation = opcode - p.questions = [] - return p - - def finish_name_packet(self, packet, questions): - "Helper to finalize a dns.name_packet" - packet.qdcount = len(questions) - packet.questions = questions - - def make_name_question(self, name, qtype, qclass): - "Helper creating a dns.name_question" - q = dns.name_question() - q.name = name - q.question_type = qtype - q.question_class = qclass - return q - - def get_dns_domain(self): - "Helper to get dns domain" - return os.getenv('REALM', 'example.com').lower() - - def dns_transaction_udp(self, packet, host=os.getenv('SERVER_IP')): - "send a DNS query and read the reply" - s = None - try: - send_packet = ndr.ndr_pack(packet) - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) - s.connect((host, 53)) - s.send(send_packet, 0) - recv_packet = s.recv(2048, 0) - return ndr.ndr_unpack(dns.name_packet, recv_packet) - finally: - if s is not None: - s.close() - - def dns_transaction_tcp(self, packet, host=os.getenv('SERVER_IP')): - "send a DNS query and read the reply" - s = None - try: - send_packet = ndr.ndr_pack(packet) - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) - s.connect((host, 53)) - tcp_packet = struct.pack('!H', len(send_packet)) - tcp_packet += send_packet - s.send(tcp_packet, 0) - recv_packet = s.recv(0xffff + 2, 0) - return ndr.ndr_unpack(dns.name_packet, recv_packet[2:]) - finally: - if s is not None: - s.close() - - -class TestSimpleQueries(DNSTest): - - def test_one_a_query(self): - "create a query packet containing one query record" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - print "asking for ", q.name - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, 1) - self.assertEquals(response.answers[0].rdata, - os.getenv('SERVER_IP')) - - def test_one_a_query_tcp(self): - "create a query packet containing one query record via TCP" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - print "asking for ", q.name - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_tcp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, 1) - self.assertEquals(response.answers[0].rdata, - os.getenv('SERVER_IP')) - - def test_two_queries(self): - "create a query packet containing two query records" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - questions.append(q) - - name = "%s.%s" % ('bogusname', self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_FORMERR) - - def test_qtype_all_query(self): - "create a QTYPE_ALL query" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_ALL, dns.DNS_QCLASS_IN) - print "asking for ", q.name - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - - num_answers = 1 - dc_ipv6 = os.getenv('SERVER_IPV6') - if dc_ipv6 is not None: - num_answers += 1 - - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, num_answers) - self.assertEquals(response.answers[0].rdata, - os.getenv('SERVER_IP')) - if dc_ipv6 is not None: - self.assertEquals(response.answers[1].rdata, dc_ipv6) - - def test_qclass_none_query(self): - "create a QCLASS_NONE query" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_ALL, dns.DNS_QCLASS_NONE) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NOTIMP) - -# Only returns an authority section entry in BIND and Win DNS -# FIXME: Enable one Samba implements this feature -# def test_soa_hostname_query(self): -# "create a SOA query for a hostname" -# p = self.make_name_packet(dns.DNS_OPCODE_QUERY) -# questions = [] -# -# name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) -# q = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) -# questions.append(q) -# -# self.finish_name_packet(p, questions) -# response = self.dns_transaction_udp(p) -# self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) -# self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) -# # We don't get SOA records for single hosts -# self.assertEquals(response.ancount, 0) - - def test_soa_domain_query(self): - "create a SOA query for a domain" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = self.get_dns_domain() - q = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, 1) - - -class TestDNSUpdates(DNSTest): - - def test_two_updates(self): - "create two update requests" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - u = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - updates.append(u) - - name = self.get_dns_domain() - u = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - updates.append(u) - - self.finish_name_packet(p, updates) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_FORMERR) - - def test_update_wrong_qclass(self): - "create update with DNS_QCLASS_NONE" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - u = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_NONE) - updates.append(u) - - self.finish_name_packet(p, updates) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NOTIMP) - - def test_update_prereq_with_non_null_ttl(self): - "test update with a non-null TTL" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - prereqs = [] - r = dns.res_rec() - r.name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_NONE - r.ttl = 1 - r.length = 0 - prereqs.append(r) - - p.ancount = len(prereqs) - p.answers = prereqs - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_FORMERR) - -# I'd love to test this one, but it segfaults. :) -# def test_update_prereq_with_non_null_length(self): -# "test update with a non-null length" -# p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) -# updates = [] -# -# name = self.get_dns_domain() -# -# u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) -# updates.append(u) -# self.finish_name_packet(p, updates) -# -# prereqs = [] -# r = dns.res_rec() -# r.name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) -# r.rr_type = dns.DNS_QTYPE_TXT -# r.rr_class = dns.DNS_QCLASS_ANY -# r.ttl = 0 -# r.length = 1 -# prereqs.append(r) -# -# p.ancount = len(prereqs) -# p.answers = prereqs -# -# response = self.dns_transaction_udp(p) -# self.assert_dns_rcode_equals(response, dns.DNS_RCODE_FORMERR) - - def test_update_prereq_nonexisting_name(self): - "test update with a nonexisting name" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - prereqs = [] - r = dns.res_rec() - r.name = "idontexist.%s" % self.get_dns_domain() - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_ANY - r.ttl = 0 - r.length = 0 - prereqs.append(r) - - p.ancount = len(prereqs) - p.answers = prereqs - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NXRRSET) - - def test_update_add_txt_record(self): - "test adding records works" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = "textrec.%s" % self.get_dns_domain() - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_IN - r.ttl = 900 - r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "textrec.%s" % self.get_dns_domain() - q = self.make_name_question(name, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assertEquals(response.ancount, 1) - self.assertEquals(response.answers[0].rdata.txt, '"This is a test"') - - def test_update_add_two_txt_records(self): - "test adding two txt records works" - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = "textrec2.%s" % self.get_dns_domain() - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_IN - r.ttl = 900 - r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test" "and this is a test, too"' - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "textrec2.%s" % self.get_dns_domain() - q = self.make_name_question(name, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assertEquals(response.ancount, 1) - self.assertEquals(response.answers[0].rdata.txt, '"This is a test" "and this is a test, too"') - - def test_delete_record(self): - "Test if deleting records works" - - NAME = "deleterec.%s" % self.get_dns_domain() - - # First, create a record to make sure we have a record to delete. - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = NAME - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_IN - r.ttl = 900 - r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - # Now check the record is around - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - q = self.make_name_question(NAME, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - # Now delete the record - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = NAME - r.rr_type = dns.DNS_QTYPE_TXT - r.rr_class = dns.DNS_QCLASS_NONE - r.ttl = 0 - r.length = 0xffff - r.rdata = dns.txt_record() - r.rdata.txt = '"This is a test"' - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - # And finally check it's gone - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - q = self.make_name_question(NAME, dns.DNS_QTYPE_TXT, dns.DNS_QCLASS_IN) - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_NXDOMAIN) - - -class TestComplexQueries(DNSTest): - - def setUp(self): - super(TestComplexQueries, self).setUp() - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = "cname_test.%s" % self.get_dns_domain() - r.rr_type = dns.DNS_QTYPE_CNAME - r.rr_class = dns.DNS_QCLASS_IN - r.ttl = 900 - r.length = 0xffff - r.rdata = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - def tearDown(self): - super(TestComplexQueries, self).tearDown() - p = self.make_name_packet(dns.DNS_OPCODE_UPDATE) - updates = [] - - name = self.get_dns_domain() - - u = self.make_name_question(name, dns.DNS_QTYPE_SOA, dns.DNS_QCLASS_IN) - updates.append(u) - self.finish_name_packet(p, updates) - - updates = [] - r = dns.res_rec() - r.name = "cname_test.%s" % self.get_dns_domain() - r.rr_type = dns.DNS_QTYPE_CNAME - r.rr_class = dns.DNS_QCLASS_NONE - r.ttl = 0 - r.length = 0xffff - r.rdata = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - updates.append(r) - p.nscount = len(updates) - p.nsrecs = updates - - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - - def test_one_a_query(self): - "create a query packet containing one query record" - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "cname_test.%s" % self.get_dns_domain() - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - print "asking for ", q.name - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, 2) - self.assertEquals(response.answers[0].rr_type, dns.DNS_QTYPE_CNAME) - self.assertEquals(response.answers[0].rdata, "%s.%s" % - (os.getenv('SERVER'), self.get_dns_domain())) - self.assertEquals(response.answers[1].rr_type, dns.DNS_QTYPE_A) - self.assertEquals(response.answers[1].rdata, - os.getenv('SERVER_IP')) - -class TestInvalidQueries(DNSTest): - - def test_one_a_query(self): - "send 0 bytes follows by create a query packet containing one query record" - - s = None - try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) - s.connect((os.getenv('SERVER_IP'), 53)) - s.send("", 0) - finally: - if s is not None: - s.close() - - p = self.make_name_packet(dns.DNS_OPCODE_QUERY) - questions = [] - - name = "%s.%s" % (os.getenv('SERVER'), self.get_dns_domain()) - q = self.make_name_question(name, dns.DNS_QTYPE_A, dns.DNS_QCLASS_IN) - print "asking for ", q.name - questions.append(q) - - self.finish_name_packet(p, questions) - response = self.dns_transaction_udp(p) - self.assert_dns_rcode_equals(response, dns.DNS_RCODE_OK) - self.assert_dns_opcode_equals(response, dns.DNS_OPCODE_QUERY) - self.assertEquals(response.ancount, 1) - self.assertEquals(response.answers[0].rdata, - os.getenv('SERVER_IP')) - -if __name__ == "__main__": - import unittest - unittest.main() diff --git a/source4/scripting/python/samba/tests/docs.py b/source4/scripting/python/samba/tests/docs.py deleted file mode 100644 index c1b371680d..0000000000 --- a/source4/scripting/python/samba/tests/docs.py +++ /dev/null @@ -1,127 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2012 -# -# Tests for documentation. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for presence of documentation.""" - -import samba -import samba.tests -from samba.tests import TestSkipped - -import errno -import os -import re -import subprocess - - -class TestCase(samba.tests.TestCase): - - def _format_message(self, parameters, message): - parameters = list(parameters) - parameters.sort() - return message + '\n\n %s' % ('\n '.join(parameters)) - - -class NoXsltProc(Exception): - - def __init__(self): - Exception.__init__(self, "'xsltproc' is not installed") - - -def get_documented_parameters(sourcedir): - path = os.path.join(sourcedir, "bin", "default", "docs-xml", "smbdotconf") - if not os.path.exists(os.path.join(path, "parameters.all.xml")): - raise Exception("Unable to find parameters.all.xml") - try: - p = subprocess.Popen( - ["xsltproc", "--xinclude", "--param", "smb.context", "ALL", os.path.join(sourcedir, "docs-xml", "smbdotconf", "generate-context.xsl"), "parameters.all.xml"], - stderr=subprocess.STDOUT, stdout=subprocess.PIPE, - cwd=path) - except OSError, e: - if e.errno == errno.ENOENT: - raise NoXsltProc() - raise - out, err = p.communicate() - assert p.returncode == 0, "returncode was %r" % p.returncode - for l in out.splitlines(): - m = re.match('<samba:parameter .*?name="([^"]*?)"', l) - if "removed=\"1\"" in l: - continue - if m: - name = m.group(1) - yield name - m = re.match('.*<synonym>(.*)</synonym>.*', l) - if m: - name = m.group(1) - yield name - - -def get_implementation_parameters(sourcedir): - # Reading entries from source code - f = open(os.path.join(sourcedir, "lib/param/param_table.c"), "r") - try: - # burn through the preceding lines - while True: - l = f.readline() - if l.startswith("static struct parm_struct parm_table"): - break - - for l in f.readlines(): - if re.match("^\s*\}\;\s*$", l): - break - # pull in the param names only - if re.match(".*P_SEPARATOR.*", l): - continue - m = re.match("\s*\.label\s*=\s*\"(.*)\".*", l) - if not m: - continue - - name = m.group(1) - yield name - finally: - f.close() - - -class SmbDotConfTests(TestCase): - - def test_unknown(self): - topdir = samba.source_tree_topdir() - try: - documented = set(get_documented_parameters(topdir)) - except NoXsltProc: - raise TestSkipped("'xsltproc' is missing, unable to load parameters") - parameters = set(get_implementation_parameters(topdir)) - # Filter out parametric options, since we can't find them in the parm - # table - documented = set([p for p in documented if not ":" in p]) - unknown = documented.difference(parameters) - if len(unknown) > 0: - self.fail(self._format_message(unknown, - "Parameters that are documented but not in the implementation:")) - - def test_undocumented(self): - topdir = samba.source_tree_topdir() - try: - documented = set(get_documented_parameters(topdir)) - except NoXsltProc: - raise TestSkipped("'xsltproc' is missing, unable to load parameters") - parameters = set(get_implementation_parameters(topdir)) - undocumented = parameters.difference(documented) - if len(undocumented) > 0: - self.fail(self._format_message(undocumented, - "Parameters that are in the implementation but undocumented:")) diff --git a/source4/scripting/python/samba/tests/dsdb.py b/source4/scripting/python/samba/tests/dsdb.py deleted file mode 100644 index 3aef1d2fa4..0000000000 --- a/source4/scripting/python/samba/tests/dsdb.py +++ /dev/null @@ -1,130 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for dsdb -# Copyright (C) Matthieu Patou <mat@matws.net> 2010 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dsdb.""" - -from samba.credentials import Credentials -from samba.samdb import SamDB -from samba.auth import system_session -from samba.tests import TestCase -from samba.ndr import ndr_unpack, ndr_pack -from samba.dcerpc import drsblobs -import ldb -import os -import samba - - -class DsdbTests(TestCase): - - def setUp(self): - super(DsdbTests, self).setUp() - self.lp = samba.param.LoadParm() - self.lp.load(os.path.join(os.path.join(self.baseprovpath(), "etc"), "smb.conf")) - self.creds = Credentials() - self.creds.guess(self.lp) - self.session = system_session() - self.samdb = SamDB(os.path.join(self.baseprovpath(), "private", "sam.ldb"), - session_info=self.session, credentials=self.creds,lp=self.lp) - - def baseprovpath(self): - return os.path.join(os.environ['SELFTEST_PREFIX'], "dc") - - def test_get_oid_from_attrid(self): - oid = self.samdb.get_oid_from_attid(591614) - self.assertEquals(oid, "1.2.840.113556.1.4.1790") - - def test_error_replpropertymetadata(self): - res = self.samdb.search(expression="cn=Administrator", - scope=ldb.SCOPE_SUBTREE, - attrs=["replPropertyMetaData"]) - repl = ndr_unpack(drsblobs.replPropertyMetaDataBlob, - str(res[0]["replPropertyMetaData"])) - ctr = repl.ctr - for o in ctr.array: - # Search for Description - if o.attid == 13: - old_version = o.version - o.version = o.version + 1 - replBlob = ndr_pack(repl) - msg = ldb.Message() - msg.dn = res[0].dn - msg["replPropertyMetaData"] = ldb.MessageElement(replBlob, ldb.FLAG_MOD_REPLACE, "replPropertyMetaData") - self.assertRaises(ldb.LdbError, self.samdb.modify, msg, ["local_oid:1.3.6.1.4.1.7165.4.3.14:0"]) - - def test_twoatt_replpropertymetadata(self): - res = self.samdb.search(expression="cn=Administrator", - scope=ldb.SCOPE_SUBTREE, - attrs=["replPropertyMetaData", "uSNChanged"]) - repl = ndr_unpack(drsblobs.replPropertyMetaDataBlob, - str(res[0]["replPropertyMetaData"])) - ctr = repl.ctr - for o in ctr.array: - # Search for Description - if o.attid == 13: - old_version = o.version - o.version = o.version + 1 - o.local_usn = long(str(res[0]["uSNChanged"])) + 1 - replBlob = ndr_pack(repl) - msg = ldb.Message() - msg.dn = res[0].dn - msg["replPropertyMetaData"] = ldb.MessageElement(replBlob, ldb.FLAG_MOD_REPLACE, "replPropertyMetaData") - msg["description"] = ldb.MessageElement("new val", ldb.FLAG_MOD_REPLACE, "description") - self.assertRaises(ldb.LdbError, self.samdb.modify, msg, ["local_oid:1.3.6.1.4.1.7165.4.3.14:0"]) - - def test_set_replpropertymetadata(self): - res = self.samdb.search(expression="cn=Administrator", - scope=ldb.SCOPE_SUBTREE, - attrs=["replPropertyMetaData", "uSNChanged"]) - repl = ndr_unpack(drsblobs.replPropertyMetaDataBlob, - str(res[0]["replPropertyMetaData"])) - ctr = repl.ctr - for o in ctr.array: - # Search for Description - if o.attid == 13: - old_version = o.version - o.version = o.version + 1 - o.local_usn = long(str(res[0]["uSNChanged"])) + 1 - o.originating_usn = long(str(res[0]["uSNChanged"])) + 1 - replBlob = ndr_pack(repl) - msg = ldb.Message() - msg.dn = res[0].dn - msg["replPropertyMetaData"] = ldb.MessageElement(replBlob, ldb.FLAG_MOD_REPLACE, "replPropertyMetaData") - self.samdb.modify(msg, ["local_oid:1.3.6.1.4.1.7165.4.3.14:0"]) - - def test_ok_get_attribute_from_attid(self): - self.assertEquals(self.samdb.get_attribute_from_attid(13), "description") - - def test_ko_get_attribute_from_attid(self): - self.assertEquals(self.samdb.get_attribute_from_attid(11979), None) - - def test_get_attribute_replmetadata_version(self): - res = self.samdb.search(expression="cn=Administrator", - scope=ldb.SCOPE_SUBTREE, - attrs=["dn"]) - self.assertEquals(len(res), 1) - dn = str(res[0].dn) - self.assertEqual(self.samdb.get_attribute_replmetadata_version(dn, "unicodePwd"), 1) - - def test_set_attribute_replmetadata_version(self): - res = self.samdb.search(expression="cn=Administrator", - scope=ldb.SCOPE_SUBTREE, - attrs=["dn"]) - self.assertEquals(len(res), 1) - dn = str(res[0].dn) - version = self.samdb.get_attribute_replmetadata_version(dn, "description") - self.samdb.set_attribute_replmetadata_version(dn, "description", version + 2) - self.assertEqual(self.samdb.get_attribute_replmetadata_version(dn, "description"), version + 2) diff --git a/source4/scripting/python/samba/tests/gensec.py b/source4/scripting/python/samba/tests/gensec.py deleted file mode 100644 index e270c418ea..0000000000 --- a/source4/scripting/python/samba/tests/gensec.py +++ /dev/null @@ -1,146 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2009 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for GENSEC. - -Note that this just tests the bindings work. It does not intend to test -the functionality, that's already done in other tests. -""" - -from samba.credentials import Credentials -from samba import gensec, auth -import samba.tests - -class GensecTests(samba.tests.TestCase): - - def setUp(self): - super(GensecTests, self).setUp() - self.settings = {} - self.settings["lp_ctx"] = self.lp_ctx = samba.tests.env_loadparm() - self.settings["target_hostname"] = self.lp_ctx.get("netbios name") - """This is just for the API tests""" - self.gensec = gensec.Security.start_client(self.settings) - - def test_start_mech_by_unknown_name(self): - self.assertRaises(RuntimeError, self.gensec.start_mech_by_name, "foo") - - def test_start_mech_by_name(self): - self.gensec.start_mech_by_name("spnego") - - def test_info_uninitialized(self): - self.assertRaises(RuntimeError, self.gensec.session_info) - - def test_update(self): - """Test GENSEC by doing an exchange with ourselves using GSSAPI against a KDC""" - - """Start up a client and server GENSEC instance to test things with""" - - self.gensec_client = gensec.Security.start_client(self.settings) - self.gensec_client.set_credentials(self.get_credentials()) - self.gensec_client.want_feature(gensec.FEATURE_SEAL) - self.gensec_client.start_mech_by_sasl_name("GSSAPI") - - self.gensec_server = gensec.Security.start_server(settings=self.settings, - auth_context=auth.AuthContext(lp_ctx=self.lp_ctx)) - creds = Credentials() - creds.guess(self.lp_ctx) - creds.set_machine_account(self.lp_ctx) - self.gensec_server.set_credentials(creds) - - self.gensec_server.want_feature(gensec.FEATURE_SEAL) - self.gensec_server.start_mech_by_sasl_name("GSSAPI") - - client_finished = False - server_finished = False - server_to_client = "" - - """Run the actual call loop""" - while not client_finished and not server_finished: - if not client_finished: - print "running client gensec_update" - (client_finished, client_to_server) = self.gensec_client.update(server_to_client) - if not server_finished: - print "running server gensec_update" - (server_finished, server_to_client) = self.gensec_server.update(client_to_server) - session_info = self.gensec_server.session_info() - - test_string = "Hello Server" - test_wrapped = self.gensec_client.wrap(test_string) - test_unwrapped = self.gensec_server.unwrap(test_wrapped) - self.assertEqual(test_string, test_unwrapped) - test_string = "Hello Client" - test_wrapped = self.gensec_server.wrap(test_string) - test_unwrapped = self.gensec_client.unwrap(test_wrapped) - self.assertEqual(test_string, test_unwrapped) - - client_session_key = self.gensec_client.session_key() - server_session_key = self.gensec_server.session_key() - self.assertEqual(client_session_key, server_session_key) - - def test_max_update_size(self): - """Test GENSEC by doing an exchange with ourselves using GSSAPI against a KDC""" - - """Start up a client and server GENSEC instance to test things with""" - - self.gensec_client = gensec.Security.start_client(self.settings) - self.gensec_client.set_credentials(self.get_credentials()) - self.gensec_client.want_feature(gensec.FEATURE_SIGN) - self.gensec_client.set_max_update_size(5) - self.gensec_client.start_mech_by_name("spnego") - - self.gensec_server = gensec.Security.start_server(settings=self.settings, - auth_context=auth.AuthContext(lp_ctx=self.lp_ctx)) - creds = Credentials() - creds.guess(self.lp_ctx) - creds.set_machine_account(self.lp_ctx) - self.gensec_server.set_credentials(creds) - self.gensec_server.want_feature(gensec.FEATURE_SIGN) - self.gensec_server.set_max_update_size(5) - self.gensec_server.start_mech_by_name("spnego") - - client_finished = False - server_finished = False - server_to_client = "" - - """Run the actual call loop""" - i = 0 - while not client_finished or not server_finished: - i += 1 - if not client_finished: - print "running client gensec_update: %d: %r" % (len(server_to_client), server_to_client) - (client_finished, client_to_server) = self.gensec_client.update(server_to_client) - if not server_finished: - print "running server gensec_update: %d: %r" % (len(client_to_server), client_to_server) - (server_finished, server_to_client) = self.gensec_server.update(client_to_server) - - """Here we expect a lot more than the typical 1 or 2 roundtrips""" - self.assertTrue(i > 10) - - session_info = self.gensec_server.session_info() - - test_string = "Hello Server" - test_wrapped = self.gensec_client.wrap(test_string) - test_unwrapped = self.gensec_server.unwrap(test_wrapped) - self.assertEqual(test_string, test_unwrapped) - test_string = "Hello Client" - test_wrapped = self.gensec_server.wrap(test_string) - test_unwrapped = self.gensec_client.unwrap(test_wrapped) - self.assertEqual(test_string, test_unwrapped) - - client_session_key = self.gensec_client.session_key() - server_session_key = self.gensec_server.session_key() - self.assertEqual(client_session_key, server_session_key) diff --git a/source4/scripting/python/samba/tests/getopt.py b/source4/scripting/python/samba/tests/getopt.py deleted file mode 100644 index 14ee0a7428..0000000000 --- a/source4/scripting/python/samba/tests/getopt.py +++ /dev/null @@ -1,55 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for option parsing. - -""" - -import optparse -from samba.getopt import ( - AUTO_USE_KERBEROS, - DONT_USE_KERBEROS, - MUST_USE_KERBEROS, - parse_kerberos_arg, - ) -import samba.tests - -class KerberosOptionTests(samba.tests.TestCase): - - def test_parse_true(self): - self.assertEquals( - MUST_USE_KERBEROS, parse_kerberos_arg("yes", "--kerberos")) - self.assertEquals( - MUST_USE_KERBEROS, parse_kerberos_arg("true", "--kerberos")) - self.assertEquals( - MUST_USE_KERBEROS, parse_kerberos_arg("1", "--kerberos")) - - def test_parse_false(self): - self.assertEquals( - DONT_USE_KERBEROS, parse_kerberos_arg("no", "--kerberos")) - self.assertEquals( - DONT_USE_KERBEROS, parse_kerberos_arg("false", "--kerberos")) - self.assertEquals( - DONT_USE_KERBEROS, parse_kerberos_arg("0", "--kerberos")) - - def test_parse_auto(self): - self.assertEquals( - AUTO_USE_KERBEROS, parse_kerberos_arg("auto", "--kerberos")) - - def test_parse_invalid(self): - self.assertRaises(optparse.OptionValueError, - parse_kerberos_arg, "blah?", "--kerberos") diff --git a/source4/scripting/python/samba/tests/hostconfig.py b/source4/scripting/python/samba/tests/hostconfig.py deleted file mode 100644 index 526dc0fe4e..0000000000 --- a/source4/scripting/python/samba/tests/hostconfig.py +++ /dev/null @@ -1,74 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for shares -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2009 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.hostconfig.""" - -from samba.hostconfig import SharesContainer -from samba.tests import TestCase - - -class MockService(object): - - def __init__(self, data): - self.data = data - - def __getitem__(self, name): - return self.data[name] - - -class MockLoadParm(object): - - def __init__(self, data): - self.data = data - - def __getitem__(self, name): - return MockService(self.data[name]) - - def __len__(self): - return len(self.data) - - def services(self): - return self.data.keys() - - -class ShareTests(TestCase): - - def _get_shares(self, conf): - return SharesContainer(MockLoadParm(conf)) - - def test_len_no_global(self): - shares = self._get_shares({}) - self.assertEquals(0, len(shares)) - - def test_iter(self): - self.assertEquals([], list(self._get_shares({}))) - self.assertEquals([], list(self._get_shares({"global":{}}))) - self.assertEquals( - ["bla"], - list(self._get_shares({"global":{}, "bla":{}}))) - - def test_len(self): - shares = self._get_shares({"global": {}}) - self.assertEquals(0, len(shares)) - - def test_getitem_nonexistent(self): - shares = self._get_shares({"global": {}}) - self.assertRaises(KeyError, shares.__getitem__, "bla") - - def test_getitem_global(self): - shares = self._get_shares({"global": {}}) - self.assertRaises(KeyError, shares.__getitem__, "global") diff --git a/source4/scripting/python/samba/tests/libsmb_samba_internal.py b/source4/scripting/python/samba/tests/libsmb_samba_internal.py deleted file mode 100644 index fe9f197a2c..0000000000 --- a/source4/scripting/python/samba/tests/libsmb_samba_internal.py +++ /dev/null @@ -1,78 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright Volker Lendecke <vl@samba.org> 2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.samba3.libsmb_samba_internal.""" - -from samba.samba3 import libsmb_samba_internal -from samba.dcerpc import security -from samba.samba3 import param as s3param -from samba import credentials -import samba.tests -import threading -import sys -import os - -class LibsmbTestCase(samba.tests.TestCase): - - class OpenClose(threading.Thread): - - def __init__(self, conn, filename, num_ops): - threading.Thread.__init__(self) - self.conn = conn - self.filename = filename - self.num_ops = num_ops - self.exc = False - - def run(self): - c = self.conn - try: - for i in range(self.num_ops): - f = c.create(self.filename, CreateDisposition=3, - DesiredAccess=security.SEC_STD_DELETE) - c.delete_on_close(f, True) - c.close(f) - except Exception: - self.exc = sys.exc_info() - - def test_OpenClose(self): - - lp = s3param.get_context() - lp.load(os.getenv("SMB_CONF_PATH")) - - creds = credentials.Credentials() - creds.set_username(os.getenv("USERNAME")) - creds.set_password(os.getenv("PASSWORD")) - - c = libsmb_samba_internal.Conn(os.getenv("SERVER_IP"), "tmp", creds) - - mythreads = [] - - for i in range(3): - t = LibsmbTestCase.OpenClose(c, "test" + str(i), 10) - mythreads.append(t) - - for t in mythreads: - t.start() - - for t in mythreads: - t.join() - if t.exc: - raise t.exc[0](t.exc[1]) - -if __name__ == "__main__": - import unittest - unittest.main() diff --git a/source4/scripting/python/samba/tests/messaging.py b/source4/scripting/python/samba/tests/messaging.py deleted file mode 100644 index f0cd368195..0000000000 --- a/source4/scripting/python/samba/tests/messaging.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Unix SMB/CIFS implementation. -# Copyright © Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.messaging.""" - -from samba.messaging import Messaging -from samba.tests import TestCase -from samba.dcerpc.server_id import server_id - -class MessagingTests(TestCase): - - def get_context(self, *args, **kwargs): - return Messaging(*args, **kwargs) - - def test_register(self): - x = self.get_context() - def callback(): - pass - msg_type = x.register(callback) - x.deregister(callback, msg_type) - - def test_all_servers(self): - x = self.get_context() - self.assertTrue(isinstance(x.irpc_all_servers(), list)) - - def test_by_name(self): - x = self.get_context() - for name in x.irpc_all_servers(): - self.assertTrue(isinstance(x.irpc_servers_byname(name.name), list)) - - def test_assign_server_id(self): - x = self.get_context() - self.assertTrue(isinstance(x.server_id, server_id)) - - def test_ping_speed(self): - server_ctx = self.get_context((0, 1)) - def ping_callback(src, data): - server_ctx.send(src, data) - def exit_callback(): - print "received exit" - msg_ping = server_ctx.register(ping_callback) - msg_exit = server_ctx.register(exit_callback) - - def pong_callback(): - print "received pong" - client_ctx = self.get_context((0, 2)) - msg_pong = client_ctx.register(pong_callback) - - client_ctx.send((0, 1), msg_ping, "testing") - client_ctx.send((0, 1), msg_ping, "") - diff --git a/source4/scripting/python/samba/tests/netcmd.py b/source4/scripting/python/samba/tests/netcmd.py deleted file mode 100644 index 2cbac4e8bf..0000000000 --- a/source4/scripting/python/samba/tests/netcmd.py +++ /dev/null @@ -1,90 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2009-2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.netcmd.""" - -from cStringIO import StringIO -from samba.netcmd import Command -from samba.netcmd.testparm import cmd_testparm -from samba.netcmd.main import cmd_sambatool -import samba.tests - -class NetCmdTestCase(samba.tests.TestCase): - - def run_netcmd(self, cmd_klass, args, retcode=0): - cmd = cmd_klass(outf=StringIO(), errf=StringIO()) - try: - retval = cmd._run(cmd_klass.__name__, *args) - except Exception, e: - cmd.show_command_error(e) - retval = 1 - self.assertEquals(retcode, retval) - return cmd.outf.getvalue(), cmd.errf.getvalue() - - def iter_all_subcommands(self): - todo = [] - todo.extend(cmd_sambatool.subcommands.items()) - while todo: - (path, cmd) = todo.pop() - yield path, cmd - subcmds = getattr(cmd, "subcommands", {}) - todo.extend([(path + " " + k, v) for (k, v) in - subcmds.iteritems()]) - - -class TestParmTests(NetCmdTestCase): - - def test_no_client_ip(self): - out, err = self.run_netcmd(cmd_testparm, ["--client-name=foo"], - retcode=-1) - self.assertEquals("", out) - self.assertEquals( - "ERROR: Both a DNS name and an IP address are " - "required for the host access check\n", err) - - -class CommandTests(NetCmdTestCase): - - def test_description(self): - class cmd_foo(Command): - """Mydescription""" - self.assertEquals("Mydescription", cmd_foo().short_description) - - def test_name(self): - class cmd_foo(Command): - pass - self.assertEquals("foo", cmd_foo().name) - - def test_synopsis_everywhere(self): - missing = [] - for path, cmd in self.iter_all_subcommands(): - if cmd.synopsis is None: - missing.append(path) - if missing: - self.fail("The following commands do not have a synopsis set: %r" % - missing) - - def test_short_description_everywhere(self): - missing = [] - for path, cmd in self.iter_all_subcommands(): - if cmd.short_description is None: - missing.append(path) - if not missing: - return - self.fail( - "The following commands do not have a short description set: %r" % - missing) diff --git a/source4/scripting/python/samba/tests/ntacls.py b/source4/scripting/python/samba/tests/ntacls.py deleted file mode 100644 index aa9ef6852b..0000000000 --- a/source4/scripting/python/samba/tests/ntacls.py +++ /dev/null @@ -1,83 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for ntacls manipulation -# Copyright (C) Matthieu Patou <mat@matws.net> 2009-2010 -# Copyright (C) Andrew Bartlett 2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.ntacls.""" - -from samba.ntacls import setntacl, getntacl, XattrBackendError -from samba.dcerpc import xattr, security -from samba.param import LoadParm -from samba.tests import TestCaseInTempDir, TestSkipped -import random -import os - -class NtaclsTests(TestCaseInTempDir): - - def test_setntacl(self): - lp = LoadParm() - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - open(self.tempf, 'w').write("empty") - lp.set("posix:eadb",os.path.join(self.tempdir,"eadbtest.tdb")) - setntacl(lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467") - os.unlink(os.path.join(self.tempdir,"eadbtest.tdb")) - - def test_setntacl_getntacl(self): - lp = LoadParm() - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - open(self.tempf, 'w').write("empty") - lp.set("posix:eadb",os.path.join(self.tempdir,"eadbtest.tdb")) - setntacl(lp,self.tempf,acl,"S-1-5-21-2212615479-2695158682-2101375467") - facl = getntacl(lp,self.tempf) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(anysid),acl) - os.unlink(os.path.join(self.tempdir,"eadbtest.tdb")) - - def test_setntacl_getntacl_param(self): - lp = LoadParm() - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - open(self.tempf, 'w').write("empty") - setntacl(lp,self.tempf,acl,"S-1-5-21-2212615479-2695158682-2101375467","tdb",os.path.join(self.tempdir,"eadbtest.tdb")) - facl=getntacl(lp,self.tempf,"tdb",os.path.join(self.tempdir,"eadbtest.tdb")) - domsid=security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(domsid),acl) - os.unlink(os.path.join(self.tempdir,"eadbtest.tdb")) - - def test_setntacl_invalidbackend(self): - lp = LoadParm() - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - open(self.tempf, 'w').write("empty") - self.assertRaises(XattrBackendError, setntacl, lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467","ttdb", os.path.join(self.tempdir,"eadbtest.tdb")) - - def test_setntacl_forcenative(self): - if os.getuid() == 0: - raise TestSkipped("Running test as root, test skipped") - lp = LoadParm() - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - open(self.tempf, 'w').write("empty") - lp.set("posix:eadb", os.path.join(self.tempdir,"eadbtest.tdb")) - self.assertRaises(Exception, setntacl, lp, self.tempf ,acl, - "S-1-5-21-2212615479-2695158682-2101375467","native") - - - def setUp(self): - super(NtaclsTests, self).setUp() - self.tempf = os.path.join(self.tempdir, "test") - open(self.tempf, 'w').write("empty") - - def tearDown(self): - os.unlink(self.tempf) - super(NtaclsTests, self).tearDown() diff --git a/source4/scripting/python/samba/tests/param.py b/source4/scripting/python/samba/tests/param.py deleted file mode 100644 index f539eba140..0000000000 --- a/source4/scripting/python/samba/tests/param.py +++ /dev/null @@ -1,57 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.param.""" - -from samba import param -import samba.tests - -class LoadParmTestCase(samba.tests.TestCase): - - def test_init(self): - file = param.LoadParm() - self.assertTrue(file is not None) - - def test_length(self): - file = param.LoadParm() - self.assertEquals(0, len(file)) - - def test_set_workgroup(self): - file = param.LoadParm() - file.set("workgroup", "bla") - self.assertEquals("BLA", file.get("workgroup")) - - def test_is_mydomain(self): - file = param.LoadParm() - file.set("workgroup", "bla") - self.assertTrue(file.is_mydomain("BLA")) - self.assertFalse(file.is_mydomain("FOOBAR")) - - def test_is_myname(self): - file = param.LoadParm() - file.set("netbios name", "bla") - self.assertTrue(file.is_myname("BLA")) - self.assertFalse(file.is_myname("FOOBAR")) - - def test_load_default(self): - file = param.LoadParm() - file.load_default() - - def test_section_nonexistent(self): - samba_lp = param.LoadParm() - samba_lp.load_default() - self.assertRaises(KeyError, samba_lp.__getitem__, "nonexistent") diff --git a/source4/scripting/python/samba/tests/policy.py b/source4/scripting/python/samba/tests/policy.py deleted file mode 100644 index b245745152..0000000000 --- a/source4/scripting/python/samba/tests/policy.py +++ /dev/null @@ -1,34 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2010 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for the libpolicy Python bindings. - -""" - -from samba.tests import TestCase -from samba import policy - - -class PolicyTests(TestCase): - - def test_get_gpo_flags(self): - self.assertEquals(["GPO_FLAG_USER_DISABLE"], - policy.get_gpo_flags(policy.GPO_FLAG_USER_DISABLE)) - - def test_get_gplink_options(self): - self.assertEquals(["GPLINK_OPT_DISABLE"], - policy.get_gplink_options(policy.GPLINK_OPT_DISABLE)) diff --git a/source4/scripting/python/samba/tests/posixacl.py b/source4/scripting/python/samba/tests/posixacl.py deleted file mode 100644 index 7cd22ebccd..0000000000 --- a/source4/scripting/python/samba/tests/posixacl.py +++ /dev/null @@ -1,732 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for NT and posix ACL manipulation -# Copyright (C) Matthieu Patou <mat@matws.net> 2009-2010 -# Copyright (C) Andrew Bartlett 2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for the Samba3 NT -> posix ACL layer""" - -from samba.ntacls import setntacl, getntacl, checkset_backend -from samba.dcerpc import xattr, security, smb_acl, idmap -from samba.param import LoadParm -from samba.tests import TestCaseInTempDir -from samba import provision -import random -import os -from samba.samba3 import smbd, passdb -from samba.samba3 import param as s3param - -# To print a posix ACL use: -# for entry in posix_acl.acl: -# print "a_type: %d" % entry.a_type -# print "a_perm: %o" % entry.a_perm -# print "uid: %d" % entry.uid -# print "gid: %d" % entry.gid - -class PosixAclMappingTests(TestCaseInTempDir): - - def test_setntacl(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - - def test_setntacl_smbd_getntacl(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=True) - facl = getntacl(self.lp, self.tempf, direct_db_access=True) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(anysid),acl) - - def test_setntacl_smbd_setposixacl_getntacl(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=True) - - # This will invalidate the ACL, as we have a hook! - smbd.set_simple_acl(self.tempf, 0640) - - # However, this only asks the xattr - try: - facl = getntacl(self.lp, self.tempf, direct_db_access=True) - self.assertTrue(False) - except TypeError: - pass - - def test_setntacl_invalidate_getntacl(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=True) - - # This should invalidate the ACL, as we include the posix ACL in the hash - (backend_obj, dbname) = checkset_backend(self.lp, None, None) - backend_obj.wrap_setxattr(dbname, - self.tempf, "system.fake_access_acl", "") - - #however, as this is direct DB access, we do not notice it - facl = getntacl(self.lp, self.tempf, direct_db_access=True) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setntacl_invalidate_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - - # This should invalidate the ACL, as we include the posix ACL in the hash - (backend_obj, dbname) = checkset_backend(self.lp, None, None) - backend_obj.wrap_setxattr(dbname, - self.tempf, "system.fake_access_acl", "") - - #the hash would break, and we return an ACL based only on the mode, except we set the ACL using the 'ntvfs' mode that doesn't include a hash - facl = getntacl(self.lp, self.tempf) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setntacl_smbd_invalidate_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - simple_acl_from_posix = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)(A;;0x001200a9;;;S-1-5-21-2212615479-2695158682-2101375467-513)(A;;;;;WD)" - os.chmod(self.tempf, 0750) - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - - # This should invalidate the ACL, as we include the posix ACL in the hash - (backend_obj, dbname) = checkset_backend(self.lp, None, None) - backend_obj.wrap_setxattr(dbname, - self.tempf, "system.fake_access_acl", "") - - #the hash will break, and we return an ACL based only on the mode - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(simple_acl_from_posix, facl.as_sddl(anysid)) - - def test_setntacl_smbd_dont_invalidate_getntacl_smbd(self): - # set an ACL on a tempfile - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - os.chmod(self.tempf, 0750) - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - - # now influence the POSIX ACL->SD mapping it returns something else than - # what was set previously - # this should not invalidate the hash and the complete ACL should still - # be returned - self.lp.set("profile acls", "yes") - # we should still get back the ACL (and not one mapped from POSIX ACL) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - self.lp.set("profile acls", "no") - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setntacl_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=True) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(anysid),acl) - - def test_setntacl_smbd_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(anysid),acl) - - def test_setntacl_smbd_setposixacl_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - simple_acl_from_posix = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;;0x001f019f;;;S-1-5-21-2212615479-2695158682-2101375467-512)(A;;0x00120089;;;S-1-5-21-2212615479-2695158682-2101375467-513)(A;;;;;WD)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - # This invalidates the hash of the NT acl just set because there is a hook in the posix ACL set code - smbd.set_simple_acl(self.tempf, 0640) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(simple_acl_from_posix, facl.as_sddl(anysid)) - - def test_setntacl_smbd_setposixacl_group_getntacl_smbd(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - simple_acl_from_posix = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;;0x001f019f;;;S-1-5-21-2212615479-2695158682-2101375467-512)(A;;0x00120089;;;BA)(A;;0x00120089;;;S-1-5-21-2212615479-2695158682-2101375467-513)(A;;;;;WD)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - # This invalidates the hash of the NT acl just set because there is a hook in the posix ACL set code - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - smbd.set_simple_acl(self.tempf, 0640, BA_gid) - - # This should re-calculate an ACL based on the posix details - facl = getntacl(self.lp,self.tempf, direct_db_access=False) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(simple_acl_from_posix, facl.as_sddl(anysid)) - - def test_setntacl_smbd_getntacl_smbd_gpo(self): - acl = "O:DAG:DUD:P(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;EA)(A;OICIIO;0x001f01ff;;;CO)(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)(A;OICI;0x001200a9;;;ED)S:AI(OU;CIIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)(OU;CIIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - domsid = security.dom_sid("S-1-5-21-2212615479-2695158682-2101375467") - self.assertEquals(facl.as_sddl(domsid),acl) - - def test_setntacl_getposixacl(self): - acl = "O:S-1-5-21-2212615479-2695158682-2101375467-512G:S-1-5-21-2212615479-2695158682-2101375467-513D:(A;OICI;0x001f01ff;;;S-1-5-21-2212615479-2695158682-2101375467-512)" - setntacl(self.lp, self.tempf, acl, "S-1-5-21-2212615479-2695158682-2101375467", use_ntvfs=False) - facl = getntacl(self.lp, self.tempf) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(facl.as_sddl(anysid),acl) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - - def test_setposixacl_getposixacl(self): - smbd.set_simple_acl(self.tempf, 0640) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - self.assertEquals(posix_acl.count, 4) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[0].a_perm, 6) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[1].a_perm, 4) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[3].a_perm, 6) - - def test_setposixacl_getntacl(self): - acl = "" - smbd.set_simple_acl(self.tempf, 0750) - try: - facl = getntacl(self.lp, self.tempf) - self.assertTrue(False) - except TypeError: - # We don't expect the xattr to be filled in in this case - pass - - def test_setposixacl_getntacl_smbd(self): - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - group_SID = s4_passdb.gid_to_sid(os.stat(self.tempf).st_gid) - user_SID = s4_passdb.uid_to_sid(os.stat(self.tempf).st_uid) - smbd.set_simple_acl(self.tempf, 0640) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - acl = "O:%sG:%sD:(A;;0x001f019f;;;%s)(A;;0x00120089;;;%s)(A;;;;;WD)" % (user_SID, group_SID, user_SID, group_SID) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setposixacl_dir_getntacl_smbd(self): - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - user_SID = s4_passdb.uid_to_sid(os.stat(self.tempdir).st_uid) - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - (BA_id,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - SO_sid = security.dom_sid(security.SID_BUILTIN_SERVER_OPERATORS) - (SO_id,SO_type) = s4_passdb.sid_to_id(SO_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - smbd.chown(self.tempdir, BA_id, SO_id) - smbd.set_simple_acl(self.tempdir, 0750) - facl = getntacl(self.lp, self.tempdir, direct_db_access=False) - acl = "O:BAG:SOD:(A;;0x001f01ff;;;BA)(A;;0x001200a9;;;SO)(A;;;;;WD)(A;OICIIO;0x001f01ff;;;CO)(A;OICIIO;0x001f01ff;;;CG)(A;OICIIO;0x001f01ff;;;WD)" - - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setposixacl_group_getntacl_smbd(self): - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - group_SID = s4_passdb.gid_to_sid(os.stat(self.tempf).st_gid) - user_SID = s4_passdb.uid_to_sid(os.stat(self.tempf).st_uid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - smbd.set_simple_acl(self.tempf, 0640, BA_gid) - facl = getntacl(self.lp, self.tempf, direct_db_access=False) - domsid = passdb.get_global_sam_sid() - acl = "O:%sG:%sD:(A;;0x001f019f;;;%s)(A;;0x00120089;;;BA)(A;;0x00120089;;;%s)(A;;;;;WD)" % (user_SID, group_SID, user_SID, group_SID) - anysid = security.dom_sid(security.SID_NT_SELF) - self.assertEquals(acl, facl.as_sddl(anysid)) - - def test_setposixacl_getposixacl(self): - smbd.set_simple_acl(self.tempf, 0640) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - self.assertEquals(posix_acl.count, 4) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[0].a_perm, 6) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[1].a_perm, 4) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[3].a_perm, 7) - - def test_setposixacl_dir_getposixacl(self): - smbd.set_simple_acl(self.tempdir, 0750) - posix_acl = smbd.get_sys_acl(self.tempdir, smb_acl.SMB_ACL_TYPE_ACCESS) - self.assertEquals(posix_acl.count, 4) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[0].a_perm, 7) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[1].a_perm, 5) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[3].a_perm, 7) - - def test_setposixacl_group_getposixacl(self): - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - smbd.set_simple_acl(self.tempf, 0670, BA_gid) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - - self.assertEquals(posix_acl.count, 5) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[0].a_perm, 6) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[1].a_perm, 7) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[3].a_perm, 7) - self.assertEquals(posix_acl.acl[3].info.gid, BA_gid) - - self.assertEquals(posix_acl.acl[4].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[4].a_perm, 7) - - def test_setntacl_sysvol_check_getposixacl(self): - acl = provision.SYSVOL_ACL - domsid = passdb.get_global_sam_sid() - setntacl(self.lp, self.tempf,acl,str(domsid), use_ntvfs=False) - facl = getntacl(self.lp, self.tempf) - self.assertEquals(facl.as_sddl(domsid),acl) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - - LA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_ADMINISTRATOR)) - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - SO_sid = security.dom_sid(security.SID_BUILTIN_SERVER_OPERATORS) - SY_sid = security.dom_sid(security.SID_NT_SYSTEM) - AU_sid = security.dom_sid(security.SID_NT_AUTHENTICATED_USERS) - - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - - # These assertions correct for current plugin_s4_dc selftest - # configuration. When other environments have a broad range of - # groups mapped via passdb, we can relax some of these checks - (LA_uid,LA_type) = s4_passdb.sid_to_id(LA_sid) - self.assertEquals(LA_type, idmap.ID_TYPE_UID) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - (SO_gid,SO_type) = s4_passdb.sid_to_id(SO_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (SY_gid,SY_type) = s4_passdb.sid_to_id(SY_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (AU_gid,AU_type) = s4_passdb.sid_to_id(AU_sid) - self.assertEquals(AU_type, idmap.ID_TYPE_BOTH) - - self.assertEquals(posix_acl.count, 9) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[0].a_perm, 7) - self.assertEquals(posix_acl.acl[0].info.gid, BA_gid) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_USER) - self.assertEquals(posix_acl.acl[1].a_perm, 6) - self.assertEquals(posix_acl.acl[1].info.uid, LA_uid) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[3].a_perm, 6) - - self.assertEquals(posix_acl.acl[4].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[4].a_perm, 7) - - self.assertEquals(posix_acl.acl[5].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[5].a_perm, 5) - self.assertEquals(posix_acl.acl[5].info.gid, SO_gid) - - self.assertEquals(posix_acl.acl[6].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[6].a_perm, 7) - self.assertEquals(posix_acl.acl[6].info.gid, SY_gid) - - self.assertEquals(posix_acl.acl[7].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[7].a_perm, 5) - self.assertEquals(posix_acl.acl[7].info.gid, AU_gid) - - self.assertEquals(posix_acl.acl[8].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[8].a_perm, 7) - - -# check that it matches: -# user::rwx -# user:root:rwx (selftest user actually) -# group::rwx -# group:Local Admins:rwx -# group:3000000:r-x -# group:3000001:rwx -# group:3000002:r-x -# mask::rwx -# other::--- - -# -# This is in this order in the NDR smb_acl (not re-orderded for display) -# a_type: GROUP -# a_perm: 7 -# uid: -1 -# gid: 10 -# a_type: USER -# a_perm: 6 -# uid: 0 (selftest user actually) -# gid: -1 -# a_type: OTHER -# a_perm: 0 -# uid: -1 -# gid: -1 -# a_type: USER_OBJ -# a_perm: 6 -# uid: -1 -# gid: -1 -# a_type: GROUP_OBJ -# a_perm: 7 -# uid: -1 -# gid: -1 -# a_type: GROUP -# a_perm: 5 -# uid: -1 -# gid: 3000020 -# a_type: GROUP -# a_perm: 7 -# uid: -1 -# gid: 3000000 -# a_type: GROUP -# a_perm: 5 -# uid: -1 -# gid: 3000001 -# a_type: MASK -# a_perm: 7 -# uid: -1 -# gid: -1 - -# - - - def test_setntacl_sysvol_dir_check_getposixacl(self): - acl = provision.SYSVOL_ACL - domsid = passdb.get_global_sam_sid() - setntacl(self.lp, self.tempdir,acl,str(domsid), use_ntvfs=False) - facl = getntacl(self.lp, self.tempdir) - self.assertEquals(facl.as_sddl(domsid),acl) - posix_acl = smbd.get_sys_acl(self.tempdir, smb_acl.SMB_ACL_TYPE_ACCESS) - - LA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_ADMINISTRATOR)) - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - SO_sid = security.dom_sid(security.SID_BUILTIN_SERVER_OPERATORS) - SY_sid = security.dom_sid(security.SID_NT_SYSTEM) - AU_sid = security.dom_sid(security.SID_NT_AUTHENTICATED_USERS) - - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - - # These assertions correct for current plugin_s4_dc selftest - # configuration. When other environments have a broad range of - # groups mapped via passdb, we can relax some of these checks - (LA_uid,LA_type) = s4_passdb.sid_to_id(LA_sid) - self.assertEquals(LA_type, idmap.ID_TYPE_UID) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - (SO_gid,SO_type) = s4_passdb.sid_to_id(SO_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (SY_gid,SY_type) = s4_passdb.sid_to_id(SY_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (AU_gid,AU_type) = s4_passdb.sid_to_id(AU_sid) - self.assertEquals(AU_type, idmap.ID_TYPE_BOTH) - - self.assertEquals(posix_acl.count, 9) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[0].a_perm, 7) - self.assertEquals(posix_acl.acl[0].info.gid, BA_gid) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_USER) - self.assertEquals(posix_acl.acl[1].a_perm, 7) - self.assertEquals(posix_acl.acl[1].info.uid, LA_uid) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[3].a_perm, 7) - - self.assertEquals(posix_acl.acl[4].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[4].a_perm, 7) - - self.assertEquals(posix_acl.acl[5].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[5].a_perm, 5) - self.assertEquals(posix_acl.acl[5].info.gid, SO_gid) - - self.assertEquals(posix_acl.acl[6].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[6].a_perm, 7) - self.assertEquals(posix_acl.acl[6].info.gid, SY_gid) - - self.assertEquals(posix_acl.acl[7].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[7].a_perm, 5) - self.assertEquals(posix_acl.acl[7].info.gid, AU_gid) - - self.assertEquals(posix_acl.acl[8].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[8].a_perm, 7) - - -# check that it matches: -# user::rwx -# user:root:rwx (selftest user actually) -# group::rwx -# group:3000000:rwx -# group:3000001:r-x -# group:3000002:rwx -# group:3000003:r-x -# mask::rwx -# other::--- - - - def test_setntacl_policies_dir_check_getposixacl(self): - acl = provision.POLICIES_ACL - domsid = passdb.get_global_sam_sid() - setntacl(self.lp, self.tempdir,acl,str(domsid), use_ntvfs=False) - facl = getntacl(self.lp, self.tempdir) - self.assertEquals(facl.as_sddl(domsid),acl) - posix_acl = smbd.get_sys_acl(self.tempdir, smb_acl.SMB_ACL_TYPE_ACCESS) - - LA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_ADMINISTRATOR)) - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - SO_sid = security.dom_sid(security.SID_BUILTIN_SERVER_OPERATORS) - SY_sid = security.dom_sid(security.SID_NT_SYSTEM) - AU_sid = security.dom_sid(security.SID_NT_AUTHENTICATED_USERS) - PA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_POLICY_ADMINS)) - - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - - # These assertions correct for current plugin_s4_dc selftest - # configuration. When other environments have a broad range of - # groups mapped via passdb, we can relax some of these checks - (LA_uid,LA_type) = s4_passdb.sid_to_id(LA_sid) - self.assertEquals(LA_type, idmap.ID_TYPE_UID) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - (SO_gid,SO_type) = s4_passdb.sid_to_id(SO_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (SY_gid,SY_type) = s4_passdb.sid_to_id(SY_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (AU_gid,AU_type) = s4_passdb.sid_to_id(AU_sid) - self.assertEquals(AU_type, idmap.ID_TYPE_BOTH) - (PA_gid,PA_type) = s4_passdb.sid_to_id(PA_sid) - self.assertEquals(PA_type, idmap.ID_TYPE_BOTH) - - self.assertEquals(posix_acl.count, 10) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[0].a_perm, 7) - self.assertEquals(posix_acl.acl[0].info.gid, BA_gid) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_USER) - self.assertEquals(posix_acl.acl[1].a_perm, 7) - self.assertEquals(posix_acl.acl[1].info.uid, LA_uid) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[3].a_perm, 7) - - self.assertEquals(posix_acl.acl[4].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[4].a_perm, 7) - - self.assertEquals(posix_acl.acl[5].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[5].a_perm, 5) - self.assertEquals(posix_acl.acl[5].info.gid, SO_gid) - - self.assertEquals(posix_acl.acl[6].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[6].a_perm, 7) - self.assertEquals(posix_acl.acl[6].info.gid, SY_gid) - - self.assertEquals(posix_acl.acl[7].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[7].a_perm, 5) - self.assertEquals(posix_acl.acl[7].info.gid, AU_gid) - - self.assertEquals(posix_acl.acl[8].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[8].a_perm, 7) - self.assertEquals(posix_acl.acl[8].info.gid, PA_gid) - - self.assertEquals(posix_acl.acl[9].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[9].a_perm, 7) - - -# check that it matches: -# user::rwx -# user:root:rwx (selftest user actually) -# group::rwx -# group:3000000:rwx -# group:3000001:r-x -# group:3000002:rwx -# group:3000003:r-x -# group:3000004:rwx -# mask::rwx -# other::--- - - - - def test_setntacl_policies_check_getposixacl(self): - acl = provision.POLICIES_ACL - - domsid = passdb.get_global_sam_sid() - setntacl(self.lp, self.tempf, acl, str(domsid), use_ntvfs=False) - facl = getntacl(self.lp, self.tempf) - self.assertEquals(facl.as_sddl(domsid),acl) - posix_acl = smbd.get_sys_acl(self.tempf, smb_acl.SMB_ACL_TYPE_ACCESS) - - LA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_ADMINISTRATOR)) - BA_sid = security.dom_sid(security.SID_BUILTIN_ADMINISTRATORS) - SO_sid = security.dom_sid(security.SID_BUILTIN_SERVER_OPERATORS) - SY_sid = security.dom_sid(security.SID_NT_SYSTEM) - AU_sid = security.dom_sid(security.SID_NT_AUTHENTICATED_USERS) - PA_sid = security.dom_sid(str(domsid)+"-"+str(security.DOMAIN_RID_POLICY_ADMINS)) - - s4_passdb = passdb.PDB(self.lp.get("passdb backend")) - - # These assertions correct for current plugin_s4_dc selftest - # configuration. When other environments have a broad range of - # groups mapped via passdb, we can relax some of these checks - (LA_uid,LA_type) = s4_passdb.sid_to_id(LA_sid) - self.assertEquals(LA_type, idmap.ID_TYPE_UID) - (BA_gid,BA_type) = s4_passdb.sid_to_id(BA_sid) - self.assertEquals(BA_type, idmap.ID_TYPE_BOTH) - (SO_gid,SO_type) = s4_passdb.sid_to_id(SO_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (SY_gid,SY_type) = s4_passdb.sid_to_id(SY_sid) - self.assertEquals(SO_type, idmap.ID_TYPE_BOTH) - (AU_gid,AU_type) = s4_passdb.sid_to_id(AU_sid) - self.assertEquals(AU_type, idmap.ID_TYPE_BOTH) - (PA_gid,PA_type) = s4_passdb.sid_to_id(PA_sid) - self.assertEquals(PA_type, idmap.ID_TYPE_BOTH) - - self.assertEquals(posix_acl.count, 10) - - self.assertEquals(posix_acl.acl[0].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[0].a_perm, 7) - self.assertEquals(posix_acl.acl[0].info.gid, BA_gid) - - self.assertEquals(posix_acl.acl[1].a_type, smb_acl.SMB_ACL_USER) - self.assertEquals(posix_acl.acl[1].a_perm, 6) - self.assertEquals(posix_acl.acl[1].info.uid, LA_uid) - - self.assertEquals(posix_acl.acl[2].a_type, smb_acl.SMB_ACL_OTHER) - self.assertEquals(posix_acl.acl[2].a_perm, 0) - - self.assertEquals(posix_acl.acl[3].a_type, smb_acl.SMB_ACL_USER_OBJ) - self.assertEquals(posix_acl.acl[3].a_perm, 6) - - self.assertEquals(posix_acl.acl[4].a_type, smb_acl.SMB_ACL_GROUP_OBJ) - self.assertEquals(posix_acl.acl[4].a_perm, 7) - - self.assertEquals(posix_acl.acl[5].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[5].a_perm, 5) - self.assertEquals(posix_acl.acl[5].info.gid, SO_gid) - - self.assertEquals(posix_acl.acl[6].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[6].a_perm, 7) - self.assertEquals(posix_acl.acl[6].info.gid, SY_gid) - - self.assertEquals(posix_acl.acl[7].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[7].a_perm, 5) - self.assertEquals(posix_acl.acl[7].info.gid, AU_gid) - - self.assertEquals(posix_acl.acl[8].a_type, smb_acl.SMB_ACL_GROUP) - self.assertEquals(posix_acl.acl[8].a_perm, 7) - self.assertEquals(posix_acl.acl[8].info.gid, PA_gid) - - self.assertEquals(posix_acl.acl[9].a_type, smb_acl.SMB_ACL_MASK) - self.assertEquals(posix_acl.acl[9].a_perm, 7) - - -# check that it matches: -# user::rwx -# user:root:rwx (selftest user actually) -# group::rwx -# group:Local Admins:rwx -# group:3000000:r-x -# group:3000001:rwx -# group:3000002:r-x -# group:3000003:rwx -# mask::rwx -# other::--- - -# -# This is in this order in the NDR smb_acl (not re-orderded for display) -# a_type: GROUP -# a_perm: 7 -# uid: -1 -# gid: 10 -# a_type: USER -# a_perm: 6 -# uid: 0 (selftest user actually) -# gid: -1 -# a_type: OTHER -# a_perm: 0 -# uid: -1 -# gid: -1 -# a_type: USER_OBJ -# a_perm: 6 -# uid: -1 -# gid: -1 -# a_type: GROUP_OBJ -# a_perm: 7 -# uid: -1 -# gid: -1 -# a_type: GROUP -# a_perm: 5 -# uid: -1 -# gid: 3000020 -# a_type: GROUP -# a_perm: 7 -# uid: -1 -# gid: 3000000 -# a_type: GROUP -# a_perm: 5 -# uid: -1 -# gid: 3000001 -# a_type: GROUP -# a_perm: 7 -# uid: -1 -# gid: 3000003 -# a_type: MASK -# a_perm: 7 -# uid: -1 -# gid: -1 - -# - - def setUp(self): - super(PosixAclMappingTests, self).setUp() - s3conf = s3param.get_context() - s3conf.load(self.get_loadparm().configfile) - s3conf.set("xattr_tdb:file", os.path.join(self.tempdir,"xattr.tdb")) - self.lp = s3conf - self.tempf = os.path.join(self.tempdir, "test") - open(self.tempf, 'w').write("empty") - - def tearDown(self): - smbd.unlink(self.tempf) - os.unlink(os.path.join(self.tempdir,"xattr.tdb")) - super(PosixAclMappingTests, self).tearDown() diff --git a/source4/scripting/python/samba/tests/provision.py b/source4/scripting/python/samba/tests/provision.py deleted file mode 100644 index 929e7074f7..0000000000 --- a/source4/scripting/python/samba/tests/provision.py +++ /dev/null @@ -1,203 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.provision.""" - -import os -from samba.provision import ( - ProvisionNames, - ProvisionPaths, - ProvisionResult, - determine_netbios_name, - sanitize_server_role, - setup_secretsdb, - findnss, - ) -import samba.tests -from samba.tests import env_loadparm, TestCase - -def create_dummy_secretsdb(path, lp=None): - """Create a dummy secrets database for use in tests. - - :param path: Path to store the secrets db - :param lp: Optional loadparm context. A simple one will - be generated if not specified. - """ - if lp is None: - lp = env_loadparm() - paths = ProvisionPaths() - paths.secrets = path - paths.private_dir = os.path.dirname(path) - paths.keytab = "no.keytab" - paths.dns_keytab = "no.dns.keytab" - secrets_ldb = setup_secretsdb(paths, None, None, lp=lp) - secrets_ldb.transaction_commit() - return secrets_ldb - - -class ProvisionTestCase(samba.tests.TestCaseInTempDir): - """Some simple tests for individual functions in the provisioning code. - """ - - def test_setup_secretsdb(self): - path = os.path.join(self.tempdir, "secrets.ldb") - paths = ProvisionPaths() - secrets_tdb_path = os.path.join(self.tempdir, "secrets.tdb") - secrets_ntdb_path = os.path.join(self.tempdir, "secrets.ntdb") - paths.secrets = path - paths.private_dir = os.path.dirname(path) - paths.keytab = "no.keytab" - paths.dns_keytab = "no.dns.keytab" - ldb = setup_secretsdb(paths, None, None, lp=env_loadparm()) - try: - self.assertEquals("LSA Secrets", - ldb.searchone(basedn="CN=LSA Secrets", attribute="CN")) - finally: - del ldb - os.unlink(path) - if os.path.exists(secrets_tdb_path): - os.unlink(secrets_tdb_path) - if os.path.exists(secrets_ntdb_path): - os.unlink(secrets_ntdb_path) - -class FindNssTests(TestCase): - """Test findnss() function.""" - - def test_nothing(self): - def x(y): - raise KeyError - self.assertRaises(KeyError, findnss, x, []) - - def test_first(self): - self.assertEquals("bla", findnss(lambda x: "bla", ["bla"])) - - def test_skip_first(self): - def x(y): - if y != "bla": - raise KeyError - return "ha" - self.assertEquals("ha", findnss(x, ["bloe", "bla"])) - - -class Disabled(object): - - def test_setup_templatesdb(self): - raise NotImplementedError(self.test_setup_templatesdb) - - def test_setup_registry(self): - raise NotImplementedError(self.test_setup_registry) - - def test_setup_samdb_rootdse(self): - raise NotImplementedError(self.test_setup_samdb_rootdse) - - def test_setup_samdb_partitions(self): - raise NotImplementedError(self.test_setup_samdb_partitions) - - def test_provision_dns(self): - raise NotImplementedError(self.test_provision_dns) - - def test_provision_ldapbase(self): - raise NotImplementedError(self.test_provision_ldapbase) - - def test_provision_guess(self): - raise NotImplementedError(self.test_provision_guess) - - def test_join_domain(self): - raise NotImplementedError(self.test_join_domain) - - def test_vampire(self): - raise NotImplementedError(self.test_vampire) - - -class SanitizeServerRoleTests(TestCase): - - def test_same(self): - self.assertEquals("standalone server", - sanitize_server_role("standalone server")) - self.assertEquals("member server", - sanitize_server_role("member server")) - - def test_invalid(self): - self.assertRaises(ValueError, sanitize_server_role, "foo") - - def test_valid(self): - self.assertEquals( - "standalone server", - sanitize_server_role("ROLE_STANDALONE")) - self.assertEquals( - "standalone server", - sanitize_server_role("standalone")) - self.assertEquals( - "active directory domain controller", - sanitize_server_role("domain controller")) - - -class DummyLogger(object): - - def __init__(self): - self.entries = [] - - def info(self, text, *args): - self.entries.append(("INFO", text % args)) - - -class ProvisionResultTests(TestCase): - - def report_logger(self, result): - logger = DummyLogger() - result.report_logger(logger) - return logger.entries - - def base_result(self): - result = ProvisionResult() - result.server_role = "domain controller" - result.names = ProvisionNames() - result.names.hostname = "hostnaam" - result.names.domain = "DOMEIN" - result.names.dnsdomain = "dnsdomein" - result.domainsid = "S1-1-1" - result.paths = ProvisionPaths() - return result - - def test_basic_report_logger(self): - result = self.base_result() - entries = self.report_logger(result) - self.assertEquals(entries, [ - ('INFO', 'Once the above files are installed, your Samba4 server ' - 'will be ready to use'), - ('INFO', 'Server Role: domain controller'), - ('INFO', 'Hostname: hostnaam'), - ('INFO', 'NetBIOS Domain: DOMEIN'), - ('INFO', 'DNS Domain: dnsdomein'), - ('INFO', 'DOMAIN SID: S1-1-1')]) - - def test_report_logger_adminpass(self): - result = self.base_result() - result.adminpass_generated = True - result.adminpass = "geheim" - entries = self.report_logger(result) - self.assertEquals(entries[1], - ("INFO", 'Admin password: geheim')) - - -class DetermineNetbiosNameTests(TestCase): - - def test_limits_to_15(self): - self.assertEquals("A" * 15, determine_netbios_name("a" * 30)) - - def test_strips_invalid(self): - self.assertEquals("BLABLA", determine_netbios_name("bla/bla")) diff --git a/source4/scripting/python/samba/tests/registry.py b/source4/scripting/python/samba/tests/registry.py deleted file mode 100644 index 8016a0bb68..0000000000 --- a/source4/scripting/python/samba/tests/registry.py +++ /dev/null @@ -1,60 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.registry.""" - -import os -from samba import registry -import samba.tests - -class HelperTests(samba.tests.TestCase): - - def test_predef_to_name(self): - self.assertEquals("HKEY_LOCAL_MACHINE", - registry.get_predef_name(0x80000002)) - - def test_str_regtype(self): - self.assertEquals("REG_DWORD", registry.str_regtype(4)) - - - -class HiveTests(samba.tests.TestCaseInTempDir): - - def setUp(self): - super(HiveTests, self).setUp() - self.hive_path = os.path.join(self.tempdir, "ldb_new.ldb") - self.hive = registry.open_ldb(self.hive_path) - - def tearDown(self): - del self.hive - os.unlink(self.hive_path) - super(HiveTests, self).tearDown() - - def test_ldb_new(self): - self.assertTrue(self.hive is not None) - - #def test_flush(self): - # self.hive.flush() - - #def test_del_value(self): - # self.hive.del_value("FOO") - - -class RegistryTests(samba.tests.TestCase): - - def test_new(self): - self.registry = registry.Registry() diff --git a/source4/scripting/python/samba/tests/samba3.py b/source4/scripting/python/samba/tests/samba3.py deleted file mode 100644 index 0a7f13c66f..0000000000 --- a/source4/scripting/python/samba/tests/samba3.py +++ /dev/null @@ -1,219 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.samba3.""" - -from samba.samba3 import ( - Registry, - WinsDatabase, - IdmapDatabase, - ) -from samba.samba3 import passdb -from samba.samba3 import param as s3param -from samba.tests import TestCase, TestCaseInTempDir -from samba.dcerpc.security import dom_sid -import os - - -for p in [ "../../../../../testdata/samba3", "../../../../testdata/samba3" ]: - DATADIR = os.path.join(os.path.dirname(__file__), p) - if os.path.exists(DATADIR): - break - - -class RegistryTestCase(TestCase): - - def setUp(self): - super(RegistryTestCase, self).setUp() - self.registry = Registry(os.path.join(DATADIR, "registry.tdb")) - - def tearDown(self): - self.registry.close() - super(RegistryTestCase, self).tearDown() - - def test_length(self): - self.assertEquals(28, len(self.registry)) - - def test_keys(self): - self.assertTrue("HKLM" in self.registry.keys()) - - def test_subkeys(self): - self.assertEquals(["SOFTWARE", "SYSTEM"], self.registry.subkeys("HKLM")) - - def test_values(self): - self.assertEquals({'DisplayName': (1L, 'E\x00v\x00e\x00n\x00t\x00 \x00L\x00o\x00g\x00\x00\x00'), - 'ErrorControl': (4L, '\x01\x00\x00\x00')}, - self.registry.values("HKLM/SYSTEM/CURRENTCONTROLSET/SERVICES/EVENTLOG")) - - -class PassdbTestCase(TestCaseInTempDir): - - def setUp(self): - super (PassdbTestCase, self).setUp() - os.system("cp -r %s %s" % (DATADIR, self.tempdir)) - datadir = os.path.join(self.tempdir, "samba3") - - self.lp = s3param.get_context() - self.lp.load(os.path.join(datadir, "smb.conf")) - self.lp.set("private dir", datadir) - self.lp.set("state directory", datadir) - self.lp.set("lock directory", datadir) - passdb.set_secrets_dir(datadir) - self.pdb = passdb.PDB("tdbsam") - - def tearDown(self): - self.lp = [] - self.pdb = [] - os.system("rm -rf %s" % os.path.join(self.tempdir, "samba3")) - super(PassdbTestCase, self).tearDown() - - def test_param(self): - self.assertEquals("BEDWYR", self.lp.get("netbios name")) - self.assertEquals("SAMBA", self.lp.get("workgroup")) - self.assertEquals("USER", self.lp.get("security")) - - def test_policy(self): - policy = self.pdb.get_account_policy() - self.assertEquals(0, policy['bad lockout attempt']) - self.assertEquals(-1, policy['disconnect time']) - self.assertEquals(0, policy['lockout duration']) - self.assertEquals(999999999, policy['maximum password age']) - self.assertEquals(0, policy['minimum password age']) - self.assertEquals(5, policy['min password length']) - self.assertEquals(0, policy['password history']) - self.assertEquals(0, policy['refuse machine password change']) - self.assertEquals(0, policy['reset count minutes']) - self.assertEquals(0, policy['user must logon to change password']) - - def test_get_sid(self): - domain_sid = passdb.get_global_sam_sid() - self.assertEquals(dom_sid("S-1-5-21-2470180966-3899876309-2637894779"), domain_sid) - - def test_usernames(self): - userlist = self.pdb.search_users(0) - self.assertEquals(3, len(userlist)) - - def test_getuser(self): - user = self.pdb.getsampwnam("root") - - self.assertEquals(16, user.acct_ctrl) - self.assertEquals("", user.acct_desc) - self.assertEquals(0, user.bad_password_count) - self.assertEquals(0, user.bad_password_time) - self.assertEquals(0, user.code_page) - self.assertEquals(0, user.country_code) - self.assertEquals("", user.dir_drive) - self.assertEquals("BEDWYR", user.domain) - self.assertEquals("root", user.full_name) - self.assertEquals(dom_sid('S-1-5-21-2470180966-3899876309-2637894779-513'), user.group_sid) - self.assertEquals("\\\\BEDWYR\\root", user.home_dir) - self.assertEquals([-1 for i in range(21)], user.hours) - self.assertEquals(21, user.hours_len) - self.assertEquals(9223372036854775807, user.kickoff_time) - self.assertEquals(None, user.lanman_passwd) - self.assertEquals(9223372036854775807, user.logoff_time) - self.assertEquals(0, user.logon_count) - self.assertEquals(168, user.logon_divs) - self.assertEquals("", user.logon_script) - self.assertEquals(0, user.logon_time) - self.assertEquals("", user.munged_dial) - self.assertEquals('\x87\x8d\x80\x14`l\xda)gzD\xef\xa15?\xc7', user.nt_passwd) - self.assertEquals("", user.nt_username) - self.assertEquals(1125418267, user.pass_can_change_time) - self.assertEquals(1125418267, user.pass_last_set_time) - self.assertEquals(2125418266, user.pass_must_change_time) - self.assertEquals(None, user.plaintext_passwd) - self.assertEquals("\\\\BEDWYR\\root\\profile", user.profile_path) - self.assertEquals(None, user.pw_history) - self.assertEquals(dom_sid("S-1-5-21-2470180966-3899876309-2637894779-1000"), user.user_sid) - self.assertEquals("root", user.username) - self.assertEquals("", user.workstations) - - def test_group_length(self): - grouplist = self.pdb.enum_group_mapping() - self.assertEquals(13, len(grouplist)) - - def test_get_group(self): - group = self.pdb.getgrsid(dom_sid("S-1-5-32-544")) - self.assertEquals("Administrators", group.nt_name) - self.assertEquals(-1, group.gid) - self.assertEquals(5, group.sid_name_use) - - def test_groupsids(self): - grouplist = self.pdb.enum_group_mapping() - sids = [] - for g in grouplist: - sids.append(str(g.sid)) - self.assertTrue("S-1-5-32-544" in sids) - self.assertTrue("S-1-5-32-545" in sids) - self.assertTrue("S-1-5-32-546" in sids) - self.assertTrue("S-1-5-32-548" in sids) - self.assertTrue("S-1-5-32-549" in sids) - self.assertTrue("S-1-5-32-550" in sids) - self.assertTrue("S-1-5-32-551" in sids) - - def test_alias_length(self): - aliaslist = self.pdb.search_aliases() - self.assertEquals(1, len(aliaslist)) - self.assertEquals("Jelmers NT Group", aliaslist[0]['account_name']) - - -class WinsDatabaseTestCase(TestCase): - - def setUp(self): - super(WinsDatabaseTestCase, self).setUp() - self.winsdb = WinsDatabase(os.path.join(DATADIR, "wins.dat")) - - def test_length(self): - self.assertEquals(22, len(self.winsdb)) - - def test_first_entry(self): - self.assertEqual((1124185120, ["192.168.1.5"], 0x64), self.winsdb["ADMINISTRATOR#03"]) - - def tearDown(self): - self.winsdb.close() - super(WinsDatabaseTestCase, self).tearDown() - - -class IdmapDbTestCase(TestCase): - - def setUp(self): - super(IdmapDbTestCase, self).setUp() - self.idmapdb = IdmapDatabase(os.path.join(DATADIR, - "winbindd_idmap.tdb")) - - def test_user_hwm(self): - self.assertEquals(10000, self.idmapdb.get_user_hwm()) - - def test_group_hwm(self): - self.assertEquals(10002, self.idmapdb.get_group_hwm()) - - def test_uids(self): - self.assertEquals(1, len(list(self.idmapdb.uids()))) - - def test_gids(self): - self.assertEquals(3, len(list(self.idmapdb.gids()))) - - def test_get_user_sid(self): - self.assertEquals("S-1-5-21-58189338-3053988021-627566699-501", self.idmapdb.get_user_sid(65534)) - - def test_get_group_sid(self): - self.assertEquals("S-1-5-21-2447931902-1787058256-3961074038-3007", self.idmapdb.get_group_sid(10001)) - - def tearDown(self): - self.idmapdb.close() - super(IdmapDbTestCase, self).tearDown() diff --git a/source4/scripting/python/samba/tests/samba3sam.py b/source4/scripting/python/samba/tests/samba3sam.py deleted file mode 100644 index 9c017fb79c..0000000000 --- a/source4/scripting/python/samba/tests/samba3sam.py +++ /dev/null @@ -1,1125 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2005-2008 -# Copyright (C) Martin Kuehl <mkhl@samba.org> 2006 -# -# This is a Python port of the original in testprogs/ejs/samba3sam.js -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for the samba3sam LDB module, which maps Samba3 LDAP to AD LDAP.""" - -import os -import ldb -from ldb import SCOPE_DEFAULT, SCOPE_BASE -from samba import Ldb, substitute_var -from samba.tests import TestCaseInTempDir, env_loadparm -import samba.dcerpc.security -import samba.ndr -from samba.auth import system_session -from operator import attrgetter - - -def read_datafile(filename): - paths = [ "../../../../../testdata/samba3", - "../../../../testdata/samba3" ] - for p in paths: - datadir = os.path.join(os.path.dirname(__file__), p) - if os.path.exists(datadir): - break - return open(os.path.join(datadir, filename), 'r').read() - -def ldb_debug(l, text): - print text - - -class MapBaseTestCase(TestCaseInTempDir): - """Base test case for mapping tests.""" - - def setup_modules(self, ldb, s3, s4): - ldb.add({"dn": "@MAP=samba3sam", - "@FROM": s4.basedn, - "@TO": "sambaDomainName=TESTS," + s3.basedn}) - - ldb.add({"dn": "@MODULES", - "@LIST": "rootdse,paged_results,server_sort,asq,samldb,password_hash,operational,objectguid,rdn_name,samba3sam,samba3sid,show_deleted,partition"}) - - ldb.add({"dn": "@PARTITION", - "partition": ["%s" % (s4.basedn_casefold), - "%s" % (s3.basedn_casefold)], - "replicateEntries": ["@ATTRIBUTES", "@INDEXLIST"], - "modules": "*:"}) - - def setUp(self): - self.lp = env_loadparm() - self.lp.set("workgroup", "TESTS") - self.lp.set("netbios name", "TESTS") - super(MapBaseTestCase, self).setUp() - - def make_dn(basedn, rdn): - return "%s,sambaDomainName=TESTS,%s" % (rdn, basedn) - - def make_s4dn(basedn, rdn): - return "%s,%s" % (rdn, basedn) - - self.ldbfile = os.path.join(self.tempdir, "test.ldb") - self.ldburl = "tdb://" + self.ldbfile - - tempdir = self.tempdir - - class Target: - """Simple helper class that contains data for a specific SAM - connection.""" - - def __init__(self, basedn, dn, lp): - self.db = Ldb(lp=lp, session_info=system_session()) - self.db.set_opaque("skip_allocate_sids", "true"); - self.basedn = basedn - self.basedn_casefold = ldb.Dn(self.db, basedn).get_casefold() - self.substvars = {"BASEDN": self.basedn} - self.file = os.path.join(tempdir, "%s.ldb" % self.basedn_casefold) - self.url = "tdb://" + self.file - self._dn = dn - - def dn(self, rdn): - return self._dn(self.basedn, rdn) - - def connect(self): - return self.db.connect(self.url) - - def setup_data(self, path): - self.add_ldif(read_datafile(path)) - - def subst(self, text): - return substitute_var(text, self.substvars) - - def add_ldif(self, ldif): - self.db.add_ldif(self.subst(ldif)) - - def modify_ldif(self, ldif): - self.db.modify_ldif(self.subst(ldif)) - - self.samba4 = Target("dc=vernstok,dc=nl", make_s4dn, self.lp) - self.samba3 = Target("cn=Samba3Sam", make_dn, self.lp) - - self.samba3.connect() - self.samba4.connect() - - def tearDown(self): - os.unlink(self.ldbfile) - os.unlink(self.samba3.file) - os.unlink(self.samba4.file) - pdir = "%s.d" % self.ldbfile - mdata = os.path.join(pdir, "metadata.tdb") - if os.path.exists(mdata): - os.unlink(mdata) - os.rmdir(pdir) - super(MapBaseTestCase, self).tearDown() - - def assertSidEquals(self, text, ndr_sid): - sid_obj1 = samba.ndr.ndr_unpack(samba.dcerpc.security.dom_sid, - str(ndr_sid[0])) - sid_obj2 = samba.dcerpc.security.dom_sid(text) - self.assertEquals(sid_obj1, sid_obj2) - - -class Samba3SamTestCase(MapBaseTestCase): - - def setUp(self): - super(Samba3SamTestCase, self).setUp() - ldb = Ldb(self.ldburl, lp=self.lp, session_info=system_session()) - ldb.set_opaque("skip_allocate_sids", "true"); - self.samba3.setup_data("samba3.ldif") - ldif = read_datafile("provision_samba3sam.ldif") - ldb.add_ldif(self.samba4.subst(ldif)) - self.setup_modules(ldb, self.samba3, self.samba4) - del ldb - self.ldb = Ldb(self.ldburl, lp=self.lp, session_info=system_session()) - self.ldb.set_opaque("skip_allocate_sids", "true"); - - def test_search_non_mapped(self): - """Looking up by non-mapped attribute""" - msg = self.ldb.search(expression="(cn=Administrator)") - self.assertEquals(len(msg), 1) - self.assertEquals(msg[0]["cn"], "Administrator") - - def test_search_non_mapped(self): - """Looking up by mapped attribute""" - msg = self.ldb.search(expression="(name=Backup Operators)") - self.assertEquals(len(msg), 1) - self.assertEquals(str(msg[0]["name"]), "Backup Operators") - - def test_old_name_of_renamed(self): - """Looking up by old name of renamed attribute""" - msg = self.ldb.search(expression="(displayName=Backup Operators)") - self.assertEquals(len(msg), 0) - - def test_mapped_containing_sid(self): - """Looking up mapped entry containing SID""" - msg = self.ldb.search(expression="(cn=Replicator)") - self.assertEquals(len(msg), 1) - self.assertEquals(str(msg[0].dn), - "cn=Replicator,ou=Groups,dc=vernstok,dc=nl") - self.assertTrue("objectSid" in msg[0]) - self.assertSidEquals("S-1-5-21-4231626423-2410014848-2360679739-552", - msg[0]["objectSid"]) - oc = set(msg[0]["objectClass"]) - self.assertEquals(oc, set(["group"])) - - def test_search_by_objclass(self): - """Looking up by objectClass""" - msg = self.ldb.search(expression="(|(objectClass=user)(cn=Administrator))") - self.assertEquals(set([str(m.dn) for m in msg]), - set(["unixName=Administrator,ou=Users,dc=vernstok,dc=nl", - "unixName=nobody,ou=Users,dc=vernstok,dc=nl"])) - - def test_s3sam_modify(self): - # Adding a record that will be fallbacked - self.ldb.add({"dn": "cn=Foo", - "foo": "bar", - "blah": "Blie", - "cn": "Foo", - "showInAdvancedViewOnly": "TRUE"} - ) - - # Checking for existence of record (local) - # TODO: This record must be searched in the local database, which is - # currently only supported for base searches - # msg = ldb.search(expression="(cn=Foo)", ['foo','blah','cn','showInAdvancedViewOnly')] - # TODO: Actually, this version should work as well but doesn't... - # - # - msg = self.ldb.search(expression="(cn=Foo)", base="cn=Foo", - scope=SCOPE_BASE, - attrs=['foo','blah','cn','showInAdvancedViewOnly']) - self.assertEquals(len(msg), 1) - self.assertEquals(str(msg[0]["showInAdvancedViewOnly"]), "TRUE") - self.assertEquals(str(msg[0]["foo"]), "bar") - self.assertEquals(str(msg[0]["blah"]), "Blie") - - # Adding record that will be mapped - self.ldb.add({"dn": "cn=Niemand,cn=Users,dc=vernstok,dc=nl", - "objectClass": "user", - "unixName": "bin", - "sambaUnicodePwd": "geheim", - "cn": "Niemand"}) - - # Checking for existence of record (remote) - msg = self.ldb.search(expression="(unixName=bin)", - attrs=['unixName','cn','dn', 'sambaUnicodePwd']) - self.assertEquals(len(msg), 1) - self.assertEquals(str(msg[0]["cn"]), "Niemand") - self.assertEquals(str(msg[0]["sambaUnicodePwd"]), "geheim") - - # Checking for existence of record (local && remote) - msg = self.ldb.search(expression="(&(unixName=bin)(sambaUnicodePwd=geheim))", - attrs=['unixName','cn','dn', 'sambaUnicodePwd']) - self.assertEquals(len(msg), 1) # TODO: should check with more records - self.assertEquals(str(msg[0]["cn"]), "Niemand") - self.assertEquals(str(msg[0]["unixName"]), "bin") - self.assertEquals(str(msg[0]["sambaUnicodePwd"]), "geheim") - - # Checking for existence of record (local || remote) - msg = self.ldb.search(expression="(|(unixName=bin)(sambaUnicodePwd=geheim))", - attrs=['unixName','cn','dn', 'sambaUnicodePwd']) - #print "got %d replies" % len(msg) - self.assertEquals(len(msg), 1) # TODO: should check with more records - self.assertEquals(str(msg[0]["cn"]), "Niemand") - self.assertEquals(str(msg[0]["unixName"]), "bin") - self.assertEquals(str(msg[0]["sambaUnicodePwd"]), "geheim") - - # Checking for data in destination database - msg = self.samba3.db.search(expression="(cn=Niemand)") - self.assertTrue(len(msg) >= 1) - self.assertEquals(str(msg[0]["sambaSID"]), - "S-1-5-21-4231626423-2410014848-2360679739-2001") - self.assertEquals(str(msg[0]["displayName"]), "Niemand") - - # Adding attribute... - self.ldb.modify_ldif(""" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -add: description -description: Blah -""") - - # Checking whether changes are still there... - msg = self.ldb.search(expression="(cn=Niemand)") - self.assertTrue(len(msg) >= 1) - self.assertEquals(str(msg[0]["cn"]), "Niemand") - self.assertEquals(str(msg[0]["description"]), "Blah") - - # Modifying attribute... - self.ldb.modify_ldif(""" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -replace: description -description: Blie -""") - - # Checking whether changes are still there... - msg = self.ldb.search(expression="(cn=Niemand)") - self.assertTrue(len(msg) >= 1) - self.assertEquals(str(msg[0]["description"]), "Blie") - - # Deleting attribute... - self.ldb.modify_ldif(""" -dn: cn=Niemand,cn=Users,dc=vernstok,dc=nl -changetype: modify -delete: description -""") - - # Checking whether changes are no longer there... - msg = self.ldb.search(expression="(cn=Niemand)") - self.assertTrue(len(msg) >= 1) - self.assertTrue(not "description" in msg[0]) - - # Renaming record... - self.ldb.rename("cn=Niemand,cn=Users,dc=vernstok,dc=nl", - "cn=Niemand2,cn=Users,dc=vernstok,dc=nl") - - # Checking whether DN has changed... - msg = self.ldb.search(expression="(cn=Niemand2)") - self.assertEquals(len(msg), 1) - self.assertEquals(str(msg[0].dn), - "cn=Niemand2,cn=Users,dc=vernstok,dc=nl") - - # Deleting record... - self.ldb.delete("cn=Niemand2,cn=Users,dc=vernstok,dc=nl") - - # Checking whether record is gone... - msg = self.ldb.search(expression="(cn=Niemand2)") - self.assertEquals(len(msg), 0) - - -class MapTestCase(MapBaseTestCase): - - def setUp(self): - super(MapTestCase, self).setUp() - ldb = Ldb(self.ldburl, lp=self.lp, session_info=system_session()) - ldb.set_opaque("skip_allocate_sids", "true"); - ldif = read_datafile("provision_samba3sam.ldif") - ldb.add_ldif(self.samba4.subst(ldif)) - self.setup_modules(ldb, self.samba3, self.samba4) - del ldb - self.ldb = Ldb(self.ldburl, lp=self.lp, session_info=system_session()) - self.ldb.set_opaque("skip_allocate_sids", "true"); - - def test_map_search(self): - """Running search tests on mapped data.""" - self.samba3.db.add({ - "dn": "sambaDomainName=TESTS," + self.samba3.basedn, - "objectclass": ["sambaDomain", "top"], - "sambaSID": "S-1-5-21-4231626423-2410014848-2360679739", - "sambaNextRid": "2000", - "sambaDomainName": "TESTS" - }) - - # Add a set of split records - self.ldb.add_ldif(""" -dn: """+ self.samba4.dn("cn=Domain Users") + """ -objectClass: group -cn: Domain Users -objectSid: S-1-5-21-4231626423-2410014848-2360679739-513 -""") - - # Add a set of split records - self.ldb.add_ldif(""" -dn: """+ self.samba4.dn("cn=X") + """ -objectClass: user -cn: X -codePage: x -revision: x -dnsHostName: x -nextRid: y -lastLogon: x -description: x -objectSid: S-1-5-21-4231626423-2410014848-2360679739-552 -""") - - self.ldb.add({ - "dn": self.samba4.dn("cn=Y"), - "objectClass": "top", - "cn": "Y", - "codePage": "x", - "revision": "x", - "dnsHostName": "y", - "nextRid": "y", - "lastLogon": "y", - "description": "x"}) - - self.ldb.add({ - "dn": self.samba4.dn("cn=Z"), - "objectClass": "top", - "cn": "Z", - "codePage": "x", - "revision": "y", - "dnsHostName": "z", - "nextRid": "y", - "lastLogon": "z", - "description": "y"}) - - # Add a set of remote records - - self.samba3.db.add({ - "dn": self.samba3.dn("cn=A"), - "objectClass": "posixAccount", - "cn": "A", - "sambaNextRid": "x", - "sambaBadPasswordCount": "x", - "sambaLogonTime": "x", - "description": "x", - "sambaSID": "S-1-5-21-4231626423-2410014848-2360679739-552", - "sambaPrimaryGroupSID": "S-1-5-21-4231626423-2410014848-2360679739-512"}) - - self.samba3.db.add({ - "dn": self.samba3.dn("cn=B"), - "objectClass": "top", - "cn": "B", - "sambaNextRid": "x", - "sambaBadPasswordCount": "x", - "sambaLogonTime": "y", - "description": "x"}) - - self.samba3.db.add({ - "dn": self.samba3.dn("cn=C"), - "objectClass": "top", - "cn": "C", - "sambaNextRid": "x", - "sambaBadPasswordCount": "y", - "sambaLogonTime": "z", - "description": "y"}) - - # Testing search by DN - - # Search remote record by local DN - dn = self.samba4.dn("cn=A") - res = self.ldb.search(dn, scope=SCOPE_BASE, - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - - # Search remote record by remote DN - dn = self.samba3.dn("cn=A") - res = self.samba3.db.search(dn, scope=SCOPE_BASE, - attrs=["dnsHostName", "lastLogon", "sambaLogonTime"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertTrue(not "lastLogon" in res[0]) - self.assertEquals(str(res[0]["sambaLogonTime"]), "x") - - # Search split record by local DN - dn = self.samba4.dn("cn=X") - res = self.ldb.search(dn, scope=SCOPE_BASE, - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["dnsHostName"]), "x") - self.assertEquals(str(res[0]["lastLogon"]), "x") - - # Search split record by remote DN - dn = self.samba3.dn("cn=X") - res = self.samba3.db.search(dn, scope=SCOPE_BASE, - attrs=["dnsHostName", "lastLogon", "sambaLogonTime"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertTrue(not "lastLogon" in res[0]) - self.assertEquals(str(res[0]["sambaLogonTime"]), "x") - - # Testing search by attribute - - # Search by ignored attribute - res = self.ldb.search(expression="(revision=x)", scope=SCOPE_DEFAULT, - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[0]["dnsHostName"]), "x") - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[1]["dnsHostName"]), "y") - self.assertEquals(str(res[1]["lastLogon"]), "y") - - # Search by kept attribute - res = self.ldb.search(expression="(description=y)", - scope=SCOPE_DEFAULT, attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "z") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[1]["dnsHostName"]), "z") - self.assertEquals(str(res[1]["lastLogon"]), "z") - - # Search by renamed attribute - res = self.ldb.search(expression="(badPwdCount=x)", scope=SCOPE_DEFAULT, - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - - # Search by converted attribute - # TODO: - # Using the SID directly in the parse tree leads to conversion - # errors, letting the search fail with no results. - #res = self.ldb.search("(objectSid=S-1-5-21-4231626423-2410014848-2360679739-552)", scope=SCOPE_DEFAULT, attrs) - res = self.ldb.search(expression="(objectSid=*)", base=None, scope=SCOPE_DEFAULT, attrs=["dnsHostName", "lastLogon", "objectSid"]) - self.assertEquals(len(res), 4) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[1]["dnsHostName"]), "x") - self.assertEquals(str(res[1]["lastLogon"]), "x") - self.assertSidEquals("S-1-5-21-4231626423-2410014848-2360679739-552", - res[1]["objectSid"]) - self.assertTrue("objectSid" in res[1]) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertSidEquals("S-1-5-21-4231626423-2410014848-2360679739-552", - res[0]["objectSid"]) - self.assertTrue("objectSid" in res[0]) - - # Search by generated attribute - # In most cases, this even works when the mapping is missing - # a `convert_operator' by enumerating the remote db. - res = self.ldb.search(expression="(primaryGroupID=512)", - attrs=["dnsHostName", "lastLogon", "primaryGroupID"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[0]["primaryGroupID"]), "512") - - # Note that Xs "objectSid" seems to be fine in the previous search for - # "objectSid"... - #res = ldb.search(expression="(primaryGroupID=*)", NULL, ldb. SCOPE_DEFAULT, attrs) - #print len(res) + " results found" - #for i in range(len(res)): - # for (obj in res[i]) { - # print obj + ": " + res[i][obj] - # } - # print "---" - # - - # Search by remote name of renamed attribute */ - res = self.ldb.search(expression="(sambaBadPasswordCount=*)", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 0) - - # Search by objectClass - attrs = ["dnsHostName", "lastLogon", "objectClass"] - res = self.ldb.search(expression="(objectClass=user)", attrs=attrs) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[0]["objectClass"][0]), "user") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[1]["dnsHostName"]), "x") - self.assertEquals(str(res[1]["lastLogon"]), "x") - self.assertEquals(str(res[1]["objectClass"][0]), "user") - - # Prove that the objectClass is actually used for the search - res = self.ldb.search(expression="(|(objectClass=user)(badPwdCount=x))", - attrs=attrs) - self.assertEquals(len(res), 3) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(res[0]["objectClass"][0], "user") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(set(res[1]["objectClass"]), set(["top"])) - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[2]["dnsHostName"]), "x") - self.assertEquals(str(res[2]["lastLogon"]), "x") - self.assertEquals(str(res[2]["objectClass"][0]), "user") - - # Testing search by parse tree - - # Search by conjunction of local attributes - res = self.ldb.search(expression="(&(codePage=x)(revision=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[0]["dnsHostName"]), "x") - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[1]["dnsHostName"]), "y") - self.assertEquals(str(res[1]["lastLogon"]), "y") - - # Search by conjunction of remote attributes - res = self.ldb.search(expression="(&(lastLogon=x)(description=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[1]["dnsHostName"]), "x") - self.assertEquals(str(res[1]["lastLogon"]), "x") - - # Search by conjunction of local and remote attribute - res = self.ldb.search(expression="(&(codePage=x)(description=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[0]["dnsHostName"]), "x") - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[1]["dnsHostName"]), "y") - self.assertEquals(str(res[1]["lastLogon"]), "y") - - # Search by conjunction of local and remote attribute w/o match - attrs = ["dnsHostName", "lastLogon"] - res = self.ldb.search(expression="(&(codePage=x)(nextRid=x))", - attrs=attrs) - self.assertEquals(len(res), 0) - res = self.ldb.search(expression="(&(revision=x)(lastLogon=z))", - attrs=attrs) - self.assertEquals(len(res), 0) - - # Search by disjunction of local attributes - res = self.ldb.search(expression="(|(revision=x)(dnsHostName=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 2) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[0]["dnsHostName"]), "x") - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[1]["dnsHostName"]), "y") - self.assertEquals(str(res[1]["lastLogon"]), "y") - - # Search by disjunction of remote attributes - res = self.ldb.search(expression="(|(badPwdCount=x)(lastLogon=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 3) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertFalse("dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertFalse("dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[2]["dnsHostName"]), "x") - self.assertEquals(str(res[2]["lastLogon"]), "x") - - # Search by disjunction of local and remote attribute - res = self.ldb.search(expression="(|(revision=x)(lastLogon=y))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 3) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=B")) - self.assertFalse("dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "y") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[1]["dnsHostName"]), "x") - self.assertEquals(str(res[1]["lastLogon"]), "x") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[2]["dnsHostName"]), "y") - self.assertEquals(str(res[2]["lastLogon"]), "y") - - # Search by disjunction of local and remote attribute w/o match - res = self.ldb.search(expression="(|(codePage=y)(nextRid=z))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 0) - - # Search by negated local attribute - res = self.ldb.search(expression="(!(revision=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 6) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[2]) - self.assertEquals(str(res[2]["lastLogon"]), "z") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[3]["dnsHostName"]), "z") - self.assertEquals(str(res[3]["lastLogon"]), "z") - - # Search by negated remote attribute - res = self.ldb.search(expression="(!(description=x))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 4) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "z") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[1]["dnsHostName"]), "z") - self.assertEquals(str(res[1]["lastLogon"]), "z") - - # Search by negated conjunction of local attributes - res = self.ldb.search(expression="(!(&(codePage=x)(revision=x)))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 6) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[2]) - self.assertEquals(str(res[2]["lastLogon"]), "z") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[3]["dnsHostName"]), "z") - self.assertEquals(str(res[3]["lastLogon"]), "z") - - # Search by negated conjunction of remote attributes - res = self.ldb.search(expression="(!(&(lastLogon=x)(description=x)))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 6) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "y") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "z") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[2]["dnsHostName"]), "y") - self.assertEquals(str(res[2]["lastLogon"]), "y") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[3]["dnsHostName"]), "z") - self.assertEquals(str(res[3]["lastLogon"]), "z") - - # Search by negated conjunction of local and remote attribute - res = self.ldb.search(expression="(!(&(codePage=x)(description=x)))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 6) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[2]) - self.assertEquals(str(res[2]["lastLogon"]), "z") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[3]["dnsHostName"]), "z") - self.assertEquals(str(res[3]["lastLogon"]), "z") - - # Search by negated disjunction of local attributes - res = self.ldb.search(expression="(!(|(revision=x)(dnsHostName=x)))", - attrs=["dnsHostName", "lastLogon"]) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[2]) - self.assertEquals(str(res[2]["lastLogon"]), "z") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[3]["dnsHostName"]), "z") - self.assertEquals(str(res[3]["lastLogon"]), "z") - - # Search by negated disjunction of remote attributes - res = self.ldb.search(expression="(!(|(badPwdCount=x)(lastLogon=x)))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 5) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "z") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=Y")) - self.assertEquals(str(res[1]["dnsHostName"]), "y") - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[2]["dnsHostName"]), "z") - self.assertEquals(str(res[2]["lastLogon"]), "z") - - # Search by negated disjunction of local and remote attribute - res = self.ldb.search(expression="(!(|(revision=x)(lastLogon=y)))", - attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 5) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "z") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[2]["dnsHostName"]), "z") - self.assertEquals(str(res[2]["lastLogon"]), "z") - - # Search by complex parse tree - res = self.ldb.search(expression="(|(&(revision=x)(dnsHostName=x))(!(&(description=x)(nextRid=y)))(badPwdCount=y))", attrs=["dnsHostName", "lastLogon"]) - self.assertEquals(len(res), 7) - res = sorted(res, key=attrgetter('dn')) - self.assertEquals(str(res[0].dn), self.samba4.dn("cn=A")) - self.assertTrue(not "dnsHostName" in res[0]) - self.assertEquals(str(res[0]["lastLogon"]), "x") - self.assertEquals(str(res[1].dn), self.samba4.dn("cn=B")) - self.assertTrue(not "dnsHostName" in res[1]) - self.assertEquals(str(res[1]["lastLogon"]), "y") - self.assertEquals(str(res[2].dn), self.samba4.dn("cn=C")) - self.assertTrue(not "dnsHostName" in res[2]) - self.assertEquals(str(res[2]["lastLogon"]), "z") - self.assertEquals(str(res[3].dn), self.samba4.dn("cn=X")) - self.assertEquals(str(res[3]["dnsHostName"]), "x") - self.assertEquals(str(res[3]["lastLogon"]), "x") - self.assertEquals(str(res[4].dn), self.samba4.dn("cn=Z")) - self.assertEquals(str(res[4]["dnsHostName"]), "z") - self.assertEquals(str(res[4]["lastLogon"]), "z") - - # Clean up - dns = [self.samba4.dn("cn=%s" % n) for n in ["A","B","C","X","Y","Z"]] - for dn in dns: - self.ldb.delete(dn) - - def test_map_modify_local(self): - """Modification of local records.""" - # Add local record - dn = "cn=test,dc=idealx,dc=org" - self.ldb.add({"dn": dn, - "cn": "test", - "foo": "bar", - "revision": "1", - "description": "test"}) - # Check it's there - attrs = ["foo", "revision", "description"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["foo"]), "bar") - self.assertEquals(str(res[0]["revision"]), "1") - self.assertEquals(str(res[0]["description"]), "test") - # Check it's not in the local db - res = self.samba4.db.search(expression="(cn=test)", - scope=SCOPE_DEFAULT, attrs=attrs) - self.assertEquals(len(res), 0) - # Check it's not in the remote db - res = self.samba3.db.search(expression="(cn=test)", - scope=SCOPE_DEFAULT, attrs=attrs) - self.assertEquals(len(res), 0) - - # Modify local record - ldif = """ -dn: """ + dn + """ -replace: foo -foo: baz -replace: description -description: foo -""" - self.ldb.modify_ldif(ldif) - # Check in local db - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["foo"]), "baz") - self.assertEquals(str(res[0]["revision"]), "1") - self.assertEquals(str(res[0]["description"]), "foo") - - # Rename local record - dn2 = "cn=toast,dc=idealx,dc=org" - self.ldb.rename(dn, dn2) - # Check in local db - res = self.ldb.search(dn2, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["foo"]), "baz") - self.assertEquals(str(res[0]["revision"]), "1") - self.assertEquals(str(res[0]["description"]), "foo") - - # Delete local record - self.ldb.delete(dn2) - # Check it's gone - res = self.ldb.search(dn2, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) - - def test_map_modify_remote_remote(self): - """Modification of remote data of remote records""" - # Add remote record - dn = self.samba4.dn("cn=test") - dn2 = self.samba3.dn("cn=test") - self.samba3.db.add({"dn": dn2, - "cn": "test", - "description": "foo", - "sambaBadPasswordCount": "3", - "sambaNextRid": "1001"}) - # Check it's there - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, - attrs=["description", "sambaBadPasswordCount", "sambaNextRid"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "foo") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "3") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - # Check in mapped db - attrs = ["description", "badPwdCount", "nextRid"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs, expression="") - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "foo") - self.assertEquals(str(res[0]["badPwdCount"]), "3") - self.assertEquals(str(res[0]["nextRid"]), "1001") - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 0) - - # Modify remote data of remote record - ldif = """ -dn: """ + dn + """ -replace: description -description: test -replace: badPwdCount -badPwdCount: 4 -""" - self.ldb.modify_ldif(ldif) - # Check in mapped db - res = self.ldb.search(dn, scope=SCOPE_BASE, - attrs=["description", "badPwdCount", "nextRid"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["badPwdCount"]), "4") - self.assertEquals(str(res[0]["nextRid"]), "1001") - # Check in remote db - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, - attrs=["description", "sambaBadPasswordCount", "sambaNextRid"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "4") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - - # Rename remote record - dn2 = self.samba4.dn("cn=toast") - self.ldb.rename(dn, dn2) - # Check in mapped db - dn = dn2 - res = self.ldb.search(dn, scope=SCOPE_BASE, - attrs=["description", "badPwdCount", "nextRid"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["badPwdCount"]), "4") - self.assertEquals(str(res[0]["nextRid"]), "1001") - # Check in remote db - dn2 = self.samba3.dn("cn=toast") - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, - attrs=["description", "sambaBadPasswordCount", "sambaNextRid"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "4") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - - # Delete remote record - self.ldb.delete(dn) - # Check in mapped db that it's removed - res = self.ldb.search(dn, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) - # Check in remote db - res = self.samba3.db.search(dn2, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) - - def test_map_modify_remote_local(self): - """Modification of local data of remote records""" - # Add remote record (same as before) - dn = self.samba4.dn("cn=test") - dn2 = self.samba3.dn("cn=test") - self.samba3.db.add({"dn": dn2, - "cn": "test", - "description": "foo", - "sambaBadPasswordCount": "3", - "sambaNextRid": "1001"}) - - # Modify local data of remote record - ldif = """ -dn: """ + dn + """ -add: revision -revision: 1 -replace: description -description: test - -""" - self.ldb.modify_ldif(ldif) - # Check in mapped db - attrs = ["revision", "description"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["revision"]), "1") - # Check in remote db - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "test") - self.assertTrue(not "revision" in res[0]) - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "description" in res[0]) - self.assertEquals(str(res[0]["revision"]), "1") - - # Delete (newly) split record - self.ldb.delete(dn) - - def test_map_modify_split(self): - """Testing modification of split records""" - # Add split record - dn = self.samba4.dn("cn=test") - dn2 = self.samba3.dn("cn=test") - self.ldb.add({ - "dn": dn, - "cn": "test", - "description": "foo", - "badPwdCount": "3", - "nextRid": "1001", - "revision": "1"}) - # Check it's there - attrs = ["description", "badPwdCount", "nextRid", "revision"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "foo") - self.assertEquals(str(res[0]["badPwdCount"]), "3") - self.assertEquals(str(res[0]["nextRid"]), "1001") - self.assertEquals(str(res[0]["revision"]), "1") - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "description" in res[0]) - self.assertTrue(not "badPwdCount" in res[0]) - self.assertTrue(not "nextRid" in res[0]) - self.assertEquals(str(res[0]["revision"]), "1") - # Check in remote db - attrs = ["description", "sambaBadPasswordCount", "sambaNextRid", - "revision"] - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "foo") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "3") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - self.assertTrue(not "revision" in res[0]) - - # Modify of split record - ldif = """ -dn: """ + dn + """ -replace: description -description: test -replace: badPwdCount -badPwdCount: 4 -replace: revision -revision: 2 -""" - self.ldb.modify_ldif(ldif) - # Check in mapped db - attrs = ["description", "badPwdCount", "nextRid", "revision"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["badPwdCount"]), "4") - self.assertEquals(str(res[0]["nextRid"]), "1001") - self.assertEquals(str(res[0]["revision"]), "2") - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "description" in res[0]) - self.assertTrue(not "badPwdCount" in res[0]) - self.assertTrue(not "nextRid" in res[0]) - self.assertEquals(str(res[0]["revision"]), "2") - # Check in remote db - attrs = ["description", "sambaBadPasswordCount", "sambaNextRid", - "revision"] - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "4") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - self.assertTrue(not "revision" in res[0]) - - # Rename split record - dn2 = self.samba4.dn("cn=toast") - self.ldb.rename(dn, dn2) - # Check in mapped db - dn = dn2 - attrs = ["description", "badPwdCount", "nextRid", "revision"] - res = self.ldb.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["badPwdCount"]), "4") - self.assertEquals(str(res[0]["nextRid"]), "1001") - self.assertEquals(str(res[0]["revision"]), "2") - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE, attrs=attrs) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn) - self.assertTrue(not "description" in res[0]) - self.assertTrue(not "badPwdCount" in res[0]) - self.assertTrue(not "nextRid" in res[0]) - self.assertEquals(str(res[0]["revision"]), "2") - # Check in remote db - dn2 = self.samba3.dn("cn=toast") - res = self.samba3.db.search(dn2, scope=SCOPE_BASE, - attrs=["description", "sambaBadPasswordCount", "sambaNextRid", - "revision"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0].dn), dn2) - self.assertEquals(str(res[0]["description"]), "test") - self.assertEquals(str(res[0]["sambaBadPasswordCount"]), "4") - self.assertEquals(str(res[0]["sambaNextRid"]), "1001") - self.assertTrue(not "revision" in res[0]) - - # Delete split record - self.ldb.delete(dn) - # Check in mapped db - res = self.ldb.search(dn, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) - # Check in local db - res = self.samba4.db.search(dn, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) - # Check in remote db - res = self.samba3.db.search(dn2, scope=SCOPE_BASE) - self.assertEquals(len(res), 0) diff --git a/source4/scripting/python/samba/tests/samba_tool/__init__.py b/source4/scripting/python/samba/tests/samba_tool/__init__.py deleted file mode 100644 index 3d7f0591e2..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. diff --git a/source4/scripting/python/samba/tests/samba_tool/base.py b/source4/scripting/python/samba/tests/samba_tool/base.py deleted file mode 100644 index 60ccaa543d..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/base.py +++ /dev/null @@ -1,114 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -# This provides a wrapper around the cmd interface so that tests can -# easily be built on top of it and have minimal code to run basic tests -# of the commands. A list of the environmental variables can be found in -# ~/selftest/selftest.pl -# -# These can all be accesses via os.environ["VARIBLENAME"] when needed - -import random -import string -from samba.auth import system_session -from samba.samdb import SamDB -from cStringIO import StringIO -from samba.netcmd.main import cmd_sambatool -import samba.tests - -class SambaToolCmdTest(samba.tests.TestCaseInTempDir): - - def getSamDB(self, *argv): - """a convenience function to get a samdb instance so that we can query it""" - - # We build a fake command to get the options created the same - # way the command classes do it. It would be better if the command - # classes had a way to more cleanly do this, but this lets us write - # tests for now - cmd = cmd_sambatool.subcommands["user"].subcommands["setexpiry"] - parser, optiongroups = cmd._create_parser("user") - opts, args = parser.parse_args(list(argv)) - # Filter out options from option groups - args = args[1:] - kwargs = dict(opts.__dict__) - for option_group in parser.option_groups: - for option in option_group.option_list: - if option.dest is not None: - del kwargs[option.dest] - kwargs.update(optiongroups) - - H = kwargs.get("H", None) - sambaopts = kwargs.get("sambaopts", None) - credopts = kwargs.get("credopts", None) - - lp = sambaopts.get_loadparm() - creds = credopts.get_credentials(lp, fallback_machine=True) - - samdb = SamDB(url=H, session_info=system_session(), - credentials=creds, lp=lp) - return samdb - - - def runcmd(self, name, *args): - """run a single level command""" - cmd = cmd_sambatool.subcommands[name] - cmd.outf = StringIO() - cmd.errf = StringIO() - result = cmd._run(name, *args) - return (result, cmd.outf.getvalue(), cmd.errf.getvalue()) - - def runsubcmd(self, name, sub, *args): - """run a command with sub commands""" - # The reason we need this function seperate from runcmd is - # that the .outf StringIO assignment is overriden if we use - # runcmd, so we can't capture stdout and stderr - cmd = cmd_sambatool.subcommands[name].subcommands[sub] - cmd.outf = StringIO() - cmd.errf = StringIO() - result = cmd._run(name, *args) - return (result, cmd.outf.getvalue(), cmd.errf.getvalue()) - - def assertCmdSuccess(self, val, msg=""): - self.assertIsNone(val, msg) - - def assertCmdFail(self, val, msg=""): - self.assertIsNotNone(val, msg) - - def assertMatch(self, base, string, msg=""): - self.assertTrue(string in base, msg) - - def randomName(self, count=8): - """Create a random name, cap letters and numbers, and always starting with a letter""" - name = random.choice(string.ascii_uppercase) - name += ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase+ string.digits) for x in range(count - 1)) - return name - - def randomPass(self, count=16): - name = random.choice(string.ascii_uppercase) - name += random.choice(string.digits) - name += random.choice(string.ascii_lowercase) - name += ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase+ string.digits) for x in range(count - 3)) - return name - - def randomXid(self): - # pick some hopefully unused, high UID/GID range to avoid interference - # from the system the test runs on - xid = random.randint(4711000, 4799000) - return xid - - def assertWithin(self, val1, val2, delta, msg=""): - """Assert that val1 is within delta of val2, useful for time computations""" - self.assertTrue(((val1 + delta) > val2) and ((val1 - delta) < val2), msg) diff --git a/source4/scripting/python/samba/tests/samba_tool/gpo.py b/source4/scripting/python/samba/tests/samba_tool/gpo.py deleted file mode 100644 index e20a97794a..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/gpo.py +++ /dev/null @@ -1,79 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Andrew Bartlett 2012 -# -# based on time.py: -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -from samba.tests.samba_tool.base import SambaToolCmdTest -import shutil - -class GpoCmdTestCase(SambaToolCmdTest): - """Tests for samba-tool time subcommands""" - - gpo_name = "testgpo" - - def test_gpo_list(self): - """Run gpo list against the server and make sure it looks accurate""" - (result, out, err) = self.runsubcmd("gpo", "listall", "-H", "ldap://%s" % os.environ["SERVER"]) - self.assertCmdSuccess(result, "Ensuring gpo listall ran successfully") - - def test_fetchfail(self): - """Run against a non-existent GPO, and make sure it fails (this hard-coded UUID is very unlikely to exist""" - (result, out, err) = self.runsubcmd("gpo", "fetch", "c25cac17-a02a-4151-835d-fae17446ee43", "-H", "ldap://%s" % os.environ["SERVER"]) - self.assertEquals(result, -1, "check for result code") - - def test_fetch(self): - """Run against a real GPO, and make sure it passes""" - (result, out, err) = self.runsubcmd("gpo", "fetch", self.gpo_guid, "-H", "ldap://%s" % os.environ["SERVER"], "--tmpdir", self.tempdir) - self.assertCmdSuccess(result, "Ensuring gpo fetched successfully") - shutil.rmtree(os.path.join(self.tempdir, "policy")) - - def test_show(self): - """Show a real GPO, and make sure it passes""" - (result, out, err) = self.runsubcmd("gpo", "show", self.gpo_guid, "-H", "ldap://%s" % os.environ["SERVER"]) - self.assertCmdSuccess(result, "Ensuring gpo fetched successfully") - - def test_show_as_admin(self): - """Show a real GPO, and make sure it passes""" - (result, out, err) = self.runsubcmd("gpo", "show", self.gpo_guid, "-H", "ldap://%s" % os.environ["SERVER"], "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"])) - self.assertCmdSuccess(result, "Ensuring gpo fetched successfully") - - def test_aclcheck(self): - """Check all the GPOs on the remote server have correct ACLs""" - (result, out, err) = self.runsubcmd("gpo", "aclcheck", "-H", "ldap://%s" % os.environ["SERVER"], "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"])) - self.assertCmdSuccess(result, "Ensuring gpo checked successfully") - - def setUp(self): - """set up a temporary GPO to work with""" - super(GpoCmdTestCase, self).setUp() - (result, out, err) = self.runsubcmd("gpo", "create", self.gpo_name, - "-H", "ldap://%s" % os.environ["SERVER"], - "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"]), - "--tmpdir", self.tempdir) - shutil.rmtree(os.path.join(self.tempdir, "policy")) - self.assertCmdSuccess(result, "Ensuring gpo created successfully") - try: - self.gpo_guid = "{%s}" % out.split("{")[1].split("}")[0] - except IndexError: - self.fail("Failed to find GUID in output: %s" % out) - - def tearDown(self): - """remove the temporary GPO to work with""" - (result, out, err) = self.runsubcmd("gpo", "del", self.gpo_guid, "-H", "ldap://%s" % os.environ["SERVER"], "-U%s%%%s" % (os.environ["USERNAME"], os.environ["PASSWORD"])) - self.assertCmdSuccess(result, "Ensuring gpo deleted successfully") - super(GpoCmdTestCase, self).tearDown() diff --git a/source4/scripting/python/samba/tests/samba_tool/group.py b/source4/scripting/python/samba/tests/samba_tool/group.py deleted file mode 100644 index 2c0c46e5dc..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/group.py +++ /dev/null @@ -1,169 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Michael Adam 2012 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -import time -import ldb -from samba.tests.samba_tool.base import SambaToolCmdTest -from samba import ( - nttime2unix, - dsdb - ) - -class GroupCmdTestCase(SambaToolCmdTest): - """Tests for samba-tool group subcommands""" - groups = [] - samdb = None - - def setUp(self): - super(GroupCmdTestCase, self).setUp() - self.samdb = self.getSamDB("-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - self.groups = [] - self.groups.append(self._randomGroup({"name": "testgroup1"})) - self.groups.append(self._randomGroup({"name": "testgroup2"})) - self.groups.append(self._randomGroup({"name": "testgroup3"})) - self.groups.append(self._randomGroup({"name": "testgroup4"})) - - # setup the 4 groups and ensure they are correct - for group in self.groups: - (result, out, err) = self._create_group(group) - - self.assertCmdSuccess(result) - self.assertEquals(err, "", "There shouldn't be any error message") - self.assertIn("Added group %s" % group["name"], out) - - found = self._find_group(group["name"]) - - self.assertIsNotNone(found) - - self.assertEquals("%s" % found.get("name"), group["name"]) - self.assertEquals("%s" % found.get("description"), group["description"]) - - def tearDown(self): - super(GroupCmdTestCase, self).tearDown() - # clean up all the left over groups, just in case - for group in self.groups: - if self._find_group(group["name"]): - self.runsubcmd("group", "delete", group["name"]) - - - def test_newgroup(self): - """This tests the "group add" and "group delete" commands""" - # try to add all the groups again, this should fail - for group in self.groups: - (result, out, err) = self._create_group(group) - self.assertCmdFail(result, "Succeeded to create existing group") - self.assertIn("LDAP error 68 LDAP_ENTRY_ALREADY_EXISTS", err) - - # try to delete all the groups we just added - for group in self.groups: - (result, out, err) = self.runsubcmd("group", "delete", group["name"]) - self.assertCmdSuccess(result, - "Failed to delete group '%s'" % group["name"]) - found = self._find_group(group["name"]) - self.assertIsNone(found, - "Deleted group '%s' still exists" % group["name"]) - - # test adding groups - for group in self.groups: - (result, out, err) = self.runsubcmd("group", "add", group["name"], - "--description=%s" % group["description"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) - - self.assertCmdSuccess(result) - self.assertEquals(err,"","There shouldn't be any error message") - self.assertIn("Added group %s" % group["name"], out) - - found = self._find_group(group["name"]) - - self.assertEquals("%s" % found.get("samaccountname"), - "%s" % group["name"]) - - - def test_list(self): - (result, out, err) = self.runsubcmd("group", "list", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) - self.assertCmdSuccess(result, "Error running list") - - search_filter = "(objectClass=group)" - - grouplist = self.samdb.search(base=self.samdb.domain_dn(), - scope=ldb.SCOPE_SUBTREE, - expression=search_filter, - attrs=["samaccountname"]) - - self.assertTrue(len(grouplist) > 0, "no groups found in samdb") - - for groupobj in grouplist: - name = groupobj.get("samaccountname", idx=0) - found = self.assertMatch(out, name, - "group '%s' not found" % name) - - def test_listmembers(self): - (result, out, err) = self.runsubcmd("group", "listmembers", "Domain Users", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) - self.assertCmdSuccess(result, "Error running listmembers") - - search_filter = "(|(primaryGroupID=513)(memberOf=CN=Domain Users,CN=Users,%s))" % self.samdb.domain_dn() - - grouplist = self.samdb.search(base=self.samdb.domain_dn(), - scope=ldb.SCOPE_SUBTREE, - expression=search_filter, - attrs=["samAccountName"]) - - self.assertTrue(len(grouplist) > 0, "no groups found in samdb") - - for groupobj in grouplist: - name = groupobj.get("samAccountName", idx=0) - found = self.assertMatch(out, name, "group '%s' not found" % name) - - def _randomGroup(self, base={}): - """create a group with random attribute values, you can specify base attributes""" - group = { - "name": self.randomName(), - "description": self.randomName(count=100), - } - group.update(base) - return group - - def _create_group(self, group): - return self.runsubcmd("group", "add", group["name"], - "--description=%s" % group["description"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) - - def _find_group(self, name): - search_filter = ("(&(sAMAccountName=%s)(objectCategory=%s,%s))" % - (ldb.binary_encode(name), - "CN=Group,CN=Schema,CN=Configuration", - self.samdb.domain_dn())) - grouplist = self.samdb.search(base=self.samdb.domain_dn(), - scope=ldb.SCOPE_SUBTREE, - expression=search_filter, - attrs=[]) - if grouplist: - return grouplist[0] - else: - return None diff --git a/source4/scripting/python/samba/tests/samba_tool/ntacl.py b/source4/scripting/python/samba/tests/samba_tool/ntacl.py deleted file mode 100644 index 2a329fe7d4..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/ntacl.py +++ /dev/null @@ -1,135 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Andrew Bartlett 2012 -# -# Based on user.py: -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -import time -import ldb -from samba.tests.samba_tool.base import SambaToolCmdTest -import random - -class NtACLCmdSysvolTestCase(SambaToolCmdTest): - """Tests for samba-tool ntacl sysvol* subcommands""" - - - def test_ntvfs(self): - (result, out, err) = self.runsubcmd("ntacl", "sysvolreset", - "--use-ntvfs") - self.assertCmdSuccess(result) - self.assertEquals(out,"","Shouldn't be any output messages") - self.assertIn("Please note that POSIX permissions have NOT been changed, only the stored NT ACL", err) - - def test_s3fs(self): - (result, out, err) = self.runsubcmd("ntacl", "sysvolreset", - "--use-s3fs") - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(out,"","Shouldn't be any output messages") - - def test_ntvfs_check(self): - (result, out, err) = self.runsubcmd("ntacl", "sysvolreset", - "--use-ntvfs") - self.assertCmdSuccess(result) - self.assertEquals(out,"","Shouldn't be any output messages") - self.assertIn("Please note that POSIX permissions have NOT been changed, only the stored NT ACL", err) - # Now check they were set correctly - (result, out, err) = self.runsubcmd("ntacl", "sysvolcheck") - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(out,"","Shouldn't be any output messages") - - def test_s3fs_check(self): - (result, out, err) = self.runsubcmd("ntacl", "sysvolreset", - "--use-s3fs") - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(out,"","Shouldn't be any output messages") - - # Now check they were set correctly - (result, out, err) = self.runsubcmd("ntacl", "sysvolcheck") - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(out,"","Shouldn't be any output messages") - -class NtACLCmdGetSetTestCase(SambaToolCmdTest): - """Tests for samba-tool ntacl get/set subcommands""" - - acl = "O:DAG:DUD:P(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;EA)(A;OICIIO;0x001f01ff;;;CO)(A;OICI;0x001f01ff;;;DA)(A;OICI;0x001f01ff;;;SY)(A;OICI;0x001200a9;;;AU)(A;OICI;0x001200a9;;;ED)S:AI(OU;CIIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)(OU;CIIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)" - - - def test_ntvfs(self): - path = os.environ['SELFTEST_PREFIX'] - tempf = os.path.join(path,"pytests"+str(int(100000*random.random()))) - open(tempf, 'w').write("empty") - - (result, out, err) = self.runsubcmd("ntacl", "set", self.acl, tempf, - "--use-ntvfs") - self.assertCmdSuccess(result) - self.assertEquals(out,"","Shouldn't be any output messages") - self.assertIn("Please note that POSIX permissions have NOT been changed, only the stored NT ACL", err) - - def test_s3fs(self): - path = os.environ['SELFTEST_PREFIX'] - tempf = os.path.join(path,"pytests"+str(int(100000*random.random()))) - open(tempf, 'w').write("empty") - - (result, out, err) = self.runsubcmd("ntacl", "set", self.acl, tempf, - "--use-s3fs") - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(out,"","Shouldn't be any output messages") - - def test_ntvfs_check(self): - path = os.environ['SELFTEST_PREFIX'] - tempf = os.path.join(path,"pytests"+str(int(100000*random.random()))) - open(tempf, 'w').write("empty") - - (result, out, err) = self.runsubcmd("ntacl", "set", self.acl, tempf, - "--use-ntvfs") - self.assertCmdSuccess(result) - self.assertEquals(out,"","Shouldn't be any output messages") - self.assertIn("Please note that POSIX permissions have NOT been changed, only the stored NT ACL", err) - - # Now check they were set correctly - (result, out, err) = self.runsubcmd("ntacl", "get", tempf, - "--use-ntvfs", "--as-sddl") - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(self.acl+"\n", out, "Output should be the ACL") - - def test_s3fs_check(self): - path = os.environ['SELFTEST_PREFIX'] - tempf = os.path.join(path,"pytests"+str(int(100000*random.random()))) - open(tempf, 'w').write("empty") - - (result, out, err) = self.runsubcmd("ntacl", "set", self.acl, tempf, - "--use-s3fs") - self.assertCmdSuccess(result) - self.assertEquals(out,"","Shouldn't be any output messages") - self.assertEquals(err,"","Shouldn't be any error messages") - - # Now check they were set correctly - (result, out, err) = self.runsubcmd("ntacl", "get", tempf, - "--use-s3fs", "--as-sddl") - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertEquals(self.acl+"\n", out,"Output should be the ACL") diff --git a/source4/scripting/python/samba/tests/samba_tool/processes.py b/source4/scripting/python/samba/tests/samba_tool/processes.py deleted file mode 100644 index 91a5266b54..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/processes.py +++ /dev/null @@ -1,35 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Andrew Bartlett 2012 -# -# based on time.py: -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -from samba.tests.samba_tool.base import SambaToolCmdTest - -class ProcessCmdTestCase(SambaToolCmdTest): - """Tests for samba-tool process subcommands""" - - def test_name(self): - """Run processes command""" - (result, out, err) = self.runcmd("processes", "--name", "samba") - self.assertCmdSuccess(result, "Ensuring processes ran successfully") - - def test_all(self): - """Run processes command""" - (result, out, err) = self.runcmd("processes") - self.assertCmdSuccess(result, "Ensuring processes ran successfully") diff --git a/source4/scripting/python/samba/tests/samba_tool/timecmd.py b/source4/scripting/python/samba/tests/samba_tool/timecmd.py deleted file mode 100644 index 000f0f2828..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/timecmd.py +++ /dev/null @@ -1,43 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -from time import localtime, strptime, mktime -from samba.tests.samba_tool.base import SambaToolCmdTest - -class TimeCmdTestCase(SambaToolCmdTest): - """Tests for samba-tool time subcommands""" - - def test_timeget(self): - """Run time against the server and make sure it looks accurate""" - (result, out, err) = self.runcmd("time", os.environ["SERVER"]) - self.assertCmdSuccess(result, "Ensuring time ran successfully") - - timefmt = strptime(out, "%a %b %d %H:%M:%S %Y %Z\n") - servertime = int(mktime(timefmt)) - now = int(mktime(localtime())) - - # because there is a race here, allow up to 5 seconds difference in times - delta = 5 - self.assertTrue((servertime > (now - delta) and (servertime < (now + delta)), "Time is now")) - - def test_timefail(self): - """Run time against a non-existent server, and make sure it fails""" - (result, out, err) = self.runcmd("time", "notaserver") - self.assertEquals(result, -1, "check for result code") - self.assertTrue(err.strip().endswith("NT_STATUS_OBJECT_NAME_NOT_FOUND"), "ensure right error string") - self.assertEquals(out, "", "ensure no output returned") diff --git a/source4/scripting/python/samba/tests/samba_tool/user.py b/source4/scripting/python/samba/tests/samba_tool/user.py deleted file mode 100644 index 33344cd3d3..0000000000 --- a/source4/scripting/python/samba/tests/samba_tool/user.py +++ /dev/null @@ -1,362 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Sean Dague <sdague@linux.vnet.ibm.com> 2011 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -import os -import time -import ldb -from samba.tests.samba_tool.base import SambaToolCmdTest -from samba import ( - nttime2unix, - dsdb - ) - -class UserCmdTestCase(SambaToolCmdTest): - """Tests for samba-tool user subcommands""" - users = [] - samdb = None - - def setUp(self): - super(UserCmdTestCase, self).setUp() - self.samdb = self.getSamDB("-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - self.users = [] - self.users.append(self._randomUser({"name": "sambatool1", "company": "comp1"})) - self.users.append(self._randomUser({"name": "sambatool2", "company": "comp1"})) - self.users.append(self._randomUser({"name": "sambatool3", "company": "comp2"})) - self.users.append(self._randomUser({"name": "sambatool4", "company": "comp2"})) - self.users.append(self._randomPosixUser({"name": "posixuser1"})) - self.users.append(self._randomPosixUser({"name": "posixuser2"})) - self.users.append(self._randomPosixUser({"name": "posixuser3"})) - self.users.append(self._randomPosixUser({"name": "posixuser4"})) - - # setup the 8 users and ensure they are correct - for user in self.users: - (result, out, err) = user["createUserFn"](user) - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertIn("User '%s' created successfully" % user["name"], out) - - user["checkUserFn"](user) - - - def tearDown(self): - super(UserCmdTestCase, self).tearDown() - # clean up all the left over users, just in case - for user in self.users: - if self._find_user(user["name"]): - self.runsubcmd("user", "delete", user["name"]) - - - def test_newuser(self): - # try to add all the users again, this should fail - for user in self.users: - (result, out, err) = self._create_user(user) - self.assertCmdFail(result, "Ensure that create user fails") - self.assertIn("LDAP error 68 LDAP_ENTRY_ALREADY_EXISTS", err) - - # try to delete all the 4 users we just added - for user in self.users: - (result, out, err) = self.runsubcmd("user", "delete", user["name"]) - self.assertCmdSuccess(result, "Can we delete users") - found = self._find_user(user["name"]) - self.assertIsNone(found) - - # test adding users with --use-username-as-cn - for user in self.users: - (result, out, err) = self.runsubcmd("user", "add", user["name"], user["password"], - "--use-username-as-cn", - "--surname=%s" % user["surname"], - "--given-name=%s" % user["given-name"], - "--job-title=%s" % user["job-title"], - "--department=%s" % user["department"], - "--description=%s" % user["description"], - "--company=%s" % user["company"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertIn("User '%s' created successfully" % user["name"], out) - - found = self._find_user(user["name"]) - - self.assertEquals("%s" % found.get("cn"), "%(name)s" % user) - self.assertEquals("%s" % found.get("name"), "%(name)s" % user) - - - - def test_setpassword(self): - for user in self.users: - newpasswd = self.randomPass() - (result, out, err) = self.runsubcmd("user", "setpassword", - user["name"], - "--newpassword=%s" % newpasswd, - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - # self.assertCmdSuccess(result, "Ensure setpassword runs") - self.assertEquals(err,"","setpassword with url") - self.assertMatch(out, "Changed password OK", "setpassword with url") - - for user in self.users: - newpasswd = self.randomPass() - (result, out, err) = self.runsubcmd("user", "setpassword", - user["name"], - "--newpassword=%s" % newpasswd) - # self.assertCmdSuccess(result, "Ensure setpassword runs") - self.assertEquals(err,"","setpassword without url") - self.assertMatch(out, "Changed password OK", "setpassword without url") - - for user in self.users: - newpasswd = self.randomPass() - (result, out, err) = self.runsubcmd("user", "setpassword", - user["name"], - "--newpassword=%s" % newpasswd, - "--must-change-at-next-login", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - # self.assertCmdSuccess(result, "Ensure setpassword runs") - self.assertEquals(err,"","setpassword with forced change") - self.assertMatch(out, "Changed password OK", "setpassword with forced change") - - - - - def test_setexpiry(self): - twodays = time.time() + (2 * 24 * 60 * 60) - - for user in self.users: - (result, out, err) = self.runsubcmd("user", "setexpiry", user["name"], - "--days=2", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - self.assertCmdSuccess(result, "Can we run setexpiry with names") - self.assertIn("Expiry for user '%s' set to 2 days." % user["name"], out) - - for user in self.users: - found = self._find_user(user["name"]) - - expires = nttime2unix(int("%s" % found.get("accountExpires"))) - self.assertWithin(expires, twodays, 5, "Ensure account expires is within 5 seconds of the expected time") - - # TODO: renable this after the filter case is sorted out - if "filters are broken, bail now": - return - - # now run the expiration based on a filter - fourdays = time.time() + (4 * 24 * 60 * 60) - (result, out, err) = self.runsubcmd("user", "setexpiry", - "--filter", "(&(objectClass=user)(company=comp2))", - "--days=4", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - self.assertCmdSuccess(result, "Can we run setexpiry with a filter") - - for user in self.users: - found = self._find_user(user["name"]) - if ("%s" % found.get("company")) == "comp2": - expires = nttime2unix(int("%s" % found.get("accountExpires"))) - self.assertWithin(expires, fourdays, 5, "Ensure account expires is within 5 seconds of the expected time") - else: - expires = nttime2unix(int("%s" % found.get("accountExpires"))) - self.assertWithin(expires, twodays, 5, "Ensure account expires is within 5 seconds of the expected time") - - - def test_list(self): - (result, out, err) = self.runsubcmd("user", "list", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], - os.environ["DC_PASSWORD"])) - self.assertCmdSuccess(result, "Error running list") - - search_filter = ("(&(objectClass=user)(userAccountControl:%s:=%u))" % - (ldb.OID_COMPARATOR_AND, dsdb.UF_NORMAL_ACCOUNT)) - - userlist = self.samdb.search(base=self.samdb.domain_dn(), - scope=ldb.SCOPE_SUBTREE, - expression=search_filter, - attrs=["samaccountname"]) - - self.assertTrue(len(userlist) > 0, "no users found in samdb") - - for userobj in userlist: - name = userobj.get("samaccountname", idx=0) - found = self.assertMatch(out, name, - "user '%s' not found" % name) - def test_getpwent(self): - try: - import pwd - except ImportError: - self.skipTest("Skipping getpwent test, no 'pwd' module available") - return - - # get the current user's data for the test - uid = os.geteuid() - try: - u = pwd.getpwuid(uid) - except KeyError: - self.skipTest("Skipping getpwent test, current EUID not found in NSS") - return - - user = self._randomPosixUser({ - "name": u[0], - "uid": u[0], - "uidNumber": u[2], - "gidNumber": u[3], - "gecos": u[4], - "loginShell": u[6], - }) - # check if --rfc2307-from-nss sets the same values as we got from pwd.getpwuid() - (result, out, err) = self.runsubcmd("user", "add", user["name"], user["password"], - "--surname=%s" % user["surname"], - "--given-name=%s" % user["given-name"], - "--job-title=%s" % user["job-title"], - "--department=%s" % user["department"], - "--description=%s" % user["description"], - "--company=%s" % user["company"], - "--rfc2307-from-nss", - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertIn("User '%s' created successfully" % user["name"], out) - - self._check_posix_user(user) - self.runsubcmd("user", "delete", user["name"]) - - # Check if overriding the attributes from NSS with explicit values works - # - # get a user with all random posix attributes - user = self._randomPosixUser({"name": u[0]}) - # create a user with posix attributes from nss but override all of them with the - # random ones just obtained - (result, out, err) = self.runsubcmd("user", "add", user["name"], user["password"], - "--surname=%s" % user["surname"], - "--given-name=%s" % user["given-name"], - "--job-title=%s" % user["job-title"], - "--department=%s" % user["department"], - "--description=%s" % user["description"], - "--company=%s" % user["company"], - "--rfc2307-from-nss", - "--gecos=%s" % user["gecos"], - "--login-shell=%s" % user["loginShell"], - "--uid=%s" % user["uid"], - "--uid-number=%s" % user["uidNumber"], - "--gid-number=%s" % user["gidNumber"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - - self.assertCmdSuccess(result) - self.assertEquals(err,"","Shouldn't be any error messages") - self.assertIn("User '%s' created successfully" % user["name"], out) - - self._check_posix_user(user) - self.runsubcmd("user", "delete", user["name"]) - - def _randomUser(self, base={}): - """create a user with random attribute values, you can specify base attributes""" - user = { - "name": self.randomName(), - "password": self.randomPass(), - "surname": self.randomName(), - "given-name": self.randomName(), - "job-title": self.randomName(), - "department": self.randomName(), - "company": self.randomName(), - "description": self.randomName(count=100), - "createUserFn": self._create_user, - "checkUserFn": self._check_user, - } - user.update(base) - return user - - def _randomPosixUser(self, base={}): - """create a user with random attribute values and additional RFC2307 - attributes, you can specify base attributes""" - user = self._randomUser({}) - user.update(base) - posixAttributes = { - "uid": self.randomName(), - "loginShell": self.randomName(), - "gecos": self.randomName(), - "uidNumber": self.randomXid(), - "gidNumber": self.randomXid(), - "createUserFn": self._create_posix_user, - "checkUserFn": self._check_posix_user, - } - user.update(posixAttributes) - user.update(base) - return user - - def _check_user(self, user): - """ check if a user from SamDB has the same attributes as its template """ - found = self._find_user(user["name"]) - - self.assertEquals("%s" % found.get("name"), "%(given-name)s %(surname)s" % user) - self.assertEquals("%s" % found.get("title"), user["job-title"]) - self.assertEquals("%s" % found.get("company"), user["company"]) - self.assertEquals("%s" % found.get("description"), user["description"]) - self.assertEquals("%s" % found.get("department"), user["department"]) - - def _check_posix_user(self, user): - """ check if a posix_user from SamDB has the same attributes as its template """ - found = self._find_user(user["name"]) - - self.assertEquals("%s" % found.get("loginShell"), user["loginShell"]) - self.assertEquals("%s" % found.get("gecos"), user["gecos"]) - self.assertEquals("%s" % found.get("uidNumber"), "%s" % user["uidNumber"]) - self.assertEquals("%s" % found.get("gidNumber"), "%s" % user["gidNumber"]) - self.assertEquals("%s" % found.get("uid"), user["uid"]) - self._check_user(user) - - def _create_user(self, user): - return self.runsubcmd("user", "add", user["name"], user["password"], - "--surname=%s" % user["surname"], - "--given-name=%s" % user["given-name"], - "--job-title=%s" % user["job-title"], - "--department=%s" % user["department"], - "--description=%s" % user["description"], - "--company=%s" % user["company"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - def _create_posix_user(self, user): - """ create a new user with RFC2307 attributes """ - return self.runsubcmd("user", "create", user["name"], user["password"], - "--surname=%s" % user["surname"], - "--given-name=%s" % user["given-name"], - "--job-title=%s" % user["job-title"], - "--department=%s" % user["department"], - "--description=%s" % user["description"], - "--company=%s" % user["company"], - "--gecos=%s" % user["gecos"], - "--login-shell=%s" % user["loginShell"], - "--uid=%s" % user["uid"], - "--uid-number=%s" % user["uidNumber"], - "--gid-number=%s" % user["gidNumber"], - "-H", "ldap://%s" % os.environ["DC_SERVER"], - "-U%s%%%s" % (os.environ["DC_USERNAME"], os.environ["DC_PASSWORD"])) - - def _find_user(self, name): - search_filter = "(&(sAMAccountName=%s)(objectCategory=%s,%s))" % (ldb.binary_encode(name), "CN=Person,CN=Schema,CN=Configuration", self.samdb.domain_dn()) - userlist = self.samdb.search(base=self.samdb.domain_dn(), - scope=ldb.SCOPE_SUBTREE, - expression=search_filter, attrs=[]) - if userlist: - return userlist[0] - else: - return None diff --git a/source4/scripting/python/samba/tests/samdb.py b/source4/scripting/python/samba/tests/samdb.py deleted file mode 100644 index 5c80391cba..0000000000 --- a/source4/scripting/python/samba/tests/samdb.py +++ /dev/null @@ -1,96 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for SamDB -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.samdb.""" - -import logging -import os -import uuid - -from samba.auth import system_session -from samba.provision import (setup_samdb, guess_names, make_smbconf, - provision_paths_from_lp) -from samba.provision import DEFAULT_POLICY_GUID, DEFAULT_DC_POLICY_GUID -from samba.provision.backend import ProvisionBackend -from samba.tests import TestCaseInTempDir -from samba.dcerpc import security -from samba.schema import Schema -from samba import param - - -class SamDBTestCase(TestCaseInTempDir): - """Base-class for tests with a Sam Database. - - This is used by the Samba SamDB-tests, but e.g. also by the OpenChange - provisioning tests (which need a Sam). - """ - - def setUp(self): - super(SamDBTestCase, self).setUp() - invocationid = str(uuid.uuid4()) - domaindn = "DC=COM,DC=EXAMPLE" - self.domaindn = domaindn - configdn = "CN=Configuration," + domaindn - schemadn = "CN=Schema," + configdn - domainguid = str(uuid.uuid4()) - policyguid = DEFAULT_POLICY_GUID - domainsid = security.random_sid() - path = os.path.join(self.tempdir, "samdb.ldb") - session_info = system_session() - - hostname="foo" - domain="EXAMPLE" - dnsdomain="example.com" - serverrole="domain controller" - policyguid_dc = DEFAULT_DC_POLICY_GUID - - smbconf = os.path.join(self.tempdir, "smb.conf") - make_smbconf(smbconf, hostname, domain, dnsdomain, - self.tempdir, serverrole=serverrole) - - self.lp = param.LoadParm() - self.lp.load(smbconf) - - names = guess_names(lp=self.lp, hostname=hostname, - domain=domain, dnsdomain=dnsdomain, - serverrole=serverrole, - domaindn=self.domaindn, configdn=configdn, - schemadn=schemadn) - - paths = provision_paths_from_lp(self.lp, names.dnsdomain) - - logger = logging.getLogger("provision") - - provision_backend = ProvisionBackend("ldb", paths=paths, - lp=self.lp, credentials=None, - names=names, logger=logger) - - schema = Schema(domainsid, invocationid=invocationid, - schemadn=names.schemadn, serverdn=names.serverdn, - am_rodc=False) - - self.samdb = setup_samdb(path, session_info, - provision_backend, self.lp, names, logger, - domainsid, domainguid, policyguid, policyguid_dc, False, - "secret", "secret", "secret", invocationid, "secret", - None, "domain controller", schema=schema) - - def tearDown(self): - for f in ['schema.ldb', 'configuration.ldb', - 'users.ldb', 'samdb.ldb', 'smb.conf']: - os.remove(os.path.join(self.tempdir, f)) - super(SamDBTestCase, self).tearDown() diff --git a/source4/scripting/python/samba/tests/security.py b/source4/scripting/python/samba/tests/security.py deleted file mode 100644 index d2938aacb0..0000000000 --- a/source4/scripting/python/samba/tests/security.py +++ /dev/null @@ -1,143 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.dcerpc.security.""" - -import samba.tests -from samba.dcerpc import security - -class SecurityTokenTests(samba.tests.TestCase): - - def setUp(self): - super(SecurityTokenTests, self).setUp() - self.token = security.token() - - def test_is_system(self): - self.assertFalse(self.token.is_system()) - - def test_is_anonymous(self): - self.assertFalse(self.token.is_anonymous()) - - def test_has_builtin_administrators(self): - self.assertFalse(self.token.has_builtin_administrators()) - - def test_has_nt_authenticated_users(self): - self.assertFalse(self.token.has_nt_authenticated_users()) - - def test_has_priv(self): - self.assertFalse(self.token.has_privilege(security.SEC_PRIV_SHUTDOWN)) - - def test_set_priv(self): - self.assertFalse(self.token.has_privilege(security.SEC_PRIV_SHUTDOWN)) - self.assertFalse(self.token.set_privilege(security.SEC_PRIV_SHUTDOWN)) - self.assertTrue(self.token.has_privilege(security.SEC_PRIV_SHUTDOWN)) - - -class SecurityDescriptorTests(samba.tests.TestCase): - - def setUp(self): - super(SecurityDescriptorTests, self).setUp() - self.descriptor = security.descriptor() - - def test_from_sddl(self): - desc = security.descriptor.from_sddl("O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)", security.dom_sid("S-2-0-0")) - self.assertEquals(desc.group_sid, security.dom_sid('S-2-0-0-512')) - self.assertEquals(desc.owner_sid, security.dom_sid('S-1-5-32-548')) - self.assertEquals(desc.revision, 1) - self.assertEquals(desc.sacl, None) - self.assertEquals(desc.type, 0x8004) - - def test_from_sddl_invalidsddl(self): - self.assertRaises(TypeError,security.descriptor.from_sddl, "foo",security.dom_sid("S-2-0-0")) - - def test_from_sddl_invalidtype1(self): - self.assertRaises(TypeError, security.descriptor.from_sddl, security.dom_sid('S-2-0-0-512'),security.dom_sid("S-2-0-0")) - - def test_from_sddl_invalidtype2(self): - sddl = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" - self.assertRaises(TypeError, security.descriptor.from_sddl, sddl, - "S-2-0-0") - - def test_as_sddl(self): - text = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" - dom = security.dom_sid("S-2-0-0") - desc1 = security.descriptor.from_sddl(text, dom) - desc2 = security.descriptor.from_sddl(desc1.as_sddl(dom), dom) - self.assertEquals(desc1.group_sid, desc2.group_sid) - self.assertEquals(desc1.owner_sid, desc2.owner_sid) - self.assertEquals(desc1.sacl, desc2.sacl) - self.assertEquals(desc1.type, desc2.type) - - def test_as_sddl_invalid(self): - text = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" - dom = security.dom_sid("S-2-0-0") - desc1 = security.descriptor.from_sddl(text, dom) - self.assertRaises(TypeError, desc1.as_sddl,text) - - - def test_as_sddl_no_domainsid(self): - dom = security.dom_sid("S-2-0-0") - text = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" - desc1 = security.descriptor.from_sddl(text, dom) - desc2 = security.descriptor.from_sddl(desc1.as_sddl(), dom) - self.assertEquals(desc1.group_sid, desc2.group_sid) - self.assertEquals(desc1.owner_sid, desc2.owner_sid) - self.assertEquals(desc1.sacl, desc2.sacl) - self.assertEquals(desc1.type, desc2.type) - - def test_domsid_nodomsid_as_sddl(self): - dom = security.dom_sid("S-2-0-0") - text = "O:AOG:DAD:(A;;RPWPCCDCLCSWRCWDWOGA;;;S-1-0-0)" - desc1 = security.descriptor.from_sddl(text, dom) - self.assertNotEqual(desc1.as_sddl(), desc1.as_sddl(dom)) - - def test_split(self): - dom = security.dom_sid("S-2-0-7") - self.assertEquals((security.dom_sid("S-2-0"), 7), dom.split()) - - -class DomSidTests(samba.tests.TestCase): - - def test_parse_sid(self): - sid = security.dom_sid("S-1-5-21") - self.assertEquals("S-1-5-21", str(sid)) - - def test_sid_equal(self): - sid1 = security.dom_sid("S-1-5-21") - sid2 = security.dom_sid("S-1-5-21") - self.assertEquals(sid1, sid1) - self.assertEquals(sid1, sid2) - - def test_random(self): - sid = security.random_sid() - self.assertTrue(str(sid).startswith("S-1-5-21-")) - - def test_repr(self): - sid = security.random_sid() - self.assertTrue(repr(sid).startswith("dom_sid('S-1-5-21-")) - - -class PrivilegeTests(samba.tests.TestCase): - - def test_privilege_name(self): - self.assertEquals("SeShutdownPrivilege", - security.privilege_name(security.SEC_PRIV_SHUTDOWN)) - - def test_privilege_id(self): - self.assertEquals(security.SEC_PRIV_SHUTDOWN, - security.privilege_id("SeShutdownPrivilege")) - diff --git a/source4/scripting/python/samba/tests/source.py b/source4/scripting/python/samba/tests/source.py deleted file mode 100644 index 2612ae68cf..0000000000 --- a/source4/scripting/python/samba/tests/source.py +++ /dev/null @@ -1,264 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2011 -# -# Loosely based on bzrlib's test_source.py -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Source level Python tests.""" - -import errno -import os -import re -import warnings - -import samba -samba.ensure_external_module("pep8", "pep8") -import pep8 - -from samba.tests import ( - TestCase, - ) - - -def get_python_source_files(): - """Iterate over all Python source files.""" - library_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "samba")) - assert os.path.isdir(library_dir), library_dir - - for root, dirs, files in os.walk(library_dir): - for f in files: - if f.endswith(".py"): - yield os.path.abspath(os.path.join(root, f)) - - bindir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "bin")) - assert os.path.isdir(bindir), bindir - for f in os.listdir(bindir): - p = os.path.abspath(os.path.join(bindir, f)) - if not os.path.islink(p): - continue - target = os.readlink(p) - if os.path.dirname(target).endswith("scripting/bin"): - yield p - wafsambadir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "buildtools", "wafsamba")) - assert os.path.isdir(wafsambadir), wafsambadir - for root, dirs, files in os.walk(wafsambadir): - for f in files: - if f.endswith(".py"): - yield os.path.abspath(os.path.join(root, f)) - - -def get_source_file_contents(): - """Iterate over the contents of all python files.""" - for fname in get_python_source_files(): - try: - f = open(fname, 'rb') - except IOError, e: - if e.errno == errno.ENOENT: - warnings.warn("source file %s broken link?" % fname) - continue - else: - raise - try: - text = f.read() - finally: - f.close() - yield fname, text - - -class TestSource(TestCase): - - def test_copyright(self): - """Test that all Python files have a valid copyright statement.""" - incorrect = [] - - copyright_re = re.compile('#\\s*copyright.*(?=\n)', re.I) - - for fname, text in get_source_file_contents(): - if fname.endswith("ms_schema.py"): - # FIXME: Not sure who holds copyright on ms_schema.py - continue - if "wafsamba" in fname: - # FIXME: No copyright headers in wafsamba - continue - match = copyright_re.search(text) - if not match: - incorrect.append((fname, 'no copyright line found\n')) - - if incorrect: - help_text = ["Some files have missing or incorrect copyright" - " statements.", - "", - ] - for fname, comment in incorrect: - help_text.append(fname) - help_text.append((' ' * 4) + comment) - - self.fail('\n'.join(help_text)) - - def test_gpl(self): - """Test that all .py files have a GPL disclaimer.""" - incorrect = [] - - gpl_txt = """ -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -""" - gpl_re = re.compile(re.escape(gpl_txt), re.MULTILINE) - - for fname, text in get_source_file_contents(): - if "wafsamba" in fname: - # FIXME: License to wafsamba hasn't been clarified yet - continue - if not gpl_re.search(text): - incorrect.append(fname) - - if incorrect: - help_text = ['Some files have missing or incomplete GPL statement', - gpl_txt] - for fname in incorrect: - help_text.append((' ' * 4) + fname) - - self.fail('\n'.join(help_text)) - - def _push_file(self, dict_, fname, line_no): - if fname not in dict_: - dict_[fname] = [line_no] - else: - dict_[fname].append(line_no) - - def _format_message(self, dict_, message): - files = ["%s: %s" % (f, ', '.join([str(i + 1) for i in lines])) - for f, lines in dict_.items()] - files.sort() - return message + '\n\n %s' % ('\n '.join(files)) - - def _iter_source_files_lines(self): - for fname, text in get_source_file_contents(): - lines = text.splitlines(True) - last_line_no = len(lines) - 1 - for line_no, line in enumerate(lines): - yield fname, line_no, line - - def test_no_tabs(self): - """Check that there are no tabs in Python files.""" - tabs = {} - for fname, line_no, line in self._iter_source_files_lines(): - if '\t' in line: - self._push_file(tabs, fname, line_no) - if tabs: - self.fail(self._format_message(tabs, - 'Tab characters were found in the following source files.' - '\nThey should either be replaced by "\\t" or by spaces:')) - - def test_unix_newlines(self): - """Check for unix new lines.""" - illegal_newlines = {} - for fname, line_no, line in self._iter_source_files_lines(): - if not line.endswith('\n') or line.endswith('\r\n'): - self._push_file(illegal_newlines, fname, line_no) - if illegal_newlines: - self.fail(self._format_message(illegal_newlines, - 'Non-unix newlines were found in the following source files:')) - - def test_trailing_whitespace(self): - """Check that there is not trailing whitespace in Python files.""" - trailing_whitespace = {} - for fname, line_no, line in self._iter_source_files_lines(): - if line.rstrip("\n").endswith(" "): - self._push_file(trailing_whitespace, fname, line_no) - if trailing_whitespace: - self.fail(self._format_message(trailing_whitespace, - 'Trailing whitespace was found in the following source files.')) - - def test_shebang_lines(self): - """Check that files with shebang lines and only those are executable.""" - files_with_shebang = {} - files_without_shebang= {} - for fname, line_no, line in self._iter_source_files_lines(): - if line_no >= 1: - continue - executable = (os.stat(fname).st_mode & 0111) - has_shebang = line.startswith("#!") - if has_shebang and not executable: - self._push_file(files_with_shebang, fname, line_no) - if not has_shebang and executable: - self._push_file(files_without_shebang, fname, line_no) - if files_with_shebang: - self.fail(self._format_message(files_with_shebang, - 'Files with shebang line that are not executable:')) - if files_without_shebang: - self.fail(self._format_message(files_without_shebang, - 'Files without shebang line that are executable:')) - - pep8_ignore = [ - 'E401', # multiple imports on one line - 'E501', # line too long - 'E251', # no spaces around keyword / parameter equals - 'E201', # whitespace after '[' - 'E202', # whitespace before ')' - 'E302', # expected 2 blank lines, found 1 - 'E231', # missing whitespace after ',' - 'E225', # missing whitespace around operator - 'E111', # indentation is not a multiple of four - 'E261', # at least two spaces before inline comment - 'E702', # multiple statements on one line (semicolon) - 'E221', # multiple spaces before operator - 'E303', # too many blank lines (2) - 'E203', # whitespace before ':' - 'E222', # multiple spaces after operator - 'E301', # expected 1 blank line, found 0 - 'E211', # whitespace before '(' - 'E701', # multiple statements on one line (colon) - ] - - def test_pep8(self): - pep8.process_options() - pep8.options.repeat = True - pep8_errors = [] - pep8_warnings = [] - for fname, text in get_source_file_contents(): - def report_error(line_number, offset, text, check): - code = text[:4] - if code in self.pep8_ignore: - code = 'W' + code[1:] - text = code + text[4:] - print "%s:%s: %s" % (fname, line_number, text) - summary = (fname, line_number, offset, text, check) - if code[0] == 'W': - pep8_warnings.append(summary) - else: - pep8_errors.append(summary) - lines = text.splitlines(True) - checker = pep8.Checker(fname, lines) - checker.report_error = report_error - checker.check_all() - if len(pep8_errors) > 0: - d = {} - for (fname, line_no, offset, text, check) in pep8_errors: - d.setdefault(fname, []).append(line_no - 1) - self.fail(self._format_message(d, - 'There were %d PEP8 errors:' % len(pep8_errors))) - diff --git a/source4/scripting/python/samba/tests/strings.py b/source4/scripting/python/samba/tests/strings.py deleted file mode 100644 index 23382d756e..0000000000 --- a/source4/scripting/python/samba/tests/strings.py +++ /dev/null @@ -1,103 +0,0 @@ -# subunit test cases for Samba string functions. - -# Copyright (C) 2003 by Martin Pool <mbp@samba.org> -# Copyright (C) 2011 Andrew Bartlett -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -# XXX: All this code assumes that the Unix character set is UTF-8, -# which is the most common setting. I guess it would be better to -# force it to that value while running the tests. I'm not sure of the -# best way to do that yet. -# -# -- mbp - -from unicodenames import * - -import samba.tests -from samba import strcasecmp_m, strstr_m - -def signum(a): - if a < 0: - return -1 - elif a > 0: - return +1 - else: - return 0 - - -class strcasecmp_m_Tests(samba.tests.TestCase): - """String comparisons in simple ASCII and unicode""" - def test_strcasecmp_m(self): - # A, B, strcasecmp(A, B) - cases = [('hello', 'hello', 0), - ('hello', 'goodbye', +1), - ('goodbye', 'hello', -1), - ('hell', 'hello', -1), - ('', '', 0), - ('a', '', +1), - ('', 'a', -1), - ('a', 'A', 0), - ('aa', 'aA', 0), - ('Aa', 'aa', 0), - ('longstring ' * 100, 'longstring ' * 100, 0), - ('longstring ' * 100, 'longstring ' * 100 + 'a', -1), - ('longstring ' * 100 + 'a', 'longstring ' * 100, +1), - (KATAKANA_LETTER_A, KATAKANA_LETTER_A, 0), - (KATAKANA_LETTER_A, 'a', 1), - ] - for a, b, expect in cases: - self.assertEquals(signum(strcasecmp_m(a.encode('utf-8'), - b.encode('utf-8'))), - expect) - -class strstr_m_Tests(samba.tests.TestCase): - """strstr_m tests in simple ASCII and unicode strings""" - - def test_strstr_m(self): - # A, B, strstr_m(A, B) - cases = [('hello', 'hello', 'hello'), - ('hello', 'goodbye', None), - ('goodbye', 'hello', None), - ('hell', 'hello', None), - ('hello', 'hell', 'hello'), - ('', '', ''), - ('a', '', 'a'), - ('', 'a', None), - ('a', 'A', None), - ('aa', 'aA', None), - ('Aa', 'aa', None), - ('%v foo', '%v', '%v foo'), - ('foo %v foo', '%v', '%v foo'), - ('foo %v', '%v', '%v'), - ('longstring ' * 100, 'longstring ' * 99, 'longstring ' * 100), - ('longstring ' * 99, 'longstring ' * 100, None), - ('longstring a' * 99, 'longstring ' * 100 + 'a', None), - ('longstring ' * 100 + 'a', 'longstring ' * 100, 'longstring ' * 100 + 'a'), - (KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', None), - (KATAKANA_LETTER_A + 'bcde', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcde'), - ('d'+KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcd'), - ('d'+KATAKANA_LETTER_A + 'bd', KATAKANA_LETTER_A + 'bcd', None), - - ('e'+KATAKANA_LETTER_A + 'bcdf', KATAKANA_LETTER_A + 'bcd', KATAKANA_LETTER_A + 'bcdf'), - (KATAKANA_LETTER_A, KATAKANA_LETTER_A + 'bcd', None), - (KATAKANA_LETTER_A*3, 'a', None), - ] - for a, b, expect in cases: - if expect is not None: - expect = expect.encode('utf-8') - self.assertEquals(strstr_m(a.encode('utf-8'), - b.encode('utf-8')), - expect) diff --git a/source4/scripting/python/samba/tests/unicodenames.py b/source4/scripting/python/samba/tests/unicodenames.py deleted file mode 100644 index ed65de6651..0000000000 --- a/source4/scripting/python/samba/tests/unicodenames.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2003 by Martin Pool <mbp@samba.org> - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -""" -Defines symbolic names for a few UNICODE characters, to make test -source code more readable on machines that don't have all the -necessary fonts. - -You can do "import *" on this file safely. -""" - -LATIN_CAPITAL_LETTER_N_WITH_TILDE = u'\u004e' -LATIN_CAPITAL_LETTER_O_WITH_DIARESIS = u'\u00d6' -LATIN_SMALL_LETTER_O_WITH_DIARESIS = u'\u00f6' - -KATAKANA_LETTER_A = u'\u30a2' diff --git a/source4/scripting/python/samba/tests/upgrade.py b/source4/scripting/python/samba/tests/upgrade.py deleted file mode 100644 index b46a417319..0000000000 --- a/source4/scripting/python/samba/tests/upgrade.py +++ /dev/null @@ -1,40 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.upgrade.""" - -from samba.upgrade import import_wins -from samba.tests import LdbTestCase - - -class WinsUpgradeTests(LdbTestCase): - - def test_upgrade(self): - winsdb = { - "FOO#20": (200, ["127.0.0.1", "127.0.0.2"], 0x60) - } - import_wins(self.ldb, winsdb) - - self.assertEquals( - ['name=FOO,type=0x20'], - [str(m.dn) for m in - self.ldb.search(expression="(objectClass=winsRecord)")]) - - def test_version(self): - import_wins(self.ldb, {}) - self.assertEquals("VERSION", - str(self.ldb.search(expression="(objectClass=winsMaxVersion)")[0]["cn"])) diff --git a/source4/scripting/python/samba/tests/upgradeprovision.py b/source4/scripting/python/samba/tests/upgradeprovision.py deleted file mode 100644 index 93a6731c83..0000000000 --- a/source4/scripting/python/samba/tests/upgradeprovision.py +++ /dev/null @@ -1,135 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.upgradeprovision.""" - -import os -from samba.upgradehelpers import (usn_in_range, dn_sort, - get_diff_sddls, update_secrets, - construct_existor_expr) - -from samba.tests.provision import create_dummy_secretsdb -from samba.tests import TestCaseInTempDir -from samba import Ldb -from ldb import SCOPE_BASE -import samba.tests - -def dummymessage(a=None, b=None): - pass - - -class UpgradeProvisionTestCase(TestCaseInTempDir): - """Some simple tests for individual functions in the provisioning code. - """ - def test_usn_in_range(self): - range = [5, 25, 35, 55] - - vals = [3, 26, 56] - - for v in vals: - self.assertFalse(usn_in_range(v, range)) - - vals = [5, 20, 25, 35, 36] - - for v in vals: - self.assertTrue(usn_in_range(v, range)) - - def test_dn_sort(self): - # higher level comes after lower even if lexicographicaly closer - # ie dc=tata,dc=toto (2 levels), comes after dc=toto - # even if dc=toto is lexicographicaly after dc=tata, dc=toto - self.assertEquals(dn_sort("dc=tata,dc=toto", "dc=toto"), 1) - self.assertEquals(dn_sort("dc=zata", "dc=tata"), 1) - self.assertEquals(dn_sort("dc=toto,dc=tata", - "cn=foo,dc=toto,dc=tata"), -1) - self.assertEquals(dn_sort("cn=bar, dc=toto,dc=tata", - "cn=foo, dc=toto,dc=tata"), -1) - - def test_get_diff_sddl(self): - sddl = "O:SAG:DUD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)S:AI(AU;CIIDSA;WP;;;WD)" - sddl1 = "O:SAG:DUD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)S:AI(AU;CIIDSA;WP;;;WD)" - sddl2 = "O:BAG:DUD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)S:AI(AU;CIIDSA;WP;;;WD)" - sddl3 = "O:SAG:BAD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)S:AI(AU;CIIDSA;WP;;;WD)" - sddl4 = "O:SAG:DUD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;BA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)S:AI(AU;CIIDSA;WP;;;WD)" - sddl5 = "O:SAG:DUD:AI(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA)\ -(A;CIID;RP LCLORC;;;AU)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)" - - self.assertEquals(get_diff_sddls(sddl, sddl1), "") - txt = get_diff_sddls(sddl, sddl2) - self.assertEquals(txt, "\tOwner mismatch: SA (in ref) BA(in current)\n") - txt = get_diff_sddls(sddl, sddl3) - self.assertEquals(txt, "\tGroup mismatch: DU (in ref) BA(in current)\n") - txt = get_diff_sddls(sddl, sddl4) - txtmsg = "\tPart dacl is different between reference and current here\ - is the detail:\n\t\t(A;CIID;RPWPCRCCLCLORCWOWDSW;;;BA) ACE is not present in\ - the reference\n\t\t(A;CIID;RPWPCRCCLCLORCWOWDSW;;;SA) ACE is not present in\ - the current\n" - self.assertEquals(txt, txtmsg) - txt = get_diff_sddls(sddl, sddl5) - self.assertEquals(txt, "\tCurrent ACL hasn't a sacl part\n") - - def test_construct_existor_expr(self): - res = construct_existor_expr([]) - self.assertEquals(res, "") - - res = construct_existor_expr(["foo"]) - self.assertEquals(res, "(|(foo=*))") - - res = construct_existor_expr(["foo", "bar"]) - self.assertEquals(res, "(|(foo=*)(bar=*))") - - -class UpdateSecretsTests(samba.tests.TestCaseInTempDir): - - def setUp(self): - super(UpdateSecretsTests, self).setUp() - self.referencedb = create_dummy_secretsdb( - os.path.join(self.tempdir, "ref.ldb")) - - def _getEmptyDb(self): - return Ldb(os.path.join(self.tempdir, "secrets.ldb")) - - def _getCurrentFormatDb(self): - return create_dummy_secretsdb( - os.path.join(self.tempdir, "secrets.ldb")) - - def test_trivial(self): - # Test that updating an already up-to-date secretsdb works fine - self.secretsdb = self._getCurrentFormatDb() - self.assertEquals(None, - update_secrets(self.referencedb, self.secretsdb, dummymessage)) - - def test_update_modules(self): - empty_db = self._getEmptyDb() - update_secrets(self.referencedb, empty_db, dummymessage) - newmodules = empty_db.search(base="@MODULES", scope=SCOPE_BASE) - refmodules = self.referencedb.search(base="@MODULES", scope=SCOPE_BASE) - self.assertEquals(newmodules.msgs, refmodules.msgs) - - def tearDown(self): - for name in ["ref.ldb", "secrets.ldb", "secrets.tdb", "secrets.tdb.bak", "secrets.ntdb"]: - path = os.path.join(self.tempdir, name) - if os.path.exists(path): - os.unlink(path) - super(UpdateSecretsTests, self).tearDown() - - diff --git a/source4/scripting/python/samba/tests/upgradeprovisionneeddc.py b/source4/scripting/python/samba/tests/upgradeprovisionneeddc.py deleted file mode 100644 index a7cb298ed7..0000000000 --- a/source4/scripting/python/samba/tests/upgradeprovisionneeddc.py +++ /dev/null @@ -1,179 +0,0 @@ -# Unix SMB/CIFS implementation. -# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.upgradeprovision that need a DC.""" - -import os -import re -import shutil - -from samba import param -from samba.credentials import Credentials -from samba.auth import system_session -from samba.provision import getpolicypath,find_provision_key_parameters -from samba.upgradehelpers import (get_paths, get_ldbs, - identic_rename, - updateOEMInfo, getOEMInfo, update_gpo, - delta_update_basesamdb, - update_dns_account_password, - search_constructed_attrs_stored, - increment_calculated_keyversion_number) -from samba.tests import env_loadparm, TestCaseInTempDir -from samba.tests.provision import create_dummy_secretsdb -import ldb - - -def dummymessage(a=None, b=None): - pass - -smb_conf_path = "%s/%s/%s" % (os.environ["SELFTEST_PREFIX"], "dc", "etc/smb.conf") - -class UpgradeProvisionBasicLdbHelpersTestCase(TestCaseInTempDir): - """Some simple tests for individual functions in the provisioning code. - """ - - def test_get_ldbs(self): - paths = get_paths(param, None, smb_conf_path) - creds = Credentials() - lp = env_loadparm() - creds.guess(lp) - get_ldbs(paths, creds, system_session(), lp) - - def test_find_key_param(self): - paths = get_paths(param, None, smb_conf_path) - creds = Credentials() - lp = env_loadparm() - creds.guess(lp) - rootdn = "dc=samba,dc=example,dc=com" - ldbs = get_ldbs(paths, creds, system_session(), lp) - names = find_provision_key_parameters(ldbs.sam, ldbs.secrets, ldbs.idmap, - paths, smb_conf_path, lp) - self.assertEquals(names.realm, "SAMBA.EXAMPLE.COM") - self.assertEquals(str(names.rootdn).lower(), rootdn.lower()) - self.assertNotEquals(names.policyid_dc, None) - self.assertNotEquals(names.ntdsguid, "") - - -class UpgradeProvisionWithLdbTestCase(TestCaseInTempDir): - - def _getEmptyDbName(self): - return os.path.join(self.tempdir, "sam.ldb") - - def setUp(self): - super(UpgradeProvisionWithLdbTestCase, self).setUp() - paths = get_paths(param, None, smb_conf_path) - self.creds = Credentials() - self.lp = env_loadparm() - self.creds.guess(self.lp) - self.paths = paths - self.ldbs = get_ldbs(paths, self.creds, system_session(), self.lp) - self.names = find_provision_key_parameters(self.ldbs.sam, - self.ldbs.secrets, self.ldbs.idmap, paths, smb_conf_path, - self.lp) - self.referencedb = create_dummy_secretsdb( - os.path.join(self.tempdir, "ref.ldb")) - - def test_search_constructed_attrs_stored(self): - hashAtt = search_constructed_attrs_stored(self.ldbs.sam, - self.names.rootdn, - ["msds-KeyVersionNumber"]) - self.assertFalse(hashAtt.has_key("msds-KeyVersionNumber")) - - def test_increment_calculated_keyversion_number(self): - dn = "CN=Administrator,CN=Users,%s" % self.names.rootdn - # We conctruct a simple hash for the user administrator - hash = {} - # And we want the version to be 140 - hash[dn.lower()] = 140 - - increment_calculated_keyversion_number(self.ldbs.sam, - self.names.rootdn, - hash) - self.assertEqual(self.ldbs.sam.get_attribute_replmetadata_version(dn, - "unicodePwd"), - 140) - # This function should not decrement the version - hash[dn.lower()] = 130 - - increment_calculated_keyversion_number(self.ldbs.sam, - self.names.rootdn, - hash) - self.assertEqual(self.ldbs.sam.get_attribute_replmetadata_version(dn, - "unicodePwd"), - 140) - - def test_identic_rename(self): - rootdn = "DC=samba,DC=example,DC=com" - - guestDN = ldb.Dn(self.ldbs.sam, "CN=Guest,CN=Users,%s" % rootdn) - identic_rename(self.ldbs.sam, guestDN) - res = self.ldbs.sam.search(expression="(name=Guest)", base=rootdn, - scope=ldb.SCOPE_SUBTREE, attrs=["dn"]) - self.assertEquals(len(res), 1) - self.assertEquals(str(res[0]["dn"]), "CN=Guest,CN=Users,%s" % rootdn) - - def test_delta_update_basesamdb(self): - dummysampath = self._getEmptyDbName() - delta_update_basesamdb(self.paths.samdb, dummysampath, - self.creds, system_session(), self.lp, - dummymessage) - - def test_update_gpo_simple(self): - dir = getpolicypath(self.paths.sysvol, self.names.dnsdomain, - self.names.policyid) - shutil.rmtree(dir) - self.assertFalse(os.path.isdir(dir)) - update_gpo(self.paths, self.ldbs.sam, self.names, self.lp, dummymessage) - self.assertTrue(os.path.isdir(dir)) - - def test_update_gpo_acl(self): - path = os.path.join(self.tempdir, "testupdategpo") - save = self.paths.sysvol - self.paths.sysvol = path - os.mkdir(path) - os.mkdir(os.path.join(path, self.names.dnsdomain)) - os.mkdir(os.path.join(os.path.join(path, self.names.dnsdomain), - "Policies")) - update_gpo(self.paths, self.ldbs.sam, self.names, self.lp, dummymessage) - shutil.rmtree(path) - self.paths.sysvol = save - - def test_getOEMInfo(self): - realm = self.lp.get("realm") - basedn = "DC=%s" % realm.replace(".", ", DC=") - oem = getOEMInfo(self.ldbs.sam, basedn) - self.assertNotEquals(oem, "") - - def test_update_dns_account(self): - update_dns_account_password(self.ldbs.sam, self.ldbs.secrets, - self.names) - - def test_updateOEMInfo(self): - realm = self.lp.get("realm") - basedn = "DC=%s" % realm.replace(".", ", DC=") - oem = getOEMInfo(self.ldbs.sam, basedn) - updateOEMInfo(self.ldbs.sam, basedn) - oem2 = getOEMInfo(self.ldbs.sam, basedn) - self.assertNotEquals(str(oem), str(oem2)) - self.assertTrue(re.match(".*upgrade to.*", str(oem2))) - - def tearDown(self): - for name in ["ref.ldb", "secrets.ldb", "secrets.tdb", "secrets.tdb.bak", "secrets.ntdb", "sam.ldb"]: - path = os.path.join(self.tempdir, name) - if os.path.exists(path): - os.unlink(path) - super(UpgradeProvisionWithLdbTestCase, self).tearDown() diff --git a/source4/scripting/python/samba/tests/xattr.py b/source4/scripting/python/samba/tests/xattr.py deleted file mode 100644 index 89add28456..0000000000 --- a/source4/scripting/python/samba/tests/xattr.py +++ /dev/null @@ -1,126 +0,0 @@ -# Unix SMB/CIFS implementation. Tests for xattr manipulation -# Copyright (C) Matthieu Patou <mat@matws.net> 2009 -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -"""Tests for samba.xattr_native and samba.xattr_tdb.""" - -import samba.xattr_native, samba.xattr_tdb -from samba.xattr import copytree_with_xattrs -from samba.dcerpc import xattr -from samba.ndr import ndr_pack -from samba.tests import ( - TestCase, - TestCaseInTempDir, - TestSkipped, - ) -import random -import shutil -import os - -class XattrTests(TestCase): - - def _tmpfilename(self): - random.seed() - path = os.environ['SELFTEST_PREFIX'] - return os.path.join(path, "pytests"+str(int(100000*random.random()))) - - def _eadbpath(self): - return os.path.join(os.environ['SELFTEST_PREFIX'], "eadb.tdb") - - def test_set_xattr_native(self): - if not samba.xattr_native.is_xattr_supported(): - raise TestSkipped() - ntacl = xattr.NTACL() - ntacl.version = 1 - tempf = self._tmpfilename() - open(tempf, 'w').write("empty") - try: - samba.xattr_native.wrap_setxattr(tempf, "user.unittests", - ndr_pack(ntacl)) - except IOError: - raise TestSkipped("the filesystem where the tests are runned do not support XATTR") - os.unlink(tempf) - - def test_set_and_get_native(self): - if not samba.xattr_native.is_xattr_supported(): - raise TestSkipped() - tempf = self._tmpfilename() - reftxt = "this is a test" - open(tempf, 'w').write("empty") - try: - samba.xattr_native.wrap_setxattr(tempf, "user.unittests", reftxt) - text = samba.xattr_native.wrap_getxattr(tempf, "user.unittests") - self.assertEquals(text, reftxt) - except IOError: - raise TestSkipped("the filesystem where the tests are runned do not support XATTR") - os.unlink(tempf) - - def test_set_xattr_tdb(self): - tempf = self._tmpfilename() - eadb_path = self._eadbpath() - ntacl = xattr.NTACL() - ntacl.version = 1 - open(tempf, 'w').write("empty") - try: - samba.xattr_tdb.wrap_setxattr(eadb_path, - tempf, "user.unittests", ndr_pack(ntacl)) - finally: - os.unlink(tempf) - os.unlink(eadb_path) - - def test_set_tdb_not_open(self): - tempf = self._tmpfilename() - ntacl = xattr.NTACL() - ntacl.version = 1 - open(tempf, 'w').write("empty") - try: - self.assertRaises(IOError, samba.xattr_tdb.wrap_setxattr, - os.path.join("nonexistent", "eadb.tdb"), tempf, - "user.unittests", ndr_pack(ntacl)) - finally: - os.unlink(tempf) - - def test_set_and_get_tdb(self): - tempf = self._tmpfilename() - eadb_path = self._eadbpath() - reftxt = "this is a test" - open(tempf, 'w').write("empty") - try: - samba.xattr_tdb.wrap_setxattr(eadb_path, tempf, "user.unittests", - reftxt) - text = samba.xattr_tdb.wrap_getxattr(eadb_path, tempf, - "user.unittests") - self.assertEquals(text, reftxt) - finally: - os.unlink(tempf) - os.unlink(eadb_path) - - -class TestCopyTreeWithXattrs(TestCaseInTempDir): - - def test_simple(self): - os.chdir(self.tempdir) - os.mkdir("a") - os.mkdir("a/b") - os.mkdir("a/b/c") - f = open('a/b/c/d', 'w') - try: - f.write("foo") - finally: - f.close() - copytree_with_xattrs("a", "b") - shutil.rmtree("a") - shutil.rmtree("b") |