summaryrefslogtreecommitdiff
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py148
1 files changed, 148 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100644
index 00000000..67ff72ac
--- /dev/null
+++ b/main.py
@@ -0,0 +1,148 @@
+#!/var/www/opendc.ewi.tudelft.nl/web-server/venv/bin/python
+
+import json
+import os
+import sys
+import traceback
+
+from flask import Flask, abort, request, send_from_directory, session, jsonify
+import flask_socketio
+from oauth2client import client, crypt
+
+from opendc.models.user import User
+from opendc.util import exceptions, rest
+
+# Get keys from config file
+with open('/var/www/opendc.ewi.tudelft.nl/web-server/config/keys.json') as file:
+ KEYS = json.load(file)
+
+STATIC_ROOT = os.path.join(KEYS['ROOT_DIR'], 'static', 'build')
+
+FLASK_CORE_APP = Flask(__name__, static_url_path='')
+FLASK_CORE_APP.config['SECREY_KEY'] = KEYS['FLASK_SECRET']
+
+SOCKET_IO_CORE = flask_socketio.SocketIO(FLASK_CORE_APP)
+
+@FLASK_CORE_APP.errorhandler(404)
+def page_not_found(e):
+ return send_from_directory(STATIC_ROOT, '404.html')
+
+@FLASK_CORE_APP.route('/')
+def serve_splash():
+ """Serve the splash page on /"""
+
+ return send_from_directory(STATIC_ROOT, 'index.html')
+
+@FLASK_CORE_APP.route('/app')
+def serve_app():
+ """Serve the app on /app."""
+
+ return send_from_directory(STATIC_ROOT, 'app.html')
+
+@FLASK_CORE_APP.route('/profile')
+def serve_profile():
+ """Serve profile page."""
+
+ return send_from_directory(STATIC_ROOT, 'profile.html')
+
+@FLASK_CORE_APP.route('/projects')
+def serve_projects():
+ """Serve the projects page."""
+
+ return send_from_directory(STATIC_ROOT, 'projects.html')
+
+@FLASK_CORE_APP.route('/web-server-test')
+def serve_web_server_test():
+ """Serve the web server test."""
+
+ return send_from_directory(os.path.join(KEYS['ROOT_DIR'], 'web-server', 'static'), 'index.html')
+
+@FLASK_CORE_APP.route('/<path:folder>/<path:filepath>')
+def serve_static(folder, filepath):
+ """Serve static files from the build directory"""
+
+ if not folder in ['bower_components', 'img', 'scripts', 'styles']:
+ abort(404)
+
+ return send_from_directory(os.path.join(KEYS['ROOT_DIR'], 'static', 'build', folder), filepath)
+
+@FLASK_CORE_APP.route('/tokensignin', methods=['POST'])
+def sign_in():
+ """Authenticate a user with Google sign in"""
+
+ try:
+ token = request.form['idtoken']
+ except KeyError:
+ return 'No idtoken provided', 401
+
+ try:
+ idinfo = client.verify_id_token(token, KEYS['OAUTH_CLIENT_ID'])
+
+ if idinfo['aud'] != KEYS['OAUTH_CLIENT_ID']:
+ raise crypt.AppIdentityError('Unrecognized client.')
+
+ if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
+ raise crypt.AppIdentityError('Wrong issuer.')
+
+ except crypt.AppIdentityError, e:
+ return 'Did not successfully authenticate'
+
+ user = User.from_google_id(idinfo['sub'])
+
+ data = {
+ 'isNewUser': not user.exists()
+ }
+
+ if user.exists():
+ data['userId'] = user.id
+
+ return jsonify(**data)
+
+@SOCKET_IO_CORE.on('request')
+def receive_message(message):
+ """"Receive a SocketIO request"""
+
+ try:
+ request = rest.Request(message)
+ response = request.process()
+
+ flask_socketio.emit('response', response.to_JSON(), json=True)
+
+ print 'Socket: {} to `/{}` resulted in {}: {}'.format(
+ request.method,
+ request.path,
+ response.status['code'],
+ response.status['description']
+ )
+
+ return
+
+ except exceptions.AuthorizationTokenError as e:
+ response = rest.Response(401, 'Authorization error')
+ response.id = message['id']
+
+ flask_socketio.emit('response', response.to_JSON(), json=True)
+
+ except exceptions.RequestInitializationError as e:
+ response = rest.Response(400, e.message)
+ response.id = message['id']
+
+ flask_socketio.emit('response', response.to_JSON(), json=True)
+
+ except Exception as e:
+ response = rest.Response(500, 'Internal server error')
+ response.id = message['id']
+
+ flask_socketio.emit('response', response.to_JSON(), json=True)
+ traceback.print_exc()
+
+ print 'Socket: {} to `{}` resulted in {}: {}'.format(
+ message['method'],
+ message['path'],
+ response.status['code'],
+ response.status['description']
+ )
+
+
+SOCKET_IO_CORE.run(FLASK_CORE_APP, port=8081)
+