def node_id_from_req_path(req): parts = splitpath(req.path) if not parts: raise ValueError("invalid node ID path '{}'".format(req.path)) nid = userinput.string_to_int(parts[0]) if nid is None: raise ValueError("path contains an invalid node ID: '{}'".format(req.path)) return nid
def popup_fullsize(req): nid = userinput.string_to_int(req.args.get("id", type=int)) if nid is None: return 400 node = q(Node).get(nid) if not isinstance(node, Node): return 404 version_id = req.params.get("v") version = node.get_tagged_version(unicode(version_id)) node_or_version = version if version else node return node_or_version.popup_fullsize(req)
def send_attfile(req): """send single attachment file to user""" parts = req.path[9:].split('/') if len(parts) < 2: return 400 nid = userinput.string_to_int(parts[0]) if nid is None: return 400 version_id = version_id_from_req(req) node = get_node_or_version(nid, version_id, Data) # XXX: why do we want to send attachments from containers? if (node is None or isinstance(node, Container) and not node.has_read_access() or isinstance(node, Content) and not node.has_data_access()): return 404 paths = ["/".join(parts[1:]), "/".join(parts[1:-1])] fileobjs = [fo for fo in node.files if fo.path in paths] if not fileobjs: return 404 fileobj = fileobjs[0] if fileobj.mimetype == u'inode/directory': # files in attachment directory cannot be found in node.files # so send file directly as it was made in mysql filename = clean_path("/".join(parts[1:])) path = os.path.join(config.get("paths.datadir"), filename) mime, type = getMimeType(filename) if (get_filesize(filename) > 16 * 1048576): req.reply_headers[ "Content-Disposition"] = 'attachment; filename="{}"'.format( filename) return req.sendFile(path, mime) if (fileobj.size > 16 * 1048576): req.reply_headers[ "Content-Disposition"] = u'attachment; filename="{}"'.format( fileobj.base_name).encode('utf8') return req.sendFile(fileobj.abspath, fileobj.mimetype)
def send_attfile(req): """send single attachment file to user""" parts = req.path[9:].split('/') if len(parts) < 2: return 400 nid = userinput.string_to_int(parts[0]) if nid is None: return 400 version_id = version_id_from_req(req) node = get_node_or_version(nid, version_id, Data) # XXX: why do we want to send attachments from containers? if (node is None or isinstance(node, Container) and not node.has_read_access() or isinstance(node, Content) and not node.has_data_access()): return 404 paths = ["/".join(parts[1:]), "/".join(parts[1:-1])] fileobjs = [fo for fo in node.files if fo.path in paths] if not fileobjs: return 404 fileobj = fileobjs[0] if fileobj.mimetype == u'inode/directory': # files in attachment directory cannot be found in node.files # so send file directly as it was made in mysql filename = clean_path("/".join(parts[1:])) path = os.path.join(config.get("paths.datadir"), filename) mime, type = getMimeType(filename) if (get_filesize(filename) > 16 * 1048576): req.reply_headers["Content-Disposition"] = 'attachment; filename="{}"'.format(filename) return req.sendFile(path, mime) if (fileobj.size > 16 * 1048576): req.reply_headers["Content-Disposition"] = u'attachment; filename="{}"'.format(fileobj.base_name).encode('utf8') return req.sendFile(fileobj.abspath, fileobj.mimetype)
def send_file(req): parts = splitpath(req.path) if len(parts) != 2: return 400 nidstr, filename = parts if nidstr.endswith("_transfer.zip"): nidstr = nidstr[:-13] nid = userinput.string_to_int(nidstr) if nid is None: return 400 version_id = version_id_from_req(req) node = get_node_or_version(nid, version_id) if (node is None or isinstance(node, Container) and not node.has_read_access() or isinstance(node, Content) and not node.has_data_access()): return 404 def _send_attachment(filepath, mimetype): file_ext = os.path.splitext(filepath)[1] if existMetaField(node.schema, u'nodename'): display_file_name = u'{}{}'.format(os.path.splitext(os.path.basename(node.name))[0], file_ext) else: display_file_name = filename try: display_file_name.encode('ascii') except UnicodeEncodeError: req.reply_headers["Content-Disposition"] = u'attachment; filename="{0}"; filename*=UTF-8\'\'{0}'.\ format(quote(display_file_name.encode('utf8'))) else: req.reply_headers["Content-Disposition"] = u'attachment; filename="{}"'.format(display_file_name) return req.sendFile(filepath, mimetype) if filename is None: # build zip-file and return it with tempfile.NamedTemporaryFile() as tmpfile: files_written = build_transferzip(tmpfile, node) if files_written == 0: return 404 # don't enable nginx x_accel_redirect for temporary files return req.sendFile(tmpfile.name, "application/zip", nginx_x_accel_redirect_enabled=False) # try full filename for f in node.files: if f.base_name == filename: return _send_attachment(f.abspath, f.mimetype) archive = get_archive_for_node(node) if archive: filepath = archive.get_local_filepath(node) mimetype, _ = getMimeType(filepath) return _send_attachment(filepath, mimetype) else: # try only extension file_ext = os.path.splitext(filename)[1] for f in node.files: if os.path.splitext(f.base_name)[1] == file_ext and f.filetype in [u'document', u'original', u'mp3']: logg.warn("serving file %s for node %s only by matched extension", f.path, node.id) return _send_attachment(f.abspath, f.mimetype) return 404
def send_file(req): parts = splitpath(req.path) if len(parts) != 2: return 400 nidstr, filename = parts if nidstr.endswith("_transfer.zip"): nidstr = nidstr[:-13] nid = userinput.string_to_int(nidstr) if nid is None: return 400 version_id = version_id_from_req(req) node = get_node_or_version(nid, version_id) if (node is None or isinstance(node, Container) and not node.has_read_access() or isinstance(node, Content) and not node.has_data_access()): return 404 def _send_attachment(filepath, mimetype): file_ext = os.path.splitext(filepath)[1] if existMetaField(node.schema, u'nodename'): display_file_name = u'{}{}'.format( os.path.splitext(os.path.basename(node.name))[0], file_ext) else: display_file_name = filename req.reply_headers[ "Content-Disposition"] = u'attachment; filename="{}"'.format( display_file_name) return req.sendFile(filepath, mimetype) if filename is None: # build zip-file and return it with tempfile.NamedTemporaryFile() as tmpfile: files_written = build_transferzip(tmpfile, node) if files_written == 0: return 404 return req.sendFile(tmpfile.name, "application/zip") # try full filename for f in node.files: if f.base_name == filename: return _send_attachment(f.abspath, f.mimetype) archive = get_archive_for_node(node) if archive: filepath = archive.get_local_filepath(node) mimetype, _ = getMimeType(filepath) return _send_attachment(filepath, mimetype) else: # try only extension file_ext = os.path.splitext(filename)[1] for f in node.files: if os.path.splitext(f.base_name)[1] == file_ext and f.filetype in [ u'document', u'original', u'mp3' ]: logg.warn( "serving file %s for node %s only by matched extension", f.path, node.id) return _send_attachment(f.abspath, f.mimetype) return 404