#!/usr/share/ucs-test/runner python
# -*- coding: utf-8 -*.
## desc: Test setting of user photo via UMC
## bugs: [36273]
## roles:
##  - domaincontroller_master
## exposure: dangerous

import sys
import subprocess
from tempfile import NamedTemporaryFile

import univention.testing.utils as utils
from univention.testing.udm import UCSTestUDM
from univention.testing.strings import random_username

sys.path.insert(0, '.')
from umc import UMCBase  # noqa: E402


class TestUMCUserAuthentication(UMCBase):

	def __init__(self):
		"""Test Class constructor"""
		super(TestUMCUserAuthentication, self).__init__()

		self.UDM = None

		self.test_user_dn = ''
		self.test_username = ''
		self.test_password = ''

	def create_user(self):
		self.test_user_dn = self.UDM.create_user(
			password=self.test_password,
			username=self.test_username,
			policy_reference='cn=default-umc-all,cn=UMC,cn=policies,%s' % self.ucr['ldap/base']
		)[0]
		utils.verify_ldap_object(self.test_user_dn)

	def set_image_jpeg(self):
		with open('./34_userphoto.jpeg') as fd:
			image = fd.read()
		assert image == self.set_image(image).decode('base64'), "Failed to set JPEG user photo"

	def set_image_jpg(self):
		with open('./34_userphoto.jpg') as fd:
			image = fd.read()
		assert image == self.set_image(image).decode('base64'), "Failed to set JPG user photo"

	def set_image_png(self):
		with open('./34_userphoto.png') as fd:
			image = fd.read()
		image = self.set_image(image).decode('base64')
		with NamedTemporaryFile() as tempfile:
			tempfile.write(image)
			tempfile.flush()
			p = subprocess.Popen(['/usr/bin/file', '-i', tempfile.name], stdout=subprocess.PIPE)
			stdout, stderr = p.communicate()
			assert 'image/jpeg' in stdout, "Failed to set PNG user photo (not converted to JPEG): %r" % (stdout,)

	def unset_image(self):
		assert not self.set_image(""), "Failed to unset user photo"

	def set_image(self, jpegPhoto):
		if jpegPhoto:
			jpegPhoto = jpegPhoto.encode('base64').rstrip()  # TODO: make umcp/upload request
		self.modify_object([{"object": {"jpegPhoto": jpegPhoto, "$dn$": self.test_user_dn}}], 'users/user')
		response = self.get_object([self.test_user_dn], 'users/user')
		return response[0].get('jpegPhoto')

	def main(self):
		"""
		Tests the UMC user authentication and various password change cases.
		"""
		self.test_username = 'umc_test_user_' + random_username(6)
		self.test_password = 'univention'

		with UCSTestUDM() as self.UDM:
			self.create_user()
			self.create_connection_authenticate()

			self.set_image_jpeg()
			self.set_image_jpg()
			self.set_image_png()
			self.unset_image()


if __name__ == '__main__':
	TestUMC = TestUMCUserAuthentication()
	sys.exit(TestUMC.main())
