#!/usr/share/ucs-test/runner python
## desc: Create Py3-only 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
from univention.testing.udm_extensions import (
	get_extension_name,
	get_extension_filename,
	get_extension_buffer,
	get_package_name,
	get_package_version
)
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 = '5.0-0'
		version_end = ''

		udm.create_object(
			'container/cn',
			name='udm_%s' % (extension_type,),
			position='cn=univention,%s' % (ucr['ldap/base'],),
			ignore_exists=True
		)

		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 as ex:
			if 'Wrong value given for ucs-test-syntax' not 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()
