aboutsummaryrefslogtreecommitdiff
path: root/src/hydrilla/proxy/policies/payload.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/hydrilla/proxy/policies/payload.py')
-rw-r--r--src/hydrilla/proxy/policies/payload.py52
1 files changed, 38 insertions, 14 deletions
diff --git a/src/hydrilla/proxy/policies/payload.py b/src/hydrilla/proxy/policies/payload.py
index a063c7c..1069c41 100644
--- a/src/hydrilla/proxy/policies/payload.py
+++ b/src/hydrilla/proxy/policies/payload.py
@@ -60,6 +60,20 @@ class PayloadAwarePolicy(base.Policy):
return f'{request_url.url_without_path}/{"/".join(base_path_segments)}/'
+ def _payload_details_to_signed_query_string(
+ self,
+ _salt: str,
+ **extra_keys: str
+ ) -> str:
+ params: t.Mapping[str, str] = {
+ 'payload_id': self.payload_data.ref.id,
+ **extra_keys
+ }
+
+ serializer = URLSafeSerializer(self.payload_data.global_secret, _salt)
+
+ return urlencode({'details': serializer.dumps(params)})
+
@dc.dataclass(frozen=True) # type: ignore[misc]
class PayloadAwarePolicyFactory(base.PolicyFactory):
@@ -283,20 +297,18 @@ class AutoPayloadInjectPolicy(PayloadInjectPolicy):
return super().consume_response(response_info)
except (state.RepoCommunicationError, state.FileInstallationError,
_PayloadHasProblemsError) as ex:
- params = {
- 'next_url': response_info.url.orig_url,
- 'payload_id': self.payload_data.ref.id
+ extra_params: dict[str, str] = {
+ 'next_url': response_info.url.orig_url
}
-
if isinstance(ex, state.FileInstallationError):
- params['repo_id'] = ex.repo_id
- params['file_sha256'] = ex.sha256
+ extra_params['repo_id'] = ex.repo_id
+ extra_params['file_sha256'] = ex.sha256
- serializer = URLSafeSerializer(
- self.payload_data.global_secret,
- salt = 'auto_install_error'
+ query = self._payload_details_to_signed_query_string(
+ _salt = 'auto_install_error',
+ **extra_params
)
- query = urlencode({'details': serializer.dumps(params)})
+
redirect_url = 'https://hkt.mitm.it/auto_install_error?' + query
msg = 'Error occured when installing payload. Redirecting.'
@@ -310,13 +322,25 @@ class AutoPayloadInjectPolicy(PayloadInjectPolicy):
@dc.dataclass(frozen=True)
class PayloadSuggestPolicy(PayloadAwarePolicy):
"""...."""
+ process_request: t.ClassVar[bool] = True
+
priority: t.ClassVar[base.PolicyPriority] = base.PolicyPriority._ONE
- def make_response(self, request_info: http_messages.RequestInfo) \
+ def consume_request(self, request_info: http_messages.RequestInfo) \
-> http_messages.ProducedResponse:
- """...."""
- # TODO: implement
- return http_messages.ProducedResponse(200, ((b'a', b'b'),), b'')
+ query = self._payload_details_to_signed_query_string(
+ _salt = 'package_suggestion',
+ next_url = request_info.url.orig_url
+ )
+
+ redirect_url = 'https://hkt.mitm.it/package_suggestion?' + query
+ msg = 'A package was found that could be used on this site. Redirecting.'
+
+ return http_messages.ProducedResponse(
+ status_code = 303,
+ headers = [(b'Location', redirect_url.encode())],
+ body = msg.encode()
+ )
@dc.dataclass(frozen=True, unsafe_hash=True)