diff --git a/gracedb/api.py b/gracedb/api.py index 2e8beb0fa91ffdc0436c83b729aa31d99097532b..3bb10a7b564985d86a98f4daf3b133019c8e3560 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -1,5 +1,5 @@ -from django.http import HttpResponse, HttpResponseNotFound +from django.http import HttpResponse, HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError from django.core.urlresolvers import reverse import simplejson @@ -24,8 +24,8 @@ def download(request, graceid, filename=""): # UGLY hack to deal with /private vs /general dirs general = False - if os.path.split(filename)[0] == "general": - filename = os.path.join(*os.path.split(filename)[1:]) + if filename.startswith("general/"): + filename = filename[len("general/"):] general = True filepath = os.path.join(event.datadir(general), filename) @@ -34,6 +34,10 @@ def download(request, graceid, filename=""): response = HttpResponseNotFound("File does not exist") elif not os.access(filepath, os.R_OK): response = HttpResponseNotFound("File not readable") + elif os.path.isfile(filename): + # get an actual file. + response = HttpResponse(open(filepath, "r"), content_type="application/octet-stream") + response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename) elif not filename: # Get list of files w/urls. rv = {} @@ -56,9 +60,9 @@ def download(request, graceid, filename=""): rv[filename] = reverse(download, args=[graceid, filename]) response = HttpResponse(simplejson.dumps(rv), content_type="application/json") + elif os.path.isdir(filepath): + response = HttpResponseForbidden("%s is a directory" % filename) else: - # get an actual file. - response = HttpResponse(open(filepath, "r"), content_type="application/octet-stream") - response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename) + response = HttpResponseServerError("Should not happen.") return response