Skip to content

Commit

Permalink
Force username field limit when generating username. Closes omabgh-93
Browse files Browse the repository at this point in the history
  • Loading branch information
omab committed Jun 21, 2011
1 parent daea9d0 commit 0f6b993
Showing 1 changed file with 15 additions and 21 deletions.
36 changes: 15 additions & 21 deletions social_auth/backends/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ def _setting(name, default=None):
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):
Expand Down Expand Up @@ -156,44 +157,37 @@ def username(self, details):
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:
username = DEFAULT_USERNAME
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

Expand Down

0 comments on commit 0f6b993

Please sign in to comment.