From a8717a57a02d9741cabb1a2ed9d452174c49c763 Mon Sep 17 00:00:00 2001 From: Addison Schiller Date: Wed, 23 Aug 2017 14:36:21 -0400 Subject: [PATCH] Added a 'undecoded_url' variable to addon providers. Currently, a URL can get encoded and decoded many times. This can cause the original name of a file to be near impossible to figure out if it uses special characters. This variable will help solve this problem. --- waterbutler/core/provider.py | 1 + waterbutler/server/api/v1/provider/__init__.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/waterbutler/core/provider.py b/waterbutler/core/provider.py index 96eec1ac4..ff76b2172 100644 --- a/waterbutler/core/provider.py +++ b/waterbutler/core/provider.py @@ -99,6 +99,7 @@ def __init__(self, auth: dict, self.auth = auth self.credentials = credentials self.settings = settings + self.undecoded_path = None self.provider_metrics = MetricsRecord('provider') self.provider_metrics.add('auth', auth) diff --git a/waterbutler/server/api/v1/provider/__init__.py b/waterbutler/server/api/v1/provider/__init__.py index a9ec51620..08bb9c77e 100644 --- a/waterbutler/server/api/v1/provider/__init__.py +++ b/waterbutler/server/api/v1/provider/__init__.py @@ -62,8 +62,17 @@ async def prepare(self, *args, **kwargs): self.auth = await auth_handler.get(self.resource, provider, self.request) self.provider = utils.make_provider(provider, self.auth['auth'], self.auth['credentials'], self.auth['settings']) - self.path = await self.provider.validate_v1_path(self.path, **self.arguments) + # Find start of provider name, and start of ? marker and pull out file name from between them. + provider_index = self.request.uri.index(self.path_kwargs['provider'] + '/') + provider_length = (len(self.path_kwargs['provider'])) + end_of_path_index = self.request.uri.find('?') + # If there is no ? in uri, go to end of uri + if end_of_path_index == -1: + end_of_path_index = len(self.request.uri) + + self.provider.undecoded_path = self.request.uri[provider_index + provider_length: end_of_path_index] + self.path = await self.provider.validate_v1_path(self.path, **self.arguments) self.target_path = None # post-validator methods perform validations that expect that the path given in the url has