summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/frontend.py10
-rw-r--r--ipalib/parameters.py29
-rw-r--r--ipaserver/plugins/ldap2.py17
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):
"""