github.com/crewjam/saml@v0.4.14/samlidp/util.go (about) 1 package samlidp 2 3 import ( 4 "bytes" 5 "encoding/xml" 6 "errors" 7 "io" 8 9 xrv "github.com/mattermost/xml-roundtrip-validator" 10 11 "github.com/crewjam/saml" 12 ) 13 14 func randomBytes(n int) []byte { 15 rv := make([]byte, n) 16 if _, err := saml.RandReader.Read(rv); err != nil { 17 panic(err) 18 } 19 return rv 20 } 21 22 func getSPMetadata(r io.Reader) (spMetadata *saml.EntityDescriptor, err error) { 23 var data []byte 24 if data, err = io.ReadAll(r); err != nil { 25 return nil, err 26 } 27 28 spMetadata = &saml.EntityDescriptor{} 29 if err := xrv.Validate(bytes.NewBuffer(data)); err != nil { 30 return nil, err 31 } 32 33 if err := xml.Unmarshal(data, &spMetadata); err != nil { 34 if err.Error() == "expected element type <EntityDescriptor> but have <EntitiesDescriptor>" { 35 entities := &saml.EntitiesDescriptor{} 36 if err := xml.Unmarshal(data, &entities); err != nil { 37 return nil, err 38 } 39 40 for _, e := range entities.EntityDescriptors { 41 if len(e.SPSSODescriptors) > 0 { 42 return &e, nil 43 } 44 } 45 46 // there were no SPSSODescriptors in the response 47 return nil, errors.New("metadata contained no service provider metadata") 48 } 49 50 return nil, err 51 } 52 53 return spMetadata, nil 54 }