@@ -26,6 +26,7 @@ def __init__(self, *args, **kwargs):
2626 self ._factor = None
2727 self ._grant_token = None
2828 self ._hotp = None
29+ self ._progress_token = None
2930 self ._referrer = None
3031 self ._session_vars = None
3132 self ._status = None
@@ -58,8 +59,24 @@ def get_grant_token(self, auth_url):
5859 self ._get_status ()
5960 if self ._status == 'SUCCESS' :
6061 self ._get_oidc_exit ()
62+ if self ._progress_token :
63+ self ._get_grant_token ()
6164 return self ._grant_token
6265
66+ def _get_grant_token (self ):
67+ headers = {
68+ 'X-Csrf-Token' : self ._xsrf
69+ }
70+ data = {
71+ 'progress_token' : self ._progress_token
72+ }
73+ res = self ._api .login ('POST' ,
74+ 'authenticate' ,
75+ data = data ,
76+ headers = headers )
77+ if res .status_code == 200 :
78+ self ._grant_token = res .json ().get ('grant_token' )
79+
6380 def _get_mfa_details (self ):
6481 if self ._state .otp_secret :
6582 self ._device = 'null'
@@ -117,15 +134,19 @@ def _get_oidc_exit(self):
117134 }
118135 res = self ._api .request ('POST' , f'{ self ._base_url } /frame/v4/oidc/exit' , headers = headers , data = data )
119136 if res .status_code == 200 :
120- self ._grant_token = re .search ('grant_token=([^&]*)' , res .url ).group (1 )
137+ try :
138+ self ._grant_token = re .search ('grant_token=([^&]*)' , res .url ).group (1 )
139+ except AttributeError :
140+ self ._progress_token = re .search ('token=([^&]*)' , res .url ).group (1 )
141+ self ._xsrf = self ._utils .get_html_tag_value ('csrf-token' , res .text )
121142
122143 def _get_session_variables (self ):
123144 self ._referrer = f'https://login.{ self ._state .synack_domain } /'
124145 res = self ._api .request ('GET' , self ._auth_url , headers = self ._build_headers ())
125146 if res .status_code == 200 :
126147 self ._sid = re .search ('sid=([^&]*)' , res .url ).group (1 )
127148 self ._referrer = res .url
128- self ._base_url = re .search ('(https.*duosecurity .com)/' , res .url ).group (1 )
149+ self ._base_url = re .search ('(https.*duo[^.]* .com)/' , res .url ).group (1 )
129150 self ._xsrf = self ._utils .get_html_tag_value ('_xsrf' , res .text )
130151
131152 client_hints = base64 .b64encode (json .dumps ({
0 commit comments