From bca22678c0dd4777e3761127f567b32f0e08786a Mon Sep 17 00:00:00 2001 From: Garrett Holmstrom Date: Wed, 22 Apr 2015 11:56:32 -0700 Subject: [PATCH] Move AWS auth handlers to their own module --- requestbuilder/auth/__init__.py | 52 +++++++++++++++++++++++++ requestbuilder/{auth.py => auth/aws.py} | 36 ++--------------- 2 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 requestbuilder/auth/__init__.py rename requestbuilder/{auth.py => auth/aws.py} (96%) diff --git a/requestbuilder/auth/__init__.py b/requestbuilder/auth/__init__.py new file mode 100644 index 0000000..44b2a17 --- /dev/null +++ b/requestbuilder/auth/__init__.py @@ -0,0 +1,52 @@ +# Copyright (c) 2012-2015, Eucalyptus Systems, Inc. +# +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import absolute_import + +import logging +import warnings + + +class BaseAuth(object): + ''' + Basis for all authentication + + This class does nothing on its own. It is up to you to implement the + necessary functions to effect an authentication scheme. + ''' + ARGS = [] + + def __init__(self, config, loglevel=None, **kwargs): + self.args = kwargs + self.config = config + self.log = logging.getLogger(self.__class__.__name__) + if loglevel is not None: + self.log.level = loglevel + + def configure(self): + pass + + def apply_to_request(self, request, service): + pass + + def bind_to_service(self, service): + def wrapped_apply_to_request(req): + return self.apply_to_request(req, service) or req + return wrapped_apply_to_request + + +# Compatibility with requestbuilder < 0.3 +from .aws import HmacKeyAuth +from .aws import HmacV1Auth as S3RestAuth +from .aws import QueryHmacV2Auth as QuerySigV2Auth diff --git a/requestbuilder/auth.py b/requestbuilder/auth/aws.py similarity index 96% rename from requestbuilder/auth.py rename to requestbuilder/auth/aws.py index 7aaa175..984b2a3 100644 --- a/requestbuilder/auth.py +++ b/requestbuilder/auth/aws.py @@ -21,7 +21,6 @@ import email.utils import hashlib import hmac import os -import logging import re import time import warnings @@ -30,6 +29,7 @@ import six import six.moves.urllib_parse as urlparse from requestbuilder import Arg +from requestbuilder.auth import BaseAuth from requestbuilder.exceptions import AuthError @@ -37,34 +37,6 @@ ISO8601 = '%Y-%m-%dT%H:%M:%SZ' ISO8601_BASIC = '%Y%m%dT%H%M%SZ' -class BaseAuth(object): - ''' - Basis for all authentication - - This class does nothing on its own. It is up to you to implement the - necessary functions to effect an authentication scheme. - ''' - ARGS = [] - - def __init__(self, config, loglevel=None, **kwargs): - self.args = kwargs - self.config = config - self.log = logging.getLogger(self.__class__.__name__) - if loglevel is not None: - self.log.level = loglevel - - def configure(self): - pass - - def apply_to_request(self, request, service): - pass - - def bind_to_service(self, service): - def wrapped_apply_to_request(req): - return self.apply_to_request(req, service) or req - return wrapped_apply_to_request - - class HmacKeyAuth(BaseAuth): ''' Basis for AWS HMAC-based authentication @@ -140,7 +112,7 @@ class HmacKeyAuth(BaseAuth): self.args['secret_key'] = config_secret_key -class S3RestAuth(HmacKeyAuth): +class HmacV1Auth(HmacKeyAuth): ''' S3 REST authentication http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html @@ -274,7 +246,7 @@ class S3RestAuth(HmacKeyAuth): return base64.b64encode(req_hmac.digest()) -class S3QueryAuth(S3RestAuth): +class QueryHmacV1Auth(HmacV1Auth): DEFAULT_TIMEOUT = 600 # 10 minutes def _update_request_before_signing(self, req): @@ -298,7 +270,7 @@ class S3QueryAuth(S3RestAuth): req.prepare_url(req.url, {'Signature': signature}) -class QuerySigV2Auth(HmacKeyAuth): +class QueryHmacV2Auth(HmacKeyAuth): ''' AWS signature version 2 http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html