Exemple #1
0
    def __init__(self, *args, **kwargs):
        jinja_env = JinjaEnv(globals={'static_path': 'static'},
                             extensions=['jinja2.ext.i18n', 'jinja2.ext.with_'])

        kwargs['jinja_env'] = jinja_env
        super(UKWARewriter, self).__init__(*args, **kwargs)

        self.init_loc(jinja_env)
Exemple #2
0
    def __init__(self, framed_replay=False, jinja_env=None, config=None, paths=None):
        self.loader = ArcWarcRecordLoader()

        self.config = config or {}
        self.paths = paths or {}

        self.framed_replay = framed_replay

        if framed_replay:
            self.frame_mod = ''
            self.replay_mod = 'mp_'
        else:
            self.frame_mod = None
            self.replay_mod = ''

        self.default_rw = DefaultRewriter(replay_mod=self.replay_mod,
                                          config=config)

        self.js_proxy_rw = RewriterWithJSProxy(replay_mod=self.replay_mod)

        if not jinja_env:
            jinja_env = JinjaEnv(globals={'static_path': 'static'})

        self.jinja_env = jinja_env

        self.redirect_to_exact = config.get('redirect_to_exact')

        self.banner_view = BaseInsertView(self.jinja_env, self._html_templ('banner_html'))

        self.head_insert_view = HeadInsertView(self.jinja_env,
                                               self._html_templ('head_insert_html'),
                                               self.banner_view)

        self.frame_insert_view = TopFrameView(self.jinja_env,
                                               self._html_templ('frame_insert_html'),
                                               self.banner_view)

        self.error_view = BaseInsertView(self.jinja_env, self._html_templ('error_html'))
        self.not_found_view = BaseInsertView(self.jinja_env, self._html_templ('not_found_html'))
        self.query_view = BaseInsertView(self.jinja_env, self._html_templ('query_html'))

        self.use_js_obj_proxy = config.get('use_js_obj_proxy', True)

        self.cookie_tracker = None

        self.enable_memento = self.config.get('enable_memento')

        csp_header = self.config.get('csp-header', self.DEFAULT_CSP)
        if csp_header:
            self.csp_header = ('Content-Security-Policy', csp_header)
        else:
            self.csp_header = None

        # deprecated: Use X-Forwarded-Proto header instead!
        self.force_scheme = config.get('force_scheme')
Exemple #3
0
    def __init__(self,
                 framed_replay=False,
                 jinja_env=None,
                 config=None,
                 paths=None):
        """Initialize a new instance of RewriterApp

        :param bool framed_replay: Is rewriting happening in framed replay mode
        :param JinjaEnv|None jinja_env: Optional JinjaEnv instance to be used for
            rendering static files
        :param dict|None config: Optional config dictionary
        :param dict|None paths: Optional dictionary containing a mapping
            of path names to URLs
        """
        self.loader = ArcWarcRecordLoader()

        self.config = config or {}
        self.paths = paths or {}

        self.framed_replay = framed_replay

        if framed_replay:
            self.frame_mod = ''
            self.replay_mod = 'mp_'
        else:
            self.frame_mod = None
            self.replay_mod = ''

        self.enable_prefer = self.config.get('enable_prefer', False)

        self.default_rw = DefaultRewriter(replay_mod=self.replay_mod,
                                          config=config)

        self.js_proxy_rw = RewriterWithJSProxy(replay_mod=self.replay_mod)

        if not jinja_env:
            jinja_env = JinjaEnv(
                globals={'static_path': 'static'},
                extensions=['jinja2.ext.i18n', 'jinja2.ext.with_'])
            jinja_env.jinja_env.install_null_translations()

        self.jinja_env = jinja_env
        self.loc_map = {}

        self.jinja_env.init_loc(self.config.get('locales_root_dir'),
                                self.config.get('locales'), self.loc_map,
                                self.config.get('default_locale'))

        self.redirect_to_exact = config.get('redirect_to_exact')

        self.banner_view = BaseInsertView(self.jinja_env,
                                          self._html_templ('banner_html'))

        self.head_insert_view = HeadInsertView(
            self.jinja_env, self._html_templ('head_insert_html'),
            self.banner_view)

        self.frame_insert_view = TopFrameView(
            self.jinja_env, self._html_templ('frame_insert_html'),
            self.banner_view)

        self.error_view = BaseInsertView(self.jinja_env,
                                         self._html_templ('error_html'))
        self.not_found_view = BaseInsertView(
            self.jinja_env, self._html_templ('not_found_html'))
        self.query_view = BaseInsertView(self.jinja_env,
                                         self._html_templ('query_html'))

        self.use_js_obj_proxy = config.get('use_js_obj_proxy', True)

        self.cookie_tracker = self._init_cookie_tracker()

        self.enable_memento = self.config.get('enable_memento')

        self.static_prefix = self.config.get('static_prefix', 'static')

        csp_header = self.config.get('csp-header', self.DEFAULT_CSP)
        if csp_header:
            self.csp_header = ('Content-Security-Policy', csp_header)
        else:
            self.csp_header = None

        # deprecated: Use X-Forwarded-Proto header instead!
        self.force_scheme = config.get('force_scheme')
