remarkbox/remarkbox/views/__init__.py
Russell Ballestrini d93e9106d4 Verification challenge code refactor
it works good enough,

future commits will do some refactors to make the success
screen more user friendly.

	modified:   Makefile
	modified:   README.rst
	modified:   index.html
	modified:   remarkbox/lib/mail.py
	modified:   remarkbox/lib/mail_messages.py
	modified:   remarkbox/models/meta.py
	modified:   remarkbox/models/user.py
	modified:   remarkbox/routes.py
	modified:   remarkbox/templates/join-or-log-in.j2
	modified:   remarkbox/templates/show-node.j2
	new file:   remarkbox/templates/verification-challenge.j2
	modified:   remarkbox/tests/test_models.py
	modified:   remarkbox/tests/test_views.py
	modified:   remarkbox/views/__init__.py
	modified:   remarkbox/views/authentication.py
2022-06-19 19:01:31 -04:00

131 lines
3.9 KiB
Python

from remarkbox.models import get_node_by_id
from pyramid.httpexceptions import HTTPFound
try:
unicode("")
except:
from six import u as unicode
# view decorator.
def user_required(
flash_msg="You must log in to access that area.",
flash_level="error",
return_to_route_name="",
):
"""This view requires that the request has a user."""
def wrapped(fn):
def inner(request):
if request.user and request.user.authenticated:
return fn(request)
request.session.flash((flash_msg, flash_level))
return_to = ""
if return_to_route_name:
return_to = request.route_url(return_to_route_name)
return HTTPFound(get_join_or_log_in_route_uri(request, return_to))
return inner
return wrapped
# view decorator.
def super_fly_required(fn):
"""This view requires that the request has a super fly admin."""
# TODO: don't rely on this hack for super fly admin.
def wrapped(request):
if (
request.user
and request.user.authenticated
and (request.user.name == "Remarkbox" or request.user.name == "russell")
):
return fn(request)
request.session.flash(
("You must be a super fly admin to access that.", "error")
)
return HTTPFound(get_referer_or_home(request))
return wrapped
# view decorator.
def reject_stand_alone(fn):
"""Reject access to view if app is running in stand_alone_mode."""
def wrapped(request):
if request.stand_alone_mode:
request.session.flash(
(
b"You may not access this page if stand-alone mode is enabled.",
b"error",
)
)
return HTTPFound(get_referer_or_home(request))
return fn(request)
return wrapped
def get_referer_or_home(request):
"""return referer or safe_redirect or '/'"""
return (
request.referer
if request.referer is not None
else request.app.get("safe_redirect", "/")
)
def get_node_route_uri(request, node, anchor=""):
"""return full URI for given node."""
kwargs = {"node_id": node.id, "_anchor": anchor}
route_name = "basic-show-node"
if node.slug:
route_name = "basic-show-node2"
kwargs["slug"] = node.slug
return request.route_url(route_name, **kwargs)
def get_embed_route_uri(request, external_uri, anchor=""):
return request.route_url(
"embed-show-node", _query={"thread_uri": external_uri}, _anchor=anchor
)
def get_join_or_log_in_route_uri(request, return_to=""):
query = None
if return_to:
query = {"return-to":return_to}
return request.route_url(
"{}-join-or-log-in".format(request.mode),
_query=query,
namespace=request.namespace,
)
def nodes_pending_verify(request):
if "nodes_pending_verify" not in request.session:
request.session["nodes_pending_verify"] = []
return request.session["nodes_pending_verify"]
def set_node_to_pending_in_session(request, node):
"""Update session to make node go into pending_verify state."""
nodes_pending_verify(request).append(str(node.id_without_dashes))
def verify_pending_nodes_in_session(request, user):
"""Attempt to verify all nodes pending verification in session."""
still_pending_verify = list(nodes_pending_verify(request))
for node_id in nodes_pending_verify(request):
node = get_node_by_id(request.dbsession, node_id)
if node is not None:
# make sure these values match to prevent spoofing.
if user == node.user:
node.verified = True
request.dbsession.add(node)
still_pending_verify.remove(str(node.id_without_dashes))
request.session["nodes_pending_verify"] = still_pending_verify
request.dbsession.flush()