#!/usr/share/ucs-test/runner python
## desc: Test user creation denial on DC-Slave with Samba4.
## bugs: [34217]
## roles: [domaincontroller_slave]
## packages: [univention-samba4]
## tags: [apptest, ucsschool]
## exposure: careful

from sys import exit
from re import search, compile as regex_compile

from essential.test_samba4 import TestSamba4

import univention.testing.utils as utils
from univention.testing.strings import random_string


class TestS4SlaveUserCreationDenied(TestSamba4):

    def __init__(self):
        """
        Test class constructor.
        """
        super(TestS4SlaveUserCreationDenied, self).__init__()

        self.credentials = []  # for use with 'samba-tool'
        self.remove_user = ''  # in case user is created, will store username
        self.fail_pattern = regex_compile("univention_samaccountname_ldap_check:"
                                          ".* is disabled")

    def delete_samba4_user(self):
        """
        Tries to remove the user with username 'self.remove_user'
        using 'samba-tool'.
        """
        print("\nAttempting to remove a user with a username '%s' "
              "using 'samba-tool'" % self.remove_user)

        cmd = ["samba-tool", "user", "delete", self.remove_user]
        cmd.extend(self.credentials)

        stdout, stderr = self.create_and_run_process(cmd)
        if stderr:
            print("An error occured during '%s' user deletion: '%s'"
                  % (self.remove_user, stderr))
        if stdout:
            print("The 'samba-tool' has produced the following output: '%s'"
                  % stdout.rstrip())

    def create_samba4_user(self, creation_options):
        """
        Tries to create a user with a random username and a list of given
        'creation_options'. Fails the test if user creation succeeds or if
        the message printed to STDERR does not match the 'self.fail_pattern'.
        """
        username = 'ucs_test_school_user_' + random_string(8)
        print("\nAttempting to create a user with a username '%s' and "
              "options: %s" % (username, creation_options))

        cmd = ["samba-tool", "user", "add", username]
        cmd.extend(creation_options)
        cmd.extend(self.credentials)

        stdout, stderr = self.create_and_run_process(cmd)
        if stdout:
            print("The 'samba-tool' produced the following output to STDOUT:",
                  stdout)

            if bool(search(".*User .* created successfully.*", stdout)):
                self.remove_user = username
                utils.fail("The creation of user '%s' succeded, while should "
                           "be disabled on DC-Slave with Samba4" % username)

        if not stderr.strip():
            utils.fail("Expecting the user creation to fail, however, the "
                       "'samba-tool' did not produce any output to STDERR.")

        if not bool(self.fail_pattern.match(stderr)):
            utils.fail("The 'samba-tool' output produced to STDERR does not "
                       "match the '%s' pattern. STDERR: '%s'"
                       % (self.fail_pattern.pattern, stderr))

    def main(self):
        """
        Test that user objects creation is blocked on S4 Slave.
        """
        try:
            self.get_ucr_test_credentials()
            self.credentials = ["--username=" + self.admin_username,
                                "--password=" + self.admin_password]

            self.create_samba4_user(['Foo1' + random_string()])  # gen-d pass
            self.create_samba4_user(["--random-password"])  # tool's random
        finally:
            if self.remove_user:
                self.delete_samba4_user()


if __name__ == '__main__':
    TestUserCreationDenied = TestS4SlaveUserCreationDenied()
    exit(TestUserCreationDenied.main())
