librectf-rust/server/easyctf/decorators.py

118 lines
3.3 KiB
Python
Raw Normal View History

2018-02-21 12:37:10 +08:00
from datetime import datetime
from functools import wraps, update_wrapper
from flask import abort, flash, redirect, url_for, session, make_response, current_app
2018-02-21 12:37:10 +08:00
from flask_login import current_user, login_required
from easyctf.models import Config
def email_verification_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if current_app.config.get("EMAIL_VERIFICATION_REQUIRED", 0):
if not (current_user.is_authenticated and current_user.email_verified):
session.pop("_flashes", None)
flash("You need to verify your email first.", "warning")
return redirect(url_for("users.settings"))
2018-02-21 12:37:10 +08:00
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
def admin_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if not (current_user.is_authenticated and current_user.admin):
abort(403)
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
def teacher_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
if not (current_user.is_authenticated and current_user.level == 3):
abort(403)
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
def block_before_competition(func):
@wraps(func)
def wrapper(*args, **kwargs):
start_time = Config.get("start_time")
2022-11-29 17:20:25 +08:00
if not current_user.is_authenticated or not (
current_user.admin
or (
start_time
and current_user.is_authenticated
and datetime.utcnow() >= datetime.fromtimestamp(int(start_time))
)
):
2018-02-21 12:37:10 +08:00
abort(403)
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
def block_after_competition(func):
@wraps(func)
def wrapper(*args, **kwargs):
end_time = Config.get("end_time")
2022-11-29 17:20:25 +08:00
if not current_user.is_authenticated or not (
current_user.admin
or (
end_time
and current_user.is_authenticated
and datetime.utcnow() <= datetime.fromtimestamp(int(end_time))
)
):
2018-02-21 12:37:10 +08:00
abort(403)
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
def team_required(func):
@wraps(func)
@login_required
def wrapper(*args, **kwargs):
if not hasattr(current_user, "team") or not current_user.tid:
flash("You need a team to view this page!", "info")
return redirect(url_for("teams.create"))
return func(*args, **kwargs)
return wrapper
def is_team_captain(func):
@wraps(func)
def wrapper(*args, **kwargs):
2022-11-29 17:20:25 +08:00
if not (
current_user.is_authenticated
and current_user.tid
and current_user.team.owner == current_user.uid
):
2018-02-21 12:37:10 +08:00
return abort(403)
return func(*args, **kwargs)
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
return wrapper
2022-11-29 17:20:25 +08:00
2018-02-21 12:37:10 +08:00
def no_cache(func):
@wraps(func)
def wrapper(*args, **kwargs):
response = make_response(func(*args, **kwargs))
2022-11-29 17:20:25 +08:00
response.headers["Last-Modified"] = datetime.now()
response.headers[
"Cache-Control"
] = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "-1"
2018-02-21 12:37:10 +08:00
return response
return update_wrapper(wrapper, func)