mirror of
https://github.com/simon987/od-database.git
synced 2025-04-18 18:06:44 +00:00
Basic admin page
This commit is contained in:
parent
537228444b
commit
dc0cde61a0
38
app.py
38
app.py
@ -1,4 +1,4 @@
|
|||||||
from flask import Flask, render_template, redirect, request, flash, abort, Response, send_from_directory
|
from flask import Flask, render_template, redirect, request, flash, abort, Response, send_from_directory, session
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
@ -192,6 +192,42 @@ def enqueue():
|
|||||||
return redirect("/submit")
|
return redirect("/submit")
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/admin")
|
||||||
|
def admin_login_form():
|
||||||
|
if "username" in session:
|
||||||
|
return redirect("/dashboard")
|
||||||
|
return render_template("admin.html", recaptcha=recaptcha)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/login", methods=["POST"])
|
||||||
|
def admin_login():
|
||||||
|
|
||||||
|
if recaptcha.verify():
|
||||||
|
|
||||||
|
username = request.form.get("username")
|
||||||
|
password = request.form.get("password")
|
||||||
|
|
||||||
|
if db.check_login(username, password):
|
||||||
|
session["username"] = username
|
||||||
|
flash("Logged in", "success")
|
||||||
|
return redirect("/dashboard")
|
||||||
|
|
||||||
|
flash("Invalid username/password combo", "danger")
|
||||||
|
return redirect("/admin")
|
||||||
|
|
||||||
|
else:
|
||||||
|
flash("Invalid captcha", "danger")
|
||||||
|
return redirect("/admin")
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/dashboard")
|
||||||
|
def admin_dashboard():
|
||||||
|
if "username" in session:
|
||||||
|
return render_template("dashboard.html")
|
||||||
|
else:
|
||||||
|
return abort(403)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if config.USE_SSL:
|
if config.USE_SSL:
|
||||||
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
||||||
|
27
database.py
27
database.py
@ -2,6 +2,7 @@ import sqlite3
|
|||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import bcrypt
|
||||||
|
|
||||||
|
|
||||||
class InvalidQueryException(Exception):
|
class InvalidQueryException(Exception):
|
||||||
@ -367,3 +368,29 @@ class Database:
|
|||||||
|
|
||||||
cursor.execute("DELETE FROM Website WHERE id=?", (website_id, ))
|
cursor.execute("DELETE FROM Website WHERE id=?", (website_id, ))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
|
def check_login(self, username, password) -> bool:
|
||||||
|
with sqlite3.connect(self.db_path) as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
cursor.execute("SELECT password FROM Admin WHERE username=?", (username, ))
|
||||||
|
|
||||||
|
db_user = cursor.fetchone()
|
||||||
|
|
||||||
|
if db_user:
|
||||||
|
return bcrypt.checkpw(password.encode(), db_user[0])
|
||||||
|
return False
|
||||||
|
|
||||||
|
def generate_login(self, username, password) -> None:
|
||||||
|
|
||||||
|
with sqlite3.connect(self.db_path) as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
hashed_pw = bcrypt.hashpw(password.encode(), bcrypt.gensalt(14))
|
||||||
|
|
||||||
|
cursor.execute("INSERT INTO Admin (username, password) VALUES (?,?)", (username, hashed_pw))
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,6 +42,11 @@ CREATE TABLE Queue (
|
|||||||
priority INTEGER
|
priority INTEGER
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Admin (
|
||||||
|
username TEXT PRIMARY KEY NOT NULL,
|
||||||
|
password TEXT
|
||||||
|
)
|
||||||
|
|
||||||
-- Full Text Index
|
-- Full Text Index
|
||||||
|
|
||||||
CREATE VIRTUAL TABLE File_index USING fts5 (
|
CREATE VIRTUAL TABLE File_index USING fts5 (
|
||||||
|
@ -8,3 +8,4 @@ Flask-Caching
|
|||||||
praw
|
praw
|
||||||
humanfriendly
|
humanfriendly
|
||||||
apscheduler
|
apscheduler
|
||||||
|
bcrypt
|
26
templates/admin.html
Normal file
26
templates/admin.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% set title = "Admin login - OD-Database" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">Admin login</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form action="/login" method="post">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" name="username" placeholder="Username">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" name="password" placeholder="Password" type="password">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ recaptcha.get_code()|safe }}
|
||||||
|
|
||||||
|
<input type="submit" value="Login">
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock body %}
|
13
templates/dashboard.html
Normal file
13
templates/dashboard.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{% extends "layout.html" %}
|
||||||
|
{% set title = "Dashboard - OD-Database" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">Dashboard</div>
|
||||||
|
<div class="card-body">
|
||||||
|
todo
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock body %}
|
Loading…
x
Reference in New Issue
Block a user