def target_node(self): if self._target_node is not None: return self._target_node env_name = self.environment_identifier() if not env_name: conf.log.warning("Failed reading identifier") raise NodeError('Target node was invalid: env_name not found') project = Project.get(env_name=env_name) # env_name might be different from project.env_name! base_url = project.get_dav_url(relative=True) path_info = normalized_base_url(self.req.uri) project_id = project.id download_config = FilesDownloadConfig(project.env_name, base_url=base_url) if not path_info.startswith(download_config.base_url): raise NodeError('Target node was invalid: uri %s does not start with %s', path_info, base_url) self._download_config = download_config try: node_factory = MappedFileNode(project_id, download_config.base_path, download_config.base_url, download_config.downloads_dir) self._target_node = MappedFileNode.from_request_path_info(path_info, node_factory) except Exception as e: conf.log.warning("Not node %s", str(e)) raise NodeError('Target node was invalid: %s', str(e)) return self._target_node
def destination_node(self): if self._destination_node is not None: return self._destination_node # If req is a sub-request, req.main is the main request. destination = self._get_header('Destination') if destination: # Parse path from url try: encoded_destination = normalized_base_url(destination) destination = urllib.unquote(encoded_destination).decode('UTF-8') self._destination_node = MappedFileNode.from_request_path_info(destination, self.target_node) except Exception as e: raise NodeError('Destination node was invalid: %s'%str(e)) return self._destination_node
def process_request(self, req): """ Process request for listing, creating and removing projects """ files_core = FilesCoreComponent(self.env) timeline_notifier = FilesEventNotifier(self.env) node_factory, download_config = files_core.files_node_factory_and_config(req) if req.args.get('redirect') == 'downloads': req.perm.require('FILES_DOWNLOADS_VIEW') if download_config.downloads_dir == '': raise HTTPNotFound(_("The project doesn't have downloads directory.")) req.redirect(req.href.files(download_config.downloads_dir)) user_store = get_userstore() user = user_store.getUser(req.authname) env_name = download_config.env_name node = MappedFileNode.from_request_path_info(req.path_info, node_factory) open_in_mode_mode = '' filename = None if req.args.get('action') == 'open_in_mode': open_in_mode_mode = req.args.get('mode') if not node.exists(): if node.is_download() and node.download().is_available(): node.delete() raise HTTPNotFound(_("The file was not found!")) if req.method == 'POST' and not req.args.get('cancel'): # Each X_from_request or X_by_request method does permission check action = req.args.get('action') # need to delete a file? if action == 'delete_multiple' or action == 'delete': self.process_delete(action, node, node_factory, req, timeline_notifier) elif action == 'add_file': filename, open_in_mode_mode = self.process_add_file(node, req, timeline_notifier, user) elif action == 'move_multiple' or action == 'rename': self.process_move(action, node, node_factory, req, timeline_notifier, user) elif action == 'add_folder': try: new_dir = node.create_dir_from_request(req, user.id, timeline_notifier) if not new_dir: add_warning(req, _("No folder name was given")) else: filename = new_dir.filename open_in_mode_mode = 'show_mode' except TracError as e: add_warning(req, _("Error when creating a new directory: ") + str(e)) elif action == 'update': filename, open_in_mode_mode = self.process_update(node, node_factory, req, timeline_notifier, user) if node.is_dir(): if open_in_mode_mode: if not filename: filename = req.args.get('target') return self.show_dir(req, node, node_factory, files_core, user_store, target_filename=filename, current_mode=open_in_mode_mode) else: return self.show_dir(req, node, node_factory, files_core, user_store) elif node.is_file(): mimeview = Mimeview(self.env) try: node.show_file(req, mimeview, timeline_notifier) except InvalidOperationError as e: pass else: add_warning(req, _("Error was received when displaying the file")) parent_node = node.get_parent_dir() # Error was obtained return self.show_dir(req, parent_node, node_factory, files_core, user_store) else: raise TracError(_('Invalid filesystem node was requested'))
def process_request(self, req): """ Process request for listing, creating and removing projects """ files_core = FilesCoreComponent(self.env) timeline_notifier = FilesEventNotifier(self.env) node_factory, download_config = files_core.files_node_factory_and_config(req) if req.args.get("redirect") == "downloads": req.perm.require("FILES_DOWNLOADS_VIEW") if download_config.downloads_dir == "": raise HTTPNotFound(_("The project doesn't have downloads directory.")) req.redirect(req.href.files(download_config.downloads_dir)) user_store = get_userstore() user = user_store.getUser(req.authname) env_name = download_config.env_name node = MappedFileNode.from_request_path_info(req.path_info, node_factory) open_in_mode_mode = "" filename = None if req.args.get("action") == "open_in_mode": open_in_mode_mode = req.args.get("mode") if not node.exists(): if node.is_download() and node.download().is_available(): node.delete() raise HTTPNotFound(_("The file was not found!")) if req.method == "POST" and not req.args.get("cancel"): # Each X_from_request or X_by_request method does permission check action = req.args.get("action") # need to delete a file? if action == "delete_multiple" or action == "delete": self.process_delete(action, node, node_factory, req, timeline_notifier) elif action == "add_file": filename, open_in_mode_mode = self.process_add_file(node, req, timeline_notifier, user) elif action == "move_multiple" or action == "rename": self.process_move(action, node, node_factory, req, timeline_notifier, user) elif action == "add_folder": try: new_dir = node.create_dir_from_request(req, user.id, timeline_notifier) if not new_dir: add_warning(req, _("No folder name was given")) else: filename = new_dir.filename open_in_mode_mode = "show_mode" except TracError as e: add_warning(req, _("Error when creating a new directory: ") + str(e)) elif action == "update": filename, open_in_mode_mode = self.process_update(node, node_factory, req, timeline_notifier, user) if node.is_dir(): if open_in_mode_mode: if not filename: filename = req.args.get("target") return self.show_dir( req, node, node_factory, files_core, user_store, target_filename=filename, current_mode=open_in_mode_mode, ) else: return self.show_dir(req, node, node_factory, files_core, user_store) elif node.is_file(): mimeview = Mimeview(self.env) try: node.show_file(req, mimeview, timeline_notifier) except InvalidOperationError as e: pass else: add_warning(req, _("Error was received when displaying the file")) parent_node = node.get_parent_dir() # Error was obtained return self.show_dir(req, parent_node, node_factory, files_core, user_store) else: raise TracError(_("Invalid filesystem node was requested"))