func (ar *AuthnRequest) PopulateFromXML(n types.Node) error { if err := ar.Request.PopulateFromXML(n); err != nil { return err } xpc, err := xpath.NewContext(n) if err != nil { return errors.New("failed to create xpath context: " + err.Error()) } if err := xpc.RegisterNS(ns.SAML.Prefix, ns.SAML.URI); err != nil { return errors.New("failed to register namespace for xpath context: " + err.Error()) } ar.ProviderName = xpath.String(xpc.Find("@ProviderName")) // Check if we have a proper ProtocolBinding switch proto := binding.Protocol(xpath.String(xpc.Find("@ProtocolBinding"))); proto { case binding.HTTPPost, binding.HTTPRedirect: ar.ProtocolBinding = proto default: return errors.New("invalid protocol binding") } ar.AssertionConsumerServiceURL = xpath.String(xpc.Find("@AssertionConsumerServiceURL")) if node := xpath.NodeList(xpc.Find("NameIDPolicy")).First(); node != nil { nip := &NameIDPolicy{} if err := nip.PopulateFromXML(node.(types.Element)); err != nil { return err } ar.NameIDPolicy = nip } return nil }
func (nip *NameIDPolicy) PopulateFromXML(n types.Element) error { xpc, err := makeXPathContext(n) if err != nil { return err } nip.AllowCreate = xpath.Bool(xpc.Find("@AllowCreate")) nip.Format = nameid.Format(xpath.String(xpc.Find("@Format"))) nip.SPNameQualifier = xpath.String(xpc.Find("@SPNameQualifier")) return nil }
func (r *Request) PopulateFromXML(n types.Node) error { xpc, err := makeXPathContext(n) if err != nil { return err } r.ID = xpath.String(xpc.Find("@ID")) r.Version = xpath.String(xpc.Find("@Version")) s := xpath.String(xpc.Find("@IssueInstant")) if s == "" { t, err := time.Parse(TimeFormat, s) if err == nil { r.IssueInstant = t } } r.Issuer = xpath.String(xpc.Find(ns.SAML.AddPrefix("Issuer"))) return nil }