From a16fc6747596f97a42a71eff5e96e2f61f8c6a6d Mon Sep 17 00:00:00 2001 From: rebecca Date: Sat, 31 Oct 2026 18:53:16 +0000 Subject: add banning users --- apioforum/admin.py | 3 ++- apioforum/auth.py | 30 ++++++++++++++++-------------- apioforum/db.py | 4 ++++ apioforum/templates/admin/users.html | 3 ++- apioforum/templates/ban_user.html | 14 ++++++++++++++ apioforum/templates/view_user.html | 5 +++++ apioforum/user.py | 21 ++++++++++++++++++++- 7 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 apioforum/templates/ban_user.html diff --git a/apioforum/admin.py b/apioforum/admin.py index 7ad1d39..03f8b47 100644 --- a/apioforum/admin.py +++ b/apioforum/admin.py @@ -21,4 +21,5 @@ def user_list(): left outer join posts on posts.author = users.username group by users.username order by users.joined desc;""").fetchall() - return render_template("admin/users.html",users=users) + return render_template("admin/users.html",users=users,which="all apioforum users") + diff --git a/apioforum/auth.py b/apioforum/auth.py index 8e939c0..0f2667c 100644 --- a/apioforum/auth.py +++ b/apioforum/auth.py @@ -90,23 +90,25 @@ def logout(): @bp.before_app_request def load_user(): - username = session.get("user") if session.get("keep_logged_in",False): session.permanent = True - if username is None: - g.user = None - g.user_info = None + g.user = None + g.user_info = None + + username = session.get("user") + if username is None: return + + row = get_db().execute( + "SELECT * FROM users WHERE username = ?;", (username,) + ).fetchone() + if row is None: return # weird + + if row['banned']: + session.clear() + flash("you have been banned from apioforum: "+row['banreason'] or "(no reason given)") else: - row = get_db().execute( - "SELECT * FROM users WHERE username = ?;", (username,) - ).fetchone() - if row is None: - g.user = None - g.user_info = None - else: - g.user = row['username'] - g.user_info = row - + g.user = row['username'] + g.user_info = row def login_required(view): @functools.wraps(view) diff --git a/apioforum/db.py b/apioforum/db.py index ee197c6..116f136 100644 --- a/apioforum/db.py +++ b/apioforum/db.py @@ -254,6 +254,10 @@ CREATE VIEW most_recent_posts AS DROP VIEW public_posts; DROP VIEW public_forums; """, +""" +ALTER TABLE users ADD COLUMN banned INT NOT NULL DEFAULT 0; +ALTER TABLE users ADD COLUMN banreason TEXT; +""", ] diff --git a/apioforum/templates/admin/users.html b/apioforum/templates/admin/users.html index ed1eaf9..9949d63 100644 --- a/apioforum/templates/admin/users.html +++ b/apioforum/templates/admin/users.html @@ -7,7 +7,7 @@ {% block content %}

all users ({{ users | count }})

- + {% for user in users %} @@ -15,6 +15,7 @@ {{user.joined.strftime('%Y-%m-%d')}} {{ts(user.joined)}} {% else %}antiquity{% endif %} + {% endfor %}
usernameregistered# posts
usernameregistered# postsbanned?
{{disp_user(user.username)}} {{user.n_posts}}{%if user.banned%}BANNED: {{user.banreason}}{%else%}no{%endif%}
diff --git a/apioforum/templates/ban_user.html b/apioforum/templates/ban_user.html new file mode 100644 index 0000000..4653d8f --- /dev/null +++ b/apioforum/templates/ban_user.html @@ -0,0 +1,14 @@ +{% extends 'base.html' %} +{% block header %} +

{%block title %}ban {{user.username|e}}{%endblock%}

+{% endblock %} + +{% block content %} +
+

confirm banning user {{ disp_user(user.username) }}?

+ +
+ +cancel +
+{%endblock%} diff --git a/apioforum/templates/view_user.html b/apioforum/templates/view_user.html index aaa0c14..2235b5e 100644 --- a/apioforum/templates/view_user.html +++ b/apioforum/templates/view_user.html @@ -9,6 +9,11 @@ {% if g.user == user.username %} settings {% endif %} + {% if user.banned %} + BANNED: {{ user.banreason or "(no reason given)" }} + {%elif is_admin%} + ban user + {% endif %}
diff --git a/apioforum/user.py b/apioforum/user.py index a41707d..7220be9 100644 --- a/apioforum/user.py +++ b/apioforum/user.py @@ -8,6 +8,7 @@ from flask import ( from werkzeug.security import check_password_hash, generate_password_hash from .db import get_db from .roles import has_permission +from .permissions import admin_required import math bp = Blueprint("user", __name__, url_prefix="/user") @@ -77,5 +78,23 @@ def edit_user(username): flash(e) else: return redirect(url_for("user.view_user",username=username)) - + return render_template("user_settings.html",user=user) + +@bp.route("//ban", methods=["GET","POST"]) +@admin_required +def ban_user(username): + db = get_db() + user = db.execute("SELECT * FROM users WHERE username = ?",(username,)).fetchone() + if user is None: + abort(404) + if user['banned']: + flash("that user has already been banned") + return redirect(url_for('user.view_user',username=username)) + if request.method == "POST": + reason = request.form.get("reason",None) + db.execute("update users set banned = 1, banreason = ? where username = ?",(reason,username)) + db.commit() + flash("user banned succesfully") + return redirect(url_for("user.view_user",username=username)) + return render_template("ban_user.html",user=user) -- cgit v1.2.3