from auth.providers.base import SSOProvider from utils.helpers import extract_html_value class TUMProvider(SSOProvider): """SSO provider for Karlsruhe Institute of Technology (KIT).""" name = "TUM" domain = "tum.de" def authenticate(self) -> str: # Implement SAML authentication flow # Use self.session, self.redirect_response, self.username, self.password # Return HTML containing SAMLResponse # to get this done on tum we have to: # 1. do one post to e1s1 # 2. do post to e1s2 with login data # -> self.session.headers.pop("x-requested-with", None) self.session.headers.pop("x-inertia", None) self.session.headers.pop("x-inertia-version", None) csrf_token1 = extract_html_value( self.redirect_response.text, r'name="csrf_token" value="([^"]+)"' ) response1 = self.session.post( # 'https://idp.scc.kit.edu/idp/profile/SAML2/Redirect/SSO?execution=e1s1', "https://login.tum.de/idp/profile/SAML2/Redirect/SSO?execution=e1s1", data={ "csrf_token": csrf_token1, "shib_idp_ls_exception.shib_idp_session_ss": "", "shib_idp_ls_success.shib_idp_session_ss": "true", "shib_idp_ls_value.shib_idp_session_ss": "", "shib_idp_ls_exception.shib_idp_persistent_ss": "", "shib_idp_ls_success.shib_idp_persistent_ss": "true", "shib_idp_ls_value.shib_idp_persistent_ss": "", "shib_idp_ls_supported": "true", "_eventId_proceed": "", }, ) # print(response1.text) csrf_token2 = extract_html_value( response1.text, r'name="csrf_token" value="([^"]+)"' ) response2 = self.session.post( "https://login.tum.de/idp/profile/SAML2/Redirect/SSO?execution=e1s2", data={ "csrf_token": csrf_token2, "j_username": self.username, "j_password": self.password, "donotcache": "1", "_eventId_proceed": "", }, ) # print(response2.text) saml_response = extract_html_value( response2.text, r'name="SAMLResponse" value="([^"]+)"' ) if len(saml_response) < 3: raise ValueError("TUM auth no work:(") else: print("nice we got saml response starting with: " + saml_response[0:49]) return response2.text # print(saml_response) # sys.exit() # if "/consume" not in html.unescape(response.text): # raise ValueError("TUM authentication failed - invalid credentials or SSO error") # return response.text