create default avatar, admin, and deleted user on first run
This commit is contained in:
parent
9d20da6a16
commit
b0bd27edd0
@ -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
2
.gitignore
vendored
@ -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/
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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
8
app/constants.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
class PermissionLevel(Enum):
|
||||||
|
GUEST = 0
|
||||||
|
USER = 1
|
||||||
|
MODERATOR = 2
|
||||||
|
SYSTEM = 3
|
||||||
|
ADMIN = 4
|
10
app/db.py
10
app/db.py
@ -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"]})
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user