diff options
Diffstat (limited to 'main.py')
| -rw-r--r-- | main.py | 148 |
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) + |
