summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorMartin Basti <mbasti@redhat.com>2014-04-11 14:45:43 +0200
committerMartin Kosek <mkosek@redhat.com>2014-06-03 15:55:32 +0200
commit7625c0284499a9248a35f96e504153e815837bae (patch)
treeba4305aca4a31843a77aca243e09cff9be8cc911 /ipalib
parent64d8da21c6515315d19c8bc76128d15474f4031e (diff)
downloadfreeipa-7625c0284499a9248a35f96e504153e815837bae.tar.gz
freeipa-7625c0284499a9248a35f96e504153e815837bae.tar.xz
freeipa-7625c0284499a9248a35f96e504153e815837bae.zip
dns_name_values capability added
Added capability to transfer DNSName type between server and client Part of ticket: IPA should allow internationalized domain names https://fedorahosted.org/freeipa/ticket/3169i Reviewed-By: Jan Cholasta <jcholast@redhat.com>
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/capabilities.py5
-rw-r--r--ipalib/rpc.py23
2 files changed, 24 insertions, 4 deletions
diff --git a/ipalib/capabilities.py b/ipalib/capabilities.py
index f2e45a0f6..7ddaea2e7 100644
--- a/ipalib/capabilities.py
+++ b/ipalib/capabilities.py
@@ -50,7 +50,10 @@ capabilities = dict(
primary_key_types=u'2.83',
# support for datetime values on the client
- datetime_values=u'2.84'
+ datetime_values=u'2.84',
+
+ # dns_name_values: dnsnames as objects
+ dns_name_values=u'2.88',
)
diff --git a/ipalib/rpc.py b/ipalib/rpc.py
index c44ffb6e1..f48a49481 100644
--- a/ipalib/rpc.py
+++ b/ipalib/rpc.py
@@ -60,6 +60,7 @@ from ipapython.ipa_log_manager import root_logger
from ipapython import ipautil
from ipapython import kernel_keyring
from ipapython.cookie import Cookie
+from ipapython.dnsutil import DNSName
from ipalib.text import _
from ipapython.nsslib import NSSHTTPS, NSSConnection
from ipalib.krb_utils import KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN, KRB5KRB_AP_ERR_TKT_EXPIRED, \
@@ -173,6 +174,12 @@ def xml_wrap(value, version):
else:
return value.strftime(LDAP_GENERALIZED_TIME_FORMAT)
+ if isinstance(value, DNSName):
+ if capabilities.client_has_capability(version, 'dns_name_values'):
+ return {'__dns_name__': unicode(value)}
+ else:
+ return unicode(value)
+
assert type(value) in (unicode, int, long, float, bool, NoneType)
return value
@@ -198,9 +205,12 @@ def xml_unwrap(value, encoding='UTF-8'):
if type(value) in (list, tuple):
return tuple(xml_unwrap(v, encoding) for v in value)
if type(value) is dict:
- return dict(
- (k, xml_unwrap(v, encoding)) for (k, v) in value.iteritems()
- )
+ if '__dns_name__' in value:
+ return DNSName(value['__dns_name__'])
+ else:
+ return dict(
+ (k, xml_unwrap(v, encoding)) for (k, v) in value.iteritems()
+ )
if type(value) is str:
return value.decode(encoding)
if isinstance(value, Binary):
@@ -284,6 +294,11 @@ def json_encode_binary(val, version):
return {'__datetime__': val.strftime(LDAP_GENERALIZED_TIME_FORMAT)}
else:
return val.strftime(LDAP_GENERALIZED_TIME_FORMAT)
+ elif isinstance(val, DNSName):
+ if capabilities.client_has_capability(version, 'dns_name_values'):
+ return {'__dns_name__': unicode(val)}
+ else:
+ return unicode(val)
else:
return val
@@ -314,6 +329,8 @@ def json_decode_binary(val):
elif '__datetime__' in val:
return datetime.datetime.strptime(val['__datetime__'],
LDAP_GENERALIZED_TIME_FORMAT)
+ elif '__dns_name__' in val:
+ return DNSName(val['__dns_name__'])
else:
return dict((k, json_decode_binary(v)) for k, v in val.items())
elif isinstance(val, list):