From 62363462aade9370cfea56733a5be0d8e7446854 Mon Sep 17 00:00:00 2001 From: Danil Date: Sun, 27 Jan 2019 18:29:28 +0200 Subject: [PATCH 1/2] User LDAP add setter/getter methods for each config key --- NextCloud.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/NextCloud.py b/NextCloud.py index a274f0a..f4908cf 100644 --- a/NextCloud.py +++ b/NextCloud.py @@ -1,5 +1,7 @@ import enum import requests +import re +import types PUBLIC_API_NAME_CLASS_MAP = dict() @@ -805,6 +807,97 @@ def delete_all_notifications(self): class UserLDAP(WithRequester): API_URL = "/ocs/v2.php/apps/user_ldap/api/v1/config" + # (name_stem, argname, docstring) + CONFIG_KEYS = [ + "ldapHost", + "ldapPort", + "ldapBackupHost", + "ldapBackupPort", + "ldapBase", + "ldapBaseUsers", + "ldapBaseGroups", + "ldapAgentName", + "ldapAgentPassword", + "ldapTLS", + "turnOffCertCheck", + "ldapUserDisplayName", + "ldapGidNumber", + "ldapUserFilterObjectclass", + "ldapUserFilterGroups", + "ldapUserFilter", + "ldapUserFilterMode", + "ldapGroupFilter", + "ldapGroupFilterMode", + "ldapGroupFilterObjectclass", + "ldapGroupFilterGroups", + "ldapGroupMemberAssocAttr", + "ldapGroupDisplayName", + "ldapLoginFilter", + "ldapLoginFilterMode", + "ldapLoginFilterEmail", + "ldapLoginFilterUsername", + "ldapLoginFilterAttributes", + "ldapQuotaAttribute", + "ldapQuotaDefault", + "ldapEmailAttribute", + "ldapCacheTTL", + "ldapUuidUserAttribute", + "ldapUuidGroupAttribute", + "ldapOverrideMainServer", + "ldapConfigurationActive", + "ldapAttributesForUserSearch", + "ldapAttributesForGroupSearch", + "ldapExperiencedAdmin", + "homeFolderNamingRule", + "hasPagedResultSupport", + "hasMemberOfFilterSupport", + "useMemberOfToDetectMembership", + "ldapExpertUsernameAttr", + "ldapExpertUUIDUserAttr", + "ldapExpertUUIDGroupAttr", + "lastJpegPhotoLookup", + "ldapNestedGroups", + "ldapPagingSize", + "turnOnPasswordChange", + "ldapDynamicGroupMemberURL", + "ldapDefaultPPolicyDN", + ] + + def __init__(self, *args, **kwargs): + super(UserLDAP, self).__init__(*args, **kwargs) + for key in self.CONFIG_KEYS: + key_name = re.sub('ldap', '', key) + key_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', key_name).lower() + + # create and add getter method + getter_name = "get_ldap_{}".format(key_name) + exec( + """def {}(self, config_id): + res = self.get_ldap_config(config_id) + data = res['ocs']['data'] + return data["{}"] + """.format(getter_name, key) + ) + getter_function = locals()[getter_name] + + getter_method = types.MethodType(getter_function, self) + PUBLIC_API_NAME_CLASS_MAP[getter_name] = self.__class__.__name__ + setattr(self, getter_name, getter_method) + + # create and add setter method + setter_name = "set_ldap_{}".format(key_name) + exec( + """def {0}(self, config_id, value): + res = self.edit_ldap_config(config_id, data={{"{1}": value}}) + return res + """.format(setter_name, key) + ) + setter_function = locals()[setter_name] + + setter_method = types.MethodType(setter_function, self) + PUBLIC_API_NAME_CLASS_MAP[setter_name] = self.__class__.__name__ + setattr(self, setter_name, setter_method) + @nextcloud_method def create_ldap_config(self): """ Create a new and empty LDAP configuration """ From 7ef44e8f05eb8929ff7ca4747d2aa57dc643bc45 Mon Sep 17 00:00:00 2001 From: Danil Date: Wed, 30 Jan 2019 01:03:23 +0200 Subject: [PATCH 2/2] UserLDAP config keys setters/getters attaching to class; tests; --- NextCloud.py | 67 ++++++++++++++++++++++------------------------ tests/test_ldap.py | 32 ++++++++++++++++++++++ 2 files changed, 64 insertions(+), 35 deletions(-) diff --git a/NextCloud.py b/NextCloud.py index f4908cf..2e89952 100644 --- a/NextCloud.py +++ b/NextCloud.py @@ -863,41 +863,6 @@ class UserLDAP(WithRequester): "ldapDefaultPPolicyDN", ] - def __init__(self, *args, **kwargs): - super(UserLDAP, self).__init__(*args, **kwargs) - for key in self.CONFIG_KEYS: - key_name = re.sub('ldap', '', key) - key_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', key_name).lower() - - # create and add getter method - getter_name = "get_ldap_{}".format(key_name) - exec( - """def {}(self, config_id): - res = self.get_ldap_config(config_id) - data = res['ocs']['data'] - return data["{}"] - """.format(getter_name, key) - ) - getter_function = locals()[getter_name] - - getter_method = types.MethodType(getter_function, self) - PUBLIC_API_NAME_CLASS_MAP[getter_name] = self.__class__.__name__ - setattr(self, getter_name, getter_method) - - # create and add setter method - setter_name = "set_ldap_{}".format(key_name) - exec( - """def {0}(self, config_id, value): - res = self.edit_ldap_config(config_id, data={{"{1}": value}}) - return res - """.format(setter_name, key) - ) - setter_function = locals()[setter_name] - - setter_method = types.MethodType(setter_function, self) - PUBLIC_API_NAME_CLASS_MAP[setter_name] = self.__class__.__name__ - setattr(self, setter_name, setter_method) - @nextcloud_method def create_ldap_config(self): """ Create a new and empty LDAP configuration """ @@ -950,6 +915,38 @@ def delete_ldap_config(self, config_id): return self.requester.delete(config_id) +for ldap_key in UserLDAP.CONFIG_KEYS: + key_name = re.sub('ldap', '', ldap_key) + key_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', key_name).lower() + + # create and add getter method + getter_name = "get_ldap_{}".format(key_name) + + def getter_method(param): + def getter(self, config_id): + res = self.get_ldap_config(config_id) + data = res['ocs']['data'] + return data[param] + getter.__name__ = getter_name + return getter + + setattr(UserLDAP, getter_name, getter_method(ldap_key)) + PUBLIC_API_NAME_CLASS_MAP[getter_name] = UserLDAP.__name__ + + # create and add setter method + setter_name = "set_ldap_{}".format(key_name) + + def setter_method(param): + def setter(self, config_id, value): + res = self.edit_ldap_config(config_id, data={param: value}) + return res + setter.__name__ = setter_name + return setter + + setattr(UserLDAP, setter_name, setter_method(ldap_key)) + PUBLIC_API_NAME_CLASS_MAP[setter_name] = UserLDAP.__name__ + + class OCSCode(enum.IntEnum): OK = 100 SERVER_ERROR = 996 diff --git a/tests/test_ldap.py b/tests/test_ldap.py index e97f7de..32bab44 100644 --- a/tests/test_ldap.py +++ b/tests/test_ldap.py @@ -1,5 +1,10 @@ +import re +from unittest.mock import patch + from .base import BaseTestCase +from NextCloud import UserLDAP + class TestUserLDAP(BaseTestCase): @@ -44,4 +49,31 @@ def test_crud_ldap_config(self): res = self.nxc.get_ldap_config(config_id) assert res['ocs']['meta']['statuscode'] == self.NOT_FOUND_CODE + def test_ldap_setters_getters(self): + res = self.nxc.create_ldap_config() + assert res['ocs']['meta']['statuscode'] == self.SUCCESS_CODE + config_id = res['ocs']['data']['configID'] + + for ldap_key in UserLDAP.CONFIG_KEYS: + key_name = re.sub('ldap', '', ldap_key) + key_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', key_name).lower() + + getter_name = "get_ldap_{}".format(key_name) + setter_name = "set_ldap_{}".format(key_name) + # test if method exist + assert hasattr(self.nxc, setter_name) + assert hasattr(self.nxc, getter_name) + + # test getter + getter_value = getattr(self.nxc, getter_name)(config_id) + config_value = self.nxc.get_ldap_config(config_id)['ocs']['data'][ldap_key] + assert getter_value == config_value + + # test setter + value = 1 + with patch.object(UserLDAP, 'edit_ldap_config', return_value=1) as mock_method: + setter_method = getattr(self.nxc, setter_name) + setter_method(config_id, value) + mock_method.assert_called_with(config_id, data={ldap_key: value}) +