Skip to content

Commit 86d8c38

Browse files
committed
add support for secondary upstream oidc logout
git-svn-id: svn+ssh://svn.code.sf.net/p/migrid/code/trunk@6236 b75ad72c-e7d7-11dd-a971-7dbc132099af
1 parent 71d5854 commit 86d8c38

File tree

2 files changed

+81
-73
lines changed

2 files changed

+81
-73
lines changed

mig/user/selenium/migcore.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# --- BEGIN_HEADER ---
55
#
66
# migcore - a library of core selenium-based web helpers
7-
# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter
7+
# Copyright (C) 2003-2025 The MiG Project by the Science HPC Center at UCPH
88
#
99
# This file is part of MiG.
1010
#
@@ -168,10 +168,8 @@ def ucph_login(driver, url, login, passwd, callbacks={}):
168168
login_elem = driver.find_element(by_what('name'), "user")
169169
pass_elem = driver.find_element(by_what('name'), "pwd")
170170
elif auth_flavor == AUTH_OPENID_CONNECT:
171-
login_elem = driver.find_element(
172-
by_what('id'), "inputUsername")
173-
pass_elem = driver.find_element(
174-
by_what('id'), "inputPassword")
171+
login_elem = driver.find_element(by_what('id'), "inputUsername")
172+
pass_elem = driver.find_element(by_what('id'), "inputPassword")
175173
else:
176174
# Fall back to sane defaults
177175
login_elem = driver.find_element(by_what('name'), "username")
@@ -190,8 +188,8 @@ def ucph_login(driver, url, login, passwd, callbacks={}):
190188
# NOTE: the standard request source footer is also of class alert
191189
# so be specific here to avoid slow page load confusion
192190
try:
193-
error_elem = driver.find_element(
194-
by_what('class_name'), "alert-warning")
191+
error_elem = driver.find_element(by_what('class_name'),
192+
"alert-warning")
195193
if error_elem:
196194
print("UCPH %s login error: %s" %
197195
(auth_flavor, error_elem.text))
@@ -249,8 +247,8 @@ def mig_login(driver, url, login, passwd, callbacks={}):
249247
pass_elem.submit()
250248
# Check for login error msg to return proper status
251249
try:
252-
error_elem = driver.find_element(
253-
by_what('class_name'), "errortext")
250+
error_elem = driver.find_element(by_what('class_name'),
251+
"errortext")
254252
if error_elem:
255253
print("MiG %s login error: %s" %
256254
(auth_flavor, error_elem.text))
@@ -282,8 +280,7 @@ def shared_twofactor(driver, url, twofactor_key, callbacks={},
282280
past_twofactor = False
283281
if past_twofactor_class:
284282
try:
285-
driver.find_element(by_what(
286-
'class_name'), past_twofactor_class)
283+
driver.find_element(by_what('class_name'), past_twofactor_class)
287284
# print("DEBUG: found %s element - past twofactor login" %
288285
# past_twofactor_class)
289286
past_twofactor = True
@@ -338,8 +335,7 @@ def get_nav_link(driver, url, nav_class):
338335
try:
339336
menu = driver.find_element(by_what('id'), USERMENU_ID)
340337
link = menu.find_element(by_what('class_name'), nav_class)
341-
menubutton = driver.find_element(
342-
by_what('id'), USERMENUBUTTON_ID)
338+
menubutton = driver.find_element(by_what('id'), USERMENUBUTTON_ID)
343339
# Make sure menu link item is visible for callee
344340
if menu and link and menubutton:
345341
menubutton.click()
@@ -376,13 +372,26 @@ def shared_logout(driver, url, login, passwd, callbacks={}):
376372

377373
if do_logout:
378374
print("Confirm logout")
379-
confirm_elem = driver.find_element(by_what('link_text'), "Yes")
380-
# print "DEBUG: found confirm elem: %s" % confirm_elem
375+
confirm_elem = driver.find_element(by_what('link_text'), 'Yes')
376+
# print("DEBUG: found confirm elem: %s" % confirm_elem)
381377
state = 'logout-confirm'
382378
if callbacks.get(state, None):
383379
callbacks[state](driver, state)
384-
# print "DEBUG: click confirm elem: %s" % confirm_elem
380+
# print("DEBUG: click confirm elem: %s" % confirm_elem)
385381
confirm_elem.click()
382+
# Upstream OID(C) may have additional logout step
383+
print("Confirm logout again")
384+
try:
385+
confirm_elem = driver.find_element(by_what('xpath'),
386+
"//button[@value='Yes']")
387+
# print("DEBUG: found confirm elem: %s" % confirm_elem)
388+
state = 'logout-confirm-upstream'
389+
if callbacks.get(state, None):
390+
callbacks[state](driver, state)
391+
# print("DEBUG: click confirm elem: %s" % confirm_elem)
392+
confirm_elem.click()
393+
except Exception as exc:
394+
print("WARNING: failed in secondary logout: %s" % exc)
386395
else:
387396
status = False
388397
print("Confirm login NOT found")

mig/user/selenium/userguidescreens.py

Lines changed: 56 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# --- BEGIN_HEADER ---
55
#
66
# userguidescreens - selenium-based web client to grab user guide screenshots
7-
# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter
7+
# Copyright (C) 2003-2025 The MiG Project by the Science HPC Center at UCPH
88
#
99
# This file is part of MiG.
1010
#
@@ -134,14 +134,15 @@ def management_actions(driver, url, login, passwd, callbacks):
134134
link.click()
135135
# ajax_wait(driver, nav_name, "ui-progressbar")
136136
# NOTE: locate the relevant workzone in category ref section
137-
active_tab = driver.find_element(
138-
by_what('id'), 'create_project_tab')
137+
active_tab = driver.find_element(by_what('id'),
138+
'create_project_tab')
139139
# NOTE: project name field is shared for all categories
140-
workzone_entry = active_tab.find_element(by_what('id'),
141-
'create_project_%s_workzone_id' % sample_category)
140+
workzone_entry = active_tab.find_element(
141+
by_what('id'), 'create_project_%s_workzone_id' %
142+
sample_category)
142143
workzone_entry.send_keys(sample_workzone)
143-
proj_entry = active_tab.find_element(by_what('name'),
144-
'create_project_base_vgrid_name')
144+
proj_entry = active_tab.find_element(
145+
by_what('name'), 'create_project_base_vgrid_name')
145146
proj_entry.send_keys(sample_project)
146147
state = '%s-filled' % nav_name.lower().replace(' ', '-')
147148
if callbacks.get(state, None):
@@ -163,22 +164,20 @@ def management_actions(driver, url, login, passwd, callbacks):
163164
# print "DEBUG: found %s link: %s" % (nav_name, link)
164165
link.click()
165166
# ajax_wait(driver, nav_name, "ui-progressbar")
166-
active_tab = driver.find_element(
167-
by_what('id'), 'invite_user_tab')
167+
active_tab = driver.find_element(by_what('id'), 'invite_user_tab')
168168
dropdown_container = active_tab.find_element(by_what('class_name'),
169169
'gm_select')
170170
proj_dropdown = navmenu.find_element(by_what('name'),
171171
'invite_user_base_vgrid_name')
172172
# NOTE: we expect first real project to match sample category
173173
select_item_by_index(driver, proj_dropdown, 2)
174174
# ajax_wait(driver, nav_name, "ui-progressbar")
175-
active_tab = driver.find_element(
176-
by_what('id'), 'invite_user_tab')
177-
terms_checkbox = active_tab.find_element(by_what('id'),
178-
'invite_user_%s_user_terms' % sample_category)
175+
active_tab = driver.find_element(by_what('id'), 'invite_user_tab')
176+
terms_checkbox = active_tab.find_element(
177+
by_what('id'), 'invite_user_%s_user_terms' % sample_category)
179178
terms_checkbox.click()
180-
workzone_entry = active_tab.find_element(by_what('id'),
181-
'invite_user_%s_workzone_id' % sample_category)
179+
workzone_entry = active_tab.find_element(
180+
by_what('id'), 'invite_user_%s_workzone_id' % sample_category)
182181
# NOTE: user id field is shared for all categories
183182
invite_entry = active_tab.find_element(by_what('name'),
184183
'invite_user_short_id')
@@ -211,8 +210,8 @@ def open_project_actions(driver, url, login, passwd, callbacks):
211210
# print "DEBUG: found %s link: %s" % (nav_name, link)
212211
link.click()
213212
# ajax_wait(driver, nav_name, "ui-progressbar")
214-
dropdown_container = navmenu.find_element(
215-
by_what('class_name'), 'gm_select')
213+
dropdown_container = navmenu.find_element(by_what('class_name'),
214+
'gm_select')
216215
proj_dropdown = navmenu.find_element(by_what('name'),
217216
'access_project_base_vgrid_name')
218217
select_item_by_index(driver, proj_dropdown, 2)
@@ -302,8 +301,7 @@ def archives_actions(driver, url, login, passwd, callbacks):
302301
name_field = driver.find_element(by_what('name'), "freeze_name")
303302
name_field.send_keys(archive_name)
304303

305-
meta_field = driver.find_element(
306-
by_what('name'), "freeze_description")
304+
meta_field = driver.find_element(by_what('name'), "freeze_description")
307305
meta_field.send_keys("""Article Data Archive
308306
309307
This is my sample freeze archive with some metadata describing the archive
@@ -327,7 +325,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
327325
# Select first file (at least welcome.txt is always there)
328326
files_area = driver.find_element(by_what('class_name'), "fm_files")
329327
selected = False
330-
for select_file in files_area.find_elements(by_what('class_name'), "ext_txt"):
328+
for select_file in files_area.find_elements(by_what('class_name'),
329+
"ext_txt"):
331330
try:
332331
#print("DEBUG: scroll to file elem: %s" % select_file)
333332
scroll_to_elem(driver, select_file)
@@ -347,13 +346,12 @@ def archives_actions(driver, url, login, passwd, callbacks):
347346
file_path = select_file.text
348347
#print("DEBUG: found file path: %s" % file_path)
349348
# Use parent of unique filechooser to find the right dialog among many
350-
filechooser_elem = driver.find_element(
351-
by_what('id'), "fm_filechooser")
349+
filechooser_elem = driver.find_element(by_what('id'), "fm_filechooser")
352350
filechooser_dialog = filechooser_elem.parent
353351
# print("DEBUG: found filechooser %s and parent dialog: %s" %
354352
# (filechooser_elem, filechooser_dialog))
355-
close_button = filechooser_dialog.find_element(by_what('class_name'),
356-
"ui-dialog-titlebar-close")
353+
close_button = filechooser_dialog.find_element(
354+
by_what('class_name'), "ui-dialog-titlebar-close")
357355
#print("DEBUG: found close button: %s" % close_button)
358356
close_button.click()
359357
# dialog_buttons = filechooser_dialog.find_element(by_what('class_name'),
@@ -414,8 +412,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
414412
# (confirm_elem, confirm_dialog))
415413
dialog_buttons = confirm_dialog.find_element(by_what('class_name'),
416414
"ui-dialog-buttonset")
417-
confirm_buttons = dialog_buttons.find_elements(
418-
by_what('class_name'), "ui-button")
415+
confirm_buttons = dialog_buttons.find_elements(by_what('class_name'),
416+
"ui-button")
419417
for button in confirm_buttons:
420418
if do_finalize and button.text == 'Yes':
421419
#print("DEBUG: click confirm button: %s" % button.text)
@@ -439,8 +437,7 @@ def archives_actions(driver, url, login, passwd, callbacks):
439437
print("INFO: callback for: %s" % state)
440438
callbacks[state](driver, state)
441439

442-
view_button = driver.find_element(by_what('class_name'),
443-
"viewarchivelink")
440+
view_button = driver.find_element(by_what('class_name'), "viewarchivelink")
444441
#print("DEBUG: click view button: %s" % view_button)
445442
view_button.click()
446443
ajax_wait(driver, nav_name)
@@ -457,8 +454,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
457454

458455
dialog_buttons = driver.find_element(by_what('class_name'),
459456
"ui-dialog-buttonset")
460-
confirm_buttons = driver.find_elements(
461-
by_what('class_name'), "ui-button")
457+
confirm_buttons = driver.find_elements(by_what('class_name'),
458+
"ui-button")
462459
run_register = False
463460
for button in confirm_buttons:
464461
if button.text == 'Yes':
@@ -470,8 +467,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
470467
# Workaround if no buttons found
471468
if not confirm_buttons:
472469
print("WARNING: failed to confirm register doi - force close dialog")
473-
close_button = confirm_dialog.find_element(by_what('class_name'),
474-
"ui-dialog-titlebar-close")
470+
close_button = confirm_dialog.find_element(
471+
by_what('class_name'), "ui-dialog-titlebar-close")
475472
#print("DEBUG: found close button: %s" % close_button)
476473
close_button.click()
477474

@@ -481,22 +478,21 @@ def archives_actions(driver, url, login, passwd, callbacks):
481478

482479
# Maybe need KU-IT DOI service login if requested
483480
try:
484-
logon_button = driver.find_element(
485-
by_what('id'), "cmdLogon")
481+
logon_button = driver.find_element(by_what('id'), "cmdLogon")
486482
#print("DEBUG: click logon: %s" % logon_button)
487483
logon_button.click()
488484
except Exception as exc:
489485
pass
490486

491487
try:
492-
user_field = driver.find_element(
493-
by_what('id'), "userNameInput")
488+
user_field = driver.find_element(by_what('id'),
489+
"userNameInput")
494490
user_field.send_keys(login)
495-
password_field = driver.find_element(
496-
by_what('id'), "passwordInput")
491+
password_field = driver.find_element(by_what('id'),
492+
"passwordInput")
497493
password_field.send_keys(passwd)
498-
submit_button = driver.find_element(
499-
by_what('id'), "submitButton")
494+
submit_button = driver.find_element(by_what('id'),
495+
"submitButton")
500496
#print("DEBUG: click submit: %s" % submit_button)
501497
time.sleep(1)
502498
submit_button.click()
@@ -526,8 +522,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
526522
if popup_dialog.is_displayed():
527523
#print("DEBUG: found visible popup dialog")
528524
popup_found = True
529-
popup_buttons = popup_dialog.find_elements(by_what('class_name'),
530-
"btn")
525+
popup_buttons = popup_dialog.find_elements(
526+
by_what('class_name'), "btn")
531527
for button in popup_buttons:
532528
# print "DEBUG: inspect popup button: %s" % button.text
533529
if button.text.upper() == 'UNDERSTOOD':
@@ -549,8 +545,8 @@ def archives_actions(driver, url, login, passwd, callbacks):
549545

550546
# Check if DOI form is there and ready
551547
try:
552-
doi_idenfier = driver.find_element(
553-
by_what('id'), "IdentifierType")
548+
doi_idenfier = driver.find_element(by_what('id'),
549+
"IdentifierType")
554550
# print "DEBUG: found DOI identifier: %s" % doi_idenfier
555551
break
556552
except Exception as exc:
@@ -616,8 +612,8 @@ def setup_actions(driver, url, login, passwd, callbacks):
616612
content_anchor = driver.find_element(by_what('id'), "content")
617613
sub_link = content_anchor.find_element(
618614
by_what('link_text'), name)
619-
sub_link = driver.find_element(by_what('id'),
620-
"content").find_element(by_what('link_text'), name)
615+
sub_link = driver.find_element(
616+
by_what('id'), "content").find_element(by_what('link_text'), name)
621617
sub_link.click()
622618
# Wait for Seafile server status lookup
623619
if key == 'seafile':
@@ -653,8 +649,8 @@ def jupyter_actions(driver, url, login, passwd, callbacks):
653649
content_anchor = driver.find_element(by_what('id'), "content")
654650
sub_link = content_anchor.find_element(
655651
by_what('link_text'), name)
656-
sub_link = driver.find_element(by_what('id'),
657-
"content").find_element(by_what('link_text'), name)
652+
sub_link = driver.find_element(
653+
by_what('id'), "content").find_element(by_what('link_text'), name)
658654
sub_link.click()
659655

660656
state = 'jupyter-%s-tab-ready' % key
@@ -725,10 +721,9 @@ def peers_actions(driver, url, login, passwd, callbacks):
725721
for (key, name) in peers_sections:
726722
# Search inside page content to avoid Peers nav menu interference
727723
content_anchor = driver.find_element(by_what('id'), "content")
728-
sub_link = content_anchor.find_element(
729-
by_what('link_text'), name)
730-
sub_link = driver.find_element(by_what('id'),
731-
"content").find_element(by_what('link_text'), name)
724+
sub_link = content_anchor.find_element(by_what('link_text'), name)
725+
sub_link = driver.find_element(
726+
by_what('id'), "content").find_element(by_what('link_text'), name)
732727
sub_link.click()
733728

734729
state = 'peers-%s-tab-ready' % key
@@ -785,15 +780,16 @@ def datatransfer_actions(driver, url, login, passwd, callbacks):
785780
dstpath_field = form_field.find_element(by_what('name'), "transfer_dst")
786781
dstpath_field.send_keys(".")
787782
protocol_dropdown = form_field.find_element(by_what('id'),
788-
'protocol_select')
783+
'protocol_select')
789784
select_item_by_index(form_field, protocol_dropdown, 1)
790785
# screenshot of datatransfer page filled with example to get erda frontpage
791786
state = 'datatransfer-filled'
792787
if callbacks.get(state, None):
793788
print("INFO: callback for: %s" % state)
794789
callbacks[state](driver, state)
795-
796-
request_button = form_field.find_element(by_what('id'), "submit-request-transfer")
790+
791+
request_button = form_field.find_element(by_what('id'),
792+
"submit-request-transfer")
797793
request_button.click()
798794
# screenshot of result page for the submitted example
799795
state = 'datatransfer-requested'
@@ -803,7 +799,8 @@ def datatransfer_actions(driver, url, login, passwd, callbacks):
803799

804800
# Transfer status and output folder screenshot
805801
# Name of link is used due to a lack of find-able ID
806-
status_button = driver.find_element(by_what('link_text'), "Transfer status and output folder")
802+
status_button = driver.find_element(by_what('link_text'),
803+
"Transfer status and output folder")
807804
status_button.click()
808805
ajax_wait(driver, nav_name, "ui-progressbar")
809806
state = 'datatransfer-statusfiles'
@@ -813,13 +810,15 @@ def datatransfer_actions(driver, url, login, passwd, callbacks):
813810

814811
# Go back to previous page
815812
driver.back()
816-
return_button = driver.find_element(by_what('link_text'), "Return to data transfers overview")
813+
return_button = driver.find_element(by_what('link_text'),
814+
"Return to data transfers overview")
817815
return_button.click()
818816
state = 'datatransfer-overview'
819817
if callbacks.get(state, None):
820818
print("INFO: callback for: %s" % state)
821819
callbacks[state](driver, state)
822820

821+
823822
def sharelink_actions(driver, url, login, passwd, callbacks):
824823
"""Run user actions for section of same name"""
825824
nav_name = "Share Links"

0 commit comments

Comments
 (0)