35 lines
1.6 KiB
Python
35 lines
1.6 KiB
Python
"""
|
|
A custom Strategy for python-social-auth that allows us to fetch configuration from
|
|
ConfigurationModels rather than django.settings
|
|
"""
|
|
from .models import OAuth2ProviderConfig
|
|
from social.backends.oauth import BaseOAuth2
|
|
from social.strategies.django_strategy import DjangoStrategy
|
|
|
|
|
|
class ConfigurationModelStrategy(DjangoStrategy):
|
|
"""
|
|
A DjangoStrategy customized to load settings from ConfigurationModels
|
|
for upstream python-social-auth backends that we cannot otherwise modify.
|
|
"""
|
|
def setting(self, name, default=None, backend=None):
|
|
"""
|
|
Load the setting from a ConfigurationModel if possible, or fall back to the normal
|
|
Django settings lookup.
|
|
|
|
BaseOAuth2 subclasses will call this method for every setting they want to look up.
|
|
SAMLAuthBackend subclasses will call this method only after first checking if the
|
|
setting 'name' is configured via SAMLProviderConfig.
|
|
"""
|
|
if isinstance(backend, BaseOAuth2):
|
|
provider_config = OAuth2ProviderConfig.current(backend.name)
|
|
if not provider_config.enabled:
|
|
raise Exception("Can't fetch setting of a disabled backend/provider.")
|
|
try:
|
|
return provider_config.get_setting(name)
|
|
except KeyError:
|
|
pass
|
|
# At this point, we know 'name' is not set in a [OAuth2|SAML]ProviderConfig row.
|
|
# It's probably a global Django setting like 'FIELDS_STORED_IN_SESSION':
|
|
return super(ConfigurationModelStrategy, self).setting(name, default, backend)
|