Exemple #4
0
    def init_jinja_env(self, config):
        assets_path = os.path.expandvars(config['assets_path'])
        packages = [os.environ.get('WR_TEMPLATE_PKG', 'webrecorder'), 'pywb']

        jinja_env_wrapper = JinjaEnv(assets_path=assets_path,
                                     packages=packages,
                                     env_template_params_key='webrec.template_params')

        jinja_env = jinja_env_wrapper.jinja_env

        jinja_env.globals['metadata'] = config.get('metadata', {})
        jinja_env.globals['static_path'] = 'static'

        def get_coll(context):
            return context.get('coll', '')

        def get_collection(context):
            coll = context.get('coll', '')
            coll_name = context.get('coll_name', '')
            user = get_user(context)
            return get_user(context).get_collection_by_id(coll, coll_name)

        def get_user(context):
            u = context.get('user', '')
            if not u:
                u = context.get('curr_user', '')
            return self.user_manager.all_users.make_user(u)

        def get_browsers():
            return self.browser_mgr.get_browsers()

        def get_app_host():
            return self.app_host or 'http://localhost:8089'

        def get_content_host():
            return self.content_host or 'http://localhost:8092'

        def get_num_collections():
            count = self.access.session_user.num_total_collections()
            return count

        def get_archives():
            return self.content_app.client_archives

        @contextfunction
        def is_public(context):
            return get_collection(context).is_public()

        @contextfunction
        def can_admin(context):
            return self.access.can_admin_coll(get_collection(context))

        @contextfunction
        def is_owner(context):
            res = self.access.is_curr_user(get_user(context))
            return res

        @contextfunction
        def can_write(context):
            res = self.access.can_write_coll(get_collection(context))
            return res

        @contextfunction
        def can_read(context):
            res = self.access.can_read_coll(get_collection(context))

        @contextfunction
        def is_anon(context):
            return self.access.session_user.is_anon()

        def get_announce_list():
            announce_list = os.environ.get('ANNOUNCE_MAILING_LIST', False)
            if announce_list:
                return announce_list
            return False

        @contextfunction
        def get_path(context, user, coll=None, rec=None):
            return self.get_path(user, coll, rec)

        @contextfunction
        def get_body_class(context, action):
            return self.get_body_class(context, action)

        @contextfunction
        def get_share_url(context):
            url = context.get('url')
            br = context.get('browser', '')
            user = context.get('user')
            coll = context.get('coll')
            host = self.app_host + ('' if self.app_host.endswith('/') else '/')
            ts = context.get('timestamp', '')

            if br != '':
                br = '$br:'+br

            return 'https://{host}{user}/{coll}/{ts}{browser}/{url}'.format(
                host=host,
                user=user,
                coll=coll,
                ts=ts,
                browser=br,
                url=url
            )

        @contextfunction
        def get_embed_url(context):
            host = self.app_host + ('' if self.app_host.endswith('/') else '/')
            url = context.get('url')
            br = context.get('browser', '')
            user = context.get('user')
            coll = context.get('coll')
            ts = context.get('timestamp', '')

            if br != '':
                br = '$br:'+br

            return 'https://{host}_embed/{user}/{coll}/{ts}{browser}/{url}'.format(
                host=host,
                user=user,
                coll=coll,
                ts=ts,
                browser=br,
                url=url
            )

        @contextfunction
        def get_recs_for_coll(context):
            collection = get_collection(context)

            return [{'ts': r['timestamp'], 'url': r['url'], 'br': r.get('browser', '')}
                    for r in collection.list_pages()]

        @contextfunction
        def is_out_of_space(context):
            return self.access.session_user.is_out_of_space()

        def trunc_url_expand(value):
            """ Truncate querystrings, appending an ellipses, expand on click
            """
            trunc_value = '?<span class="truncate-expand" aria-role="button" title="Click to expand" onclick="this.innerHTML=\''+value.split('?')[-1]+'\'; this.classList.add(\'open\');">...</span>'
            return re.sub(r'(\?.*)', trunc_value, value)

        def trunc_url(value):
            """ Truncate querystrings, appending an ellipses
            """
            return re.sub(r'(\?.*)', '?...', value)

        def urldecode(value):
            """ Decode url-encoded value
            """
            return unquote(value)


        jinja_env.globals['can_admin'] = can_admin
        jinja_env.globals['can_write'] = can_write
        jinja_env.globals['can_read'] = can_read
        #jinja_env.globals['can_tag'] = can_tag
        jinja_env.globals['is_owner'] = is_owner
        jinja_env.globals['is_anon'] = is_anon
        #jinja_env.globals['is_beta'] = is_beta
        jinja_env.globals['is_public'] = is_public
        jinja_env.globals['get_announce_list'] = get_announce_list
        jinja_env.globals['get_path'] = get_path
        jinja_env.globals['get_body_class'] = get_body_class
        jinja_env.globals['get_share_url'] = get_share_url
        jinja_env.globals['get_embed_url'] = get_embed_url
        jinja_env.globals['get_recs_for_coll'] = get_recs_for_coll
        jinja_env.globals['get_app_host'] = get_app_host
        jinja_env.globals['get_content_host'] = get_content_host
        jinja_env.globals['get_num_collections'] = get_num_collections
        jinja_env.globals['get_archives'] = get_archives
        jinja_env.globals['is_out_of_space'] = is_out_of_space
        jinja_env.globals['get_browsers'] = get_browsers
        #jinja_env.globals['is_extractable'] = is_extractable
        #jinja_env.globals['get_tags'] = get_tags
        #jinja_env.globals['is_tagged'] = is_tagged
        #jinja_env.globals['get_tags_in_collection'] = get_tags_in_collection
        jinja_env.filters['trunc_url'] = trunc_url
        jinja_env.filters['trunc_url_expand'] = trunc_url_expand
        jinja_env.filters['urldecode'] = urldecode

        return jinja_env_wrapper
    def init_jinja_env(self, config):
        assets_path = os.path.expandvars(config['assets_path'])
        packages = [os.environ.get('WR_TEMPLATE_PKG', 'webrecorder'), 'pywb']

        jinja_env_wrapper = JinjaEnv(
            assets_path=assets_path,
            packages=packages,
            env_template_params_key='webrec.template_params')

        jinja_env = jinja_env_wrapper.jinja_env

        jinja_env.globals['metadata'] = config.get('metadata', {})

        def get_coll(context):
            coll = context.get('coll_orig', '')
            if not coll:
                coll = context.get('coll', '')
            return coll

        def get_user(context):
            u = context.get('user', '')
            if not u:
                u = context.get('curr_user', '')
            return u

        def get_browsers():
            return self.browser_mgr.get_browsers()

        def get_tags():
            return self.manager.get_available_tags()

        def get_tags_in_collection(user, coll):
            return self.manager.get_tags_in_collection(user, coll)

        def get_app_host():
            return self.app_host

        def get_content_host():
            return self.content_host

        def get_num_collections():
            curr_user = self.manager.get_curr_user()
            count = self.manager.num_collections(curr_user) if curr_user else 0
            return count

        def get_archives():
            return self.content_app.client_archives

        def is_beta():
            return self.manager.is_beta()

        def can_tag():
            return self.manager.can_tag()

        def is_public(user, coll):
            return self.manager.is_public(user, coll)

        @contextfunction
        def can_admin(context):
            return self.manager.can_admin_coll(get_user(context),
                                               get_coll(context))

        @contextfunction
        def is_owner(context):
            return self.manager.is_owner(get_user(context))

        @contextfunction
        def can_write(context):
            res = self.manager.can_write_coll(get_user(context),
                                              get_coll(context))
            return res

        @contextfunction
        def can_read(context):
            return self.manager.can_read_coll(get_user(context),
                                              get_coll(context))

        @contextfunction
        def is_extractable(context):
            return self.manager.is_extractable(get_user(context),
                                               get_coll(context))

        @contextfunction
        def is_anon(context):
            return self.manager.is_anon(get_user(context))

        def get_announce_list():
            announce_list = os.environ.get('ANNOUNCE_MAILING_LIST', False)
            if announce_list:
                return announce_list
            return False

        @contextfunction
        def get_path(context, user, coll=None, rec=None):
            return self.get_path(user, coll, rec)

        @contextfunction
        def get_body_class(context, action):
            return self.get_body_class(context, action)

        @contextfunction
        def get_share_url(context):
            url = context.get('url')
            br = context.get('browser', '')
            user = context.get('user')
            coll = context.get('coll')
            host = self.app_host + ('' if self.app_host.endswith('/') else '/')
            ts = ''

            if br != '':
                br = '$br:' + br

            if context.get('curr_mode', '') in ('record'):
                ts = context.get('timestamp', '')
            else:
                ts = context.get('ts', '')

            return 'https://{host}{user}/{coll}/{ts}{browser}/{url}'.format(
                host=host, user=user, coll=coll, ts=ts, browser=br, url=url)

        @contextfunction
        def get_embed_url(context):
            host = self.app_host + ('' if self.app_host.endswith('/') else '/')
            url = context.get('url')
            br = context.get('browser', '')
            user = context.get('user')
            coll = context.get('coll')
            ts = ''

            if br != '':
                br = '$br:' + br

            if context.get('curr_mode', '') in ('record'):
                ts = context.get('timestamp', '')
            else:
                ts = context.get('ts', '')

            return 'https://{host}_embed/{user}/{coll}/{ts}{browser}/{url}'.format(
                host=host, user=user, coll=coll, ts=ts, browser=br, url=url)

        @contextfunction
        def get_recs_for_coll(context):
            user = context.get('user')
            coll = get_coll(context)
            return [{
                'ts': r['timestamp'],
                'url': r['url'],
                'br': r.get('browser', '')
            } for r in self.manager.list_coll_pages(user, coll)]

        @contextfunction
        def is_out_of_space(context):
            return self.manager.is_out_of_space(context.get('curr_user', ''))

        @contextfunction
        def is_tagged(context, bookmark_id):
            available = context.get('available_tags', [])
            tags = context.get('tags', [])

            for tag in available:
                if tag in tags and bookmark_id in tags[tag]:
                    return True
            return False

        def trunc_url(value):
            """ Truncate querystrings, appending an ellipses
            """
            return re.sub(r'(\?.*)', '?...', value)

        def urldecode(value):
            """ Decode url-encoded value
            """
            return unquote(value)

        jinja_env.globals['can_admin'] = can_admin
        jinja_env.globals['can_write'] = can_write
        jinja_env.globals['can_read'] = can_read
        jinja_env.globals['can_tag'] = can_tag
        jinja_env.globals['is_owner'] = is_owner
        jinja_env.globals['is_anon'] = is_anon
        jinja_env.globals['is_beta'] = is_beta
        jinja_env.globals['is_public'] = is_public
        jinja_env.globals['get_announce_list'] = get_announce_list
        jinja_env.globals['get_path'] = get_path
        jinja_env.globals['get_body_class'] = get_body_class
        jinja_env.globals['get_share_url'] = get_share_url
        jinja_env.globals['get_embed_url'] = get_embed_url
        jinja_env.globals['get_recs_for_coll'] = get_recs_for_coll
        jinja_env.globals['get_app_host'] = get_app_host
        jinja_env.globals['get_content_host'] = get_content_host
        jinja_env.globals['get_num_collections'] = get_num_collections
        jinja_env.globals['get_archives'] = get_archives
        jinja_env.globals['is_out_of_space'] = is_out_of_space
        jinja_env.globals['get_browsers'] = get_browsers
        jinja_env.globals['is_extractable'] = is_extractable
        jinja_env.globals['get_tags'] = get_tags
        jinja_env.globals['is_tagged'] = is_tagged
        jinja_env.globals['get_tags_in_collection'] = get_tags_in_collection
        jinja_env.filters['trunc_url'] = trunc_url
        jinja_env.filters['urldecode'] = urldecode

        return jinja_env_wrapper