views.py 11 KB

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