#!/usr/share/ucs-test/runner python
## desc: Create UDM syntax extension object and test it via CLI
## tags: [udm-ldapextensions,apptest]
## roles: [domaincontroller_master,domaincontroller_backup,domaincontroller_slave,memberserver]
## exposure: dangerous
## packages:
##   - univention-directory-manager-tools

from univention.config_registry import ConfigRegistry
import univention.testing.udm as udm_test
from univention.testing.utils import verify_ldap_object, wait_for_replication_and_postrun, fail
from univention.testing.strings import random_name, random_version, random_ucs_version
from univention.testing.udm_extensions import *
import bz2
import base64

if __name__ == '__main__':
	ucr = ConfigRegistry()
	ucr.load()

	with udm_test.UCSTestUDM() as udm:
		extension_type = 'syntax'
		extension_name = get_extension_name(extension_type)
		extension_filename = get_extension_filename(extension_type, extension_name)
		extension_buffer = get_extension_buffer(extension_type, extension_name)
		object_name = random_name()

		package_name = get_package_name()
		package_version = get_package_version()
		app_id = '%s-%s' % (random_name(), random_version())
		version_start = random_ucs_version(max_major=2)
		version_end = random_ucs_version(min_major=5)

		extension_dn = udm.create_object('settings/udm_%s' % extension_type,
							   name = extension_name,
							   data = base64.b64encode(bz2.compress(extension_buffer)),
							   filename = extension_filename,
							   packageversion = package_version,
							   appidentifier = app_id,
							   package = package_name,
							   ucsversionstart = version_start,
							   ucsversionend = version_end,
							   active = 'FALSE',
							   position = 'cn=udm_%s,cn=univention,%s' % (extension_type, ucr['ldap/base']))

		extattr_dn = udm.create_object('settings/extended_attribute',
									   position='cn=custom attributes,cn=univention,%s' % ucr.get('ldap/base'),
									   objectClass='univentionFreeAttributes',
									   groupPosition='1',
									   module='users/user',
									   overwriteTab='0',
									   shortDescription='UCS Test Extended Attribute',
									   groupName='UCS TEST: test_udm_syntax',
									   valueRequired='0',
									   CLIName='ucstest%s' % extension_name.upper(),
									   longDescription='UCS Test Extended Attribute',
									   doNotSearch='0',
									   tabName='UCS TEST',
									   syntax=extension_name,
									   tabAdvanced='0',
									   name='UCStest-syntax-extension-%s' % extension_name,
									   mayChange='1',
									   multivalue='0',
									   ldapMapping='univentionFreeAttribute20',
									   notEditable='0',
									   tabPosition='1')

		wait_for_replication_and_postrun()
		udm.stop_cli_server()

		verify_ldap_object(extension_dn, {
				'cn': [extension_name],
				'univentionUDM%sFilename' % extension_type.capitalize(): [extension_filename],
				'univentionOwnedByPackage': [package_name],
				'univentionObjectType': ['settings/udm_%s' % extension_type],
				'univentionOwnedByPackageVersion': [package_version],
				'univentionUDM%sData' % extension_type.capitalize(): [bz2.compress(extension_buffer)],
				'univentionUDM%sActive' % extension_type.capitalize(): ['TRUE'],

				})

		# create user and set extended attribute with valid value
		value = 'ucstest-%s' % random_name()
		userargs = { 'ucstest%s' % extension_name.upper(): value }
		user_dn, username = udm.create_user(**userargs)

		# modify user and set extended attribute with invalid value (according to assigned syntax)
		userargs = { 'ucstest%s' % extension_name.upper(): random_name() }
		try:
			udm.modify_object('users/user', dn=user_dn, **userargs)
			fail('Syntax is not in use')
		except udm_test.UCSTestUDM_ModifyUDMObjectFailed, ex:
			if not 'Wrong value given for ucs-test-syntax' in str(ex):
				raise

	wait_for_replication_and_postrun()
	udm.stop_cli_server()

	with udm_test.UCSTestUDM() as udm:
		# test if user/user module is still ok after removing UDM module extension
		udm.create_user()
