def check_public_commands(self, command): ''' check and execute commands, which are available without authorization ''' if command == 'link': # get file from link code code = self.request.path_info_pop() link = ShareLink.gql('WHERE link = :1', code).get() if link == None: # link not found self.error(404) return True status, metadata = self.backend.get_metadata(link.path, link.data.credentials) type = mimetypes.guess_type(metadata['path']) if type[0]: self.response.headers['Content-Type'] = type[0] # check if file is modified if status == 200: if self.request.headers.get('If-None-Match', '') == metadata['version']: status = 304 else: # output file content status = self.backend.get_file(self.response.out, link.path, link.data.credentials) self.response.headers.add_header("ETag", metadata['version']) self.response.set_status(status) return True if command == 'extensions': # return list of supported extensions query = self.request.get('name',None) extensions = self.backend.get_extensions() if query: # if query parameter is supplied, # then check only queried extension if query in extensions: self.response.out.write('True') else: self.response.out.write('False') else: json.dump(extensions, self.response.out) return True return False
def get(self, command, service=None): ''' process GET request ''' if service == None: # select service adapter self.service, self.backend = self.detect_service() command = self.request.path_info_pop() # not all commands need authorization if self.check_public_commands(command): return # Check authorization user_auth = auth.valid_token(self.request) if user_auth == None: self.send_unauthorized() return if command == 'files': # pass whole file to user creds_key = user_auth.owner + "_" + self.service creds = ServiceData.get_by_key_name(creds_key) if creds == None: self.send_unauthorized('no authorization data for service '+self.service) else: if self.request.get('version'): params = {'version' : self.request.get('version')} else: params = None path = self.request.path_info status = self.backend.get_file(self.response.out, path, creds.credentials, params) self.response.set_status(status) return if command == 'metadata': # return metadata creds_key = user_auth.owner + "_" + self.service creds = ServiceData.get_by_key_name(creds_key) if creds == None: self.send_unauthorized('no authorization data for service '+self.service) else: if self.request.get('list'): params = {'list' : True if self.request.get('list') == 'true' else False } else: params = None path = self.request.path_info status, metadata = self.backend.get_metadata(path, creds.credentials, params) # output json json.dump(metadata, self.response.out, ensure_ascii=False) self.response.set_status(status) return if command == 'addshare': # create public link to file creds_key = user_auth.owner + "_" + self.service creds = ServiceData.get_by_key_name(creds_key) if creds == None: self.send_unauthorized('no authorization data for service '+self.service) else: path = self.request.path_info link_key = creds_key + path link = ShareLink.get_or_insert(link_key, data=creds, path=path) link.regenerate_link() # generate link code self.response.out.write(link.link) return if command == 'share': # return list of shares # get credentials creds_key = user_auth.owner + "_" + self.service creds = ServiceData.get_by_key_name(creds_key) if creds == None: self.send_unauthorized('no authorization data for service '+self.service) else: links = ShareLink.gql('WHERE data = :1', creds) link_list = [(link.path, link.link) for link in links] # return json json.dump(link_list, self.response.out, ensure_ascii=False) return if command == 'unshare': # delete public link to file # get credentials creds_key = user_auth.owner + "_" + self.service creds = ServiceData.get_by_key_name(creds_key) if creds == None: self.send_unauthorized('no authorization data for service '+self.service) else: path = self.request.path_info link_key = creds_key + path link = ShareLink.get_by_key_name(link_key) if link == None: self.error(404) else: link.delete() return # if we got down here then command is not recognized # report error self.error(400) self.response.headers.add_header("Cache-Control", "no-store") self.response.out.write("Unsupported command")