Guest User

Untitled

a guest
May 21st, 2018
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. from django.contrib.auth import views as auth_views
  2.  
  3.  
  4. url(r"^accounts/password_change/$",
  5. auth_views.PasswordChangeView.as_view(),
  6. name="password_change"),
  7. url(r"^accounts/password_change/done/$",
  8. auth_views.PasswordChangeDoneView.as_view(),
  9. name="password_change_done"),
  10. url(r"^accounts/password_reset/$",
  11. auth_views.PasswordResetView.as_view(email_template_name="app/email/accounts/password_reset_email.html",
  12. success_url=reverse_lazy("app:password_reset_done"),
  13. subject_template_name="app/email/accounts/password_reset_subject.html"),
  14. name="password_reset"),
  15. url(r"^accounts/password_reset/done/$",
  16. auth_views.PasswordResetDoneView.as_view(),
  17. name="password_reset_done"),
  18. url(r"^accounts/reset/(?P<uidb64>[0-9A-Za-z_-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$",
  19. auth_views.PasswordResetConfirmView.as_view(
  20. success_url=reverse_lazy("app:password_reset_complete"),
  21. form_class=CustomSetPasswordForm),
  22. name="password_reset_confirm"),
  23. url(r"^accounts/reset/complete/$",
  24. auth_views.PasswordResetCompleteView.as_view(),
  25. name="password_reset_complete"),
  26.  
  27. import re
  28. from django.urls import reverse, NoReverseMatch
  29. from django.test import TestCase, Client
  30. from django.core import mail
  31. from django.test.utils import override_settings
  32. from django.contrib.auth import authenticate
  33.  
  34. VALID_USER_NAME = "username"
  35. USER_OLD_PSW = "oldpassword"
  36. USER_NEW_PSW = "newpassword"
  37. PASSWORD_RESET_URL = reverse("app:password_reset")
  38.  
  39. def PASSWORD_RESET_CONFIRM_URL(uidb64, token):
  40. try:
  41. return reverse("app:password_reset_confirm", args=(uidb64, token))
  42. except NoReverseMatch:
  43. return f"/accounts/reset/invaliduidb64/invalid-token/"
  44.  
  45.  
  46. def utils_extract_reset_tokens(full_url):
  47. return re.findall(r"/([w-]+)",
  48. re.search(r"^http://.+$", full_url, flags=re.MULTILINE)[0])[3:5]
  49.  
  50.  
  51. @override_settings(EMAIL_BACKEND="anymail.backends.test.EmailBackend")
  52. class PasswordResetTestCase(TestCase):
  53. @classmethod
  54. def setUpClass(cls):
  55. super().setUpClass()
  56. cls.myclient = Client()
  57.  
  58. def test_password_reset_ok(self):
  59. # ask for password reset
  60. response = self.myclient.post(PASSWORD_RESET_URL,
  61. {"email": VALID_USER_NAME},
  62. follow=True)
  63.  
  64. # extract reset token from email
  65. self.assertEqual(len(mail.outbox), 1)
  66. msg = mail.outbox[0]
  67. uidb64, token = utils_extract_reset_tokens(msg.body)
  68.  
  69. # change the password
  70. response = self.myclient.post(PASSWORD_RESET_CONFIRM_URL(uidb64, token),
  71. {"new_password1": USER_NEW_PSW,
  72. "new_password2": USER_NEW_PSW},
  73. follow=True)
  74.  
  75. self.assertIsNone(authenticate(username=VALID_USER_NAME,password=USER_OLD_PSW))
  76.  
  77. def test_password_reset_ok(self):
  78. # ask for password reset
  79. response = self.myclient.post(PASSWORD_RESET_URL,
  80. {"email": VALID_USER_NAME},
  81. follow=True)
  82.  
  83. # extract reset token from email
  84. self.assertEqual(len(mail.outbox), 1)
  85. msg = mail.outbox[0]
  86. uidb64, token = utils_extract_reset_tokens(msg.body)
  87.  
  88. # change the password
  89. self.myclient.get(PASSWORD_RESET_CONFIRM_URL(uidb64, token), follow=True)
  90. response = self.myclient.post(PASSWORD_RESET_CONFIRM_URL(uidb64, "set-password"),
  91. {"new_password1": USER_NEW_PSW,
  92. "new_password2": USER_NEW_PSW},
  93. follow=True)
  94.  
  95. self.assertIsNone(authenticate(username=VALID_USER_NAME,password=USER_OLD_PSW))
  96.  
  97. INTERNAL_RESET_URL_TOKEN = 'set-password'
  98. INTERNAL_RESET_SESSION_TOKEN = '_password_reset_token'
  99.  
  100. @method_decorator(sensitive_post_parameters())
  101. @method_decorator(never_cache)
  102. def dispatch(self, *args, **kwargs):
  103. assert 'uidb64' in kwargs and 'token' in kwargs
  104.  
  105. self.validlink = False
  106. self.user = self.get_user(kwargs['uidb64'])
  107.  
  108. if self.user is not None:
  109. token = kwargs['token']
  110. if token == INTERNAL_RESET_URL_TOKEN:
  111. session_token = self.request.session.get(INTERNAL_RESET_SESSION_TOKEN)
  112. if self.token_generator.check_token(self.user, session_token):
  113. # If the token is valid, display the password reset form.
  114. self.validlink = True
  115. return super().dispatch(*args, **kwargs)
  116. else:
  117. if self.token_generator.check_token(self.user, token):
  118. # Store the token in the session and redirect to the
  119. # password reset form at a URL without the token. That
  120. # avoids the possibility of leaking the token in the
  121. # HTTP Referer header.
  122. self.request.session[INTERNAL_RESET_SESSION_TOKEN] = token
  123. redirect_url = self.request.path.replace(token, INTERNAL_RESET_URL_TOKEN)
  124. return HttpResponseRedirect(redirect_url)
  125.  
  126. # Display the "Password reset unsuccessful" page.
  127. return self.render_to_response(self.get_context_data())
Add Comment
Please, Sign In to add comment