Revision 78fa9134

b/snf-cyclades-app/synnefo/plankton/backend.py
63 63
from django.conf import settings
64 64
from django.utils import importlib
65 65
from pithos.backends.base import NotAllowedError, VersionNotExists
66
from synnefo.util.text import uenc
67

  
66 68

  
67 69
logger = logging.getLogger(__name__)
68 70

  
......
100 102

  
101 103
def split_url(url):
102 104
    """Returns (accout, container, object) from a url string"""
103
    t = url.split('/', 4)
104
    assert t[0] == "pithos:", "Invalid url"
105
    assert len(t) == 5, "Invalid url"
106
    return t[2:5]
105
    try:
106
        assert(isinstance(url, basestring))
107
        t = url.split('/', 4)
108
        assert t[0] == "pithos:", "Invalid url"
109
        assert len(t) == 5, "Invalid url"
110
        return t[2:5]
111
    except AssertionError:
112
        raise InvalidLocation("Invalid location '%s" % url)
107 113

  
108 114

  
109 115
def format_timestamp(t):
......
205 211
        """Update object's metadata."""
206 212
        account, container, name = split_url(image_url)
207 213

  
208
        prefixed = [(PLANKTON_PREFIX + k, v) for k, v in meta.items()
214
        prefixed = [(PLANKTON_PREFIX + uenc(k), uenc(v))
215
                    for k, v in meta.items()
209 216
                    if k in PLANKTON_META or k.startswith(PROPERTY_PREFIX)]
210 217
        prefixed = dict(prefixed)
211 218

  
......
484 491
    pass
485 492

  
486 493

  
494
class InvalidLocation(ImageBackendError):
495
    pass
496

  
497

  
487 498
def image_to_dict(image_url, meta, permissions):
488 499
    """Render an image to a dictionary"""
489 500
    account, container, name = split_url(image_url)
b/snf-cyclades-app/synnefo/plankton/views.py
42 42

  
43 43
from snf_django.lib import api
44 44
from snf_django.lib.api import faults
45
from synnefo.lib.text import uenc
45 46
from synnefo.plankton.utils import image_backend
46
from synnefo.plankton.backend import split_url
47
from synnefo.util.text import uenc
47
from synnefo.plankton.backend import split_url, InvalidLocation
48

  
48 49

  
49 50
FILTERS = ('name', 'container_format', 'disk_format', 'status', 'size_min',
50 51
           'size_max')
......
139 140
    params = _get_image_headers(request)
140 141
    log.debug('add_image %s', params)
141 142

  
142
    assert 'name' in params
143
    assert set(params.keys()).issubset(set(ADD_FIELDS))
143
    if not set(params.keys()).issubset(set(ADD_FIELDS)):
144
        raise faults.BadRequest("Invalid parameters")
144 145

  
145 146
    name = params.pop('name')
146

  
147
    if len(uenc(name)) < 1:
147
    if name is None:
148
        raise faults.BadRequest("Image 'name' parameter is required")
149
    elif len(uenc(name)) == 0:
148 150
        raise faults.BadRequest("Invalid image name")
149

  
150 151
    location = params.pop('location', None)
152
    if location is None:
153
        raise faults.BadRequest("'location' parameter is required")
154

  
151 155
    try:
152 156
        split_url(location)
153
    except AssertionError:
157
    except InvalidLocation:
154 158
        raise faults.BadRequest("Invalid location '%s'" % location)
155 159

  
156 160
    if location:
......
284 288
    params.setdefault('sort_key', 'created_at')
285 289
    params.setdefault('sort_dir', 'desc')
286 290

  
287
    assert params['sort_key'] in SORT_KEY_OPTIONS
288
    assert params['sort_dir'] in SORT_DIR_OPTIONS
291
    if not params['sort_key'] in SORT_KEY_OPTIONS:
292
        raise faults.BadRequest("Invalid 'sort_key'")
293
    if not params['sort_dir'] in SORT_DIR_OPTIONS:
294
        raise faults.BadRequest("Invalid 'sort_dir'")
289 295

  
290 296
    if 'size_max' in filters:
291 297
        try:
......
367 373
    meta = _get_image_headers(request)
368 374
    log.debug('update_image %s', meta)
369 375

  
370
    assert set(meta.keys()).issubset(set(UPDATE_FIELDS))
376
    if not set(meta.keys()).issubset(set(UPDATE_FIELDS)):
377
        raise faults.BadRequest("Invalid metadata")
371 378

  
372 379
    with image_backend(request.user_uniq) as backend:
373 380
        image = backend.update_metadata(image_id, meta)

Also available in: Unified diff