nyxask/app/app.py

115 lines
3.7 KiB
Python
Raw Normal View History

from flask import request, redirect, session, render_template, send_from_directory, Flask
2025-03-09 12:57:29 -05:00
from os import path, walk
2025-03-12 22:47:50 -05:00
import hashlib
2025-03-10 01:25:36 -05:00
import configparser
from sqlalchemy import create_engine, Column, Integer, String
2025-03-12 22:47:50 -05:00
from sqlalchemy.orm import scoped_session,sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import text
2025-03-12 22:47:50 -05:00
2025-03-10 01:25:36 -05:00
config = configparser.ConfigParser()
config.read('config.ini')
instanceBranding = str(config['BRANDING']['instanceName'])
2025-03-12 22:47:50 -05:00
instanceLocation = str(config['BRANDING']['instanceLocation'])
databaseUsername = str(config['DATABASE']['username'])
databasePassword = str(config['DATABASE']['password'])
databaseName = str(config['DATABASE']['name'])
engine = create_engine(f"postgresql://{databaseUsername}:{databasePassword}@localhost/{databaseName}")
db = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String, unique=True, nullable=False)
password = Column(String, nullable=False)
Base.metadata.create_all(engine)
2025-03-10 01:25:36 -05:00
2025-03-09 12:57:29 -05:00
app = Flask(__name__)
2025-03-12 22:47:50 -05:00
def encrypt(data):
hash = hashlib.sha512()
data = data.encode('utf-8')
hash.update(data)
hash = hash.hexdigest()
# print(str(hash))
return hash
#encrypt("hi")
2025-03-09 23:41:26 -05:00
2025-03-09 12:57:29 -05:00
@app.route('/')
def home():
2025-03-11 10:15:17 -05:00
return render_template('index.j2', instanceLocation=instanceLocation, instanceBranding=instanceBranding)
2025-03-09 12:57:29 -05:00
2025-03-09 23:41:26 -05:00
@app.route('/auth/login/', methods=['GET', 'POST'])
2025-03-09 12:57:29 -05:00
def login():
if request.method == 'POST':
username = request.form['username']
password = encrypt(request.form['password'])
user = db.execute(text("SELECT * FROM users WHERE username = :username AND password = :password"),
2025-03-13 00:20:56 -05:00
{"username": username, "password": password}).fetchone()
if user:
session['user_id'] = user.id
return redirect('/')
else:
2025-03-13 00:20:56 -05:00
return "invalid credentials 😾"
2025-03-11 10:15:17 -05:00
return render_template('login.j2', instanceLocation=instanceLocation, instanceBranding=instanceBranding)
2025-03-09 12:57:29 -05:00
@app.route('/auth/register/', methods=['GET', 'POST'])
2025-03-10 00:48:30 -05:00
def register():
if request.method == 'POST':
username = request.form['username']
password = encrypt(request.form['password'])
print(username)
# check if username exists
existing_user = db.execute(text("SELECT * FROM users WHERE username = :username"),
{"username": username}).fetchone()
if existing_user:
2025-03-13 00:20:56 -05:00
return "that user already exists 😾"
# insert new user
db.execute(text("INSERT INTO users (username, password) VALUES (:username, :password)"),
{"username": username, "password": password})
db.commit()
return redirect('/auth/login/') # redirect to login page after successful registration
2025-03-11 10:15:17 -05:00
return render_template('register.j2', instanceLocation=instanceLocation, instanceBranding=instanceBranding)
2025-03-09 23:41:26 -05:00
@app.route('/auth/logout/')
def logout():
session.pop('user_id', None)
return redirect('/')
2025-03-13 19:15:29 -05:00
@app.route('/auth/profile/')
2025-03-13 19:27:36 -05:00
def privateProfile():
2025-03-13 19:15:29 -05:00
return render_template('account.j2', userName='alice') #temporary name
2025-03-09 23:41:26 -05:00
@app.route('/assets/css/index.css')
def index_css():
return send_from_directory('static/assets/css', 'index.css')
extra_dirs = ['app/templates', 'static/assets/css']
2025-03-09 12:57:29 -05:00
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
for dirname, dirs, files in walk(extra_dir):
for filename in files:
filename = path.join(dirname, filename)
if path.isfile(filename):
extra_files.append(filename)
if __name__ == '__main__':
2025-03-12 22:47:50 -05:00
app.secret_key = 'super secret key'
2025-03-13 19:27:51 -05:00
app.run(debug=True, extra_files=extra_files, port=6996)