[ckan-dev] File upload via API and ckanclient

Hendrik Bunke bunke.hendrik at gmail.com
Thu Mar 28 11:53:34 UTC 2013


Hi,

I'm trying to upload a file via API and with ckanclient (Python).
It doesn't work and as far as can see there is an authorization
error somewhere in CKAN. I'm aware that there have been others on
this list with similar problems, but so far I haven't found a
solution. So I did some debugging, and here's what I found.

For this test and debugging purposes upload is done with a very
simple script that submits the API key, defines the filename and
so on. Upload to a local CKAN instance is then done via
ckanclient.upload_file(filename). 

I've set a pdb at ckan/controllers/storage.py in function
authorize (I've tried many others, but this seems to be the most
helpful). CKAN log is set to debug, now let's see what happens:

    2013-03-28 11:43:19,750 DEBUG [ckan.lib.base] Received API Key: <some-long-here-hidden-key>
    2013-03-28 11:43:19,758 DEBUG [ckan.logic] check access - user u'bunke', action dashboard_new_activities_count
    2013-03-28 11:43:19,758 DEBUG [ckan.logic] Access OK.
    2013-03-28 11:43:19,759 DEBUG [ckan.logic] check access - user u'bunke', action dashboard_activity_list
    2013-03-28 11:43:19,759 DEBUG [ckan.logic] Access OK.
    > /home/bunke/dev/ckan/src/ckan/ckan/controllers/storage.py(106)authorize()
    -> if not is_authorized:

Everything's fine here. Asking for is_authorized:
    
    (Pdb) is_authorized
    True

So, API key is correct and authorization (called by storage.py
upload_handle) for file upload seems to be correct, right?

Going some steps further: 

    (Pdb) n
    > /home/bunke/dev/ckan/src/ckan/ckan/controllers/storage.py(418)auth_form()
    -> data = self._get_form_data(label)
    (Pdb) data
    {'action': '/storage/upload_handle', 'fields': [{'name': 'key', 'value': u'2013-03-28T114319/2011-33.html'}]}

even the necessary userobject is still available and correct:    

    (Pdb) print c
    <pylons.util.AttribSafeContextObj at 0xb29bdec action=u'auth_form',
    author=u'bunke', controller=u'ckan.controllers.storage:StorageAPIController',
    environ={'HTTP_AUTHORIZATION': '<API-key>'},
    label=u'2013-03-28T114319/2011-33.html', language='en', new_activities=0,
    pylons=<pylons.util.PylonsContext object at 0xb175fac>,
    remote_addr='127.0.0.1', start_response=<function repl_start_response at
    0xb28dfb4>, user=u'bunke', userobj=<User
    id=a3bd42dd-3583-40d9-97c7-76cade9f8ac0 name=bunke ope...True>>

After that some wsgi and middleware actions are performed, and
then suddenly we are back to storage.py.authorize:

    (Pdb) cont
    2013-03-28 11:49:58,777 DEBUG [ckan.new_authz] Using auth profile at ckan.logic.auth
    > /home/bunke/dev/ckan/src/ckan/ckan/controllers/storage.py(106)authorize()
    -> if not is_authorized:

And --surprise, surprise-- there's no authorization anymore:
    (Pdb) is_authorized
    False

Somewhere in the WSGI process authorization got lost, or did I
get something completely wrong here? The last call before going
back to authorize came from here:

    /home/bunke/dev/ckan/local/lib/python2.7/site-packages/paste/httpserver.py(296)wsgi_execute()->None
    -> result = None

Why am I back to authorize here? I could dig my way through the
wsgi code but that's hard. There's the private method in
ckanclient _post_multipart(). Does it really use the credentials
(e.g. the API key?)

thanks in advance
hendrik


-- 
Hendrik Bunke
http://gplus.to/hbunke
http://twitter.com/hbunke
http://www.hbxt.org




More information about the ckan-dev mailing list