#!/usr/bin/python # -*- coding: UTF-8 -*- from datetime import timedelta from hashlib import sha512 from uuid import uuid4 import os from flask import Flask from flask import render_template, send_from_directory from flask import request from flask import session from flask import url_for from flask_compress import Compress from flask_session import Session from werkzeug import redirect from functions import pbkdf2 import config ################################################################################ app = Flask( __name__ ) app.config.from_pyfile( 'config.py' ) Compress( app ) Session( app ) debug = os.environ.get( "DEBUG", False ) baseurl = os.environ.get( "BASEURL", "" ) ################################################################################ # Generic routing @app.route( baseurl + '/ping' ) def ping(): return "pong" ################################################################################ # App serving @app.route( baseurl + '/app/' ) def send_app_files( path ): return send_from_directory( 'app', path ) ################################################################################ # Sessions @app.before_request def renew_session(): session.permanent = True app.permanent_session_lifetime = timedelta( seconds = config.session_timeout ) @app.route( baseurl + '/logout' ) def logout(): session.clear() return redirect( url_for( 'home' ) ) @app.route( baseurl + '/login' ) def login(): session.clear() return render_template( "login.html", baseurl = baseurl, js = config.cdnjs, css = config.cdncss ) @app.route( baseurl + '/do_login', methods = [ 'POST' ] ) def do_login(): q = config.db.query( 'SELECT * FROM users WHERE username = %s', ( request.form.get( "username" ), ) ) user = q.fetchone() if pbkdf2( request.form.get( "password" ), user[ 'password' ] ): session[ 'logged' ] = True session[ 'session_id' ] = str( uuid4() ) session[ 'username' ] = user[ 'username' ] return redirect( url_for( 'home' ) ) else: session.clear() return redirect( url_for( 'home' ) ) ################################################################################ # Home page @app.route( baseurl + '/' ) def home(): if not 'session_id' in session: return redirect( url_for( 'login' ) ) else: return render_template( "index.html", baseurl = baseurl ) ################################################################################ # Main startup if __name__ == '__main__': app.run( debug = debug, host = "0.0.0.0", threaded = True )