diff --git a/ipatests/test_integration/test_custom_plugins.py b/ipatests/test_integration/test_custom_plugins.py new file mode 100644 index 000000000..add3580e8 --- /dev/null +++ b/ipatests/test_integration/test_custom_plugins.py @@ -0,0 +1,88 @@ +# +# Copyright (C) 2021 FreeIPA Contributors see COPYING for license +# +"""Tests for custom plugins +""" +from __future__ import absolute_import + +import logging +import os +import site + +from ipatests.test_integration.base import IntegrationTest +from ipatests.pytest_ipa.integration import tasks + +logger = logging.getLogger(__name__) + + +class TestCustomPlugin(IntegrationTest): + """ + Tests for user-generated custom plugins + """ + @classmethod + def install(cls, mh): + tasks.install_master(cls.master, setup_dns=True) + + def test_add_user_objectclass_with_custom_schema(self): + """Test adding a custom userclass to new users + + Attributes should not be case-sensitive. + + Based heavily on the custom plugin and schema at + https://github.com/Brandeis-CS-Systems/idm-unet-id-plugin + """ + schema = ( + "dn: cn=schema\n" + "attributeTypes: ( 2.16.840.1.113730.3.8.24.1.1 NAME 'customID' " + "EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX " + "1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Testing' )\n" + "objectClasses: ( 2.16.840.1.113730.3.8.24.2.1 NAME 'customUser' " + "DESC 'custom user ID objectClass' AUXILIARY MAY ( customID ) " + "X-ORIGIN 'Testing' )\n" + ) + plugin = ( + "from ipalib.parameters import Str\n\n" + "from ipaserver.plugins.user import user\n\n" + "if 'customUser' not in user.possible_objectclasses:\n" + " user.possible_objectclasses.append('customUser')\n" + "customuser_attributes = ['customID']\n" + "user.default_attributes.extend(customuser_attributes)\n" + "takes_params = (\n" + " Str('customid?',\n" + " cli_name='customid',\n" + " maxlength=64,\n" + " label='User custom uid'),\n" + ")\n" + "user.takes_params += takes_params\n" + ) + + tasks.kinit_admin(self.master) + self.master.put_file_contents('/tmp/schema.ldif', schema) + self.master.run_command(['ipa-ldap-updater', '-S', '/tmp/schema.ldif']) + self.master.put_file_contents('/tmp/schema.ldif', schema) + + site_packages = site.getsitepackages()[-1] + site_file = os.path.join( + site_packages, "ipaserver", "plugins", "test.py" + ) + + self.master.put_file_contents(site_file, plugin) + + self.master.run_command(['ipactl', 'restart']) + + self.master.run_command([ + 'ipa', 'config-mod', + '--userobjectclasses', 'top', + '--userobjectclasses', 'person', + '--userobjectclasses', 'organizationalperson', + '--userobjectclasses', 'inetorgperson', + '--userobjectclasses', 'inetuser', + '--userobjectclasses', 'posixaccount', + '--userobjectclasses', 'krbprincipalaux', + '--userobjectclasses', 'krbticketpolicyaux', + '--userobjectclasses', 'ipaobject', + '--userobjectclasses', 'ipasshuser', + '--userobjectclasses', 'customuser', + ]) + + self.master.run_command(['rm', '-f', site_file])