diff options
-rw-r--r-- | ipalib/frontend.py | 10 | ||||
-rw-r--r-- | ipalib/parameters.py | 29 | ||||
-rw-r--r-- | ipaserver/plugins/ldap2.py | 17 |
3 files changed, 56 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 61e7f493..851de437 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -428,6 +428,8 @@ class Command(HasParam): if not self.api.env.in_server and 'version' not in params: params['version'] = API_VERSION self.validate(**params) + if self.api.env.in_server: + params = self.encode(**params) (args, options) = self.params_2_args_options(**params) ret = self.run(*args, **options) if ( @@ -648,6 +650,14 @@ class Command(HasParam): (k, self.params[k].convert(v)) for (k, v) in kw.iteritems() ) + def encode(self, **kw): + """ + Return a dictionary of encoded values. + """ + return dict( + (k, self.params[k].encode(v)) for (k, v) in kw.iteritems() + ) + def __convert_iter(self, kw): for param in self.params(): if kw.get(param.name, None) is None: diff --git a/ipalib/parameters.py b/ipalib/parameters.py index f9e171b0..1f3fdfde 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -307,6 +307,7 @@ class Param(ReadOnly): ('multivalue', bool, False), ('primary_key', bool, False), ('normalizer', callable, None), + ('encoder', callable, None), ('default_from', DefaultFrom, None), ('create_default', callable, None), ('autofill', bool, False), @@ -768,6 +769,34 @@ class Param(ReadOnly): rule=rule, ) + def encode(self, value): + """ + Encode Python native type value to chosen backend format. Encoding is + applied for parameters representing actual attributes (attribute=True). + + The default encode method `Param._encode` can be overriden in a `Param` + instance with `encoder` attribute: + + >>> s = Str('my_str', encoder=lambda x:encode(x)) + + Note that the default method of encoding values is defined in + `Param._encode()`. + + :param value: Encoded value + """ + if not self.attribute: #pylint: disable=E1101 + return value + if self.encoder is not None: #pylint: disable=E1101 + return self.encoder(value) #pylint: disable=E1101 + + return self._encode(value) + + def _encode(self, value): + """ + Encode a value to backend format. + """ + return value + def get_default(self, **kw): """ Return the static default or construct and return a dynamic default. diff --git a/ipaserver/plugins/ldap2.py b/ipaserver/plugins/ldap2.py index 5c401829..32a1eccb 100644 --- a/ipaserver/plugins/ldap2.py +++ b/ipaserver/plugins/ldap2.py @@ -45,6 +45,7 @@ from ldap.controls import LDAPControl from ldap.functions import explode_dn from ipalib.dn import DN from ipalib import _ +from ipalib.parameters import Bool import krbV @@ -62,6 +63,22 @@ MEMBERS_INDIRECT = 2 # SASL authentication mechanism SASL_AUTH = _ldap_sasl.sasl({}, 'GSSAPI') +# OID 1.3.6.1.4.1.1466.115.121.1.7 (Boolean) syntax encoding +def _encode_bool(self, value): + def encode_bool_value(value): + if value: + return u'TRUE' + else: + return u'FALSE' + + if type(value) in (tuple, list): + return tuple(encode_bool_value(v) for v in value) + else: + return encode_bool_value(value) + +# set own Bool parameter encoder +Bool._encode = _encode_bool + # universal LDAPError handler def _handle_errors(e, **kw): """ |