diff --git a/NextCloud.py b/NextCloud.py index a274f0a..2e89952 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,62 @@ 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", + ] + @nextcloud_method def create_ldap_config(self): """ Create a new and empty LDAP configuration """ @@ -857,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}) +