Skip to content

Commit 070839e

Browse files
authored
Added more scrutinizing SIP header validation warnings (#1238)
1 parent 90649d6 commit 070839e

File tree

4 files changed

+681
-1
lines changed

4 files changed

+681
-1
lines changed

.changeset/fair-beds-take.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"github.com/livekit/protocol": patch
3+
---
4+
5+
Added warning prints to SIP headers

livekit/sip.go

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
266290
func (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

Comments
 (0)