46
46
from .version import VERSION
47
47
48
48
"""
49
- Moneky patch for PyOpenSSL Socket wrapper
49
+ Monkey patch for PyOpenSSL Socket wrapper
50
50
"""
51
51
ssl_wrap_socket .inject_into_urllib3 ()
52
52
@@ -209,7 +209,7 @@ def authenticate(self, account, user, password, master_token=None,
209
209
warehouse = None , role = None , passcode = None ,
210
210
passcode_in_password = False , saml_response = None ,
211
211
mfa_callback = None , password_callback = None ,
212
- session_parameters = None ):
212
+ session_parameters = None , retry_connection_auth = True ):
213
213
self .logger .info (u'authenticate' )
214
214
215
215
if token and master_token :
@@ -296,9 +296,10 @@ def authenticate(self, account, user, password, master_token=None,
296
296
"body['data']: %s" ,
297
297
{k : v for (k , v ) in body [u'data' ].items () if k != u'PASSWORD' })
298
298
299
- # retry 10 times for authentication
299
+ max_retry = 10 if retry_connection_auth else 1
300
+ # max_retry times for authentication
300
301
ret = self ._post_request (
301
- url , headers , json .dumps (body ), retry = 10 )
302
+ url , headers , json .dumps (body ), retry = max_retry )
302
303
# this means we are waiting for MFA authentication
303
304
if ret [u'data' ].get (u'nextAction' ) and ret [u'data' ][
304
305
u'nextAction' ] == u'EXT_AUTHN_DUO_ALL' :
@@ -307,8 +308,9 @@ def authenticate(self, account, user, password, master_token=None,
307
308
self .ret = None
308
309
309
310
def post_request_wrapper (self , url , headers , body ):
310
- # retry 10 times for MFA approval
311
- self .ret = self ._post_request (url , headers , body , retry = 10 )
311
+ # max_retry times for MFA approval
312
+ self .ret = self ._post_request (
313
+ url , headers , body , retry = max_retry )
312
314
313
315
# send new request to wait until MFA is approved
314
316
t = Thread (target = post_request_wrapper ,
@@ -327,9 +329,9 @@ def post_request_wrapper(self, url, headers, body):
327
329
body = copy .deepcopy (body_template )
328
330
body [u'inFlightCtx' ] = ret [u'data' ][u'inFlightCtx' ]
329
331
# final request to get tokens
330
- # retry 10 times
332
+ # max_retry times
331
333
ret = self ._post_request (
332
- url , headers , json .dumps (body ), retry = 10 )
334
+ url , headers , json .dumps (body ), retry = max_retry )
333
335
334
336
elif ret [u'data' ].get (u'nextAction' ) and ret [u'data' ][
335
337
u'nextAction' ] == u'PWD_CHANGE' :
@@ -339,9 +341,9 @@ def post_request_wrapper(self, url, headers, body):
339
341
body [u'data' ][u"LOGIN_NAME" ] = user
340
342
body [u'data' ][u"PASSWORD" ] = password
341
343
body [u'data' ][u'CHOSEN_NEW_PASSWORD' ] = password_callback ()
342
- # retry 10 times for New Password input
344
+ # max_retry times for New Password input
343
345
ret = self ._post_request (
344
- url , headers , json .dumps (body ), retry = 10 )
346
+ url , headers , json .dumps (body ), retry = max_retry )
345
347
346
348
self .logger .debug (u'completed authentication' )
347
349
if not ret [u'success' ]:
@@ -560,7 +562,7 @@ def _post_request(self, url, headers, body, token=None, retry=10,
560
562
max_connection_pool = self ._max_connection_pool )
561
563
self .logger .debug (
562
564
u'ret[code] = {code}, after post request' .format (
563
- code = (ret [ u'code' ] if u'code' in ret else u' N/A' )))
565
+ code = (ret . get ( u'code' , u' N/A') )))
564
566
565
567
if u'code' in ret and ret [u'code' ] == SESSION_EXPIRED_GS_CODE :
566
568
ret = self ._renew_session ()
@@ -685,7 +687,7 @@ def request_thread(result_queue):
685
687
elif raw_ret .status_code in STATUS_TO_EXCEPTION :
686
688
# retryable exceptions
687
689
result_queue .put (
688
- (STATUS_TO_EXCEPTION [raw_ret .status_code ], True ))
690
+ (STATUS_TO_EXCEPTION [raw_ret .status_code ]() , True ))
689
691
elif raw_ret .status_code == UNAUTHORIZED and \
690
692
catch_okta_unauthorized_error :
691
693
# OKTA Unauthorized errors
@@ -757,6 +759,7 @@ def request_thread(result_queue):
757
759
sleeping_time = 1
758
760
return_object = None
759
761
for retry_cnt in range (retry ):
762
+ return_object = None
760
763
request_result_queue = Queue ()
761
764
th = Thread (name = 'request_thread' , target = request_thread ,
762
765
args = (request_result_queue ,))
@@ -801,8 +804,17 @@ def request_thread(result_queue):
801
804
retry ,
802
805
sleeping_time )
803
806
time .sleep (sleeping_time )
804
- return_object = None
805
807
808
+ if isinstance (return_object , Error ):
809
+ Error .errorhandler_wrapper (conn , None , return_object )
810
+ elif isinstance (return_object , Exception ):
811
+ Error .errorhandler_wrapper (
812
+ conn , None , OperationalError ,
813
+ {
814
+ u'msg' : u'Failed to execute request: {0}' .format (
815
+ return_object ),
816
+ u'errno' : ER_FAILED_TO_REQUEST ,
817
+ })
806
818
return return_object
807
819
808
820
def authenticate_by_saml (self , authenticator , account , user , password ):
0 commit comments