PageRenderTime 38ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/helios_auth/auth_systems/password.py

https://github.com/benadida/helios-server
Python | 137 lines | 109 code | 17 blank | 11 comment | 10 complexity | fe39f95d536d8ff5f6a870dbcd0e3180 MD5 | raw file
Possible License(s): Apache-2.0
  1. """
  2. Username/Password Authentication
  3. """
  4. from django.urls import reverse
  5. from django import forms
  6. from django.core.mail import send_mail
  7. from django.conf import settings
  8. from django.http import HttpResponseRedirect
  9. from django.conf.urls import url
  10. from helios_auth import url_names
  11. import logging
  12. # some parameters to indicate that status updating is possible
  13. STATUS_UPDATES = False
  14. PASSWORD_LOGIN_URL_NAME = "auth@password@login"
  15. PASSWORD_FORGOTTEN_URL_NAME = "auth@password@forgotten"
  16. def create_user(username, password, name = None):
  17. from helios_auth.models import User
  18. user = User.get_by_type_and_id('password', username)
  19. if user:
  20. raise Exception('user exists')
  21. info = {'password' : password, 'name': name}
  22. user = User.update_or_create(user_type='password', user_id=username, info = info)
  23. user.save()
  24. class LoginForm(forms.Form):
  25. username = forms.CharField(max_length=50)
  26. password = forms.CharField(widget=forms.PasswordInput(), max_length=100)
  27. def password_check(user, password):
  28. return (user and user.info['password'] == password)
  29. # the view for logging in
  30. def password_login_view(request):
  31. from helios_auth.view_utils import render_template
  32. from helios_auth.views import after
  33. from helios_auth.models import User
  34. error = None
  35. if request.method == "GET":
  36. form = LoginForm()
  37. else:
  38. form = LoginForm(request.POST)
  39. # set this in case we came here straight from the multi-login chooser
  40. # and thus did not have a chance to hit the "start/password" URL
  41. request.session['auth_system_name'] = 'password'
  42. if 'return_url' in request.POST:
  43. request.session['auth_return_url'] = request.POST.get('return_url')
  44. if form.is_valid():
  45. username = form.cleaned_data['username'].strip()
  46. password = form.cleaned_data['password'].strip()
  47. try:
  48. user = User.get_by_type_and_id('password', username)
  49. if password_check(user, password):
  50. request.session['password_user_id'] = user.user_id
  51. return HttpResponseRedirect(reverse(url_names.AUTH_AFTER))
  52. except User.DoesNotExist:
  53. pass
  54. error = 'Bad Username or Password'
  55. return render_template(request, 'password/login', {'form': form, 'error': error})
  56. def password_forgotten_view(request):
  57. """
  58. forgotten password view and submit.
  59. includes return_url
  60. """
  61. from helios_auth.view_utils import render_template
  62. from helios_auth.models import User
  63. if request.method == "GET":
  64. return render_template(request, 'password/forgot', {'return_url': request.GET.get('return_url', '')})
  65. else:
  66. username = request.POST['username']
  67. return_url = request.POST['return_url']
  68. try:
  69. user = User.get_by_type_and_id('password', username)
  70. except User.DoesNotExist:
  71. return render_template(request, 'password/forgot', {'return_url': request.GET.get('return_url', ''), 'error': 'no such username'})
  72. body = """
  73. This is a password reminder:
  74. Your username: %s
  75. Your password: %s
  76. --
  77. %s
  78. """ % (user.user_id, user.info['password'], settings.SITE_TITLE)
  79. # FIXME: make this a task
  80. send_mail('password reminder', body, settings.SERVER_EMAIL, ["%s <%s>" % (user.info['name'], user.info['email'])], fail_silently=False)
  81. return HttpResponseRedirect(return_url)
  82. def get_auth_url(request, redirect_url = None):
  83. return reverse(PASSWORD_LOGIN_URL_NAME)
  84. def get_user_info_after_auth(request):
  85. from helios_auth.models import User
  86. user = User.get_by_type_and_id('password', request.session['password_user_id'])
  87. del request.session['password_user_id']
  88. return {'type': 'password', 'user_id' : user.user_id, 'name': user.name, 'info': user.info, 'token': None}
  89. def update_status(token, message):
  90. pass
  91. def send_message(user_id, user_name, user_info, subject, body):
  92. email = user_id
  93. name = user_name or user_info.get('name', email)
  94. send_mail(subject, body, settings.SERVER_EMAIL, ["\"%s\" <%s>" % (name, email)], fail_silently=False)
  95. #
  96. # Election Creation
  97. #
  98. def can_create_election(user_id, user_info):
  99. return True
  100. urlpatterns = [
  101. url(r'^password/login', password_login_view, name=PASSWORD_LOGIN_URL_NAME),
  102. url(r'^password/forgot', password_forgotten_view, name=PASSWORD_FORGOTTEN_URL_NAME)
  103. ]