From 80d29c626093e2304ffab41adc617da948d042e8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mat=C3=ADas=20Aguirre?= Date: Wed, 19 Jan 2011 12:12:47 -0200 Subject: [PATCH] Added 'enabled' checking to backends --- social_auth/backends/__init__.py | 24 +++++++++++++++++++++--- social_auth/backends/contrib/orkut.py | 6 ++---- social_auth/backends/facebook.py | 7 +++++++ social_auth/backends/google.py | 12 ++++++------ social_auth/backends/twitter.py | 6 ++---- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/social_auth/backends/__init__.py b/social_auth/backends/__init__.py index aade8a9..b513870 100644 --- a/social_auth/backends/__init__.py +++ b/social_auth/backends/__init__.py @@ -273,6 +273,11 @@ class BaseAuth(object): otherwise return false.""" return True + @classmethod + def enabled(cls): + """Return backend enabled status, all enabled by default""" + return True + class OpenIdAuth(BaseAuth): """ @@ -393,6 +398,8 @@ class ConsumerBasedOAuth(BaseOAuth): ACCESS_TOKEN_URL = '' SERVER_URL = '' AUTH_BACKEND = None + SETTINGS_KEY_NAME = '' + SETTINGS_SECRET_NAME = '' def auth_url(self): """Returns redirect url""" @@ -477,9 +484,17 @@ class ConsumerBasedOAuth(BaseOAuth): def get_key_and_secret(self): """Return tuple with Consumer Key and Consumer Secret for current - service provider. Must return (key, secret), order must be respected. + service provider. Must return (key, secret), order *must* be respected. """ - raise NotImplementedError('Implement in subclass') + return getattr(settings, self.SETTINGS_KEY_NAME), \ + getattr(settings, self.SETTINGS_SECRET_NAME) + + @classmethod + def enabled(cls): + """Return backend enabled status by checking basic settings""" + return all(hasattr(settings, name) for name in + (cls.SETTINGS_KEY_NAME, + cls.SETTINGS_SECRET_NAME)) # import sources from where check for auth backends @@ -502,7 +517,10 @@ def get_backends(): try: name = basename(name).replace('.py', '') sub = import_module(mod_name + '.' + name) - backends.update(sub.BACKENDS) + # register only enabled backends + backends.update(((key, val) + for key, val in sub.BACKENDS.items() + if val.enabled())) except (ImportError, AttributeError): pass return backends diff --git a/social_auth/backends/contrib/orkut.py b/social_auth/backends/contrib/orkut.py index 9356063..1acae12 100644 --- a/social_auth/backends/contrib/orkut.py +++ b/social_auth/backends/contrib/orkut.py @@ -43,6 +43,8 @@ class OrkutBackend(OAuthBackend): class OrkutAuth(BaseGoogleOAuth): """Orkut OAuth authentication mechanism""" AUTH_BACKEND = OrkutBackend + SETTINGS_KEY_NAME = 'ORKUT_CONSUMER_KEY' + SETTINGS_SECRET_NAME = 'ORKUT_CONSUMER_SECRET' def user_data(self, access_token): """Loads user data from Orkut service""" @@ -63,10 +65,6 @@ class OrkutAuth(BaseGoogleOAuth): except (simplejson.JSONDecodeError, KeyError): return None - def get_key_and_secret(self): - """Return Orkut Consumer Key and Consumer Secret pair""" - return settings.ORKUT_CONSUMER_KEY, settings.ORKUT_CONSUMER_SECRET - # Backend definition BACKENDS = { diff --git a/social_auth/backends/facebook.py b/social_auth/backends/facebook.py index eff17d6..1731ab6 100644 --- a/social_auth/backends/facebook.py +++ b/social_auth/backends/facebook.py @@ -79,6 +79,13 @@ class FacebookAuth(BaseOAuth): except simplejson.JSONDecodeError: return None + @classmethod + def enabled(cls): + """Return backend enabled status by checking basic settings""" + return all(hasattr(settings, name) for name in + ('FACEBOOK_APP_ID', + 'FACEBOOK_API_SECRET')) + # Backend definition BACKENDS = { diff --git a/social_auth/backends/google.py b/social_auth/backends/google.py index c2a1249..ac4a1df 100644 --- a/social_auth/backends/google.py +++ b/social_auth/backends/google.py @@ -77,14 +77,12 @@ class BaseGoogleOAuth(ConsumerBasedOAuth): """Loads user data from G service""" raise NotImplementedError('Implement in subclass') - def get_key_and_secret(self): - """Return Consumer Key and Consumer Secret pair""" - raise NotImplementedError('Implement in subclass') - class GoogleOAuth(BaseGoogleOAuth): """Google OAuth authorization mechanism""" AUTH_BACKEND = GoogleOAuthBackend + SETTINGS_KEY_NAME = 'GOOGLE_CONSUMER_KEY' + SETTINGS_SECRET_NAME = 'GOOGLE_CONSUMER_SECRET' def user_data(self, access_token): """Loads user data data from googleapis service, only email so far @@ -122,8 +120,10 @@ class GoogleOAuth(BaseGoogleOAuth): registered and a security badge is displayed on authorization page. http://code.google.com/apis/accounts/docs/OAuth_ref.html#SigningOAuth """ - return getattr(settings, 'GOOGLE_CONSUMER_KEY', 'anonymous'), \ - getattr(settings, 'GOOGLE_CONSUMER_SECRET', 'anonymous') + try: + return super(GoogleOAuth, self).get_key_and_secret() + except AttributeError: + return 'anonymous', 'anonymous' # Backend definition diff --git a/social_auth/backends/twitter.py b/social_auth/backends/twitter.py index 04c47e3..299d949 100644 --- a/social_auth/backends/twitter.py +++ b/social_auth/backends/twitter.py @@ -44,6 +44,8 @@ class TwitterAuth(ConsumerBasedOAuth): ACCESS_TOKEN_URL = TWITTER_ACCESS_TOKEN_URL SERVER_URL = TWITTER_SERVER AUTH_BACKEND = TwitterBackend + SETTINGS_KEY_NAME = 'TWITTER_CONSUMER_KEY' + SETTINGS_SECRET_NAME = 'TWITTER_CONSUMER_SECRET' def user_data(self, access_token): """Return user data provided""" @@ -54,10 +56,6 @@ class TwitterAuth(ConsumerBasedOAuth): except simplejson.JSONDecodeError: return None - def get_key_and_secret(self): - """Return Twitter Consumer Key and Consumer Secret pair""" - return settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET - # Backend definition BACKENDS = { -- 2.39.5