From 44cc24b1af5e7657270cddca3e6f73739023e049 Mon Sep 17 00:00:00 2001 From: James Wang Date: Tue, 22 Dec 2015 20:17:39 -0500 Subject: [PATCH 1/5] Add mysql dependencies --- scripts/requirements.txt | 3 ++- scripts/setup.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 1167f2f..34e95c7 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,2 +1,3 @@ Flask -gunicorn \ No newline at end of file +gunicorn +flask-mysql \ No newline at end of file diff --git a/scripts/setup.sh b/scripts/setup.sh index 043bc62..ed0a903 100644 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -5,7 +5,7 @@ sudo apt-get -y update sudo apt-get -y upgrade echo "Installing dependencies..." -sudo apt-get -y install python-pip +sudo apt-get -y install python-pip libmysqlclient-dev echo "Installing pip dependencies..." sudo pip install -r scripts/requirements.txt From b6800b5b47993212042b2d0e0a2bb1e4a915e5ed Mon Sep 17 00:00:00 2001 From: Thomas Gerot Date: Tue, 22 Dec 2015 19:18:30 -0600 Subject: [PATCH 2/5] Deleted Angular.js --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2c08841..2fba482 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ #EasyCTF 2016 The EasyCTF website for the 2016 competition. -**Back End** : Flask (Python) +**Resources** : Flask, MySQL + Main Pages: - login.html @@ -20,8 +21,6 @@ Main Pages: - updates.html - resetpassword.html -**Front End** : Angular.js (JavaScript) - Color Scheme: #69D2E7 | #A7DBDB | #E0E4CC | #F38630 | #FA6900 Setting Up The Environment From 869ce7a269849fac9c96da2e8d21666ce4910e68 Mon Sep 17 00:00:00 2001 From: James Wang Date: Tue, 22 Dec 2015 20:37:38 -0500 Subject: [PATCH 3/5] Add beginnings of an api --- server/api/__init__.py | 0 server/api/api.py | 11 +++++++++++ server/app.py | 38 +++++++++++++++++++++----------------- 3 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 server/api/__init__.py create mode 100644 server/api/api.py diff --git a/server/api/__init__.py b/server/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/api.py b/server/api/api.py new file mode 100644 index 0000000..7626508 --- /dev/null +++ b/server/api/api.py @@ -0,0 +1,11 @@ +from flask import Blueprint + +api = Blueprint("api", __name__) + +@api.route("/api/register", methods=["POST"]) +def register(): + pass + +@api.route("/api/login", methods=["POST"]) +def login(): + pass diff --git a/server/app.py b/server/app.py index df19576..2be5eba 100644 --- a/server/app.py +++ b/server/app.py @@ -1,75 +1,79 @@ -from flask import Flask import sys + import config +from api.api import api +from flask import Flask + app = Flask(__name__) app.secret_key = config.SECRET #Home Page @app.route("/") def hello_world(): - return "Hello, EasyCTF!" + return "Hello, EasyCTF!" #Login Page @app.route('/login') def login(): - return "EasyCTF Login" + return "EasyCTF Login" #Registration Page @app.route('/register') def register(): - return "EasyCTF Register" + return "EasyCTF Register" #Scoreboard Page @app.route('/scoreboard') def scoreboard(): - return "EasyCTF Scoreboard" + return "EasyCTF Scoreboard" #Problems Page @app.route('/problems') def problems(): - return "EasyCTF Problems" + return "EasyCTF Problems" #Account Page @app.route('/account') def account(): - return "EasyCTF Account" + return "EasyCTF Account" #Programming Page @app.route('/programming') def programming(): - return "EasyCTF Programming" + return "EasyCTF Programming" #Chat Page @app.route('/chat') def chat(): - return "EasyCTF Chat" + return "EasyCTF Chat" #About Page @app.route('/about') def about(): - return "EasyCTF About" + return "EasyCTF About" #Forgot Password Page @app.route('/forgot_password') def forgot_password(): - return "EasyCTF Forgot Password" + return "EasyCTF Forgot Password" #Logout Page @app.route('/logout') def logout(): - return "EasyCTF Logout" + return "EasyCTF Logout" #Rules Page @app.route('/rules') def rules(): - return "EasyCTF Rules" + return "EasyCTF Rules" #Team Page @app.route('/team') def team(): - return "EasyCTF Team" + return "EasyCTF Team" #Shell Page @app.route('/shell') def shell(): - return "EasyCTF Shell" + return "EasyCTF Shell" #Updates Page @app.route('/updates') def updates(): - return "EasyCTF Updates" + return "EasyCTF Updates" #Reset Password Page @app.route('/reset_password') def reset_password(): - return "EasyCTF Reset" + return "EasyCTF Reset" if __name__ == "__main__": + app.register_blueprint(api) app.debug = "--debug" in sys.argv app.run(port=8000) From 0b2e5d00c251ff98f1e448dbc13e283ed3d94b8d Mon Sep 17 00:00:00 2001 From: James Wang Date: Tue, 22 Dec 2015 20:45:50 -0500 Subject: [PATCH 4/5] Add skeleton for a few decorators --- server/api/decorators.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 server/api/decorators.py diff --git a/server/api/decorators.py b/server/api/decorators.py new file mode 100644 index 0000000..9164a8f --- /dev/null +++ b/server/api/decorators.py @@ -0,0 +1,21 @@ +from functools import wraps +from flask import session + +def login_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + return f(*args, **kwargs) + return decorated_function + +def admins_only(f): + @wraps(f) + def decorated_function(*args, **kwargs): + return f(*args, **kwargs) + return decorated_function + +def check_csrf(f): + @wraps(f) + @login_required + def wrapper(*args, **kwds): + return f(*args, **kwds) + return wrapper From 57e09be6004b8b6c5b36d98e37ad5200eba854a4 Mon Sep 17 00:00:00 2001 From: James Wang Date: Tue, 22 Dec 2015 22:44:51 -0500 Subject: [PATCH 5/5] Add utils.py --- server/api/utils.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 server/api/utils.py diff --git a/server/api/utils.py b/server/api/utils.py new file mode 100644 index 0000000..28127e5 --- /dev/null +++ b/server/api/utils.py @@ -0,0 +1,33 @@ +import datetime +import MySQLdb +import random +import string + +from werkzeug.security import generate_password_hash, check_password_hash + +host = "localhost" +user = "root" + +conn = MySQLdb.connect() + +def get_connection(): + global conn + if not conn: + conn = MySQLdb.connect(host=host, user=user) + return conn + +def hash_password(s): + return generate_password_hash(s) + +def check_password(hashed_password, try_password): + return check_password_hash(hashed_password, try_password) + +def generate_string(length): + return "".join([random.choice(string.letters + string.digits) for x in range(length)]) + +def unix_time_millis(dt): + epoch = datetime.datetime.utcfromtimestamp(0) + return (dt - epoch).total_seconds() * 1000.0 + +def get_time_since_epoch(): + return unix_time_millis(datetime.datetime.now())