From 5f9c3f168d495cf81fbd39fb300748c5c923506e Mon Sep 17 00:00:00 2001 From: root <krish94@uab.edu> Date: Tue, 5 Apr 2022 13:02:39 -0500 Subject: [PATCH 1/6] added state checking --- app/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index 7753b03..5dd8c41 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -34,6 +34,8 @@ def create_app(config_name): @app.route('/', methods=['GET', 'POST']) # initial route to display the reg page def index(): + invalid_state = ["blocked", "certification"] + if 'uid' not in session: session['uid']=str(uuid.uuid4()) @@ -48,7 +50,11 @@ def create_app(config_name): else: session['return_url'] = request.referrer - return render_template('auth/SignUp.html', room_id=session['uid'], + if rc_util.check_state(session['user'].get('username')) in invalid_state: + return render_template('errors/error.html', title='account creation failed') + + else: + return render_template('auth/SignUp.html', room_id=session['uid'], username=session['user'].get('username'), fullname=session['user'].get('fullname'), email=session['user'].get('email'), referrer=session['return_url'], cancel_url=vars.default_referrer, -- GitLab From 91b50d6b2e669cf5d6249ba787e9bbd500bbd79a Mon Sep 17 00:00:00 2001 From: root <krish94@uab.edu> Date: Tue, 5 Apr 2022 22:44:54 -0500 Subject: [PATCH 2/6] 1. Reading eppa value from request header 2. Sending to error page of eppa not valid --- app/__init__.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 5dd8c41..ab5b673 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -12,6 +12,7 @@ from flask_bootstrap import Bootstrap import random import os import json +import sys def create_app(config_name): app = Flask(__name__, static_folder='static') # initialization of the flask app @@ -22,11 +23,13 @@ def create_app(config_name): username_key = list(filter(lambda key: (request.headers.get(key) is not None), vars.username_key)) fullname_key = list(filter(lambda key: (request.headers.get(key) is not None), vars.fullname_key)) email_key = list(filter(lambda key: (request.headers.get(key) is not None), vars.email_key)) + eppa_key = list(filter(lambda key: (request.headers.get(key) is not None), vars.eppa_key)) user = { "username": (request.headers.get(username_key[0]) if len(username_key) > 0 else None), "fullname": (request.headers.get(fullname_key[0]) if len(fullname_key) > 0 else None), "email": (request.headers.get(email_key[0]) if len(email_key) > 0 else None), + "eppa": (request.headers.get(eppa_key[0]) if len(eppa_key) > 0 else None), } return user @@ -34,6 +37,7 @@ def create_app(config_name): @app.route('/', methods=['GET', 'POST']) # initial route to display the reg page def index(): + valid_eppa = ["staff", "faculty", "student"] invalid_state = ["blocked", "certification"] if 'uid' not in session: @@ -42,16 +46,14 @@ def create_app(config_name): if 'user' not in session: session["user"] = get_authorized_user() - if "redir" in request.args and 'return_url' not in session: # check for redir arg in url - session['return_url'] = request.args.get("redir") + session['return_url'] = request.args.get('redir', vars.default_referrer) - elif "redir" not in request.args and 'return_url' not in session: - session['return_url'] = vars.default_referrer - else: - session['return_url'] = request.referrer + + if session['user'].get('eppa') in not valid_eppa: + return render_template('errors/error.html', title='shibboleth error') if rc_util.check_state(session['user'].get('username')) in invalid_state: - return render_template('errors/error.html', title='account creation failed') + return render_template('errors/error.html', title='account state error') else: return render_template('auth/SignUp.html', room_id=session['uid'], @@ -62,6 +64,8 @@ def create_app(config_name): cancel_msg=messages.cancel_message, error_msg=messages.error_message) + + @app.route('/error_account') def error_account_create(): return render_template('errors/error.html', title='account creation failed') -- GitLab From 691bf52b5f8fb02057e04098fe00e66cd31ab29e Mon Sep 17 00:00:00 2001 From: root <krish94@uab.edu> Date: Tue, 5 Apr 2022 22:59:14 -0500 Subject: [PATCH 3/6] fixed typo in if condition --- app/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index ab5b673..15af932 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -49,7 +49,7 @@ def create_app(config_name): session['return_url'] = request.args.get('redir', vars.default_referrer) - if session['user'].get('eppa') in not valid_eppa: + if session['user'].get('eppa') not in valid_eppa: return render_template('errors/error.html', title='shibboleth error') if rc_util.check_state(session['user'].get('username')) in invalid_state: -- GitLab From bd5461123f7559ce76158e92101d47510ee806be Mon Sep 17 00:00:00 2001 From: Krish M <krish94@uab.edu> Date: Thu, 7 Apr 2022 21:31:54 -0500 Subject: [PATCH 4/6] added 2 pages for error handling --- app/__init__.py | 17 +++--- app/templates/errors/blocked.html | 74 ++++++++++++++++++++++++ app/templates/errors/certification.html | 75 +++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 app/templates/errors/blocked.html create mode 100644 app/templates/errors/certification.html diff --git a/app/__init__.py b/app/__init__.py index 15af932..288b971 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -37,7 +37,7 @@ def create_app(config_name): @app.route('/', methods=['GET', 'POST']) # initial route to display the reg page def index(): - valid_eppa = ["staff", "faculty", "student"] + invalid_eppa = ["staff"] invalid_state = ["blocked", "certification"] if 'uid' not in session: @@ -49,11 +49,11 @@ def create_app(config_name): session['return_url'] = request.args.get('redir', vars.default_referrer) - if session['user'].get('eppa') not in valid_eppa: - return render_template('errors/error.html', title='shibboleth error') + if session['user'].get('eppa') not in invalid_eppa: + return render_template('errors/blocked.html', title='shibboleth error') - if rc_util.check_state(session['user'].get('username')) in invalid_state: - return render_template('errors/error.html', title='account state error') +# if rc_util.check_state(session['user'].get('username')) in invalid_state: +# return render_template('errors/error.html', title='account state error') else: return render_template('auth/SignUp.html', room_id=session['uid'], @@ -66,10 +66,13 @@ def create_app(config_name): - @app.route('/error_account') + @app.route('/blocked_account') def error_account_create(): - return render_template('errors/error.html', title='account creation failed') + return render_template('errors/blocked.html') + @app.route('/certify_account') + def error_account_create(): + return render_template('errors/certification.html') # misc page error catching @app.errorhandler(403) diff --git a/app/templates/errors/blocked.html b/app/templates/errors/blocked.html new file mode 100644 index 0000000..964235e --- /dev/null +++ b/app/templates/errors/blocked.html @@ -0,0 +1,74 @@ +<html class="gr__rc_uab_edu"> +<title>User Blocked </title> +<head> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script> +<script src="{{ url_for('static', filename='scripts/function.js') }}"></script> + + +<link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/application.css') }}"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/app2.css') }}"> + +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + .navbar-inverse { background-color: rgb(0,99,65); } + button{ margin: 13px; + .important { color: #336699; }} +</style> + +</head> + + +<body data-gr-c-s-loaded="true"> +<header> + <nav class="navbar navbar-inverse navbar-static-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> + <a class="navbar-brand" href="/"> UAB Research Computing</a> + </div> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9"> + <div class="navbar-right"> + <ul class="nav navbar-nav"> + <li> + <a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted"> + <i class="fas fa-info-circle fa-fw"></i> Online Documentation + </a> + </li> + </ul> + </div> + </div> + </div> + </nav> +</header> + +<div class="container content" role="main" style="width: 100%"> + <div class="col-md-2 col-sm-2 my-col"> + <img alt="logo" height="auto" width="80%" src="{{ url_for('static', filename='img/logo_svg.svg') }}"> + <a href="https://tinyurl.com/cheahaAL" target="_blank"></a> + </div> + + <div class="col-md-10 col-sm-10 my-col"> + <div id="form-wrapper"> + <h2> Account blocked </h2> + <p style="font-size:110%;"> {{ welcome_msg |safe }}</p> + </div> + </div> +</div> + +<footer> + <div class="container-fluid"> + <div class="row"> + <div class="col-md-6 col-sm-6"> + <a href="https://osc.github.io/Open-OnDemand/"> + <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}"> + </a> + </div> + </div> + </div> +</footer> + +</body> +</html> diff --git a/app/templates/errors/certification.html b/app/templates/errors/certification.html new file mode 100644 index 0000000..529b7c7 --- /dev/null +++ b/app/templates/errors/certification.html @@ -0,0 +1,75 @@ +<html class="gr__rc_uab_edu"> +<title>User Certification Needed </title> +<head> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script> +<script src="{{ url_for('static', filename='scripts/function.js') }}"></script> + + +<link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/application.css') }}"> +<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/app2.css') }}"> + +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + .navbar-inverse { background-color: rgb(0,99,65); } + button{ margin: 13px; + .important { color: #336699; }} +</style> + +</head> + + +<body data-gr-c-s-loaded="true"> +<header> + <nav class="navbar navbar-inverse navbar-static-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> + <a class="navbar-brand" href="/"> UAB Research Computing</a> + </div> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9"> + <div class="navbar-right"> + <ul class="nav navbar-nav"> + <li> + <a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted"> + <i class="fas fa-info-circle fa-fw"></i> Online Documentation + </a> + </li> + </ul> + </div> + </div> + </div> + </nav> +</header> + +<div class="container content" role="main" style="width: 100%"> + <div class="col-md-2 col-sm-2 my-col"> + <img alt="logo" height="auto" width="80%" src="{{ url_for('static', filename='img/logo_svg.svg') }}"> + <a href="https://tinyurl.com/cheahaAL" target="_blank"></a> + </div> + + <div class="col-md-10 col-sm-10 my-col"> + <div id="form-wrapper"> + <h2> Account/User Certification Needed </h2> + <p style="font-size:110%;"> {{ welcome_msg |safe }}</p> + <button class="btn btn-primary btn-md" id="submit" name="submit" type="button" value="Submit" onclick="accountCertification()"> Certify Account</button> + </div> + </div> +</div> + +<footer> + <div class="container-fluid"> + <div class="row"> + <div class="col-md-6 col-sm-6"> + <a href="https://osc.github.io/Open-OnDemand/"> + <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}"> + </a> + </div> + </div> + </div> +</footer> + +</body> +</html> -- GitLab From fadb4415f14c068cb6ace614a9c0ebb2298a15e8 Mon Sep 17 00:00:00 2001 From: Krish M <krish94@uab.edu> Date: Thu, 7 Apr 2022 22:21:56 -0500 Subject: [PATCH 5/6] implemented logic to route user to correct page based on account state --- app/__init__.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 288b971..7a3e061 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -14,6 +14,9 @@ import os import json import sys +sys.path.append(vars.rabbitmq_agents_loc) +import rc_util + def create_app(config_name): app = Flask(__name__, static_folder='static') # initialization of the flask app cors = CORS(app, resources={r"/*": {"origins": vars.cors_allowed_origins}}) @@ -38,7 +41,6 @@ def create_app(config_name): def index(): invalid_eppa = ["staff"] - invalid_state = ["blocked", "certification"] if 'uid' not in session: session['uid']=str(uuid.uuid4()) @@ -49,11 +51,14 @@ def create_app(config_name): session['return_url'] = request.args.get('redir', vars.default_referrer) - if session['user'].get('eppa') not in invalid_eppa: - return render_template('errors/blocked.html', title='shibboleth error') +# if session['user'].get('eppa') not in invalid_eppa: +# return render_template('errors/blocked.html', title='shibboleth error') + + if rc_util.check_state(session['user'].get('username')) == "blocked": + return render_template('errors/blocked.html') -# if rc_util.check_state(session['user'].get('username')) in invalid_state: -# return render_template('errors/error.html', title='account state error') + elif rc_util.check_state(session['user'].get('username')) == "certification": + return render_template('errors/certification.html') else: return render_template('auth/SignUp.html', room_id=session['uid'], @@ -65,13 +70,12 @@ def create_app(config_name): error_msg=messages.error_message) - @app.route('/blocked_account') - def error_account_create(): + def account_block(): return render_template('errors/blocked.html') @app.route('/certify_account') - def error_account_create(): + def error_certify(): return render_template('errors/certification.html') # misc page error catching -- GitLab From 0015478320171fbefd6cdfaf043f076b64287f0c Mon Sep 17 00:00:00 2001 From: Krish M <krish94@uab.edu> Date: Mon, 11 Apr 2022 15:23:42 -0500 Subject: [PATCH 6/6] merge auto-conflict on app/__init__.py --- app/__init__.py | 9 +++++++-- app/static/scripts/function.js | 8 ++++++++ run.py | 11 +++++++++++ tasks.py | 18 +++++++++++++++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 7a3e061..dffb23c 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -58,8 +58,13 @@ def create_app(config_name): return render_template('errors/blocked.html') elif rc_util.check_state(session['user'].get('username')) == "certification": - return render_template('errors/certification.html') - + return render_template('errors/certify.html', room_id=session['uid'], + username=session['user'].get('username'), + fullname=session['user'].get('fullname'), email=session['user'].get('email'), + referrer=session['return_url'], cancel_url=vars.default_referrer, + welcome_msg=messages.welcome_message, + cancel_msg=messages.cancel_message, + error_msg=messages.error_message) else: return render_template('auth/SignUp.html', room_id=session['uid'], username=session['user'].get('username'), diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js index ae406d7..8848dae 100644 --- a/app/static/scripts/function.js +++ b/app/static/scripts/function.js @@ -16,6 +16,14 @@ function request_account() { }) } +function certify_account() { + socket.emit('request certification', { + fullname: document.getElementById("fullname").value, + email: document.getElementById("email").value, + username: document.getElementById("username").value + }) +} + function renderDom(title, message, error_msg) { document.getElementById("form-wrapper").innerHTML = "<h3>" + title + "</h3><br>"; document.getElementById("form-wrapper").innerHTML += "<p>" + message + "</p><br>"; diff --git a/run.py b/run.py index f69a208..d68af76 100644 --- a/run.py +++ b/run.py @@ -35,5 +35,16 @@ def request_account(json, methods=['GET', 'POST']): print(time.strftime("%m-%d-%Y_%H:%M:%S") + "\tError in account creation: ", e) socketio.emit("Account creation failed", room) +@socketio.on('request certification') +def certify_account(json, methods=['GET', 'POST']): + print (time.strftime("%m-%d-%Y_%H:%M:%S") + '\tQueue request received: ' + str(json)) + room = str(session['uid']) + print("CERTIFY Room: {}".format(room)) + try: + tasks.celery_certify_account(json, session=room ) + except Exception as e: + print(time.strftime("%m-%d-%Y_%H:%M:%S") + "\tError in account certification: ", e) + socketio.emit("Account certification failed", room) + if __name__ == '__main__': socketio.run(app, host='0.0.0.0') diff --git a/tasks.py b/tasks.py index acf3818..5721e47 100644 --- a/tasks.py +++ b/tasks.py @@ -59,4 +59,20 @@ def celery_create_account(json, session): rc_util.add_account(username, queuename, email, fullname, reason) print('sent account info') print('Waiting for completion...') - rc_util.consume(queuename, routing_key=f'complete.{queuename}', callback=gen_f(room)) + rc_util.consume(queuename, routing_key=f'complete.{queuename}', callback=gen_f(room)) + +@celery.task +def celery_certify_account(json, session): + room = session + username= json['username'] + email= json['email'] + fullname= json['fullname'] + queuename= rc_util.encode_name(username) + + print("CERTIFY : "+time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue') + send_msg('certifying account', room) + print(username) + rc_util.update_state(username, 'ok') + print('sent account info') + print('Waiting for certification...') + send_msg('certified', room) -- GitLab