diff options
Diffstat (limited to 'src/hydrilla/proxy/policies/misc.py')
-rw-r--r-- | src/hydrilla/proxy/policies/misc.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/hydrilla/proxy/policies/misc.py b/src/hydrilla/proxy/policies/misc.py new file mode 100644 index 0000000..e789b29 --- /dev/null +++ b/src/hydrilla/proxy/policies/misc.py @@ -0,0 +1,110 @@ +# SPDX-License-Identifier: GPL-3.0-or-later + +# Miscellaneous policies. +# +# This file is part of Hydrilla&Haketilo. +# +# Copyright (C) 2022 Wojtek Kosior +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +# +# I, Wojtek Kosior, thereby promise not to sue for violation of this +# file's license. Although I request that you do not make use of this +# code in a proprietary program, I am not going to enforce this in +# court. + +""" +..... +""" + +import enum +import traceback as tb +import dataclasses as dc +import typing as t + +from abc import ABC, abstractmethod + +from .. import state +from .. import http_messages +from . import base +from .rule import AllowPolicy, BlockPolicy + + +class FallbackAllowPolicy(AllowPolicy): + priority = base.PolicyPriority._ONE + + def make_info_page(self, http_info: http_messages.FullHTTPInfo) \ + -> t.Optional[str]: + template = self._get_info_template( + 'js_fallback_allowed_info.html.jinja' + ) + return template.render(url=http_info.request_info.url.orig_url) + + +class FallbackBlockPolicy(BlockPolicy): + priority = base.PolicyPriority._ONE + + def make_info_page(self, http_info: http_messages.FullHTTPInfo) \ + -> t.Optional[str]: + template = self._get_info_template( + 'js_fallback_blocked_info.html.jinja' + ) + return template.render(url=http_info.request_info.url.orig_url) + + +@dc.dataclass(frozen=True) +class ErrorBlockPolicy(BlockPolicy): + error: Exception + + @property + def traceback(self) -> str: + lines = tb.format_exception(None, self.error, self.error.__traceback__) + return ''.join(lines) + + def make_info_page(self, http_info: http_messages.FullHTTPInfo) \ + -> t.Optional[str]: + template = self._get_info_template('js_error_blocked_info.html.jinja') + return template.render( + url = http_info.request_info.url.orig_url, + settings = self.haketilo_settings, + traceback = self.traceback + ) + + +class MitmItPagePolicy(base.Policy): + """ + A special policy class for handling of the magical mitm.it domain. It causes + request and response not to be modified in any way and also (unlike + FallbackAllowPolicy) prevents them from being streamed. + """ + _process_request = base.MsgProcessOpt.MUST + _process_response = base.MsgProcessOpt.MUST + anticache = False + + priority = base.PolicyPriority._THREE + + def consume_request(self, request_info: http_messages.RequestInfo) -> None: + return None + + def consume_response(self, http_info: http_messages.FullHTTPInfo) -> None: + return None + +@dc.dataclass(frozen=True, unsafe_hash=True) +class MitmItPagePolicyFactory(base.PolicyFactory): + builtin: bool = True + + def make_policy(self, haketilo_state: state.HaketiloState) \ + -> MitmItPagePolicy: + return MitmItPagePolicy(haketilo_state.get_settings()) |