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():
|
def update_session_user():
|
||||||
database_config = config()
|
user = access_database.selectLoginsTupleByID((session['user_id'],))
|
||||||
with psycopg2.connect(**database_config) as conn:
|
user = access_database.washUserDictionary(user)
|
||||||
user = postsqldb.LoginsTable.get_washed_tuple(conn, (session['user_id'],))
|
session['user'] = user
|
||||||
session['user'] = user
|
|
||||||
|
print(user)
|
||||||
|
|
||||||
|
|
||||||
def login_required(func):
|
def login_required(func):
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
@ -44,17 +46,23 @@ def auth():
|
|||||||
'Authorization': f'Bearer {access_token}',
|
'Authorization': f'Bearer {access_token}',
|
||||||
}
|
}
|
||||||
response = requests.get(userinfo_endpoint, headers=headers)
|
response = requests.get(userinfo_endpoint, headers=headers)
|
||||||
if response.status_code == 200:
|
|
||||||
user_email = response.json()['email']
|
if response.status_code != 200:
|
||||||
user = access_database.selectUserByEmail((user_email,))
|
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)
|
user = access_database.washUserDictionary(user)
|
||||||
session['user_id'] = user['id']
|
session['user_id'] = user['id']
|
||||||
session['user'] = user
|
session['user'] = user
|
||||||
session['login_type'] = 'External'
|
|
||||||
return redirect('/')
|
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')
|
@access_api.route('/login/oidc')
|
||||||
def oidc_login():
|
def oidc_login():
|
||||||
|
|||||||
@ -10,9 +10,39 @@ def washUserDictionary(user):
|
|||||||
'sites': user['sites'],
|
'sites': user['sites'],
|
||||||
'site_roles': user['site_roles'],
|
'site_roles': user['site_roles'],
|
||||||
'system_admin': user['system_admin'],
|
'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):
|
def selectUserByEmail(payload, convert=True, conn=None):
|
||||||
""" payload = (email,)"""
|
""" payload = (email,)"""
|
||||||
self_conn = False
|
self_conn = False
|
||||||
@ -37,6 +67,37 @@ def selectUserByEmail(payload, convert=True, conn=None):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
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
|
return user
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
raise postsqldb.DatabaseError(error, payload, sql)
|
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>
|
<a onclick="toggleDarkMode()" class="uk-button uk-button-small"><span id="modeToggle" class="uk-flex material-symbols-outlined">dark_mode</span></a>
|
||||||
</div>
|
</div>
|
||||||
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -100,6 +103,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="uk-container">
|
<div class="uk-container">
|
||||||
<div class="uk-section">
|
<div class="uk-section">
|
||||||
|
<p>{{session['user']}}
|
||||||
<div uk-grid>
|
<div uk-grid>
|
||||||
<div class="uk-width-1-1@m">
|
<div class="uk-width-1-1@m">
|
||||||
<ul class="uk-iconnav uk-flex-center uk-flex-left@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:
|
with psycopg2.connect(**database_config) as conn:
|
||||||
try:
|
try:
|
||||||
with conn.cursor() as cur:
|
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'],))
|
cur.execute(sql, (session['user_id'],))
|
||||||
user = cur.fetchone()
|
user = cur.fetchone()
|
||||||
user = database.tupleDictionaryFactory(cur.description, user)
|
user = database.tupleDictionaryFactory(cur.description, user)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user