in pkg/provider/pingfed/pingfed.go [64:122]
func (ac *Client) follow(ctx context.Context, req *http.Request) (string, error) {
res, err := ac.client.Do(req)
if err != nil {
return "", errors.Wrap(err, "error following")
}
doc, err := goquery.NewDocumentFromResponse(res)
if err != nil {
return "", errors.Wrap(err, "failed to build document from response")
}
var handler func(context.Context, *goquery.Document) (context.Context, *http.Request, error)
if docIsFormRedirectToAlibabaCloud(doc) {
logger.WithField("type", "saml-response").Debug("doc detect")
if samlResponse, ok := extractSAMLResponse(doc); ok {
decodedSamlResponse, err := base64.StdEncoding.DecodeString(samlResponse)
if err != nil {
return "", errors.Wrap(err, "failed to decode saml-response")
}
logger.WithField("type", "saml-response").WithField("saml-response", string(decodedSamlResponse)).Debug("doc detect")
return samlResponse, nil
}
} else if docIsFormSamlRequest(doc) {
logger.WithField("type", "saml-request").Debug("doc detect")
handler = ac.handleFormRedirect
} else if docIsFormResume(doc) {
logger.WithField("type", "resume").Debug("doc detect")
handler = ac.handleFormRedirect
} else if docIsFormSamlResponse(doc) {
logger.WithField("type", "saml-response").Debug("doc detect")
handler = ac.handleFormRedirect
} else if docIsLogin(doc) {
logger.WithField("type", "login").Debug("doc detect")
handler = ac.handleLogin
} else if docIsOTP(doc) {
logger.WithField("type", "otp").Debug("doc detect")
handler = ac.handleOTP
} else if docIsSwipe(doc) {
logger.WithField("type", "swipe").Debug("doc detect")
handler = ac.handleSwipe
} else if docIsFormRedirect(doc) {
logger.WithField("type", "form-redirect").Debug("doc detect")
handler = ac.handleFormRedirect
} else if docIsWebAuthn(doc) {
logger.WithField("type", "webauthn").Debug("doc detect")
handler = ac.handleWebAuthn
}
if handler == nil {
html, _ := doc.Selection.Html()
logger.WithField("doc", html).Debug("Unknown document type")
return "", fmt.Errorf("Unknown document type")
}
ctx, req, err = handler(ctx, doc)
if err != nil {
return "", err
}
return ac.follow(ctx, req)
}