diff --git a/swift/common/middleware/swift3.py b/swift/common/middleware/swift3.py index 39da35665f..45fd662dd9 100644 --- a/swift/common/middleware/swift3.py +++ b/swift/common/middleware/swift3.py @@ -435,17 +435,6 @@ class Swift3Middleware(object): return BucketController, d return ServiceController, d - def get_account_info(self, env, req): - try: - account, user, _junk = \ - req.headers['Authorization'].split(' ')[-1].split(':') - except Exception: - return None, None - - h = canonical_string(req) - token = base64.urlsafe_b64encode(h) - return '%s:%s' % (account, user), token - def __call__(self, env, start_response): req = Request(env) @@ -459,17 +448,22 @@ class Swift3Middleware(object): if not 'Authorization' in req.headers: return self.app(env, start_response) + + try: + account, signature = \ + req.headers['Authorization'].split(' ')[-1].rsplit(':', 1) + except Exception: + return get_err_response('InvalidArgument')(env, start_response) + try: controller, path_parts = self.get_controller(req.path) except ValueError: return get_err_response('InvalidURI')(env, start_response) - account_name, token = self.get_account_info(env, req) - if not account_name: - return get_err_response('InvalidArgument')(env, start_response) + token = base64.urlsafe_b64encode(canonical_string(req)) + + controller = controller(env, self.app, account, token, **path_parts) - controller = controller(env, self.app, account_name, token, - **path_parts) if hasattr(controller, req.method): res = getattr(controller, req.method)(env, start_response) else: diff --git a/test/unit/common/middleware/test_swift3.py b/test/unit/common/middleware/test_swift3.py index 8d88da8332..8e765bf352 100644 --- a/test/unit/common/middleware/test_swift3.py +++ b/test/unit/common/middleware/test_swift3.py @@ -594,5 +594,25 @@ class TestSwift3(unittest.TestCase): self.assertEquals(swift3.canonical_string(req2), swift3.canonical_string(req3)) + def test_signed_urls(self): + class FakeApp(object): + def __call__(self, env, start_response): + self.req = Request(env) + start_response('200 OK') + start_response([]) + app = FakeApp() + local_app = swift3.filter_factory({})(app) + req = Request.blank('/bucket/object?Signature=X&Expires=Y&' + 'AWSAccessKeyId=Z', environ={'REQUEST_METHOD': 'PUT'}, + headers={'Authorization': 'AWS test:tester:hmac', + 'Content-MD5': 'ffoHqOWd280dyE1MT4KuoQ=='}) + req.date = datetime.now() + print req.GET + req.content_type = 'text/plain' + resp = local_app(req.environ, lambda *args: None) + print ''.join(resp) + self.assertEquals(app.req.headers['Authorization'], 'AWS Z:X') + self.assertEquals(app.req.headers['Date'], 'Y') + if __name__ == '__main__': unittest.main()