diff --git a/application/access_module/access_api.py b/application/access_module/access_api.py index d73e4b1..14a5f71 100644 --- a/application/access_module/access_api.py +++ b/application/access_module/access_api.py @@ -15,10 +15,12 @@ access_api = Blueprint('access_api', __name__, template_folder="templates", stat def update_session_user(): - database_config = config() - with psycopg2.connect(**database_config) as conn: - user = postsqldb.LoginsTable.get_washed_tuple(conn, (session['user_id'],)) - session['user'] = user + user = access_database.selectLoginsTupleByID((session['user_id'],)) + user = access_database.washUserDictionary(user) + session['user'] = user + + print(user) + def login_required(func): @wraps(func) @@ -44,17 +46,23 @@ def auth(): 'Authorization': f'Bearer {access_token}', } response = requests.get(userinfo_endpoint, headers=headers) - if response.status_code == 200: - user_email = response.json()['email'] - user = access_database.selectUserByEmail((user_email,)) + + if response.status_code != 200: + print("Failed to fetch user info:", response.status_code, response.text) + return redirect('/access/login') + + user_email = response.json()['email'] + profile_pic_url = response.json()['picture'] + user = access_database.selectUserByEmail((user_email,)) + + if user['login_type'] == "External": + user = access_database.updateLoginsTuple({'id': user['id'], 'update':{'profile_pic_url': profile_pic_url}}) user = access_database.washUserDictionary(user) session['user_id'] = user['id'] session['user'] = user - session['login_type'] = 'External' return redirect('/') - else: - print("Failed to fetch user info:", response.status_code, response.text) - return redirect('/access/login') + + return redirect('/access/login') @access_api.route('/login/oidc') def oidc_login(): diff --git a/application/access_module/access_database.py b/application/access_module/access_database.py index d7f0818..c720f80 100644 --- a/application/access_module/access_database.py +++ b/application/access_module/access_database.py @@ -10,9 +10,39 @@ def washUserDictionary(user): 'sites': user['sites'], 'site_roles': user['site_roles'], 'system_admin': user['system_admin'], - 'flags': user['flags'] + 'flags': user['flags'], + 'profile_pic_url': user['profile_pic_url'], + 'login_type': user['login_type'] } +def selectLoginsTupleByID(payload, convert=True, conn=None): + """ payload = (id,)""" + self_conn = False + user = () + sql = f"SELECT * FROM logins WHERE id=%s;" + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + user = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + user = rows + + if self_conn: + conn.commit() + conn.close() + + return user + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + def selectUserByEmail(payload, convert=True, conn=None): """ payload = (email,)""" self_conn = False @@ -37,6 +67,37 @@ def selectUserByEmail(payload, convert=True, conn=None): conn.commit() conn.close() + return user + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + + +def updateLoginsTuple(payload, convert=True, conn=None): + """ payload = {'id': user_id, 'update': {...}}""" + self_conn = False + user = () + set_clause, values = postsqldb.updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE logins SET {set_clause} WHERE id=%s RETURNING *;" + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + user = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + user = rows + + if self_conn: + conn.commit() + conn.close() + return user except Exception as error: raise postsqldb.DatabaseError(error, payload, sql) \ No newline at end of file diff --git a/application/items/templates/index.html b/application/items/templates/index.html index 39f3116..5f6b627 100644 --- a/application/items/templates/index.html +++ b/application/items/templates/index.html @@ -91,7 +91,10 @@ dark_mode
- {{username}} + + Profile Picture + {{username}} +
@@ -100,6 +103,7 @@
+

{{session['user']}}

    diff --git a/logs/database.log b/logs/database.log new file mode 100644 index 0000000..4b21554 --- /dev/null +++ b/logs/database.log @@ -0,0 +1,4 @@ + +2025-08-03 08:25:07.786121 --- ERROR --- DatabaseError(message=''int' object does not support indexing', + payload=1, + sql='SELECT * FROM logins WHERE id=%s;') \ No newline at end of file diff --git a/webserver.py b/webserver.py index 3da1fc5..4d6ac19 100644 --- a/webserver.py +++ b/webserver.py @@ -60,7 +60,7 @@ def inject_user(): with psycopg2.connect(**database_config) as conn: try: with conn.cursor() as cur: - sql = f"SELECT id, username, sites, site_roles, system_admin, flags FROM logins WHERE id=%s;" + sql = f"SELECT id, username, sites, site_roles, system_admin, flags, profile_pic_url, login_type FROM logins WHERE id=%s;" cur.execute(sql, (session['user_id'],)) user = cur.fetchone() user = database.tupleDictionaryFactory(cur.description, user)