diff options
author | Jan Cholasta <jcholast@redhat.com> | 2012-01-23 09:50:41 -0500 |
---|---|---|
committer | Rob Crittenden <rcritten@redhat.com> | 2012-02-13 22:21:50 -0500 |
commit | ca3f3041106dbaa8462aeb78c35b640b169d694a (patch) | |
tree | 4821672b66a83847e39e2cbc48e90c5ee536c130 /ipalib | |
parent | c00bf9e38afa4867f4ec397b260f2e467163096d (diff) | |
download | freeipa-ca3f3041106dbaa8462aeb78c35b640b169d694a.tar.gz freeipa-ca3f3041106dbaa8462aeb78c35b640b169d694a.tar.xz freeipa-ca3f3041106dbaa8462aeb78c35b640b169d694a.zip |
Base64-decode unicode values in Bytes parameters.
Fix wrong handling of strings in --setattr/--addattr/--delattr.
These changes make it possible to use Bytes in --setattr/--addattr/
--delattr without errors.
Fixes managing SSH keys on command-line
https://fedorahosted.org/freeipa/ticket/754
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/cli.py | 6 | ||||
-rw-r--r-- | ipalib/parameters.py | 14 | ||||
-rw-r--r-- | ipalib/plugins/baseldap.py | 8 |
3 files changed, 19 insertions, 9 deletions
diff --git a/ipalib/cli.py b/ipalib/cli.py index 5d07cb1b5..169d3e005 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -1054,11 +1054,7 @@ class cli(backend.Executioner): Decode param values if appropriate. """ for (key, value) in kw.iteritems(): - param = cmd.params[key] - if isinstance(param, Bytes): - yield (key, value) - else: - yield (key, self.Backend.textui.decode(value)) + yield (key, self.Backend.textui.decode(value)) def build_parser(self, cmd): parser = CLIOptionParser( diff --git a/ipalib/parameters.py b/ipalib/parameters.py index d918a5737..c533f9d0b 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -101,6 +101,10 @@ a more detailed description for clarity. import re import decimal +import base64 +import csv +from xmlrpclib import MAXINT, MININT + from types import NoneType from util import make_repr from text import _ as ugettext @@ -109,8 +113,6 @@ from errors import ConversionError, RequirementError, ValidationError from errors import PasswordMismatch from constants import NULLS, TYPE_ERROR, CALLABLE_ERROR from text import Gettext, FixMe -import csv -from xmlrpclib import MAXINT, MININT class DefaultFrom(ReadOnly): @@ -1440,6 +1442,14 @@ class Bytes(Data): length=self.length, ) + def _convert_scalar(self, value, index=None): + if isinstance(value, unicode): + try: + value = base64.b64decode(value) + except TypeError: + raise ConversionError(name=self.name, index=index, error=self.type_error) + return super(Bytes, self)._convert_scalar(value, index) + class Str(Data): """ diff --git a/ipalib/plugins/baseldap.py b/ipalib/plugins/baseldap.py index 66339ccad..d619f14ee 100644 --- a/ipalib/plugins/baseldap.py +++ b/ipalib/plugins/baseldap.py @@ -24,6 +24,7 @@ import re import json import time from copy import deepcopy +import base64 from ipalib import api, crud, errors from ipalib import Method, Object, Command @@ -862,6 +863,9 @@ last, after all sets and adds."""), try: entry_attrs[attr].remove(delval) except ValueError: + if isinstance(delval, str): + # This is a Binary value, base64 encode it + delval = unicode(base64.b64encode(delval)) raise errors.AttrValueNotFound(attr=attr, value=delval) # normalize all values @@ -871,8 +875,8 @@ last, after all sets and adds."""), entry_attrs[attr] = list(set([val for val in entry_attrs[attr] if val])) if not entry_attrs[attr]: entry_attrs[attr] = None - elif len(entry_attrs[attr]) == 1: - entry_attrs[attr] = entry_attrs[attr][0] + elif isinstance(entry_attrs[attr], (tuple, list)) and len(entry_attrs[attr]) == 1: + entry_attrs[attr] = entry_attrs[attr][0] class LDAPCreate(BaseLDAPCommand, crud.Create): """ |