views.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.banning.decorators import block_banned
  7. from misago.banning.views import error_banned
  8. from misago.forms.layouts import FormLayout
  9. from misago.messages import Message
  10. from misago.security import get_random_string
  11. from misago.security.auth import sign_user_in
  12. from misago.security.decorators import *
  13. from misago.sessions.models import *
  14. from misago.auth.forms import *
  15. from misago.users.models import User, Group
  16. from misago.views import error403, error404
  17. @block_banned
  18. @block_authenticated
  19. @block_jammed
  20. def register(request):
  21. if request.settings['account_activation'] == 'block':
  22. return error403(request, Message(request, 'auth/registrations_off'))
  23. message = None
  24. if request.method == 'POST':
  25. form = UserRegisterForm(request.POST, request=request)
  26. if form.is_valid():
  27. need_activation = 0
  28. if request.settings['account_activation'] == 'user':
  29. need_activation = User.ACTIVATION_USER
  30. if request.settings['account_activation'] == 'admin':
  31. need_activation = User.ACTIVATION_ADMIN
  32. new_user = User.objects.create_user(
  33. form.cleaned_data['username'],
  34. form.cleaned_data['email'],
  35. form.cleaned_data['password'],
  36. Group.objects.get(pk=3), # Registered members
  37. ip=request.session.get_ip(request),
  38. activation=need_activation,
  39. request=request
  40. )
  41. if need_activation == User.ACTIVATION_NONE:
  42. # No need for activation, sign in user
  43. sign_user_in(request, new_user)
  44. request.messages.set_flash(Message(request, 'auth/registered_activation_none', extra={'user':new_user}), 'success')
  45. if need_activation == User.ACTIVATION_USER:
  46. # Mail user activation e-mail
  47. request.messages.set_flash(Message(request, 'auth/registered_activation_user', extra={'user':new_user}), 'info')
  48. new_user.email_user(
  49. request,
  50. 'auth/activation_0',
  51. _("Welcome aboard, %(username)s!" % {'username': new_user.username}),
  52. )
  53. if need_activation == User.ACTIVATION_ADMIN:
  54. # Require admin activation
  55. request.messages.set_flash(Message(request, 'users/registered_activation_admin', extra={'user':new_user}), 'info')
  56. new_user.email_user(
  57. request,
  58. ('auth/activation_%s' % need_activation),
  59. _("Welcome aboard, %(username)s!" % {'username': new_user.username}),
  60. {'password': form.cleaned_data['password']}
  61. )
  62. return redirect(reverse('index'))
  63. else:
  64. message = Message(request, form.non_field_errors()[0])
  65. if request.settings['registrations_jams']:
  66. SignInAttempt.objects.register_attempt(request.session.get_ip(request))
  67. # Have we jammed our account?
  68. if SignInAttempt.objects.is_jammed(request.session.get_ip(request)):
  69. request.jam.expires = timezone.now()
  70. return redirect(reverse('register'))
  71. else:
  72. form = UserRegisterForm(request=request)
  73. return request.theme.render_to_response('auth/register.html',
  74. {
  75. 'message': message,
  76. 'form': FormLayout(form),
  77. 'hide_signin': True,
  78. },
  79. context_instance=RequestContext(request));
  80. @block_banned
  81. @block_authenticated
  82. @block_jammed
  83. def send_activation(request):
  84. message = None
  85. if request.method == 'POST':
  86. form = UserSendSpecialMailForm(request.POST, request=request)
  87. if form.is_valid():
  88. user = form.found_user
  89. if user.is_banned():
  90. return error_banned(request, user)
  91. if user.activation == User.ACTIVATION_NONE:
  92. return error403(request, Message(request, 'auth/activation_not_required', extra={'user': user}))
  93. if user.activation == User.ACTIVATION_ADMIN:
  94. return error403(request, Message(request, 'auth/activation_only_by_admin', extra={'user': user}))
  95. request.messages.set_flash(Message(request, 'auth/activation_resent', extra={'user':user}), 'success')
  96. user.email_user(
  97. request,
  98. 'auth/activation_resend',
  99. _("New Account Activation"),
  100. )
  101. return redirect(reverse('index'))
  102. else:
  103. message = Message(request, form.non_field_errors()[0])
  104. else:
  105. form = UserSendSpecialMailForm(request=request)
  106. return request.theme.render_to_response('auth/resend_activation.html',
  107. {
  108. 'message': message,
  109. 'form': FormLayout(form),
  110. },
  111. context_instance=RequestContext(request));
  112. @block_banned
  113. @block_authenticated
  114. @block_jammed
  115. def activate(request, username="", user="0", token=""):
  116. user = int(user)
  117. try:
  118. user = User.objects.get(pk=user)
  119. current_activation = user.activation
  120. # Run checks
  121. if user.is_banned():
  122. return error_banned(request, user)
  123. if user.activation == User.ACTIVATION_NONE:
  124. return error403(request, Message(request, 'auth/activation_not_required', extra={'user': user}))
  125. if user.activation == User.ACTIVATION_ADMIN:
  126. return error403(request, Message(request, 'auth/activation_only_by_admin', extra={'user': user}))
  127. if not token or not user.token or user.token != token:
  128. return error403(request, Message(request, 'auth/invalid_confirmation_activation', extra={'user': user}))
  129. # Activate and sign in our member
  130. user.activation = User.ACTIVATION_NONE
  131. sign_user_in(request, user)
  132. if current_activation == User.ACTIVATION_PASSWORD:
  133. request.messages.set_flash(Message(request, 'auth/activated_password', extra={'user':user}), 'success')
  134. else:
  135. request.messages.set_flash(Message(request, 'auth/activated_new', extra={'user':user}), 'success')
  136. return redirect(reverse('index'))
  137. except User.DoesNotExist:
  138. return error404(request)
  139. @block_banned
  140. @block_authenticated
  141. @block_jammed
  142. def forgot_password(request):
  143. message = None
  144. if request.method == 'POST':
  145. form = UserSendSpecialMailForm(request.POST, request=request)
  146. if form.is_valid():
  147. user = form.found_user
  148. if user.is_banned():
  149. return error_banned(request, user)
  150. elif user.activation != User.ACTIVATION_NONE:
  151. return error403(request, Message(request, 'auth/activation_required', {'user': user}))
  152. user.token = get_random_string(12)
  153. user.save(force_update=True)
  154. request.messages.set_flash(Message(request, 'auth/password_reset_confirm', extra={'user':user}), 'success')
  155. user.email_user(
  156. request,
  157. 'auth/reset_confirm',
  158. _("Confirm New Password Request")
  159. )
  160. return redirect(reverse('index'))
  161. else:
  162. message = Message(request, form.non_field_errors()[0])
  163. else:
  164. form = UserSendSpecialMailForm(request=request)
  165. return request.theme.render_to_response('auth/forgot_password.html',
  166. {
  167. 'message': message,
  168. 'form': FormLayout(form),
  169. },
  170. context_instance=RequestContext(request));
  171. @block_banned
  172. @block_authenticated
  173. @block_jammed
  174. def reset_password(request, username="", user="0", token=""):
  175. user = int(user)
  176. try:
  177. user = User.objects.get(pk=user)
  178. if user.is_banned():
  179. return error_banned(request, user)
  180. if user.activation != User.ACTIVATION_NONE:
  181. return error403(request, Message(request, 'auth/activation_required', {'user': user}))
  182. if not token or not user.token or user.token != token:
  183. return error403(request, Message(request, 'auth/invalid_confirmation_link', {'user': user}))
  184. new_password = get_random_string(6)
  185. user.token = None
  186. user.set_password(new_password)
  187. user.save(force_update=True)
  188. # Logout signed in and kill remember me tokens
  189. Session.objects.filter(user=user).update(user=None)
  190. Token.objects.filter(user=user).delete()
  191. # Set flash and mail new password
  192. request.messages.set_flash(Message(request, 'auth/password_reset_done', extra={'user':user}), 'success')
  193. user.email_user(
  194. request,
  195. 'auth/reset_new',
  196. _("Your New Password"),
  197. {'password': new_password}
  198. )
  199. return redirect(reverse('sign_in'))
  200. except User.DoesNotExist:
  201. return error404(request)