|
|
@ -7,7 +7,9 @@ from pyramid.security import forget, remember |
|
|
|
from pyramid.httpexceptions import HTTPFound |
|
|
|
from pyramid.httpexceptions import HTTPFound |
|
|
|
|
|
|
|
|
|
|
|
from .. import models, security, services |
|
|
|
from .. import models, security, services |
|
|
|
from ..schemas.account import RegistrationSchema |
|
|
|
from ..repo import RepoItemNotFound |
|
|
|
|
|
|
|
from ..events import PasswordResetEmail |
|
|
|
|
|
|
|
from ..schemas import account |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
@view_config( |
|
|
@ -63,7 +65,7 @@ def logout(context, request): |
|
|
|
renderer="ordr3:templates/account/registration.jinja2", |
|
|
|
renderer="ordr3:templates/account/registration.jinja2", |
|
|
|
) |
|
|
|
) |
|
|
|
def registration(context, request): |
|
|
|
def registration(context, request): |
|
|
|
form = RegistrationSchema.as_form(request) |
|
|
|
form = account.RegistrationSchema.as_form(request) |
|
|
|
return {"form": form} |
|
|
|
return {"form": form} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -78,14 +80,14 @@ def register_new_user(context, request): |
|
|
|
if "Cancel" in request.POST: |
|
|
|
if "Cancel" in request.POST: |
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
|
|
|
|
|
|
form = RegistrationSchema.as_form(request) |
|
|
|
form = account.RegistrationSchema.as_form(request) |
|
|
|
data = request.POST.items() |
|
|
|
data = request.POST.items() |
|
|
|
try: |
|
|
|
try: |
|
|
|
appstruct = form.validate(data) |
|
|
|
appstruct = form.validate(data) |
|
|
|
except deform.ValidationFailure: |
|
|
|
except deform.ValidationFailure: |
|
|
|
return {"form": form} |
|
|
|
return {"form": form} |
|
|
|
|
|
|
|
|
|
|
|
account = models.User( |
|
|
|
new_user = models.User( |
|
|
|
id=None, |
|
|
|
id=None, |
|
|
|
password=None, |
|
|
|
password=None, |
|
|
|
username=appstruct["user_name"], |
|
|
|
username=appstruct["user_name"], |
|
|
@ -94,8 +96,8 @@ def register_new_user(context, request): |
|
|
|
email=appstruct["email"], |
|
|
|
email=appstruct["email"], |
|
|
|
role=models.UserRole.NEW, |
|
|
|
role=models.UserRole.NEW, |
|
|
|
) |
|
|
|
) |
|
|
|
services.set_new_password(account, appstruct["password"], request) |
|
|
|
services.set_new_password(new_user, appstruct["password"], request) |
|
|
|
request.repo.add_user(account) |
|
|
|
request.repo.add_user(new_user) |
|
|
|
|
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root, "registered")) |
|
|
|
return HTTPFound(request.resource_path(request.root, "registered")) |
|
|
|
|
|
|
|
|
|
|
@ -118,3 +120,109 @@ def registration_complete(context, request): |
|
|
|
) |
|
|
|
) |
|
|
|
def breached_password(context, request): |
|
|
|
def breached_password(context, request): |
|
|
|
return {} |
|
|
|
return {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="forgot", |
|
|
|
|
|
|
|
permission="registration", |
|
|
|
|
|
|
|
request_method="GET", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/forgotten_password.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def forgotten_password(context, request): |
|
|
|
|
|
|
|
form = account.ForgottenPasswordSchema.as_form(request) |
|
|
|
|
|
|
|
return {"form": form} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="forgot", |
|
|
|
|
|
|
|
permission="registration", |
|
|
|
|
|
|
|
request_method="POST", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/forgotten_password.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def send_reset_link(context, request): |
|
|
|
|
|
|
|
if "Cancel" in request.POST: |
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
provided_identifier = request.POST.get("email_or_username") |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
user = request.repo.get_user_by_username(provided_identifier) |
|
|
|
|
|
|
|
except RepoItemNotFound: |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
user = request.repo.get_user_by_email(provided_identifier) |
|
|
|
|
|
|
|
except RepoItemNotFound: |
|
|
|
|
|
|
|
user = None |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if user is not None and user.is_active: |
|
|
|
|
|
|
|
token = services.create_token_for_user(request.repo, user) |
|
|
|
|
|
|
|
request.emit(PasswordResetEmail(user, token.token)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root, "sent")) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="sent", |
|
|
|
|
|
|
|
permission="view", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/reset_link_sent.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def reset_link_sent(context, request): |
|
|
|
|
|
|
|
return {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="reset", |
|
|
|
|
|
|
|
permission="view", |
|
|
|
|
|
|
|
request_method="GET", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/reset_password_form.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def reset_password_form(context, request): |
|
|
|
|
|
|
|
token = request.GET.get("t") |
|
|
|
|
|
|
|
user = services.get_user_from_reset_token(request.repo, token) |
|
|
|
|
|
|
|
if user is None: |
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
form = account.ResetPasswordSchema.as_form(request, token) |
|
|
|
|
|
|
|
return {"form": form} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="reset", |
|
|
|
|
|
|
|
permission="view", |
|
|
|
|
|
|
|
request_method="POST", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/reset_password_form.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def reset_password(context, request): |
|
|
|
|
|
|
|
if "Cancel" in request.POST: |
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
token = request.GET.get("t") |
|
|
|
|
|
|
|
user = services.get_user_from_reset_token(request.repo, token) |
|
|
|
|
|
|
|
if user is None: |
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
form = account.ResetPasswordSchema.as_form(request, token) |
|
|
|
|
|
|
|
data = request.POST.items() |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
appstruct = form.validate(data) |
|
|
|
|
|
|
|
except deform.ValidationFailure: |
|
|
|
|
|
|
|
return {"form": form} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
services.set_new_password(user, appstruct["new_password"], request) |
|
|
|
|
|
|
|
request.repo.delete_reset_token(request.repo.get_reset_token(token)) |
|
|
|
|
|
|
|
request.repo.clear_stale_reset_tokens() |
|
|
|
|
|
|
|
return HTTPFound(request.resource_path(request.root, "reseted")) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@view_config( |
|
|
|
|
|
|
|
context="ordr3:resources.Root", |
|
|
|
|
|
|
|
name="reseted", |
|
|
|
|
|
|
|
permission="view", |
|
|
|
|
|
|
|
renderer="ordr3:templates/account/password_reseted.jinja2", |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
def password_reseted(context, request): |
|
|
|
|
|
|
|
return {} |
|
|
|
|
|
|
|
# http://localhost:6543/reset?t=69e24c08-1cb2-4656-987a-4791175f3368 |
|
|
|