151 lines
5 KiB
Python
151 lines
5 KiB
Python
from flask import Flask, render_template, flash, send_from_directory, redirect, request, session, url_for
|
|
from flask_sqlalchemy import SQLAlchemy
|
|
from flask_migrate import Migrate
|
|
from flask_login import LoginManager, current_user, login_user, logout_user, login_required
|
|
from operator import itemgetter
|
|
import os
|
|
|
|
from models import db, User, Referal
|
|
|
|
app = Flask(__name__)
|
|
app.config.from_pyfile('settings.cfg')
|
|
|
|
db.app = app
|
|
db.init_app(app)
|
|
|
|
migrate = Migrate(app, db)
|
|
|
|
login_manager = LoginManager()
|
|
login_manager.init_app(app)
|
|
login_manager.login_view = "login"
|
|
|
|
@login_manager.user_loader
|
|
def load_user(id):
|
|
return User.query.get(id)
|
|
|
|
@app.route('/')
|
|
def index():
|
|
if current_user.is_authenticated:
|
|
return redirect(url_for('browse'))
|
|
else:
|
|
return redirect(url_for('login'))
|
|
|
|
@app.route('/login', methods=['GET', 'POST'])
|
|
def login():
|
|
if request.method == 'GET':
|
|
if current_user.is_authenticated:
|
|
return redirect(request.args.get('next') or url_for('index'))
|
|
else:
|
|
return render_template('login.html')
|
|
else:
|
|
username = request.form['username']
|
|
password = request.form['password']
|
|
|
|
user = User.query.filter_by(username=username).first()
|
|
if user is None:
|
|
flash("username / password all fucked up", 'error')
|
|
return redirect(request.path)
|
|
|
|
if user.check_password(password) == True:
|
|
success = login_user(user)
|
|
if success:
|
|
flash("holy cow you are logged in!", 'info')
|
|
return redirect(request.args.get('next') or url_for('index'))
|
|
else:
|
|
flash("oof ouch u banned my dude", 'error')
|
|
return redirect(request.path)
|
|
|
|
else:
|
|
flash("username / password all fucked up", 'error')
|
|
return redirect(request.path)
|
|
|
|
@app.route('/signup', methods=['GET', 'POST'])
|
|
def signup():
|
|
referal_key = request.args.get('referalkey')
|
|
if not referal_key:
|
|
return render_template('genericerror.html', message="I don't trust y'all. Signups are by referal only rn.")
|
|
|
|
referal = Referal.query.filter_by(key=referal_key).first()
|
|
if not referal:
|
|
return render_template('genericerror.html', message="Someone gave you a bad referal code. What a dumbass. \nGo ask for a new one.")
|
|
if not referal.user.active == True:
|
|
return render_template('genericerror.html', message="Looks like {user} got a good 'ol banaroni. Referals from them aren't valid anymore. \nSorry pal.".format(user=referal.user.username))
|
|
|
|
if request.method == 'GET':
|
|
return render_template('signup.html', referer_username=referal.user.username, referal_message=referal.message or "oh worm? make an account my dude")
|
|
else:
|
|
username = request.form['username']
|
|
password = request.form['password']
|
|
new_user = User(username, password)
|
|
|
|
db.session.add(new_user)
|
|
db.session.delete(referal)
|
|
db.session.commit()
|
|
|
|
login_success = login_user(new_user)
|
|
if login_success:
|
|
return redirect(url_for('browse'))
|
|
else:
|
|
flash("couldn't log you in because ?? guess you'll have to do it yourself", 'error')
|
|
return redirect(url_for('login'))
|
|
|
|
@app.route('/logout')
|
|
@login_required
|
|
def logout():
|
|
logout_user()
|
|
flash("bye binch", 'info')
|
|
return redirect(url_for('login'))
|
|
|
|
#FIXME: make this functionality avalible in a settings/admin view
|
|
@app.route('/newreferal')
|
|
@login_required
|
|
def newreferal():
|
|
referal = Referal(current_user)
|
|
db.session.add(referal)
|
|
db.session.commit()
|
|
|
|
return referal.key
|
|
|
|
@app.route('/browse/')
|
|
@app.route('/browse/<path:path>')
|
|
@login_required
|
|
def browse(path = None):
|
|
# Search for files in path
|
|
searchpath = os.path.join('files', path) if path is not None else 'files'
|
|
|
|
# 404 if no such path exists
|
|
if not os.path.exists(searchpath):
|
|
return render_template('404.html'), 404
|
|
|
|
if not os.path.isdir(searchpath):
|
|
return redirect(url_for('files', path=path), code=301)
|
|
|
|
# Organize files and some props into tuple list
|
|
file_size_isdir_tuple_list = [];
|
|
for filename in os.listdir(searchpath):
|
|
if not filename.startswith('.'):
|
|
fullpath = os.path.join(searchpath, filename)
|
|
file_size_bytes = os.path.getsize(fullpath)
|
|
file_size_isdir_tuple_list.append((filename, file_size_bytes, os.path.isdir(fullpath)))
|
|
|
|
file_size_isdir_tuple_list.sort(key=itemgetter(0))
|
|
file_size_isdir_tuple_list.sort(key=itemgetter(2), reverse=True)
|
|
|
|
# Render out the item browser
|
|
return render_template('items.html', files = file_size_isdir_tuple_list, path = os.path.normpath(path) + '/' if path is not None else '')
|
|
|
|
@app.route('/files/<path:path>')
|
|
@login_required
|
|
def files(path):
|
|
return send_from_directory('files', path)
|
|
|
|
@app.errorhandler(404)
|
|
def page_not_found(e):
|
|
return render_template('404.html'), 404
|
|
|
|
@app.errorhandler(500)
|
|
def internal_error(e):
|
|
return render_template('500.html'), 500
|
|
|
|
if __name__ == "__main__":
|
|
app.run()
|