diff --git a/eccs2.py b/eccs2.py index b63a9126b87414c3066d2c97e300ebc6b0bedcbc..721c8d9e940eebb7c41a99dff6e6dd5095f27f95 100755 --- a/eccs2.py +++ b/eccs2.py @@ -13,14 +13,10 @@ from eccs2properties import ECCS2LOGSDIR, ECCS2RESULTSLOG, ECCS2CHECKSLOG, ECCS2 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support.ui import Select -from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support.ui import Select, WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.remote.remote_connection import LOGGER -from selenium.common.exceptions import NoSuchElementException -from selenium.common.exceptions import TimeoutException -from selenium.common.exceptions import WebDriverException -from selenium.common.exceptions import UnexpectedAlertPresentException +from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException, UnexpectedAlertPresentException from urllib3.exceptions import MaxRetryError from urllib3.util import parse_url @@ -31,7 +27,28 @@ from urllib3.util import parse_url The check will be passed when both SPs will return the authentication page of the IdP checked. """ -def checkIdP(sp,idp,logger,driver): +#def checkIdP(sp,idp,logger,driver): +def checkIdP(sp,idp,logger): + # Chromedriver MUST be instanced here to avoid problems with SESSION + + # Disable SSL requests warning messages + requests.packages.urllib3.disable_warnings() + + # Configure Web-driver + chrome_options = webdriver.ChromeOptions() + chrome_options.add_argument('--headless') + chrome_options.add_argument('--no-sandbox') + chrome_options.add_argument('--disable-dev-shm-usage') + chrome_options.add_argument('--ignore-certificate-errors') + + driver = webdriver.Chrome('chromedriver', options=chrome_options) + + # For DEBUG only (By default ChromeDriver logs only warnings/errors to stderr. When debugging issues, it is helpful to enable more verbose logging.) + #driver = webdriver.Chrome('chromedriver', options=chrome_options, service_args=['--verbose', '--log-path=%s/%s.log' % (ECCS2SELENIUMLOGDIR, parse_url(idp['entityID'])[2])]) + + # Configure timeouts + driver.set_page_load_timeout("%d" % ECCS2SELENIUMPAGELOADTIMEOUT) + driver.set_script_timeout("%d" % ECCS2SELENIUMSCRIPTTIMEOUT) # Configure Blacklists federation_blacklist = FEDS_BLACKLIST @@ -52,6 +69,7 @@ def checkIdP(sp,idp,logger,driver): element.send_keys(idp['entityID'] + Keys.ENTER) page_source = driver.page_source status_code = requests.get(driver.current_url, verify=False).status_code + driver.quit() except TimeoutException as e: logger.info("%s;%s;999;Timeout" % (idp['entityID'],sp)) @@ -71,6 +89,7 @@ def checkIdP(sp,idp,logger,driver): except WebDriverException as e: print("!!! WEB DRIVER EXCEPTION - RUN AGAIN THE COMMAND!!!") + print (e.__str__()) return None except requests.exceptions.ConnectionError as e: @@ -91,6 +110,9 @@ def checkIdP(sp,idp,logger,driver): print (e.__str__()) return None + finally: + driver.quit() + pattern_metadata = "Unable.to.locate(\sissuer.in|).metadata(\sfor|)|no.metadata.found|profile.is.not.configured.for.relying.party|Cannot.locate.entity|fail.to.load.unknown.provider|does.not.recognise.the.service|unable.to.load.provider|Nous.n'avons.pas.pu.(charg|charger).le.fournisseur.de service|Metadata.not.found|application.you.have.accessed.is.not.registered.for.use.with.this.service|Message.did.not.meet.security.requirements" pattern_username = '<input[\s]+[^>]*((type=\s*[\'"](text|email)[\'"]|user)|(name=\s*[\'"](name)[\'"]))[^>]*>'; @@ -101,15 +123,12 @@ def checkIdP(sp,idp,logger,driver): password_found = re.search(pattern_password,page_source, re.I) if(metadata_not_found): - #print("MD-NOT-FOUND - driver.current_url: %s" % (driver.current_url)) logger.info("%s;%s;%s;No-eduGAIN-Metadata" % (idp['entityID'],sp,status_code)) return "No-eduGAIN-Metadata" elif not username_found or not password_found: - #print("INVALID-FORM - entityID: %s, sp: %s, driver.current_url: %s" % (idp['entityID'],sp,driver.current_url)) logger.info("%s;%s;%s;Invalid-Form" % (idp['entityID'],sp,status_code)) return "Invalid-Form" else: - #print("MD-FOUND - driver.current_url: %s" % (driver.current_url)) logger.info("%s;%s;%s;OK" % (idp['entityID'],sp,status_code)) return "OK" @@ -160,10 +179,10 @@ def getIdPContacts(idp,contactType): return ctcList -def checkIdp(idp,sps,eccs2log,eccs2checksLog,driver): +def checkIdp(idp,sps,eccs2log,eccs2checksLog): result = [] for sp in sps: - resultCheck = checkIdP(sp,idp,eccs2checksLog,driver) + resultCheck = checkIdP(sp,idp,eccs2checksLog) result.append(resultCheck) listTechContacts = getIdPContacts(idp,'technical') @@ -229,34 +248,4 @@ if __name__=="__main__": idp = json.loads(args.idpJson[0]) - # Disable SSL requests warning messages - requests.packages.urllib3.disable_warnings() - - # Configure Web-driver - chrome_options = webdriver.ChromeOptions() - chrome_options.add_argument('--headless') - chrome_options.add_argument('--no-sandbox') - chrome_options.add_argument('--disable-dev-shm-usage') - chrome_options.add_argument('--ignore-certificate-errors') - chrome_options.add_argument('--start-maximized') - chrome_options.add_argument('--disable-extensions') - - #driver = webdriver.Chrome('chromedriver', options=chrome_options) - - # For DEBUG only (By default ChromeDriver logs only warnings/errors to stderr. When debugging issues, it is helpful to enable more verbose logging.) - #driver = webdriver.Chrome('chromedriver', options=chrome_options, service_args=['--log-path=%s/%s.log' % (ECCS2SELENIUMLOGDIR, parse_url(idp['entityID'])[2])]) - driver = webdriver.Chrome('chromedriver', options=chrome_options, service_args=['--verbose', '--log-path=%s/%s.log' % (ECCS2SELENIUMLOGDIR, parse_url(idp['entityID'])[2])]) - - # Configure timeouts - driver.set_page_load_timeout("%d" % ECCS2SELENIUMPAGELOADTIMEOUT) - driver.set_script_timeout("%d" % ECCS2SELENIUMSCRIPTTIMEOUT) - - checkIdp(idp,sps,eccs2log,eccs2checksLog,driver) - - #driver.delete_all_cookies() - driver.close() # I need to use "close()" or the driver's process remains active - driver.quit() - - # Kill process to release resources and to avoid zombies - this reaise an issue - #pid = os.getpid() - #os.kill(pid, signal.SIGTERM) + checkIdp(idp,sps,eccs2log,eccs2checksLog) diff --git a/extractFederation.py b/extractFederation.py deleted file mode 100755 index 5eacee9ef158bc0ca27cdb997c5bf299670f66a3..0000000000000000000000000000000000000000 --- a/extractFederation.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 - -def getIdPs(): - import certifi - import urllib3 - import json - - manager = urllib3.PoolManager( - cert_reqs='CERT_REQUIRED', - ca_certs=certifi.where() - ) - - url = "https://technical.edugain.org/api.php?action=list_eccs_idps" - idp_json = manager.request('GET', url) - - idp_dict = json.loads(idp_json.data.decode('utf-8')) - - idp_list = [] - - #federation = input("Insert the registrationAuthority: ") - federation = "http://www.idem.garr.it/" - - for idp in idp_dict: - if (idp['registrationAuthority'] == federation): - idp_list.append(idp) - - return json.dumps(idp_list) - - -# MAIN -if __name__=="__main__": - - data = getIdPs() - - f = open('federation_idps.txt', 'w') - f.write(data) - f.close() - diff --git a/input/.gitignore b/input/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5e7d2734cfc60289debf74293817c0a8f572ff32 --- /dev/null +++ b/input/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/selenium-logs/.gitignore b/selenium-logs/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..5e7d2734cfc60289debf74293817c0a8f572ff32 --- /dev/null +++ b/selenium-logs/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore