def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for('addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras) ret = serialize_node(node, auth, primary=True) # Disable OSF Storage file deletion in DISK_SAVING_MODE if settings.DISK_SAVING_MODE and node_addon.config.short_name == 'osfstorage': ret['user']['can_edit'] = False ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def serialize_draft_registration(draft, auth=None): from website.project.utils import serialize_node # noqa node = draft.branched_from return { 'pk': draft._id, 'branched_from': serialize_node(node, auth), 'initiator': serialize_initiator(draft.initiator), 'registration_metadata': draft.registration_metadata, 'registration_schema': serialize_meta_schema(draft.registration_schema), 'initiated': utils.iso8601format(draft.datetime_initiated), 'updated': utils.iso8601format(draft.datetime_updated), 'flags': draft.flags, 'urls': { 'edit': node.web_url_for('edit_draft_registration_page', draft_id=draft._id), 'submit': node.api_url_for('submit_draft_for_review', draft_id=draft._id), 'before_register': node.api_url_for('project_before_register'), 'register': node.api_url_for('register_draft_registration', draft_id=draft._id), 'register_page': node.web_url_for('draft_before_register_page', draft_id=draft._id), 'registrations': node.web_url_for('node_registrations') }, 'requires_approval': draft.requires_approval, 'is_pending_approval': draft.is_pending_review, 'is_approved': draft.is_approved, }
def node_registration_retraction_get(auth, node, **kwargs): """Prepares node object for registration retraction page. :return: serialized Node to be retracted :raises: 400: BAD_REQUEST if registration already pending retraction """ if not node.is_registration: raise HTTPError( http.BAD_REQUEST, data={ "message_short": "Invalid Request", "message_long": "Retractions of non-registrations is not permitted.", }, ) if node.pending_retraction: raise HTTPError( http.BAD_REQUEST, data={ "message_short": "Invalid Request", "message_long": "This registration is already pending a retraction.", }, ) return serialize_node(node, auth, primary=True)
def addon_deleted_file(auth, node, **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one trashed = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id')) if not trashed: raise HTTPError(httplib.NOT_FOUND, { 'message_short': 'Not Found', 'message_long': 'This file does not exist' }) ret = serialize_node(node, auth, primary=True) ret.update(rubeus.collect_addon_assets(node)) ret.update({ 'urls': { 'render': None, 'sharejs': None, 'mfr': settings.MFR_SERVER_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being editted, just in case 'sharejs_uuid': None, 'file_name': trashed.name, 'file_path': trashed.path, 'provider': trashed.provider, 'materialized_path': trashed.materialized_path, 'error': FILE_GONE_ERROR_MESSAGE.format(file_name=trashed.name), 'private': getattr(node.get_addon(trashed.provider), 'is_private', False), }) return ret, httplib.GONE
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for( 'addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras ) ret = serialize_node(node, auth, primary=True) # Disable OSF Storage file deletion in DISK_SAVING_MODE if settings.DISK_SAVING_MODE and node_addon.config.short_name == 'osfstorage': ret['user']['can_edit'] = False ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def node_registration_retraction_get(auth, node, **kwargs): """Prepares node object for registration retraction page. :return: serialized Node to be retracted :raises: 400: BAD_REQUEST if registration already pending retraction """ if not node.is_registration: raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data={ 'message_short': 'Invalid Request', 'message_long': 'Withdrawal of non-registrations is not permitted.' }) if node.is_pending_retraction: raise HTTPError(http_status.HTTP_400_BAD_REQUEST, data={ 'message_short': 'Invalid Request', 'message_long': 'This registration is already pending withdrawal.' }) return serialize_node(node, auth, primary=True)
def dropbox_view_file(path, node_addon, auth, **kwargs): """Web view for the file detail page.""" if not path: raise HTTPError(http.NOT_FOUND) # check that current user has access to the path if not is_authorizer(auth, node_addon): abort_if_not_subdir(path, node_addon.folder) node = node_addon.owner client = get_node_addon_client(node_addon) # Lazily create a file GUID record file_obj, created = DropboxFile.get_or_create(node=node, path=path) redirect_url = check_file_guid(file_obj) if redirect_url: return redirect(redirect_url) rev = request.args.get('rev') or '' rendered = render_dropbox_file(file_obj, client=client, rev=rev) cleaned_path = clean_path(path) response = { 'revisions_url': node.api_url_for('dropbox_get_revisions', path=cleaned_path, rev=rev), # Append current revision as a query param 'file_name': get_file_name(path), 'render_url': node.api_url_for('dropbox_render_file', path=cleaned_path), 'download_url': file_obj.download_url(guid=True, rev=rev), 'rendered': rendered, } response.update(serialize_node(node, auth, primary=True)) return response, http.OK
def addon_deleted_file(auth, node, **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one trashed = kwargs.get("file_node") or TrashedFileNode.load(kwargs.get("trashed_id")) if not trashed: raise HTTPError(httplib.NOT_FOUND, {"message_short": "Not Found", "message_long": "This file does not exist"}) ret = serialize_node(node, auth, primary=True) ret.update(rubeus.collect_addon_assets(node)) ret.update( { "urls": { "render": None, "sharejs": None, "mfr": settings.MFR_SERVER_URL, "gravatar": get_gravatar(auth.user, 25), "files": node.web_url_for("collect_file_trees"), }, "extra": {}, "size": 9966699, # Prevent file from being editted, just in case "sharejs_uuid": None, "file_name": trashed.name, "file_path": trashed.path, "provider": trashed.provider, "materialized_path": trashed.materialized_path, "error": FILE_GONE_ERROR_MESSAGE.format(file_name=trashed.name), "private": getattr(node.get_addon(trashed.provider), "is_private", False), } ) return ret, httplib.GONE
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from website.addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace('\n', '').strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id + '-' + version._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' + version._id]) else: sharejs_uuid = None download_url = furl.furl(request.url.encode('utf-8')).set(args=dict(request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', })) render_url = furl.furl(settings.MFR_SERVER_URL).set( path=['render'], args={'url': download_url.url} ) ret.update({ 'urls': { 'render': render_url.url, 'mfr': settings.MFR_SERVER_URL, 'sharejs': wiki_settings.SHAREJS_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), 'archived_from': get_archived_from_url(node, file_node) if node.is_registration else None, }, 'error': error, 'file_name': file_node.name, 'file_name_title': os.path.splitext(file_node.name)[0], 'file_name_ext': os.path.splitext(file_node.name)[1], 'file_path': file_node.path, 'sharejs_uuid': sharejs_uuid, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path, 'extra': version.metadata.get('extra', {}), 'size': version.size if version.size is not None else 9966699, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': [tag._id for tag in file_node.tags], 'file_guid': file_node.get_guid()._id, 'file_id': file_node._id, 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for('addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras) ret = serialize_node(node, auth, primary=True) ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from website.addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace('\n', '').strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id]) else: sharejs_uuid = None download_url = furl.furl(request.url.encode('utf-8')).set(args=dict(request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', })) render_url = furl.furl(settings.MFR_SERVER_URL).set( path=['render'], args={'url': download_url.url} ) ret.update({ 'urls': { 'render': render_url.url, 'mfr': settings.MFR_SERVER_URL, 'sharejs': wiki_settings.SHAREJS_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), }, 'error': error, 'file_name': file_node.name, 'file_name_title': os.path.splitext(file_node.name)[0], 'file_name_ext': os.path.splitext(file_node.name)[1], 'file_path': file_node.path, 'sharejs_uuid': sharejs_uuid, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path, 'extra': version.metadata.get('extra', {}), 'size': version.size if version.size is not None else 9966699, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': [tag._id for tag in file_node.tags], }) ret.update(rubeus.collect_addon_assets(node)) return ret
def view_file(auth, path, node_addon, version_query): node = node_addon.owner idx, version, record = get_version(path, node_addon, version_query, throw=False) file_obj = model.OsfStorageGuidFile.get_or_create(node=node, path=path) redirect_url = check_file_guid(file_obj) if redirect_url: return redirect(redirect_url) ret = serialize_file(idx, version, record, path, node) ret.update(serialize_node(node, auth, primary=True)) return ret
def edit_draft_registration_page(auth, node, draft, **kwargs): """Draft registration editor :return: serialized DraftRegistration :rtype: dict """ check_draft_state(draft) ret = project_utils.serialize_node(node, auth, primary=True) ret['draft'] = serialize_draft_registration(draft, auth) return ret
def draft_before_register_page(auth, node, draft, *args, **kwargs): """Allow the user to select an embargo period and confirm registration :return: serialized Node + DraftRegistration :rtype: dict """ ret = serialize_node(node, auth, primary=True) ret['draft'] = serialize_draft_registration(draft, auth) return ret
def addon_view_file(auth, node, node_addon, guid_file, extras): # TODO: resolve circular import issue from website.addons.wiki import settings as wiki_settings ret = serialize_node(node, auth, primary=True) # Disable OSF Storage file deletion in DISK_SAVING_MODE if settings.DISK_SAVING_MODE and node_addon.config.short_name == 'osfstorage': ret['user']['can_edit'] = False try: guid_file.enrich() except exceptions.AddonEnrichmentError as e: error = e.as_html() else: error = None if guid_file._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[guid_file._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[guid_file._id]) else: sharejs_uuid = None size = getattr(guid_file, 'size', None) if size is None: # Size could be 0 which is a falsey value size = 9966699 # if we dont know the size assume its to big to edit ret.update({ 'error': error.replace('\n', '') if error else None, 'provider': guid_file.provider, 'file_path': guid_file.waterbutler_path, 'panels_used': ['edit', 'view'], 'private': getattr(node_addon, 'is_private', False), 'sharejs_uuid': sharejs_uuid, 'urls': { 'files': node.web_url_for('collect_file_trees'), 'render': guid_file.mfr_render_url, 'sharejs': wiki_settings.SHAREJS_URL, 'mfr': settings.MFR_SERVER_URL, 'gravatar': get_gravatar(auth.user, 25), 'external': getattr(guid_file, 'external_url', None) }, # Note: must be called after get_or_start_render. This is really only for github 'size': size, 'extra': getattr(guid_file, 'extra', {}), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(guid_file, 'name', os.path.split(guid_file.waterbutler_path)[1]), 'materialized_path': getattr(guid_file, 'materialized', guid_file.waterbutler_path), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'extra': '', 'provider': '', 'rendered': '', 'file_path': '', 'files_url': '', 'file_name': '', 'render_url': '', }) return ret
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from website.addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace("\n", "").strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id] = uuid.uuid4() node.save() if ret["user"]["can_edit"]: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id]) else: sharejs_uuid = None download_url = furl.furl(request.url.encode("utf-8")).set( args=dict(request.args, **{"direct": None, "mode": "render", "action": "download"}) ) render_url = furl.furl(settings.MFR_SERVER_URL).set(path=["render"], args={"url": download_url.url}) ret.update( { "urls": { "render": render_url.url, "mfr": settings.MFR_SERVER_URL, "sharejs": wiki_settings.SHAREJS_URL, "gravatar": get_gravatar(auth.user, 25), "files": node.web_url_for("collect_file_trees"), }, "error": error, "file_name": file_node.name, "file_name_title": os.path.splitext(file_node.name)[0], "file_name_ext": os.path.splitext(file_node.name)[1], "file_path": file_node.path, "sharejs_uuid": sharejs_uuid, "provider": file_node.provider, "materialized_path": file_node.materialized_path, "extra": version.metadata.get("extra", {}), "size": version.size if version.size is not None else 9966699, "private": getattr(node.get_addon(file_node.provider), "is_private", False), "file_tags": [tag._id for tag in file_node.tags], } ) ret.update(rubeus.collect_addon_assets(node)) return ret
def node_register_page(auth, node, **kwargs): """Display the registration metadata for a registration. :return: serialized Node """ if node.is_registration: return serialize_node(node, auth) else: status.push_status_message( 'You have been redirected to the project\'s registrations page. From here you can initiate a new Draft Registration to complete the registration process', trust=False) return redirect(node.web_url_for('node_registrations', view='draft'))
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'extra': '', 'provider': '', 'rendered': '', 'file_path': '', 'files_url': '', 'file_name': '', 'render_url': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def addon_deleted_file(auth, node, **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one trashed = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id')) if not trashed: raise HTTPError(httplib.NOT_FOUND, { 'message_short': 'Not Found', 'message_long': 'This file does not exist' }) ret = serialize_node(node, auth, primary=True) ret.update(rubeus.collect_addon_assets(node)) error_template = FILE_SUSPENDED_ERROR_MESSAGE if getattr(trashed, 'suspended', False) else FILE_GONE_ERROR_MESSAGE error = error_template.format(file_name=trashed.name) ret.update({ 'urls': { 'render': None, 'sharejs': None, 'mfr': settings.MFR_SERVER_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being editted, just in case 'sharejs_uuid': None, 'file_name': trashed.name, 'file_path': trashed.path, 'provider': trashed.provider, 'materialized_path': trashed.materialized_path, 'error': error, 'private': getattr(node.get_addon(trashed.provider), 'is_private', False), 'file_id': trashed._id, # For the off chance that there is no GUID 'file_guid': getattr(trashed.get_guid(create=False), '_id', None), 'file_tags': [tag._id for tag in trashed.tags], 'file_name_ext': os.path.splitext(trashed.name)[1], 'file_name_title': os.path.splitext(trashed.name)[0], 'allow_comments': trashed.provider in settings.ADDONS_COMMENTABLE, }) return ret, httplib.GONE
def timestamptoken_verify(auth, node, file_node, version, guid): from api.timestamp.timestamptoken_verify import TimeStampTokenVerifyCheck import requests from osf.models import Guid import shutil current_datetime = timezone.now() current_datetime_str = current_datetime.strftime('%Y%m%d%H%M%S%f') tmp_dir = '/tmp/tmp_{}_{}_{}'.format(guid, file_node._id, current_datetime_str) tmp_file = None try: ret = serialize_node(node, auth, primary=True) user_info = OSFUser.objects.get(id=Guid.objects.get( _id=ret['user']['id']).object_id) cookie = user_info.get_or_create_cookie() cookies = {settings.COOKIE_NAME: cookie} headers = {'content-type': 'application/json'} res = requests.get(file_node.generate_waterbutler_url( **dict(action='download', version=version.identifier, mode=None, _internal=False)), headers=headers, cookies=cookies) if not os.path.exists(tmp_dir): os.mkdir(tmp_dir) tmp_file = os.path.join(tmp_dir, file_node.name) with open(tmp_file, 'wb') as fout: fout.write(res.content) res.close() except Exception as err: if os.path.exists(tmp_dir): shutil.rmtree(tmp_dir) logger.exception(err) verifyCheck = TimeStampTokenVerifyCheck() result = verifyCheck.timestamp_check(ret['user']['id'], file_node._id, node._id, file_node.provider, file_node._path, tmp_file, tmp_dir) if os.path.exists(tmp_dir): shutil.rmtree(tmp_dir) return result
def node_registration_retraction_get(auth, node, **kwargs): """Prepares node object for registration retraction page. :return: serialized Node to be retracted :raises: 400: BAD_REQUEST if registration already pending retraction """ if not node.is_registration: raise HTTPError(http.BAD_REQUEST, data={ 'message_short': 'Invalid Request', 'message_long': 'Withdrawal of non-registrations is not permitted.' }) if node.is_pending_retraction: raise HTTPError(http.BAD_REQUEST, data={ 'message_short': 'Invalid Request', 'message_long': 'This registration is already pending withdrawal.' }) return serialize_node(node, auth, primary=True)
def adding_timestamp(auth, node, file_node, version): from osf.models import Guid import requests from api.timestamp.add_timestamp import AddTimestamp import shutil tmp_dir = None result = None try: ret = serialize_node(node, auth, primary=True) user_info = OSFUser.objects.get(id=Guid.objects.get( _id=ret['user']['id']).object_id) cookie = user_info.get_or_create_cookie() cookies = {settings.COOKIE_NAME: cookie} headers = {'content-type': 'application/json'} res = requests.get(file_node.generate_waterbutler_url( **dict(action='download', version=version.identifier, mode=None, _internal=False)), headers=headers, cookies=cookies) tmp_dir = '/tmp/tmp_{}'.format(ret['user']['id']) os.mkdir(tmp_dir) tmp_file = os.path.join(tmp_dir, file_node.name) with open(tmp_file, 'wb') as fout: fout.write(res.content) res.close() addTimestamp = AddTimestamp() result = addTimestamp.add_timestamp(ret['user']['id'], file_node._id, node._id, file_node.provider, file_node._path, tmp_file, tmp_dir) shutil.rmtree(tmp_dir) except Exception as err: if tmp_dir: if os.path.exists(tmp_dir): shutil.rmtree(tmp_dir) logger.exception(err) return result
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def serialize_draft_registration(draft, auth=None): from website.project.utils import serialize_node # noqa from api.base.utils import absolute_reverse node = draft.branched_from return { 'pk': draft._id, 'branched_from': serialize_node(node, auth), 'initiator': serialize_initiator(draft.initiator), 'registration_metadata': draft.registration_metadata, 'registration_schema': serialize_meta_schema(draft.registration_schema), 'initiated': utils.iso8601format(draft.datetime_initiated), 'updated': utils.iso8601format(draft.datetime_updated), 'flags': draft.flags, 'urls': { 'edit': node.web_url_for('edit_draft_registration_page', draft_id=draft._id, _guid=True), 'before_register': node.api_url_for('project_before_register'), 'register': absolute_reverse('nodes:node-registrations', kwargs={ 'node_id': node._id, 'version': 'v2' }), 'register_page': node.web_url_for('draft_before_register_page', draft_id=draft._id, _guid=True), 'registrations': node.web_url_for('node_registrations', _guid=True) }, 'requires_approval': draft.requires_approval, 'is_pending_approval': draft.is_pending_review, 'is_approved': draft.is_approved, }
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for( 'addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras ) ret = serialize_node(node, auth, primary=True) ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) return ret
def addon_deleted_file(auth, target, error_type='BLAME_PROVIDER', **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one file_node = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id')) deleted_by, deleted_on = None, None if isinstance(file_node, TrashedFileNode): deleted_by = file_node.deleted_by deleted_by_guid = file_node.deleted_by._id if deleted_by else None deleted_on = file_node.deleted_on.strftime('%c') + ' UTC' if getattr(file_node, 'suspended', False): error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None or (auth.private_key and auth.private_link.anonymous): if file_node.provider == 'osfstorage': error_type = 'FILE_GONE_ACTOR_UNKNOWN' else: error_type = 'BLAME_PROVIDER' else: error_type = 'FILE_GONE' else: error_type = 'DONT_KNOW' file_path = kwargs.get('path', file_node.path) file_name = file_node.name or os.path.basename(file_path) file_name_title, file_name_ext = os.path.splitext(file_name) provider_full = settings.ADDONS_AVAILABLE_DICT[file_node.provider].full_name try: file_guid = file_node.get_guid()._id except AttributeError: file_guid = None format_params = dict( file_name=markupsafe.escape(file_name), deleted_by=markupsafe.escape(getattr(deleted_by, 'fullname', None)), deleted_on=markupsafe.escape(deleted_on), provider=markupsafe.escape(provider_full) ) if deleted_by: format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid) error_msg = ERROR_MESSAGES[error_type].format(**format_params) if isinstance(target, AbstractNode): error_msg += format_last_known_metadata(auth, target, file_node, error_type) ret = serialize_node(target, auth, primary=True) ret.update(rubeus.collect_addon_assets(target)) ret.update({ 'error': error_msg, 'urls': { 'render': None, 'sharejs': None, 'mfr': get_mfr_url(target, file_node.provider), 'profile_image': get_profile_image_url(auth.user, 25), 'files': target.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being edited, just in case 'sharejs_uuid': None, 'file_name': file_name, 'file_path': file_path, 'file_name_title': file_name_title, 'file_name_ext': file_name_ext, 'target_deleted': getattr(target, 'is_deleted', False), 'version_id': None, 'file_guid': file_guid, 'file_id': file_node._id, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path or file_path, 'private': getattr(target.get_addon(file_node.provider), 'is_private', False), 'file_tags': list(file_node.tags.filter(system=False).values_list('name', flat=True)) if not file_node._state.adding else [], # Only access ManyRelatedManager if saved 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, }) else: # TODO - serialize deleted metadata for future types of deleted file targets ret = {'error': error_msg} return ret, httplib.GONE
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace('\n', '').strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id + '-' + version._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' + version._id]) else: sharejs_uuid = None internal_furl = furl.furl(settings.INTERNAL_DOMAIN) download_url = furl.furl(request.url).set(netloc=internal_furl.netloc, args=dict( request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', 'public_file': node.is_public, })) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set(path=['render'], args={'url': download_url.url}) version_names = BaseFileVersionsThrough.objects.filter( basefilenode_id=file_node.id).order_by('-fileversion_id').values_list( 'version_name', flat=True) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), 'archived_from': get_archived_from_url(node, file_node) if node.is_registration else None, }, 'error': error, 'file_name': file_node.name, 'file_name_title': os.path.splitext(file_node.name)[0], 'file_name_ext': os.path.splitext(file_node.name)[1], 'version_id': version.identifier, 'file_path': file_node.path, 'sharejs_uuid': sharejs_uuid, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path, 'extra': version.metadata.get('extra', {}), 'size': version.size if version.size is not None else 9966699, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': list( file_node.tags.filter(system=False).values_list('name', flat=True)) if not file_node._state.adding else [], # Only access ManyRelatedManager if saved 'file_guid': file_node.get_guid()._id, 'file_id': file_node._id, 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, 'checkout_user': file_node.checkout._id if file_node.checkout else None, 'version_names': list(version_names) }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_deleted_file(auth, target, error_type='BLAME_PROVIDER', **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one file_node = kwargs.get('file_node') or TrashedFileNode.load( kwargs.get('trashed_id')) deleted_by, deleted_on, deleted = None, None, None if isinstance(file_node, TrashedFileNode): deleted_by = file_node.deleted_by deleted_by_guid = file_node.deleted_by._id if deleted_by else None deleted_on = file_node.deleted_on.strftime('%c') + ' UTC' deleted = deleted_on if getattr(file_node, 'suspended', False): error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None or (auth.private_key and auth.private_link.anonymous): if file_node.provider == 'osfstorage': error_type = 'FILE_GONE_ACTOR_UNKNOWN' else: error_type = 'BLAME_PROVIDER' else: error_type = 'FILE_GONE' else: error_type = 'DONT_KNOW' file_path = kwargs.get('path', file_node.path) file_name = file_node.name or os.path.basename(file_path) file_name_title, file_name_ext = os.path.splitext(file_name) provider_full = settings.ADDONS_AVAILABLE_DICT[ file_node.provider].full_name try: file_guid = file_node.get_guid()._id except AttributeError: file_guid = None format_params = dict(file_name=markupsafe.escape(file_name), deleted_by=markupsafe.escape( getattr(deleted_by, 'fullname', None)), deleted_on=markupsafe.escape(deleted_on), provider=markupsafe.escape(provider_full), deleted=markupsafe.escape(deleted)) if deleted_by: format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid) error_msg = ERROR_MESSAGES[error_type].format(**format_params) if isinstance(target, AbstractNode): error_msg += format_last_known_metadata(auth, target, file_node, error_type) ret = serialize_node(target, auth, primary=True) ret.update(rubeus.collect_addon_assets(target)) ret.update({ 'error': error_msg, 'urls': { 'render': None, 'sharejs': None, 'mfr': get_mfr_url(target, file_node.provider), 'profile_image': get_profile_image_url(auth.user, 25), 'files': target.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being edited, just in case 'sharejs_uuid': None, 'file_name': file_name, 'file_path': file_path, 'file_name_title': file_name_title, 'file_name_ext': file_name_ext, 'target_deleted': getattr(target, 'is_deleted', False), 'version_id': None, 'file_guid': file_guid, 'file_id': file_node._id, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path or file_path, 'private': getattr(target.get_addon(file_node.provider), 'is_private', False), 'file_tags': list( file_node.tags.filter(system=False).values_list( 'name', flat=True)) if not file_node._state.adding else [], # Only access ManyRelatedManager if saved 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, }) else: # TODO - serialize deleted metadata for future types of deleted file targets ret = {'error': error_msg} return ret, http_status.HTTP_410_GONE
def addon_deleted_file(auth, node, error_type='BLAME_PROVIDER', **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one file_node = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id')) deleted_by, deleted_on = None, None if isinstance(file_node, TrashedFileNode): deleted_by = file_node.deleted_by deleted_by_guid = file_node.deleted_by._id if deleted_by else None deleted_on = file_node.deleted_on.strftime('%c') + ' UTC' if file_node.suspended: error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None: if file_node.provider == 'osfstorage': error_type = 'FILE_GONE_ACTOR_UNKNOWN' else: error_type = 'BLAME_PROVIDER' else: error_type = 'FILE_GONE' else: error_type = 'DONT_KNOW' file_path = kwargs.get('path', file_node.path) file_name = file_node.name or os.path.basename(file_path) file_name_title, file_name_ext = os.path.splitext(file_name) provider_full = settings.ADDONS_AVAILABLE_DICT[file_node.provider].full_name try: file_guid = file_node.get_guid()._id except AttributeError: file_guid = None format_params = dict( file_name=markupsafe.escape(file_name), deleted_by=markupsafe.escape(deleted_by), deleted_on=markupsafe.escape(deleted_on), provider=markupsafe.escape(provider_full) ) if deleted_by: format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid) ret = serialize_node(node, auth, primary=True) ret.update(rubeus.collect_addon_assets(node)) ret.update({ 'error': ERROR_MESSAGES[error_type].format(**format_params), 'urls': { 'render': None, 'sharejs': None, 'mfr': settings.MFR_SERVER_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being edited, just in case 'sharejs_uuid': None, 'file_name': file_name, 'file_path': file_path, 'file_name_title': file_name_title, 'file_name_ext': file_name_ext, 'version_id': None, 'file_guid': file_guid, 'file_id': file_node._id, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path or file_path, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': [tag._id for tag in file_node.tags], 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, }) return ret, httplib.GONE
def addon_deleted_file(auth, node, error_type='BLAME_PROVIDER', **kwargs): """Shows a nice error message to users when they try to view a deleted file """ # Allow file_node to be passed in so other views can delegate to this one file_node = kwargs.get('file_node') or TrashedFileNode.load( kwargs.get('trashed_id')) deleted_by, deleted_on = None, None if isinstance(file_node, TrashedFileNode): deleted_by = file_node.deleted_by deleted_by_guid = file_node.deleted_by._id if deleted_by else None deleted_on = file_node.deleted_on.strftime("%c") + ' UTC' if file_node.suspended: error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None: if file_node.provider == 'osfstorage': error_type = 'FILE_GONE_ACTOR_UNKNOWN' else: error_type = 'BLAME_PROVIDER' else: error_type = 'FILE_GONE' else: error_type = 'DONT_KNOW' file_path = kwargs.get('path', file_node.path) file_name = file_node.name or os.path.basename(file_path) file_name_title, file_name_ext = os.path.splitext(file_name) provider_full = settings.ADDONS_AVAILABLE_DICT[ file_node.provider].full_name try: file_guid = file_node.get_guid()._id except AttributeError: file_guid = None format_params = dict(file_name=markupsafe.escape(file_name), deleted_by=markupsafe.escape(deleted_by), deleted_on=markupsafe.escape(deleted_on), provider=markupsafe.escape(provider_full)) if deleted_by: format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid) ret = serialize_node(node, auth, primary=True) ret.update(rubeus.collect_addon_assets(node)) ret.update({ 'error': ERROR_MESSAGES[error_type].format(**format_params), 'urls': { 'render': None, 'sharejs': None, 'mfr': settings.MFR_SERVER_URL, 'gravatar': get_gravatar(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), }, 'extra': {}, 'size': 9966699, # Prevent file from being edited, just in case 'sharejs_uuid': None, 'file_name': file_name, 'file_path': file_path, 'file_name_title': file_name_title, 'file_name_ext': file_name_ext, 'file_guid': file_guid, 'file_id': file_node._id, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path or file_path, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': [tag._id for tag in file_node.tags], 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, }) return ret, httplib.GONE
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace('\n', '').strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id + '-' + version._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' + version._id]) else: sharejs_uuid = None internal_furl = furl.furl(settings.INTERNAL_DOMAIN) download_url = furl.furl(request.url.encode('utf-8')).set( netloc=internal_furl.netloc, args=dict( request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', 'public_file': node.is_public, })) # Verify file verify_result = {'verify_result': '', 'verify_result_title': ''} cookie = auth.user.get_or_create_cookie() headers = {'content-type': 'application/json'} file_data_request = requests.get(file_node.generate_waterbutler_url( version=version.identifier, meta='', _internal=True), headers=headers, cookies={settings.COOKIE_NAME: cookie}) if file_data_request.status_code == 200: file_data = file_data_request.json().get('data') file_info = { 'provider': file_node.provider, 'file_id': file_node._id, 'file_name': file_data['attributes'].get('name'), 'file_path': file_data['attributes'].get('materialized'), 'size': file_data['attributes'].get('size'), 'created': file_data['attributes'].get('created_utc'), 'modified': file_data['attributes'].get('modified_utc'), 'version': '' } if file_node.provider == 'osfstorage': file_info['version'] = file_data['attributes']['extra'].get( 'version') verify_result = timestamp.check_file_timestamp(auth.user.id, node, file_info) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set(path=['render'], args={'url': download_url.url}) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), 'archived_from': get_archived_from_url(node, file_node) if node.is_registration else None, }, 'error': error, 'file_name': file_node.name, 'file_name_title': os.path.splitext(file_node.name)[0], 'file_name_ext': os.path.splitext(file_node.name)[1], 'version_id': version.identifier, 'file_path': file_node.path, 'sharejs_uuid': sharejs_uuid, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path, 'extra': version.metadata.get('extra', {}), 'size': version.size if version.size is not None else 9966699, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': list( file_node.tags.filter(system=False).values_list('name', flat=True)) if not file_node._state.adding else [], # Only access ManyRelatedManager if saved 'file_guid': file_node.get_guid()._id, 'file_id': file_node._id, 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, 'checkout_user': file_node.checkout._id if file_node.checkout else None, 'pre_reg_checkout': is_pre_reg_checkout(node, file_node), 'timestamp_verify_result': verify_result['verify_result'], 'timestamp_verify_result_title': verify_result['verify_result_title'], }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_view_file(auth, node, file_node, version): # TODO: resolve circular import issue from addons.wiki import settings as wiki_settings if isinstance(version, tuple): version, error = version error = error.replace('\n', '').strip() else: error = None ret = serialize_node(node, auth, primary=True) if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids: node.file_guid_to_share_uuids[file_node._id + '-' + version._id] = uuid.uuid4() node.save() if ret['user']['can_edit']: sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' + version._id]) else: sharejs_uuid = None internal_furl = furl.furl(settings.INTERNAL_DOMAIN) download_url = furl.furl(request.url.encode('utf-8')).set( netloc=internal_furl.netloc, args=dict(request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', 'public_file': node.is_public, }) ) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set( path=['render'], args={'url': download_url.url} ) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(auth.user, 25), 'files': node.web_url_for('collect_file_trees'), 'archived_from': get_archived_from_url(node, file_node) if node.is_registration else None, }, 'error': error, 'file_name': file_node.name, 'file_name_title': os.path.splitext(file_node.name)[0], 'file_name_ext': os.path.splitext(file_node.name)[1], 'version_id': version.identifier, 'file_path': file_node.path, 'sharejs_uuid': sharejs_uuid, 'provider': file_node.provider, 'materialized_path': file_node.materialized_path, 'extra': version.metadata.get('extra', {}), 'size': version.size if version.size is not None else 9966699, 'private': getattr(node.get_addon(file_node.provider), 'is_private', False), 'file_tags': list(file_node.tags.filter(system=False).values_list('name', flat=True)) if not file_node._state.adding else [], # Only access ManyRelatedManager if saved 'file_guid': file_node.get_guid()._id, 'file_id': file_node._id, 'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE, 'checkout_user': file_node.checkout._id if file_node.checkout else None, 'pre_reg_checkout': is_pre_reg_checkout(node, file_node), }) ret.update(rubeus.collect_addon_assets(node)) return ret