in pkg/provider/pingfed/pingfed.go [155:202]
func (ac *Client) handleSwipe(ctx context.Context, doc *goquery.Document) (context.Context, *http.Request, error) {
form, err := page.NewFormFromDocument(doc, "#form1")
if err != nil {
return ctx, nil, errors.Wrap(err, "error extracting swipe status form")
}
// poll status. request must specifically be a GET
form.Method = "GET"
req, err := form.BuildRequest()
if err != nil {
return ctx, nil, err
}
for {
time.Sleep(3 * time.Second)
res, err := ac.client.Do(req)
if err != nil {
return ctx, nil, errors.Wrap(err, "error polling swipe status")
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return ctx, nil, errors.Wrap(err, "error parsing body from swipe status response")
}
resp := string(body)
pingfedMFAStatusResponse := gjson.Get(resp, "status").String()
//ASYNC_AUTH_WAIT indicates we keep going
//OK indicates someone swiped
//DEVICE_CLAIM_TIMEOUT indicates nobody swiped
//otherwise loop forever?
if pingfedMFAStatusResponse == "OK" || pingfedMFAStatusResponse == "DEVICE_CLAIM_TIMEOUT" || pingfedMFAStatusResponse == "TIMEOUT" {
break
}
}
// now build a request for getting response of MFA
form, err = page.NewFormFromDocument(doc, "#reponseView")
if err != nil {
return ctx, nil, errors.Wrap(err, "error extracting swipe response form")
}
req, err = form.BuildRequest()
return ctx, req, err
}