Added profile Pic sync between OIDC
This commit is contained in:
parent
324415ffb3
commit
603474743f
@ -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():
|
||||
|
||||
@ -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)
|
||||
@ -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
4
logs/database.log
Normal 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;')
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user