Ejemplo n.º 1
0
def fetch_archived(req):
    try:
        nid = node_id_from_req_path(req)
    except ValueError:
        return 400

    node = q(Content).get(nid)

    archive = get_archive_for_node(node)
    if archive:
        try:
            archive.fetch_file_from_archive(node)
        except:
            logg.exception(
                "exception in fetch_file_from_archive for archive %s",
                archive.archive_type)
            msg = "fetch archive for node failed"
            req.setStatus(500)
            req.write(msg)
        else:
            req.write('done')
    else:
        msg = "archive for node not found"
        req.setStatus(404)
        req.write(msg)
        logg.warn(msg)

    db.session.commit()
Ejemplo n.º 2
0
def fetch_archived(req):
    try:
        nid = node_id_from_req_path(req)
    except ValueError:
        return 400

    node = q(Content).get(nid)

    archive = get_archive_for_node(node)
    if archive:
        try:
            archive.fetch_file_from_archive(node)
        except:
            logg.exception("exception in fetch_file_from_archive for archive %s", archive.archive_type)
            msg = "fetch archive for node failed"
            req.setStatus(500)
            req.write(msg)
        else:
            req.write('done')
    else:
        msg = "archive for node not found"
        req.setStatus(404)
        req.write(msg)
        logg.warn(msg)

    db.session.commit()
Ejemplo n.º 3
0
    def _prepareData(self, req):
        obj = prepare_node_data(self, req)
        if obj["deleted"]:
            # no more processing needed if this object version has been deleted
            # rendering has been delegated to current version
            return obj

        obj["highres_url"] = None

        can_see_original = self.has_data_access()

        use_flash_zoom = config.getboolean("image.use_flash_zoom",
                                           True) and self.should_use_zoom
        image_url = '/fullsize?id=%d' % self.id if use_flash_zoom else '/image/%d' % self.id
        image_url = self._add_version_tag_to_url(image_url)

        archive = get_archive_for_node(self)
        if archive:
            if can_see_original:
                obj['highres_url'] = u"/file/{nid}/{nid}.tif".format(
                    nid=self.id)
                archive_state = archive.get_file_state(self)
                if archive_state == Archive.NOT_PRESENT:
                    obj['archive_fetch_url'] = u"/archive/{}".format(self.id)
                elif archive_state == Archive.PENDING:
                    obj['archive_fetch_url'] = u"pending"
                elif archive_state == Archive.PRESENT:
                    obj['archive_fetch_url'] = None

        files, sum_size = filebrowser(self, req)

        obj['canseeoriginal'] = can_see_original
        obj['preferred_image_url'] = self.preferred_image_url
        obj["image_formats"] = self.get_image_formats()
        obj['zoom'] = self.zoom_available
        obj['image_url'] = image_url
        obj['attachment'] = files
        obj['sum_size'] = sum_size
        obj['presentation_url'] = self.presentation_url
        obj['fullsize'] = str(self.id)
        if not self.isActiveVersion():
            obj['tag'] = self.tag
            obj['fullsize'] += "&v=" + self.tag
        obj['fullsize'] = '"' + obj['fullsize'] + '"'

        full_style = req.args.get(u"style", u"full_standard")
        if full_style:
            obj['style'] = full_style

        return obj
Ejemplo n.º 4
0
    def _prepareData(self, req):
        obj = prepare_node_data(self, req)
        if obj["deleted"]:
            # no more processing needed if this object version has been deleted
            # rendering has been delegated to current version
            return obj

        obj["highres_url"] = None

        can_see_original = self.has_data_access()

        use_flash_zoom = config.getboolean("image.use_flash_zoom", True) and self.should_use_zoom
        image_url = '/fullsize?id=%d' % self.id if use_flash_zoom else '/image/%d' % self.id
        image_url = self._add_version_tag_to_url(image_url)

        archive = get_archive_for_node(self)
        if archive:
            if can_see_original:
                obj['highres_url'] = u"/file/{nid}/{nid}.tif".format(nid=self.id)
                archive_state = archive.get_file_state(self)
                if archive_state == Archive.NOT_PRESENT:
                    obj['archive_fetch_url'] = u"/archive/{}".format(self.id)
                elif archive_state == Archive.PENDING:
                    obj['archive_fetch_url'] = u"pending"
                elif archive_state == Archive.PRESENT:
                    obj['archive_fetch_url'] = None

        files, sum_size = filebrowser(self, req)

        obj['canseeoriginal'] = can_see_original
        obj['preferred_image_url'] = self.preferred_image_url
        obj["image_formats"] = self.get_image_formats()
        obj['zoom'] = self.zoom_available
        obj['image_url'] = image_url
        obj['attachment'] = files
        obj['sum_size'] = sum_size
        obj['presentation_url'] = self.presentation_url
        obj['fullsize'] = str(self.id)
        if not self.isActiveVersion():
            obj['tag'] = self.tag
            obj['fullsize'] += "&v=" + self.tag
        obj['fullsize'] = '"' + obj['fullsize'] + '"'

        full_style = req.args.get(u"style", u"full_standard")
        if full_style:
            obj['style'] = full_style

        return obj
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
def test_get_archive_for_node(fake_archive):
    node = Munch(system_attrs=Munch(archive_type=u"test"))
    archive = get_archive_for_node(node)
    assert archive is fake_archive
Ejemplo n.º 7
0
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