11from baselayer .app .handlers .base import BaseHandler
22from baselayer .app .custom_exceptions import AccessError
3+ from baselayer .app .access import auth_or_token
34from ..models import DBSession , Project , Dataset , DatasetFile
45from .. import util
56
910import os
1011from os .path import join as pjoin
1112import uuid
12-
13- import tornado . web
13+ import base64
14+ import tarfile
1415
1516
1617class DatasetHandler (BaseHandler ):
17- @tornado . web . authenticated
18+ @auth_or_token
1819 def post (self ):
19- if not 'tarFile' in self .request .files :
20+ data = self .get_json ()
21+ if not 'tarFile' in data :
2022 return self .error ('No tar file uploaded' )
2123
22- zipfile = self .request .files ['tarFile' ][0 ]
24+ zipfile = data ['tarFile' ]
25+ tarball_content_type_str = 'data:application/gzip;base64,'
26+
27+ if not zipfile ['body' ].startswith (tarball_content_type_str ):
28+ return self .error ('Invalid tar file - please ensure file is gzip '
29+ 'format.' )
2330
24- if zipfile . filename == '' :
31+ if zipfile [ 'name' ] == '' :
2532 return self .error ('Empty tar file uploaded' )
2633
27- dataset_name = self . get_argument ( 'datasetName' )
28- project_id = self . get_argument ( 'projectID' )
34+ dataset_name = data [ 'datasetName' ]
35+ project_id = data [ 'projectID' ]
2936
3037 zipfile_name = (str (uuid .uuid4 ()) + "_" +
31- util .secure_filename (zipfile . filename ))
38+ util .secure_filename (zipfile [ 'name' ] ))
3239 zipfile_path = pjoin (self .cfg ['paths:upload_folder' ], zipfile_name )
3340
3441 with open (zipfile_path , 'wb' ) as f :
35- f .write (zipfile ['body' ])
42+ f .write (base64 .b64decode (
43+ zipfile ['body' ].replace (tarball_content_type_str , '' )))
44+ try :
45+ tarfile .open (zipfile_path )
46+ except tarfile .ReadError :
47+ os .remove (zipfile_path )
48+ return self .error ('Invalid tar file - please ensure file is gzip '
49+ 'format.' )
3650
3751 # Header file is optional for unlabled data w/o metafeatures
38- if 'headerFile' in self . request . files :
39- headerfile = self . request . files ['headerFile' ][ 0 ]
52+ if 'headerFile' in data :
53+ headerfile = data ['headerFile' ]
4054 headerfile_name = (str (uuid .uuid4 ()) + "_" +
41- util .secure_filename (headerfile . filename ))
55+ util .secure_filename (headerfile [ 'name' ] ))
4256 headerfile_path = pjoin (self .cfg ['paths:upload_folder' ], headerfile_name )
4357
44- with open (headerfile_path , 'wb ' ) as f :
58+ with open (headerfile_path , 'w ' ) as f :
4559 f .write (headerfile ['body' ])
4660
4761 else :
@@ -67,7 +81,7 @@ def post(self):
6781
6882 return self .success (d , 'cesium/FETCH_DATASETS' )
6983
70- @tornado . web . authenticated
84+ @auth_or_token
7185 def get (self , dataset_id = None ):
7286 if dataset_id is not None :
7387 dataset = Dataset .get_if_owned_by (dataset_id , self .current_user )
@@ -79,7 +93,7 @@ def get(self, dataset_id=None):
7993
8094 return self .success (dataset_info )
8195
82- @tornado . web . authenticated
96+ @auth_or_token
8397 def delete (self , dataset_id ):
8498 d = Dataset .get_if_owned_by (dataset_id , self .current_user )
8599 DBSession ().delete (d )
0 commit comments