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