create default avatar, admin, and deleted user on first run

This commit is contained in:
Lera Elvoé 2025-06-29 19:32:09 +03:00
parent 9d20da6a16
commit b0bd27edd0
Signed by: yagich
SSH Key Fingerprint: SHA256:6xjGb6uA7lAVcULa7byPEN//rQ0wPoG+UzYVMfZnbvc
7 changed files with 88 additions and 1 deletions

View File

@ -4,3 +4,5 @@
data/db/* data/db/*
data/static/avatars/* data/static/avatars/*
!data/static/avatars/default.webp !data/static/avatars/default.webp
.local/

2
.gitignore vendored
View File

@ -6,3 +6,5 @@ data/static/avatars/*
!data/static/avatars/default.webp !data/static/avatars/default.webp
config/secrets.prod.env config/secrets.prod.env
.local/

View File

@ -1,6 +1,43 @@
from flask import Flask from flask import Flask
from dotenv import load_dotenv from dotenv import load_dotenv
from .models import Avatars, Users
from .auth import digest
from .constants import PermissionLevel
import os import os
import time
import secrets
def create_default_avatar():
if Avatars.count() == 0:
print("Creating default avatar reference")
Avatars.create({
"file_path": "/static/avatars/default.webp",
"uploaded_at": int(time.time())
})
def create_admin():
username = "admin"
if Users.count({"username": username}) == 0:
print("!!!!!Creating admin account!!!!!")
password_length = 16
password = secrets.token_urlsafe(password_length)
hashed = digest(password)
Users.create({
"username": username,
"password_hash": hashed,
"permission": PermissionLevel.ADMIN.value,
})
print(f"!!!!!Administrator account created, use '{username}' as the login and '{password}' as the password. This will only be shown once!!!!!")
def create_deleted_user():
username = "DeletedUser"
if Users.count({"username": username}) == 0:
print("Creating DeletedUser")
Users.create({
"username": username,
"password_hash": "",
"permission": PermissionLevel.SYSTEM.value,
})
def create_app(): def create_app():
app = Flask(__name__) app = Flask(__name__)
@ -22,6 +59,10 @@ def create_app():
create_tables() create_tables()
run_migrations() run_migrations()
create_default_avatar()
create_admin()
create_deleted_user()
from app.routes.app import bp as app_bp from app.routes.app import bp as app_bp
app.register_blueprint(app_bp) app.register_blueprint(app_bp)

View File

@ -2,7 +2,7 @@ from argon2 import PasswordHasher
ph = PasswordHasher() ph = PasswordHasher()
def hash_password(password): def digest(password):
return ph.hash(password) return ph.hash(password)
def verify(expected, given): def verify(expected, given):

8
app/constants.py Normal file
View File

@ -0,0 +1,8 @@
from enum import Enum
class PermissionLevel(Enum):
GUEST = 0
USER = 1
MODERATOR = 2
SYSTEM = 3
ADMIN = 4

View File

@ -200,6 +200,16 @@ class Model:
return None return None
@classmethod
def count(cls, conditions = None):
qb = db.QueryBuilder(cls.table).select("COUNT(*) AS c")
if conditions is not None:
qb.where(conditions)
result = qb.first()
return result["c"] if result else 0
def update(self, data): def update(self, data):
qb = db.QueryBuilder(self.table)\ qb = db.QueryBuilder(self.table)\
.where({"id": self._data["id"]}) .where({"id": self._data["id"]})

View File

@ -1 +1,25 @@
from .db import Model from .db import Model
class Users(Model):
table = "users"
class Topics(Model):
table = "topics"
class Threads(Model):
table = "threads"
class Posts(Model):
table = "posts"
class PostHistory(Model):
table = "post_history"
class Sessions(Model):
table = "sessions"
class Avatars(Model):
table = "avatars"
class Subscriptions(Model):
table = "subscriptions"