149 lines
5.1 KiB
Python
149 lines
5.1 KiB
Python
class AppSettings(object):
|
|
def __init__(self, prefix):
|
|
self.prefix = prefix
|
|
|
|
def _setting(self, name, dflt):
|
|
from allauth.utils import get_setting
|
|
|
|
return get_setting(self.prefix + name, dflt)
|
|
|
|
@property
|
|
def QUERY_EMAIL(self):
|
|
"""
|
|
Request email address from 3rd party account provider?
|
|
E.g. using OpenID AX
|
|
"""
|
|
from allauth.account import app_settings as account_settings
|
|
|
|
return self._setting("QUERY_EMAIL", account_settings.EMAIL_REQUIRED)
|
|
|
|
@property
|
|
def AUTO_SIGNUP(self):
|
|
"""
|
|
Attempt to bypass the signup form by using fields (e.g. username,
|
|
email) retrieved from the social account provider. If a conflict
|
|
arises due to a duplicate email signup form will still kick in.
|
|
"""
|
|
return self._setting("AUTO_SIGNUP", True)
|
|
|
|
@property
|
|
def PROVIDERS(self):
|
|
"""
|
|
Provider specific settings
|
|
"""
|
|
ret = self._setting("PROVIDERS", {})
|
|
oidc = ret.get("openid_connect")
|
|
if oidc:
|
|
ret["openid_connect"] = self._migrate_oidc(oidc)
|
|
return ret
|
|
|
|
def _migrate_oidc(self, oidc):
|
|
servers = oidc.get("SERVERS")
|
|
if servers is None:
|
|
return oidc
|
|
ret = {}
|
|
apps = []
|
|
for server in servers:
|
|
app = dict(**server["APP"])
|
|
app_settings = {}
|
|
if "token_auth_method" in server:
|
|
app_settings["token_auth_method"] = server["token_auth_method"]
|
|
app_settings["server_url"] = server["server_url"]
|
|
app.update(
|
|
{
|
|
"name": server.get("name", ""),
|
|
"provider_id": server["id"],
|
|
"settings": app_settings,
|
|
}
|
|
)
|
|
assert app["provider_id"]
|
|
apps.append(app)
|
|
ret["APPS"] = apps
|
|
return ret
|
|
|
|
@property
|
|
def EMAIL_REQUIRED(self):
|
|
"""
|
|
The user is required to hand over an email address when signing up
|
|
"""
|
|
from allauth.account import app_settings as account_settings
|
|
|
|
return self._setting("EMAIL_REQUIRED", account_settings.EMAIL_REQUIRED)
|
|
|
|
@property
|
|
def EMAIL_VERIFICATION(self):
|
|
"""
|
|
See email verification method
|
|
"""
|
|
from allauth.account import app_settings as account_settings
|
|
|
|
return self._setting("EMAIL_VERIFICATION", account_settings.EMAIL_VERIFICATION)
|
|
|
|
@property
|
|
def EMAIL_AUTHENTICATION(self):
|
|
"""Consider a scenario where a social login occurs, and the social
|
|
account comes with a verified email address (verified by the account
|
|
provider), but that email address is already taken by a local user
|
|
account. Additionally, assume that the local user account does not have
|
|
any social account connected. Now, if the provider can be fully trusted,
|
|
you can argue that we should treat this scenario as a login to the
|
|
existing local user account even if the local account does not already
|
|
have the social account connected, because -- according to the provider
|
|
-- the user logging in has ownership of the email address. This is how
|
|
this scenario is handled when `EMAIL_AUTHENTICATION` is set to
|
|
`True`. As this implies that an untrustworthy provider can login to any
|
|
local account by fabricating social account data, this setting defaults
|
|
to `False`. Only set it to `True` if you are using providers that can be
|
|
fully trusted.
|
|
"""
|
|
return self._setting("EMAIL_AUTHENTICATION", False)
|
|
|
|
@property
|
|
def EMAIL_AUTHENTICATION_AUTO_CONNECT(self):
|
|
"""In case email authentication is applied, this setting controls
|
|
whether or not the social account is automatically connected to the
|
|
local account. In case of ``False`` (the default) the local account
|
|
remains unchanged during the login. In case of ``True``, the social
|
|
account for which the email matched, is automatically added to the list
|
|
of social accounts connected to the local account. As a result, even if
|
|
the user were to change the email address afterwards, social login
|
|
would still be possible when using ``True``, but not in case of
|
|
``False``.
|
|
"""
|
|
return self._setting("EMAIL_AUTHENTICATION_AUTO_CONNECT", False)
|
|
|
|
@property
|
|
def ADAPTER(self):
|
|
return self._setting(
|
|
"ADAPTER",
|
|
"allauth.socialaccount.adapter.DefaultSocialAccountAdapter",
|
|
)
|
|
|
|
@property
|
|
def FORMS(self):
|
|
return self._setting("FORMS", {})
|
|
|
|
@property
|
|
def LOGIN_ON_GET(self):
|
|
return self._setting("LOGIN_ON_GET", False)
|
|
|
|
@property
|
|
def STORE_TOKENS(self):
|
|
return self._setting("STORE_TOKENS", False)
|
|
|
|
@property
|
|
def UID_MAX_LENGTH(self):
|
|
return 191
|
|
|
|
@property
|
|
def SOCIALACCOUNT_STR(self):
|
|
return self._setting("SOCIALACCOUNT_STR", None)
|
|
|
|
|
|
_app_settings = AppSettings("SOCIALACCOUNT_")
|
|
|
|
|
|
def __getattr__(name):
|
|
# See https://peps.python.org/pep-0562/
|
|
return getattr(_app_settings, name)
|