def scan_and_complete_upload(request_id, filepath, is_update=False, response_id=None): """ Scans an uploaded file (see scan_file) and moves it to the data directory if it is clean. If is_update is set, the file will also be placed under the 'updated' directory. Updates redis accordingly. :param request_id: id of request associated with the upload :param filepath: path to uploaded and quarantined file :param is_update: will the file replace an existing one? :param response_id: id of response associated with the upload """ if is_update: assert response_id is not None else: assert response_id is None filename = os.path.basename(filepath) key = get_upload_key(request_id, filename, is_update) redis.set(key, upload_status.SCANNING) try: scan_file(filepath) except VirusDetectedException: sentry.captureException() redis.delete(key) else: # complete upload dst_dir = os.path.join( current_app.config['UPLOAD_DIRECTORY'], request_id ) if is_update: dst_dir = os.path.join( dst_dir, UPDATED_FILE_DIRNAME ) # store file metadata in redis redis_set_file_metadata(response_id or request_id, filepath, is_update) if not fu.exists(dst_dir): try: fu.makedirs(dst_dir) except OSError as e: sentry.captureException() # in the time between the call to fu.exists # and fu.makedirs, the directory was created current_app.logger.error("OS Error: {}".format(e.args)) fu.move( filepath, os.path.join(dst_dir, filename) ) redis.set(key, upload_status.READY)
def _move_validated_upload(request_id, tmp_path): """ Move an approved upload to the upload directory. :param request_id: the id of the request associated with the upload :param tmp_path: the temporary file path to the upload generated by app.request.utils._quarantine_upload_no_id() """ dst_dir = os.path.join(current_app.config['UPLOAD_DIRECTORY'], request_id) if not fu.exists(dst_dir): fu.mkdir(dst_dir) valid_name = os.path.basename(tmp_path).split('.', 1)[1] # remove 'tmp' prefix valid_path = os.path.join(dst_dir, valid_name) # store file metadata in redis redis_set_file_metadata(request_id, tmp_path) fu.move(tmp_path, valid_path) upload_redis.set(get_upload_key(request_id, valid_name), upload_status.READY) return valid_path
def _move_validated_upload(request_id, tmp_path): """ Move an approved upload to the upload directory. :param request_id: the id of the request associated with the upload :param tmp_path: the temporary file path to the upload generated by app.request.utils._quarantine_upload_no_id() """ dst_dir = os.path.join( current_app.config['UPLOAD_DIRECTORY'], request_id) if not fu.exists(dst_dir): fu.mkdir(dst_dir) valid_name = os.path.basename(tmp_path).split('.', 1)[1] # remove 'tmp' prefix valid_path = os.path.join(dst_dir, valid_name) # store file metadata in redis redis_set_file_metadata(request_id, tmp_path) fu.move(tmp_path, valid_path) upload_redis.set( get_upload_key(request_id, valid_name), upload_status.READY) return valid_path