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  }