diff options
author | Rob Crittenden <rcritten@redhat.com> | 2011-02-10 13:29:52 -0500 |
---|---|---|
committer | Endi S. Dewata <edewata@redhat.com> | 2011-02-11 13:36:15 -0500 |
commit | 3ac3130fc9daf853368947b268d9af4b8a67d247 (patch) | |
tree | 404d1bdf4814e6e9b58394049d1c377c7a75f7af | |
parent | b069af3bc9fe5ad91c01a0d7b4f7c9d833291e23 (diff) | |
download | freeipa-3ac3130fc9daf853368947b268d9af4b8a67d247.tar.gz freeipa-3ac3130fc9daf853368947b268d9af4b8a67d247.tar.xz freeipa-3ac3130fc9daf853368947b268d9af4b8a67d247.zip |
Convert json strings to unicode when they are unmarshalled.
This patch removes some individual work-arounds of converting strings
to unicode, they only masked the problem. String values are not
passed to the validator or normalizers so things like adding the
realm automatically to services weren't happening.
ticket 941
-rw-r--r-- | ipalib/parameters.py | 28 | ||||
-rw-r--r-- | ipaserver/rpcserver.py | 13 | ||||
-rw-r--r-- | tests/test_ipalib/test_parameters.py | 2 | ||||
-rw-r--r-- | tests/test_xmlrpc/test_user_plugin.py | 4 |
4 files changed, 15 insertions, 32 deletions
diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 22b032127..164374e00 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -1021,7 +1021,7 @@ class Int(Number): """ if type(value) in (int, long): return value - if type(value) in (str, unicode): + if type(value) is unicode: # permit floating point strings if value.find(u'.') >= 0: try: @@ -1254,14 +1254,6 @@ class Str(Data): """ if type(value) is self.type: return value - if type(value) is str: - try: - return value.decode('utf-8') - except UnicodeDecodeError: - raise ConversionError( - name=self.name, index=index, - error=ugettext(self.scalar_error) - ) if type(value) in (int, float): return self.type(value) if type(value) in (tuple, list): @@ -1385,24 +1377,6 @@ class StrEnum(Enum): type = unicode - def _convert_scalar(self, value, index=None): - """ - Convert a single scalar value. - """ - if type(value) is self.type: - return value - if type(value) is str: - try: - return value.decode('utf-8') - except UnicodeDecodeError: - raise ConversionError( - name=self.name, index=index, - error=ugettext(self.scalar_error) - ) - raise ConversionError(name=self.name, index=index, - error=ugettext(self.type_error), - ) - class List(Param): """ diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index fb86a21e9..ff2b04b5b 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -27,7 +27,7 @@ from cgi import parse_qs from xml.sax.saxutils import escape from xmlrpclib import Fault from ipalib.backend import Executioner -from ipalib.errors import PublicError, InternalError, CommandError, JSONError +from ipalib.errors import PublicError, InternalError, CommandError, JSONError, ConversionError from ipalib.request import context, Connection, destroy_context from ipalib.rpc import xml_dumps, xml_loads from ipalib.util import make_repr @@ -402,7 +402,16 @@ def json_decode_binary(val): del val return new_list else: - return val + if isinstance(val, basestring): + try: + return val.decode('utf-8') + except UnicodeDecodeError: + raise ConversionError( + name=val, + error='incorrect type' + ) + else: + return val class jsonserver(WSGIExecutioner): """ diff --git a/tests/test_ipalib/test_parameters.py b/tests/test_ipalib/test_parameters.py index e90a2625a..ffdc864b6 100644 --- a/tests/test_ipalib/test_parameters.py +++ b/tests/test_ipalib/test_parameters.py @@ -922,7 +922,7 @@ class test_Str(ClassChecker): mthd = o._convert_scalar for value in (u'Hello', 42, 1.2, unicode_str): assert mthd(value) == unicode(value) - bad = [True, dict(one=1)] + bad = [True, 'Hello', dict(one=1), utf8_bytes] for value in bad: e = raises(errors.ConversionError, mthd, value) assert e.name == 'my_str' diff --git a/tests/test_xmlrpc/test_user_plugin.py b/tests/test_xmlrpc/test_user_plugin.py index ad5d21423..d8d95b9fe 100644 --- a/tests/test_xmlrpc/test_user_plugin.py +++ b/tests/test_xmlrpc/test_user_plugin.py @@ -510,8 +510,8 @@ class test_user(Declarative): desc='Create %r with a full address' % user1, command=( 'user_add', [user1], dict(givenname=u'Test', sn=u'User1', - street='123 Maple Rd', locality='Anytown', st='MD', - telephonenumber='410-555-1212',) + street=u'123 Maple Rd', locality=u'Anytown', st=u'MD', + telephonenumber=u'410-555-1212',) ), expected=dict( value=user1, |