From f1c453d3d40d90327cfddd7072343e095eba08cf Mon Sep 17 00:00:00 2001
From: Ville Rantanen
-Admin panel |
-Home page
+ « Forum Home
+ | Admin panel
{{ msg }}
Date: Fri, 28 Jul 2023 13:08:54 +0300
Subject: [PATCH] moved config to a json, which makes adding more variables
easier, but perhaps otherwise adds complexity
---
.gitignore | 2 +
forum/change_admin_pw.sh | 28 +++++++++++
forum/db/config.py | 54 +++++++++++++++++++++
forum/db/sqlite.py | 80 ++++++++++++++++++--------------
forum/docker-entrypoint.sh | 33 +------------
forum/init_forum.sh | 51 ++++++++++++++++++++
forum/init_sqlite.sh | 58 -----------------------
forum/main.py | 70 ++++++++++++++--------------
forum/minimd.py | 3 +-
forum/restart.sh | 2 +-
forum/schema.txt | 18 +++----
forum/templates/admin/base.html | 9 ++--
forum/templates/admin/index.html | 14 ++++--
forum/templates/base.html | 5 +-
forum/templates/login.html | 2 +-
forum/templates/thread.html | 8 +++-
forum/tool.py | 1 +
forum/version.py | 2 -
18 files changed, 258 insertions(+), 182 deletions(-)
create mode 100644 forum/change_admin_pw.sh
create mode 100644 forum/db/config.py
create mode 100755 forum/init_forum.sh
delete mode 100755 forum/init_sqlite.sh
diff --git a/.gitignore b/.gitignore
index 177f8e8..57b2dde 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
/venv
__pycache__
*.db
+*.config
+*.pid
diff --git a/forum/change_admin_pw.sh b/forum/change_admin_pw.sh
new file mode 100644
index 0000000..5de0098
--- /dev/null
+++ b/forum/change_admin_pw.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+
+SQLITE=sqlite3
+PYTHON=python3
+
+set -eu
+
+if [[ -z "$DB" ]]; then
+ echo set DB env to the Sqlite database.
+ exit 1
+fi
+
+read -p 'Admin username: ' username
+read -sp 'Admin password: ' password
+
+
+password=$($PYTHON tool.py password "$password")
+time=$($PYTHON -c 'import time; print(time.time_ns())')
+
+$SQLITE "$DB" "
+ UPDATE users
+ SET password = '$password',
+ role = 2,
+ join_time = $time
+ WHERE
+ user = lower('$username')
+ "
+
diff --git a/forum/db/config.py b/forum/db/config.py
new file mode 100644
index 0000000..ec6534a
--- /dev/null
+++ b/forum/db/config.py
@@ -0,0 +1,54 @@
+import json
+import shutil
+
+
+class Config:
+ def __init__(self, path):
+ self.path = path
+ self.config_values = [
+ "version",
+ "server_name",
+ "server_description",
+ "secret_key",
+ "captcha_key",
+ "registration_enabled",
+ "login_required",
+ "threads_per_page",
+ "user_css",
+ ]
+ self._update_class(self._read_values())
+
+ def get_config(self):
+ current = self._read_values()
+ self._update_class(current)
+ return self
+
+ def set_config(self, **kwargs):
+ for key in kwargs:
+ if key not in self.config_values:
+ raise ValueError(f"Unknown config key {key}!")
+
+ current = self._read_values()
+ current.update(kwargs)
+ self._update_class(current)
+ self._write_values(current)
+
+ def set_config_secrets(self, secret_key, captcha_key):
+ current = self._read_values()
+ current["secret_key"] = secret_key
+ current["captcha_key"] = captcha_key
+ self._update_class(current)
+ self._write_values(current)
+
+ def _read_values(self):
+ with open(self.path, "rt") as fp:
+ return json.load(fp)
+
+ def _write_values(self, values):
+ shutil.copy(self.path, self.path + ".bkp")
+ with open(self.path, "wt") as fp:
+ json.dump(values, fp, indent=2, sort_keys=True)
+
+ def _update_class(self, values):
+ for item in values:
+ setattr(self, item, values[item])
diff --git a/forum/db/sqlite.py b/forum/db/sqlite.py
index 9115374..91d4f66 100644
--- a/forum/db/sqlite.py
+++ b/forum/db/sqlite.py
@@ -1,4 +1,5 @@
import sqlite3
+from db.config import Config
class DB:
@@ -6,16 +7,16 @@ class DB:
self.conn = conn
pass
- def get_config(self):
- return (
- self._db()
- .execute(
- """
- select version, name, description, secret_key, captcha_key, registration_enabled, login_required from config
- """
- )
- .fetchone()
- )
+ # ~ def get_config(self):
+ # ~ return (
+ # ~ self._db()
+ # ~ .execute(
+ # ~ """
+ # ~ select version, name, description, secret_key, captcha_key, registration_enabled, login_required from config
+ # ~ """
+ # ~ )
+ # ~ .fetchone()
+ # ~ )
def get_forums(self):
return self._db().execute(
@@ -48,7 +49,7 @@ class DB:
)
def get_thread_forum(self, thread_id):
- """ Returns forum_id of a thread """
+ """Returns forum_id of a thread"""
return (
self._db()
.execute(
@@ -104,7 +105,16 @@ class DB:
def get_thread(self, thread):
db = self._db()
- title, text, author, author_id, create_time, modify_time, hidden, forum_id = db.execute(
+ (
+ title,
+ text,
+ author,
+ author_id,
+ create_time,
+ modify_time,
+ hidden,
+ forum_id,
+ ) = db.execute(
"""
select title, text, name, author_id, create_time, modify_time, hidden, forum_id
from threads, users
@@ -139,7 +149,7 @@ class DB:
modify_time,
comments,
hidden,
- forum_id
+ forum_id,
)
def get_thread_title(self, thread_id):
@@ -525,14 +535,16 @@ class DB:
Add a user if registrations are enabled.
"""
try:
+ config = Config(os.getenv("CONF"))
+ if not config.registration_enable:
+ return None
+
db = self._db()
c = db.cursor()
c.execute(
"""
insert into users(name, password, join_time)
- select lower(?), ?, ?
- from config
- where registration_enabled = 1
+ values lower(?), ?, ?
""",
(username, password, time),
)
@@ -616,25 +628,25 @@ class DB:
)
db.commit()
- def set_config(
- self, server_name, server_description, registration_enabled, login_required
- ):
- return self.change_one(
- """
- update config
- set name = ?, description = ?, registration_enabled = ?, login_required = ?
- """,
- (server_name, server_description, registration_enabled, login_required),
- )
+ # ~ def set_config(
+ # ~ self, server_name, server_description, registration_enabled, login_required
+ # ~ ):
+ # ~ return self.change_one(
+ # ~ """
+ # ~ update config
+ # ~ set name = ?, description = ?, registration_enabled = ?, login_required = ?
+ # ~ """,
+ # ~ (server_name, server_description, registration_enabled, login_required),
+ # ~ )
- def set_config_secrets(self, secret_key, captcha_key):
- return self.change_one(
- """
- update config
- set secret_key = ?, captcha_key = ?
- """,
- (secret_key, captcha_key),
- )
+ # ~ def set_config_secrets(self, secret_key, captcha_key):
+ # ~ return self.change_one(
+ # ~ """
+ # ~ update config
+ # ~ set secret_key = ?, captcha_key = ?
+ # ~ """,
+ # ~ (secret_key, captcha_key),
+ # ~ )
def set_user_ban(self, user_id, until):
return self.change_one(
diff --git a/forum/docker-entrypoint.sh b/forum/docker-entrypoint.sh
index 67e8a8a..1dd7c87 100755
--- a/forum/docker-entrypoint.sh
+++ b/forum/docker-entrypoint.sh
@@ -3,6 +3,7 @@ PYTHON=python3
SQLITE=sqlite3
export DB="/app/forum.db"
+export CONF="/app/forum.config"
export SERVER=gunicorn
export PID="forum.pid"
export WORKERS=4
@@ -15,36 +16,6 @@ fi
set -eu
. /opt/venv/bin/activate
-if [[ -e "$DB" ]]; then
- $SQLITE -header "$DB" "SELECT version,name,description,registration_enabled,login_required FROM config"
- echo Database already exists
-else
- password=$($PYTHON tool.py password "$ADMINP")
- time=$($PYTHON -c 'import time; print(time.time_ns())')
- version=$($PYTHON tool.py version)
-
- $SQLITE "$DB" -init schema.txt "insert into config (
- version,
- name,
- description,
- secret_key,
- captcha_key,
- registration_enabled,
- login_required
-)
-values (
- '$version',
- 'Forum',
- '',
- '$(head -c 30 /dev/urandom | base64)',
- '$(head -c 30 /dev/urandom | base64)',
- 0,
- 1
- )"
- $SQLITE "$DB" "
- insert into users (name, password, role, join_time)
- values (lower('$ADMINU'), '$password', 2, $time)
- "
-fi
+sh ./init_forum.sh
exec "$SERVER" -w $WORKERS 'main:app' --pid="$PID" -b 0.0.0.0:5000
diff --git a/forum/init_forum.sh b/forum/init_forum.sh
new file mode 100755
index 0000000..7fabf9e
--- /dev/null
+++ b/forum/init_forum.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+
+SQLITE=sqlite3
+PYTHON=python3
+
+set -e
+
+if [ -z "$DB" ]; then
+ echo set DB env to point the Sqlite database.
+ exit 1
+fi
+
+if [ -z "$CONF" ]; then
+ echo set CONF env to point the config file.
+ exit 1
+fi
+
+if [ -e "$CONF" ]; then
+ echo Config exists
+else
+ version=$($PYTHON tool.py version)
+ cat <
^|\s|\n)(?P
[\g
[\g
{{ title }}
-
{% for id, name, description, _, _, _ in forums %}
{{ id }}
+{{ id }}
{{ name }}
{{ format_time(join_date) }}
@@ -61,7 +61,7 @@
-
+{{ id }}
+{{ id }}
+
+Number of threads per page
+
+
+
@@ -129,8 +137,6 @@
User defined CSS file in static/ folder
+
+
⚠ Only use queries if you know what you're doing ⚠
diff --git a/forum/templates/base.html b/forum/templates/base.html index 82267c9..3d1ad91 100644 --- a/forum/templates/base.html +++ b/forum/templates/base.html @@ -6,8 +6,8 @@ - {%- if config.server_name -%} - + {%- if config.user_css -%} + {%- endif -%} @@ -50,5 +50,6 @@{{ msg | safe }}
{%- endfor -%} {%- block content %}{% endblock -%} + diff --git a/forum/templates/login.html b/forum/templates/login.html index 5903f67..998cc61 100644 --- a/forum/templates/login.html +++ b/forum/templates/login.html @@ -3,7 +3,7 @@ {% block content %}