Skip to content

Commit 8ad8382

Browse files
authored
Merge pull request #168 from lsgd/master
Catch errors on parsing authentication responses
2 parents 1ac2c73 + 403a3e8 commit 8ad8382

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

office365/runtime/auth/saml_token_provider.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ def acquire_token(self):
5454
'endpoint': url.scheme + '://' + url.hostname + self.login
5555
}
5656

57-
self.acquire_service_token(options)
58-
self.acquire_authentication_cookie(options)
57+
if not self.acquire_service_token(options):
58+
return False
59+
if not self.acquire_authentication_cookie(options):
60+
return False
5961
return True
6062
except requests.exceptions.RequestException as e:
6163
self.error = "Error: {}".format(e)
@@ -96,7 +98,13 @@ def process_service_token_response(self, response):
9698
logger = self.logger(self.process_service_token_response.__name__)
9799
logger.debug_secrets('response: %s\nresponse.content: %s', response, response.content)
98100

99-
xml = ElementTree.fromstring(response.content)
101+
try:
102+
xml = ElementTree.fromstring(response.content)
103+
except ElementTree.ParseError as e:
104+
self.error = 'An error occurred while parsing the server response: {}'.format(e)
105+
logger.error(self.error)
106+
return None
107+
100108
ns_prefixes = {'S': '{http://www.w3.org/2003/05/soap-envelope}',
101109
'psf': '{http://schemas.microsoft.com/Passport/SoapServices/SOAPFault}',
102110
'wst': '{http://schemas.xmlsoap.org/ws/2005/02/trust}',
@@ -107,14 +115,21 @@ def process_service_token_response(self, response):
107115
if xml.find('{0}Body/{0}Fault'.format(ns_prefixes['S'])) is not None:
108116
error = xml.find('{0}Body/{0}Fault/{0}Detail/{1}error/{1}internalerror/{1}text'.format(ns_prefixes['S'],
109117
ns_prefixes['psf']))
110-
self.error = 'An error occurred while retrieving token: {0}'.format(error.text)
118+
if error is None:
119+
self.error = 'An error occurred while retrieving token from XML response.'
120+
else:
121+
self.error = 'An error occurred while retrieving token from XML response: {0}'.format(error.text)
111122
logger.error(self.error)
112123
return None
113124

114125
# extract token
115126
token = xml.find(
116127
'{0}Body/{1}RequestSecurityTokenResponse/{1}RequestedSecurityToken/{2}BinarySecurityToken'.format(
117128
ns_prefixes['S'], ns_prefixes['wst'], ns_prefixes['wsse']))
129+
if token is None:
130+
self.error = 'The service token could not be extracted from the XML response.'
131+
logger.error(self.error)
132+
return None
118133
logger.debug_secrets("token: %s", token)
119134
return token.text
120135

0 commit comments

Comments
 (0)