From 0f6b993af2bbb1a64f390c2ff1c2702cd5333d71 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mat=C3=ADas=20Aguirre?= Date: Mon, 20 Jun 2011 23:58:25 -0300 Subject: [PATCH] Force username field limit when generating username. Closes gh-93 --- social_auth/backends/__init__.py | 36 +++++++++++++------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/social_auth/backends/__init__.py b/social_auth/backends/__init__.py index ce3046d..4aa8de0 100644 --- a/social_auth/backends/__init__.py +++ b/social_auth/backends/__init__.py @@ -77,6 +77,7 @@ FORCE_RANDOM_USERNAME = _setting('SOCIAL_AUTH_FORCE_RANDOM_USERNAME', False) USERNAME_FIXER = _setting('SOCIAL_AUTH_USERNAME_FIXER', lambda u: u) DEFAULT_USERNAME = _setting('SOCIAL_AUTH_DEFAULT_USERNAME') CHANGE_SIGNAL_ONLY = _setting('SOCIAL_AUTH_CHANGE_SIGNAL_ONLY', False) +UUID_LENGHT = _setting('SOCIAL_AUTH_UUID_LENGTH', 16) class SocialAuthBackend(ModelBackend): @@ -156,12 +157,12 @@ class SocialAuthBackend(ModelBackend): setting is True, then username will be a random USERNAME_MAX_LENGTH chars uuid generated hash """ - def get_random_username(): - """Return hash from unique string cut at username max length""" - return uuid4().get_hex()[:USERNAME_MAX_LENGTH] + def mk_uuid(): + """Return hash from unique string""" + return uuid4().get_hex() if FORCE_RANDOM_USERNAME: - username = get_random_username() + username = mk_uuid() elif USERNAME in details: username = details[USERNAME] elif DEFAULT_USERNAME: @@ -169,31 +170,24 @@ class SocialAuthBackend(ModelBackend): if callable(username): username = username() else: - username = None - username = username or get_random_username() + username = mk_uuid() - name = username + short_username = username[:USERNAME_MAX_LENGTH - UUID_LENGHT] final_username = None - while not final_username: + while True: + final_username = USERNAME_FIXER(username)[:USERNAME_MAX_LENGTH] + try: - fixed_name = USERNAME_FIXER(name) - User.objects.get(username=fixed_name) + User.objects.get(username=final_username) except User.DoesNotExist: - final_username = fixed_name + break else: # User with same username already exists, generate a unique # username for current user using username as base but adding - # a unique hash at the end. - # - # Generate an uuid number but keep only the needed to avoid - # breaking the field max_length value, this reduces the - # uniqueness, but it's less likely to happen repetitions than - # increasing an index. - uuid_length = getattr(settings, 'SOCIAL_AUTH_UUID_LENGTH', 16) - if len(username) + uuid_length > USERNAME_MAX_LENGTH: - username = username[:USERNAME_MAX_LENGTH - uuid_length] - name = username + uuid4().get_hex()[:uuid_length] + # a unique hash at the end. Original username is cut to avoid + # the field max_length. + username = short_username + mk_uuid()[:UUID_LENGHT] return final_username -- 2.39.5