@@ -11,6 +11,7 @@ import (
1111 "google.golang.org/grpc/codes"
1212 "google.golang.org/grpc/status"
1313
14+ "github.com/livekit/protocol/logger"
1415 "github.com/livekit/protocol/utils/xtwirp"
1516 "golang.org/x/text/language"
1617)
@@ -263,6 +264,29 @@ func validateHeaderValues(headers map[string]string) error {
263264 return nil
264265}
265266
267+ // validateHeaders makes sure header names/keys and values are per SIP specifications
268+ func validateHeaders (headers map [string ]string ) error {
269+ for headerName , headerValue := range headers {
270+ if err := ValidateHeaderName (headerName ); err != nil {
271+ return fmt .Errorf ("invalid header name: %w" , err )
272+ }
273+ if err := ValidateHeaderValue (headerName , headerValue ); err != nil {
274+ return fmt .Errorf ("invalid header value for %s: %w" , headerName , err )
275+ }
276+ }
277+ return nil
278+ }
279+
280+ // validateHeaderNames Makes sure the values of the given map correspond to valid SIP header names
281+ func validateHeaderNames (attributesToHeaders map [string ]string ) error {
282+ for _ , headerName := range attributesToHeaders {
283+ if err := ValidateHeaderName (headerName ); err != nil {
284+ return fmt .Errorf ("invalid header name: %w" , err )
285+ }
286+ }
287+ return nil
288+ }
289+
266290func (p * SIPTrunkInfo ) Validate () error {
267291 if len (p .InboundNumbersRegex ) != 0 {
268292 return fmt .Errorf ("trunks with InboundNumbersRegex are deprecated" )
@@ -368,6 +392,15 @@ func (p *SIPInboundTrunkInfo) Validate() error {
368392 if err := validateHeaderValues (p .AttributesToHeaders ); err != nil {
369393 return err
370394 }
395+ if err := validateHeaders (p .Headers ); err != nil {
396+ logger .Warnw ("Header validation failed for Headers field" , err )
397+ // TODO: Once we're happy with the validation, we want this to error out
398+ }
399+ // Don't bother with HeadersToAttributes. If they're invalid, we just won't match
400+ if err := validateHeaderNames (p .AttributesToHeaders ); err != nil {
401+ logger .Warnw ("Header validation failed for AttributesToHeaders field" , err )
402+ // TODO: Once we're happy with the validation, we want this to error out
403+ }
371404 return nil
372405}
373406
@@ -455,6 +488,15 @@ func (p *SIPOutboundTrunkInfo) Validate() error {
455488 if err := validateHeaderValues (p .AttributesToHeaders ); err != nil {
456489 return err
457490 }
491+ if err := validateHeaders (p .Headers ); err != nil {
492+ logger .Warnw ("Header validation failed for Headers field" , err )
493+ // TODO: Once we're happy with the validation, we want this to error out
494+ }
495+ // Don't bother with HeadersToAttributes. If they're invalid, we just won't match
496+ if err := validateHeaderNames (p .AttributesToHeaders ); err != nil {
497+ logger .Warnw ("Header validation failed for AttributesToHeaders field" , err )
498+ // TODO: Once we're happy with the validation, we want this to error out
499+ }
458500 return nil
459501}
460502
@@ -472,6 +514,11 @@ func (p *SIPOutboundConfig) Validate() error {
472514 if err := validateHeaderValues (p .AttributesToHeaders ); err != nil {
473515 return err
474516 }
517+ // Don't bother with HeadersToAttributes. If they're invalid, we just won't match
518+ if err := validateHeaderNames (p .AttributesToHeaders ); err != nil {
519+ logger .Warnw ("Header validation failed for AttributesToHeaders field" , err )
520+ // No error, just a warning for SIP RFC validation for now
521+ }
475522 return nil
476523}
477524
@@ -677,13 +724,18 @@ func (p *CreateSIPParticipantRequest) Validate() error {
677724 return err
678725 }
679726
727+ if err := validateHeaders (p .Headers ); err != nil {
728+ logger .Warnw ("Header validation failed for Headers field" , err )
729+ // TODO: Once we're happy with the validation, we want this to error out
730+ }
731+
680732 // Validate display_name if provided
681733 if p .DisplayName != nil {
682734 if len (* p .DisplayName ) > 128 {
683735 return errors .New ("display_name too long (max 128 characters)" )
684736 }
685737
686- // TODO: Validate display name doesn't contain invalid characters
738+ // TODO: Once we're happy with the validation, we want this to error out
687739 }
688740
689741 // Validate destination if provided
@@ -775,6 +827,11 @@ func (p *TransferSIPParticipantRequest) Validate() error {
775827 return err
776828 }
777829
830+ if err := validateHeaders (p .Headers ); err != nil {
831+ logger .Warnw ("Header validation failed for Headers field" , err )
832+ // TODO: Once we're happy with the validation, we want this to error out
833+ }
834+
778835 return nil
779836}
780837
0 commit comments