URL: https://github.com/freeipa/freeipa/pull/5935
Author: rcritten
 Title: #5935: Don't assume that plugin attributes and objectclasses are 
lowercase
Action: opened

PR body:
"""
Don't assume that plugin attributes and objectclasses are lowercase

A user wrote their own plugin to add custom attributes which was
failing with an incorrect error that the attribute wasn't allowed.

It wasn't allowed because it wasn't being treated as case-insensitive
so wasn't being found in the schema.

https://pagure.io/freeipa/issue/8415

Signed-off-by: Rob Crittenden <rcrit...@redhat.com>

**NOTE**: the new test file is not yet integrated into PR-CI. I think this is 
fine testing as part of the nightlies and not as gating but I'm open to 
suggestions.

"""

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/5935/head:pr5935
git checkout pr5935
From cc77ce5741ff8ef048c3bd8e3677e5808c78cd75 Mon Sep 17 00:00:00 2001
From: Rob Crittenden <rcrit...@redhat.com>
Date: Thu, 29 Jul 2021 17:55:52 -0400
Subject: [PATCH 1/3] Don't assume that plugin attributes and objectclasses are
 lowercase

A user wrote their own plugin to add custom attributes which was
failing with an incorrect error that the attribute wasn't allowed.

It wasn't allowed because it wasn't being treated as case-insensitive
so wasn't being found in the schema.

https://pagure.io/freeipa/issue/8415

Signed-off-by: Rob Crittenden <rcrit...@redhat.com>
---
 ipaserver/plugins/config.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/ipaserver/plugins/config.py b/ipaserver/plugins/config.py
index 3526153ec11..ad3dd6a7fdd 100644
--- a/ipaserver/plugins/config.py
+++ b/ipaserver/plugins/config.py
@@ -534,14 +534,14 @@ def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
                     checked_attrs = checked_attrs + [self.api.Object[obj].uuid_attribute]
                 for obj_attr in checked_attrs:
                     obj_attr, _unused1, _unused2 = obj_attr.partition(';')
-                    if obj_attr in OPERATIONAL_ATTRIBUTES:
+                    if obj_attr.lower() in OPERATIONAL_ATTRIBUTES:
                         continue
-                    if obj_attr in self.api.Object[obj].params and \
+                    if obj_attr.lower() in self.api.Object[obj].params and \
                       'virtual_attribute' in \
-                      self.api.Object[obj].params[obj_attr].flags:
+                      self.api.Object[obj].params[obj_attr.lower()].flags:
                         # skip virtual attributes
                         continue
-                    if obj_attr not in new_allowed_attrs:
+                    if obj_attr.lower() not in new_allowed_attrs:
                         raise errors.ValidationError(name=attr,
                                 error=_('%(obj)s default attribute %(attr)s would not be allowed!') \
                                 % dict(obj=obj, attr=obj_attr))

From 242bb877d92a3ba7044dd19c82339fdd8305ad89 Mon Sep 17 00:00:00 2001
From: Rob Crittenden <rcrit...@redhat.com>
Date: Thu, 29 Jul 2021 17:56:32 -0400
Subject: [PATCH 2/3] ipatests: add suite for testing custom plugins

Ensure that attributes and objectclasses are case-insensitive.

https://pagure.io/freeipa/issue/8415

Signed-off-by: Rob Crittenden <rcrit...@redhat.com>
---
 .../test_integration/test_custom_plugins.py   | 85 +++++++++++++++++++
 1 file changed, 85 insertions(+)
 create mode 100644 ipatests/test_integration/test_custom_plugins.py

diff --git a/ipatests/test_integration/test_custom_plugins.py b/ipatests/test_integration/test_custom_plugins.py
new file mode 100644
index 00000000000..6643d713d11
--- /dev/null
+++ b/ipatests/test_integration/test_custom_plugins.py
@@ -0,0 +1,85 @@
+#
+# 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
+    """
+
+    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])

From af9586a3d522b830211d0c08438929d43162ab88 Mon Sep 17 00:00:00 2001
From: Rob Crittenden <rcrit...@redhat.com>
Date: Fri, 30 Jul 2021 11:36:21 -0400
Subject: [PATCH 3/3] Temp commit

Note that the new test file is not yet integrated into any PR-CI
runs.
---
 .freeipa-pr-ci.yaml                        | 2 +-
 ipatests/prci_definitions/temp_commit.yaml | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.freeipa-pr-ci.yaml b/.freeipa-pr-ci.yaml
index abcf8c5b634..80656690080 120000
--- a/.freeipa-pr-ci.yaml
+++ b/.freeipa-pr-ci.yaml
@@ -1 +1 @@
-ipatests/prci_definitions/gating.yaml
\ No newline at end of file
+ipatests/prci_definitions/temp_commit.yaml
\ No newline at end of file
diff --git a/ipatests/prci_definitions/temp_commit.yaml b/ipatests/prci_definitions/temp_commit.yaml
index 4b0398b9218..fee03889d5d 100644
--- a/ipatests/prci_definitions/temp_commit.yaml
+++ b/ipatests/prci_definitions/temp_commit.yaml
@@ -68,7 +68,7 @@ jobs:
       class: RunPytest
       args:
         build_url: '{fedora-latest/build_url}'
-        test_suite: test_integration/test_REPLACEME.py
+        test_suite: test_integration/test_custom_plugins.py
         template: *ci-master-latest
         timeout: 3600
-        topology: *master_1repl_1client
+        topology: *master_1repl
_______________________________________________
FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org
To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/freeipa-devel@lists.fedorahosted.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to