in pkg/provider/netiq/netiq.go [48:95]
func (nc *Client) follow(req *http.Request, loginDetails *creds.LoginDetails) (string, error) {
resp, err := nc.client.Do(req)
if err != nil {
return "", errors.Wrap(err, "Failed to perform http request to "+req.URL.String())
}
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
return "", errors.Wrap(err, "failed to build document from response")
}
if isSAMLResponse(doc) {
return extractSAMLAssertion(doc)
} else if resourcePath, isGetToContext := extractGetToContentUrl(doc); isGetToContext {
loginUrl, err := getLoginUrl(nc.MFA, loginDetails.URL, resourcePath)
if err != nil {
return "", errors.Wrap(err, "MFA option unsupported. Valid MFA options are: Auto or Privileged")
}
newReq, err := buildGetToContentRequest(loginUrl + "&uiDestination=contentDiv")
if err != nil {
return "", errors.Wrap(err, "Error building request")
}
return nc.follow(newReq, loginDetails)
} else if resourceURL, isWinLocHref := extractWinLocHrefURL(doc); isWinLocHref {
newReq, err := buildGetToContentRequest(resourceURL)
if err != nil {
return "", errors.Wrap(err, "Error building request")
}
return nc.follow(newReq, loginDetails)
} else if form, isIDPLoginPass := extractIDPLoginPass(doc); isIDPLoginPass {
form.Values.Set("Ecom_User_ID", loginDetails.Username)
form.Values.Set("Ecom_Password", loginDetails.Password)
newReq, err := form.BuildRequest()
if err != nil {
return "", errors.Wrap(err, "Error building request")
}
return nc.follow(newReq, loginDetails)
} else if form, isIDPLoginRsa := extractIDPLoginRsa(doc); isIDPLoginRsa {
token := prompter.StringRequired("Enter concatenated pin and token")
form.Values.Set("Ecom_User_ID", loginDetails.Username)
form.Values.Set("Ecom_Token", token)
newReq, err := form.BuildRequest()
if err != nil {
return "", errors.Wrap(err, "Error building request")
}
return nc.follow(newReq, loginDetails)
} else {
return "", fmt.Errorf("unknown document type")
}
}