Added profile Pic sync between OIDC

This commit is contained in:
Jadowyne Ulve 2025-08-03 08:34:33 -05:00
parent 324415ffb3
commit 603474743f
5 changed files with 91 additions and 14 deletions

View File

@ -15,11 +15,13 @@ 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'],))
user = access_database.selectLoginsTupleByID((session['user_id'],))
user = access_database.washUserDictionary(user)
session['user'] = user
print(user)
def login_required(func):
@wraps(func)
def wrapper(*args, **kwargs):
@ -44,16 +46,22 @@ def auth():
'Authorization': f'Bearer {access_token}',
}
response = requests.get(userinfo_endpoint, headers=headers)
if response.status_code == 200:
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')
@access_api.route('/login/oidc')

View File

@ -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
@ -40,3 +70,34 @@ def selectUserByEmail(payload, convert=True, conn=None):
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)

View File

@ -91,7 +91,10 @@
<a onclick="toggleDarkMode()" class="uk-button uk-button-small"><span id="modeToggle" class="uk-flex material-symbols-outlined">dark_mode</span></a>
</div>
<div>
<a href="" class="" uk-icon="icon: user" uk-toggle>{{username}}</a>
<a href="" class="uk-toggle">
<img src="{{session['user']['profile_pic_url']}}" alt="Profile Picture" class="profile-pic" style="width: 40px; height: 40px; border-radius: 50%; margin-right: 5px;">
{{username}}
</a>
</div>
</div>
</div>
@ -100,6 +103,7 @@
</div>
<div class="uk-container">
<div class="uk-section">
<p>{{session['user']}}
<div uk-grid>
<div class="uk-width-1-1@m">
<ul class="uk-iconnav uk-flex-center uk-flex-left@m">

4
logs/database.log Normal file
View File

@ -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;')

View File

@ -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)