Browse Source

update golangci-lint (#2868)

pull/2873/head
Alessandro Ros 2 years ago committed by GitHub
parent
commit
7437ee7a09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      .golangci.yml
  2. 2
      Makefile
  3. 10
      internal/conf/env/env.go
  4. 8
      internal/conf/path.go
  5. 8
      internal/core/auth.go
  6. 4
      internal/core/path.go
  7. 2
      internal/core/path_manager.go
  8. 6
      internal/defs/auth.go
  9. 6
      internal/defs/path.go
  10. 2
      internal/externalcmd/cmd.go
  11. 9
      internal/externalcmd/cmd_unix.go
  12. 4
      internal/formatprocessor/ac3.go
  13. 4
      internal/formatprocessor/av1.go
  14. 4
      internal/formatprocessor/h264.go
  15. 4
      internal/formatprocessor/h265.go
  16. 4
      internal/formatprocessor/mjpeg.go
  17. 4
      internal/formatprocessor/mpeg1_audio.go
  18. 4
      internal/formatprocessor/mpeg1_video.go
  19. 3
      internal/formatprocessor/mpeg4_audio.go
  20. 3
      internal/formatprocessor/mpeg4_video.go
  21. 4
      internal/formatprocessor/vp8.go
  22. 4
      internal/formatprocessor/vp9.go
  23. 2
      internal/protocols/rtmp/rawmessage/reader.go
  24. 33
      internal/protocols/rtmp/reader.go
  25. 4
      internal/record/format_fmp4.go
  26. 4
      internal/servers/hls/http_server.go
  27. 14
      internal/servers/hls/muxer.go
  28. 6
      internal/servers/rtmp/conn.go
  29. 18
      internal/servers/rtsp/conn.go
  30. 31
      internal/servers/rtsp/session.go
  31. 8
      internal/servers/srt/conn.go
  32. 4
      internal/servers/webrtc/http_server.go
  33. 7
      internal/servers/webrtc/session.go

4
.golangci.yml

@ -1,7 +1,10 @@
linters: linters:
enable: enable:
- asciicheck
- bidichk
- bodyclose - bodyclose
- dupl - dupl
- errorlint
- exportloopref - exportloopref
- gochecknoinits - gochecknoinits
- gocritic - gocritic
@ -13,6 +16,7 @@ linters:
- prealloc - prealloc
- revive - revive
- unconvert - unconvert
- tparallel
- wastedassign - wastedassign
- whitespace - whitespace

2
Makefile

@ -1,5 +1,5 @@
BASE_IMAGE = golang:1.21-alpine3.18 BASE_IMAGE = golang:1.21-alpine3.18
LINT_IMAGE = golangci/golangci-lint:v1.55.0 LINT_IMAGE = golangci/golangci-lint:v1.55.2
NODE_IMAGE = node:16-alpine3.18 NODE_IMAGE = node:16-alpine3.18
ALPINE_IMAGE = alpine:3.18 ALPINE_IMAGE = alpine:3.18
RPI32_IMAGE = balenalib/raspberry-pi:bullseye-run-20230712 RPI32_IMAGE = balenalib/raspberry-pi:bullseye-run-20230712

10
internal/conf/env/env.go vendored

@ -38,12 +38,12 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er
} }
err := i.UnmarshalEnv(prefix, ev) err := i.UnmarshalEnv(prefix, ev)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", prefix, err) return fmt.Errorf("%s: %w", prefix, err)
} }
} else if envHasAtLeastAKeyWithPrefix(env, prefix) { } else if envHasAtLeastAKeyWithPrefix(env, prefix) {
err := i.UnmarshalEnv(prefix, "") err := i.UnmarshalEnv(prefix, "")
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", prefix, err) return fmt.Errorf("%s: %w", prefix, err)
} }
} }
return nil return nil
@ -66,7 +66,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er
} }
iv, err := strconv.ParseInt(ev, 10, 32) iv, err := strconv.ParseInt(ev, 10, 32)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", prefix, err) return fmt.Errorf("%s: %w", prefix, err)
} }
prv.Elem().SetInt(iv) prv.Elem().SetInt(iv)
} }
@ -79,7 +79,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er
} }
iv, err := strconv.ParseUint(ev, 10, 32) iv, err := strconv.ParseUint(ev, 10, 32)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", prefix, err) return fmt.Errorf("%s: %w", prefix, err)
} }
prv.Elem().SetUint(iv) prv.Elem().SetUint(iv)
} }
@ -92,7 +92,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er
} }
iv, err := strconv.ParseFloat(ev, 64) iv, err := strconv.ParseFloat(ev, 64)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", prefix, err) return fmt.Errorf("%s: %w", prefix, err)
} }
prv.Elem().SetFloat(iv) prv.Elem().SetFloat(iv)
} }

8
internal/conf/path.go

@ -222,7 +222,7 @@ func (pconf *Path) check(conf *Conf, name string) error {
case name == "" || name[0] != '~': // normal path case name == "" || name[0] != '~': // normal path
err := IsValidPathName(name) err := IsValidPathName(name)
if err != nil { if err != nil {
return fmt.Errorf("invalid path name '%s': %s", name, err) return fmt.Errorf("invalid path name '%s': %w", name, err)
} }
default: // regular expression-based path default: // regular expression-based path
@ -320,14 +320,14 @@ func (pconf *Path) check(conf *Conf, name string) error {
if pconf.SRTReadPassphrase != "" { if pconf.SRTReadPassphrase != "" {
err := srtCheckPassphrase(pconf.SRTReadPassphrase) err := srtCheckPassphrase(pconf.SRTReadPassphrase)
if err != nil { if err != nil {
return fmt.Errorf("invalid 'readRTPassphrase': %v", err) return fmt.Errorf("invalid 'readRTPassphrase': %w", err)
} }
} }
if pconf.Fallback != "" { if pconf.Fallback != "" {
if strings.HasPrefix(pconf.Fallback, "/") { if strings.HasPrefix(pconf.Fallback, "/") {
err := IsValidPathName(pconf.Fallback[1:]) err := IsValidPathName(pconf.Fallback[1:])
if err != nil { if err != nil {
return fmt.Errorf("'%s': %s", pconf.Fallback, err) return fmt.Errorf("'%s': %w", pconf.Fallback, err)
} }
} else { } else {
_, err := base.ParseURL(pconf.Fallback) _, err := base.ParseURL(pconf.Fallback)
@ -384,7 +384,7 @@ func (pconf *Path) check(conf *Conf, name string) error {
err := srtCheckPassphrase(pconf.SRTPublishPassphrase) err := srtCheckPassphrase(pconf.SRTPublishPassphrase)
if err != nil { if err != nil {
return fmt.Errorf("invalid 'srtPublishPassphrase': %v", err) return fmt.Errorf("invalid 'srtPublishPassphrase': %w", err)
} }
} }

8
internal/core/auth.go

@ -97,7 +97,7 @@ func doAuthentication(
accessRequest, accessRequest,
) )
if err != nil { if err != nil {
return &defs.ErrAuthentication{Message: fmt.Sprintf("external authentication failed: %s", err)} return defs.AuthenticationError{Message: fmt.Sprintf("external authentication failed: %s", err)}
} }
} }
@ -117,7 +117,7 @@ func doAuthentication(
if pathIPs != nil { if pathIPs != nil {
if !ipEqualOrInRange(accessRequest.IP, pathIPs) { if !ipEqualOrInRange(accessRequest.IP, pathIPs) {
return &defs.ErrAuthentication{Message: fmt.Sprintf("IP %s not allowed", accessRequest.IP)} return defs.AuthenticationError{Message: fmt.Sprintf("IP %s not allowed", accessRequest.IP)}
} }
} }
@ -132,11 +132,11 @@ func doAuthentication(
"IPCAM", "IPCAM",
accessRequest.RTSPNonce) accessRequest.RTSPNonce)
if err != nil { if err != nil {
return &defs.ErrAuthentication{Message: err.Error()} return defs.AuthenticationError{Message: err.Error()}
} }
} else if !checkCredential(pathUser, accessRequest.User) || } else if !checkCredential(pathUser, accessRequest.User) ||
!checkCredential(pathPass, accessRequest.Pass) { !checkCredential(pathPass, accessRequest.Pass) {
return &defs.ErrAuthentication{Message: "invalid credentials"} return defs.AuthenticationError{Message: "invalid credentials"}
} }
} }

4
internal/core/path.go

@ -493,7 +493,7 @@ func (pa *path) doDescribe(req defs.PathDescribeReq) {
return return
} }
req.Res <- defs.PathDescribeRes{Err: defs.ErrPathNoOnePublishing{PathName: pa.name}} req.Res <- defs.PathDescribeRes{Err: defs.PathNoOnePublishingError{PathName: pa.name}}
} }
func (pa *path) doRemovePublisher(req defs.PathRemovePublisherReq) { func (pa *path) doRemovePublisher(req defs.PathRemovePublisherReq) {
@ -584,7 +584,7 @@ func (pa *path) doAddReader(req defs.PathAddReaderReq) {
return return
} }
req.Res <- defs.PathAddReaderRes{Err: defs.ErrPathNoOnePublishing{PathName: pa.name}} req.Res <- defs.PathAddReaderRes{Err: defs.PathNoOnePublishingError{PathName: pa.name}}
} }
func (pa *path) doRemoveReader(req defs.PathRemoveReaderReq) { func (pa *path) doRemoveReader(req defs.PathRemoveReaderReq) {

2
internal/core/path_manager.go

@ -38,7 +38,7 @@ func pathConfCanBeUpdated(oldPathConf *conf.Path, newPathConf *conf.Path) bool {
func getConfForPath(pathConfs map[string]*conf.Path, name string) (string, *conf.Path, []string, error) { func getConfForPath(pathConfs map[string]*conf.Path, name string) (string, *conf.Path, []string, error) {
err := conf.IsValidPathName(name) err := conf.IsValidPathName(name)
if err != nil { if err != nil {
return "", nil, nil, fmt.Errorf("invalid path name: %s (%s)", err, name) return "", nil, nil, fmt.Errorf("invalid path name: %w (%s)", err, name)
} }
// normal path // normal path

6
internal/defs/auth.go

@ -12,12 +12,12 @@ const (
AuthProtocolSRT AuthProtocol = "srt" AuthProtocolSRT AuthProtocol = "srt"
) )
// ErrAuthentication is a authentication error. // AuthenticationError is a authentication error.
type ErrAuthentication struct { type AuthenticationError struct {
Message string Message string
} }
// Error implements the error interface. // Error implements the error interface.
func (e *ErrAuthentication) Error() string { func (e AuthenticationError) Error() string {
return "authentication failed: " + e.Message return "authentication failed: " + e.Message
} }

6
internal/defs/path.go

@ -13,13 +13,13 @@ import (
"github.com/bluenviron/mediamtx/internal/stream" "github.com/bluenviron/mediamtx/internal/stream"
) )
// ErrPathNoOnePublishing is returned when no one is publishing. // PathNoOnePublishingError is returned when no one is publishing.
type ErrPathNoOnePublishing struct { type PathNoOnePublishingError struct {
PathName string PathName string
} }
// Error implements the error interface. // Error implements the error interface.
func (e ErrPathNoOnePublishing) Error() string { func (e PathNoOnePublishingError) Error() string {
return fmt.Sprintf("no one is publishing to path '%s'", e.PathName) return fmt.Sprintf("no one is publishing to path '%s'", e.PathName)
} }

2
internal/externalcmd/cmd.go

@ -76,7 +76,7 @@ func (e *Cmd) run() {
for { for {
err := e.runOSSpecific() err := e.runOSSpecific()
if err == errTerminated { if errors.Is(err, errTerminated) {
return return
} }

9
internal/externalcmd/cmd_unix.go

@ -4,6 +4,7 @@
package externalcmd package externalcmd
import ( import (
"errors"
"fmt" "fmt"
"os" "os"
"os/exec" "os/exec"
@ -40,11 +41,11 @@ func (e *Cmd) runOSSpecific() error {
if err == nil { if err == nil {
return 0 return 0
} }
ee, ok := err.(*exec.ExitError) var ee *exec.ExitError
if !ok { if errors.As(err, &ee) {
return 0 ee.ExitCode()
} }
return ee.ExitCode() return 0
}() }()
}() }()

4
internal/formatprocessor/ac3.go

@ -1,6 +1,7 @@
package formatprocessor package formatprocessor
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -98,7 +99,8 @@ func (t *formatProcessorAC3) ProcessRTPPacket( //nolint:dupl
frames, err := t.decoder.Decode(pkt) frames, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpac3.ErrNonStartingPacketAndNoPrevious || err == rtpac3.ErrMorePacketsNeeded { if errors.Is(err, rtpac3.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpac3.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/av1.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -100,7 +101,8 @@ func (t *formatProcessorAV1) ProcessRTPPacket( //nolint:dupl
tu, err := t.decoder.Decode(pkt) tu, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpav1.ErrNonStartingPacketAndNoPrevious || err == rtpav1.ErrMorePacketsNeeded { if errors.Is(err, rtpav1.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpav1.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/h264.go

@ -2,6 +2,7 @@ package formatprocessor
import ( import (
"bytes" "bytes"
"errors"
"time" "time"
"github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/gortsplib/v4/pkg/format"
@ -284,7 +285,8 @@ func (t *formatProcessorH264) ProcessRTPPacket( //nolint:dupl
} }
if err != nil { if err != nil {
if err == rtph264.ErrNonStartingPacketAndNoPrevious || err == rtph264.ErrMorePacketsNeeded { if errors.Is(err, rtph264.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtph264.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/h265.go

@ -2,6 +2,7 @@ package formatprocessor
import ( import (
"bytes" "bytes"
"errors"
"time" "time"
"github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/gortsplib/v4/pkg/format"
@ -303,7 +304,8 @@ func (t *formatProcessorH265) ProcessRTPPacket( //nolint:dupl
} }
if err != nil { if err != nil {
if err == rtph265.ErrNonStartingPacketAndNoPrevious || err == rtph265.ErrMorePacketsNeeded { if errors.Is(err, rtph265.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtph265.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/mjpeg.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -99,7 +100,8 @@ func (t *formatProcessorMJPEG) ProcessRTPPacket( //nolint:dupl
frame, err := t.decoder.Decode(pkt) frame, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpmjpeg.ErrNonStartingPacketAndNoPrevious || err == rtpmjpeg.ErrMorePacketsNeeded { if errors.Is(err, rtpmjpeg.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpmjpeg.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/mpeg1_audio.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -98,7 +99,8 @@ func (t *formatProcessorMPEG1Audio) ProcessRTPPacket( //nolint:dupl
frames, err := t.decoder.Decode(pkt) frames, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpmpeg1audio.ErrNonStartingPacketAndNoPrevious || err == rtpmpeg1audio.ErrMorePacketsNeeded { if errors.Is(err, rtpmpeg1audio.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpmpeg1audio.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/mpeg1_video.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -99,7 +100,8 @@ func (t *formatProcessorMPEG1Video) ProcessRTPPacket( //nolint:dupl
frame, err := t.decoder.Decode(pkt) frame, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpmpeg1video.ErrNonStartingPacketAndNoPrevious || err == rtpmpeg1video.ErrMorePacketsNeeded { if errors.Is(err, rtpmpeg1video.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpmpeg1video.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

3
internal/formatprocessor/mpeg4_audio.go

@ -1,6 +1,7 @@
package formatprocessor package formatprocessor
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -102,7 +103,7 @@ func (t *formatProcessorMPEG4Audio) ProcessRTPPacket( //nolint:dupl
aus, err := t.decoder.Decode(pkt) aus, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpmpeg4audio.ErrMorePacketsNeeded { if errors.Is(err, rtpmpeg4audio.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

3
internal/formatprocessor/mpeg4_video.go

@ -2,6 +2,7 @@ package formatprocessor //nolint:dupl
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"time" "time"
@ -140,7 +141,7 @@ func (t *formatProcessorMPEG4Video) ProcessRTPPacket( //nolint:dupl
frame, err := t.decoder.Decode(pkt) frame, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpmpeg4video.ErrMorePacketsNeeded { if errors.Is(err, rtpmpeg4video.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/vp8.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -99,7 +100,8 @@ func (t *formatProcessorVP8) ProcessRTPPacket( //nolint:dupl
frame, err := t.decoder.Decode(pkt) frame, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpvp8.ErrNonStartingPacketAndNoPrevious || err == rtpvp8.ErrMorePacketsNeeded { if errors.Is(err, rtpvp8.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpvp8.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

4
internal/formatprocessor/vp9.go

@ -1,6 +1,7 @@
package formatprocessor //nolint:dupl package formatprocessor //nolint:dupl
import ( import (
"errors"
"fmt" "fmt"
"time" "time"
@ -99,7 +100,8 @@ func (t *formatProcessorVP9) ProcessRTPPacket( //nolint:dupl
frame, err := t.decoder.Decode(pkt) frame, err := t.decoder.Decode(pkt)
if err != nil { if err != nil {
if err == rtpvp9.ErrNonStartingPacketAndNoPrevious || err == rtpvp9.ErrMorePacketsNeeded { if errors.Is(err, rtpvp9.ErrNonStartingPacketAndNoPrevious) ||
errors.Is(err, rtpvp9.ErrMorePacketsNeeded) {
return u, nil return u, nil
} }
return nil, err return nil, err

2
internal/protocols/rtmp/rawmessage/reader.go

@ -311,7 +311,7 @@ func (r *Reader) Read() (*Message, error) {
msg, err := rc.readMessage(typ) msg, err := rc.readMessage(typ)
if err != nil { if err != nil {
if err == errMoreChunksNeeded { if errors.Is(err, errMoreChunksNeeded) {
continue continue
} }
return nil, err return nil, err

33
internal/protocols/rtmp/reader.go

@ -2,6 +2,7 @@ package rtmp
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"time" "time"
@ -111,7 +112,7 @@ func trackFromH264DecoderConfig(data []byte) (format.Format, error) {
var conf h264conf.Conf var conf h264conf.Conf
err := conf.Unmarshal(data) err := conf.Unmarshal(data)
if err != nil { if err != nil {
return nil, fmt.Errorf("unable to parse H264 config: %v", err) return nil, fmt.Errorf("unable to parse H264 config: %w", err)
} }
return &format.H264{ return &format.H264{
@ -201,7 +202,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma
} else if msg.Type == message.VideoTypeAU && msg.IsKeyFrame { } else if msg.Type == message.VideoTypeAU && msg.IsKeyFrame {
nalus, err := h264.AVCCUnmarshal(msg.Payload) nalus, err := h264.AVCCUnmarshal(msg.Payload)
if err != nil { if err != nil {
if err == h264.ErrAVCCNoNALUs { if errors.Is(err, h264.ErrAVCCNoNALUs) {
continue continue
} }
return nil, nil, err return nil, nil, err
@ -249,7 +250,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma
var hvcc mp4.HvcC var hvcc mp4.HvcC
_, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &hvcc, mp4.Context{}) _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &hvcc, mp4.Context{})
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("invalid H265 configuration: %v", err) return nil, nil, fmt.Errorf("invalid H265 configuration: %w", err)
} }
vps := h265FindNALU(hvcc.NaluArrays, h265.NALUType_VPS_NUT) vps := h265FindNALU(hvcc.NaluArrays, h265.NALUType_VPS_NUT)
@ -270,13 +271,13 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma
var av1c mp4.Av1C var av1c mp4.Av1C
_, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &av1c, mp4.Context{}) _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &av1c, mp4.Context{})
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("invalid AV1 configuration: %v", err) return nil, nil, fmt.Errorf("invalid AV1 configuration: %w", err)
} }
// parse sequence header and metadata contained in ConfigOBUs, but do not use them // parse sequence header and metadata contained in ConfigOBUs, but do not use them
_, err = av1.BitstreamUnmarshal(av1c.ConfigOBUs, false) _, err = av1.BitstreamUnmarshal(av1c.ConfigOBUs, false)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("invalid AV1 configuration: %v", err) return nil, nil, fmt.Errorf("invalid AV1 configuration: %w", err)
} }
videoTrack = &format.AV1{ videoTrack = &format.AV1{
@ -287,7 +288,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma
var vpcc mp4.VpcC var vpcc mp4.VpcC
_, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &vpcc, mp4.Context{}) _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &vpcc, mp4.Context{})
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("invalid VP9 configuration: %v", err) return nil, nil, fmt.Errorf("invalid VP9 configuration: %w", err)
} }
videoTrack = &format.VP9{ videoTrack = &format.VP9{
@ -464,7 +465,7 @@ func (r *Reader) OnDataAV1(cb OnDataAV1Func) {
if msg, ok := msg.(*message.ExtendedCodedFrames); ok { if msg, ok := msg.(*message.ExtendedCodedFrames); ok {
tu, err := av1.BitstreamUnmarshal(msg.Payload, true) tu, err := av1.BitstreamUnmarshal(msg.Payload, true)
if err != nil { if err != nil {
return fmt.Errorf("unable to decode bitstream: %v", err) return fmt.Errorf("unable to decode bitstream: %w", err)
} }
cb(msg.DTS, tu) cb(msg.DTS, tu)
@ -490,10 +491,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) {
case *message.Video: case *message.Video:
au, err := h264.AVCCUnmarshal(msg.Payload) au, err := h264.AVCCUnmarshal(msg.Payload)
if err != nil { if err != nil {
if err == h264.ErrAVCCNoNALUs { if errors.Is(err, h264.ErrAVCCNoNALUs) {
return nil return nil
} }
return fmt.Errorf("unable to decode AVCC: %v", err) return fmt.Errorf("unable to decode AVCC: %w", err)
} }
cb(msg.DTS+msg.PTSDelta, au) cb(msg.DTS+msg.PTSDelta, au)
@ -501,10 +502,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) {
case *message.ExtendedFramesX: case *message.ExtendedFramesX:
au, err := h264.AVCCUnmarshal(msg.Payload) au, err := h264.AVCCUnmarshal(msg.Payload)
if err != nil { if err != nil {
if err == h264.ErrAVCCNoNALUs { if errors.Is(err, h264.ErrAVCCNoNALUs) {
return nil return nil
} }
return fmt.Errorf("unable to decode AVCC: %v", err) return fmt.Errorf("unable to decode AVCC: %w", err)
} }
cb(msg.DTS, au) cb(msg.DTS, au)
@ -512,10 +513,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) {
case *message.ExtendedCodedFrames: case *message.ExtendedCodedFrames:
au, err := h264.AVCCUnmarshal(msg.Payload) au, err := h264.AVCCUnmarshal(msg.Payload)
if err != nil { if err != nil {
if err == h264.ErrAVCCNoNALUs { if errors.Is(err, h264.ErrAVCCNoNALUs) {
return nil return nil
} }
return fmt.Errorf("unable to decode AVCC: %v", err) return fmt.Errorf("unable to decode AVCC: %w", err)
} }
cb(msg.DTS+msg.PTSDelta, au) cb(msg.DTS+msg.PTSDelta, au)
@ -534,7 +535,7 @@ func (r *Reader) OnDataH264(cb OnDataH26xFunc) {
var conf h264conf.Conf var conf h264conf.Conf
err := conf.Unmarshal(msg.Payload) err := conf.Unmarshal(msg.Payload)
if err != nil { if err != nil {
return fmt.Errorf("unable to parse H264 config: %v", err) return fmt.Errorf("unable to parse H264 config: %w", err)
} }
au := [][]byte{ au := [][]byte{
@ -547,10 +548,10 @@ func (r *Reader) OnDataH264(cb OnDataH26xFunc) {
case message.VideoTypeAU: case message.VideoTypeAU:
au, err := h264.AVCCUnmarshal(msg.Payload) au, err := h264.AVCCUnmarshal(msg.Payload)
if err != nil { if err != nil {
if err == h264.ErrAVCCNoNALUs { if errors.Is(err, h264.ErrAVCCNoNALUs) {
return nil return nil
} }
return fmt.Errorf("unable to decode AVCC: %v", err) return fmt.Errorf("unable to decode AVCC: %w", err)
} }
cb(msg.DTS+msg.PTSDelta, au) cb(msg.DTS+msg.PTSDelta, au)

4
internal/record/format_fmp4.go

@ -729,13 +729,13 @@ func (f *formatFMP4) initialize() {
var syncInfo ac3.SyncInfo var syncInfo ac3.SyncInfo
err := syncInfo.Unmarshal(frame) err := syncInfo.Unmarshal(frame)
if err != nil { if err != nil {
return fmt.Errorf("invalid AC-3 frame: %s", err) return fmt.Errorf("invalid AC-3 frame: %w", err)
} }
var bsi ac3.BSI var bsi ac3.BSI
err = bsi.Unmarshal(frame[5:]) err = bsi.Unmarshal(frame[5:])
if err != nil { if err != nil {
return fmt.Errorf("invalid AC-3 frame: %s", err) return fmt.Errorf("invalid AC-3 frame: %w", err)
} }
if !parsed { if !parsed {

4
internal/servers/hls/http_server.go

@ -2,6 +2,7 @@ package hls
import ( import (
_ "embed" _ "embed"
"errors"
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
@ -158,7 +159,8 @@ func (s *httpServer) onRequest(ctx *gin.Context) {
}, },
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
if !hasCredentials { if !hasCredentials {
ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`) ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`)
ctx.Writer.WriteHeader(http.StatusUnauthorized) ctx.Writer.WriteHeader(http.StatusUnauthorized)

14
internal/servers/hls/muxer.go

@ -269,7 +269,7 @@ func (m *muxer) runInner(innerCtx context.Context, innerReady chan struct{}) err
err := m.muxer.Start() err := m.muxer.Start()
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
defer m.muxer.Close() defer m.muxer.Close()
@ -318,7 +318,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go
err := m.muxer.WriteAV1(tunit.NTP, tunit.PTS, tunit.TU) err := m.muxer.WriteAV1(tunit.NTP, tunit.PTS, tunit.TU)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil
@ -342,7 +342,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go
err := m.muxer.WriteVP9(tunit.NTP, tunit.PTS, tunit.Frame) err := m.muxer.WriteVP9(tunit.NTP, tunit.PTS, tunit.Frame)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil
@ -366,7 +366,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go
err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU) err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil
@ -396,7 +396,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go
err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU) err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil
@ -428,7 +428,7 @@ func (m *muxer) createAudioTrack(stream *stream.Stream) (*description.Media, *go
tunit.PTS, tunit.PTS,
tunit.Packets) tunit.Packets)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil
@ -462,7 +462,7 @@ func (m *muxer) createAudioTrack(stream *stream.Stream) (*description.Media, *go
tunit.PTS, tunit.PTS,
tunit.AUs) tunit.AUs)
if err != nil { if err != nil {
return fmt.Errorf("muxer error: %v", err) return fmt.Errorf("muxer error: %w", err)
} }
return nil return nil

6
internal/servers/rtmp/conn.go

@ -179,7 +179,8 @@ func (c *conn) runRead(conn *rtmp.Conn, u *url.URL) error {
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
<-time.After(rtmpPauseAfterAuthError) <-time.After(rtmpPauseAfterAuthError)
return terr return terr
@ -410,7 +411,8 @@ func (c *conn) runPublish(conn *rtmp.Conn, u *url.URL) error {
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
<-time.After(rtmpPauseAfterAuthError) <-time.After(rtmpPauseAfterAuthError)
return terr return terr

18
internal/servers/rtsp/conn.go

@ -1,6 +1,7 @@
package rtsp package rtsp
import ( import (
"errors"
"fmt" "fmt"
"net" "net"
"time" "time"
@ -138,21 +139,22 @@ func (c *conn) onDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx,
}) })
if res.Err != nil { if res.Err != nil {
switch terr := res.Err.(type) { var terr defs.AuthenticationError
case *defs.ErrAuthentication: if errors.As(res.Err, &terr) {
res, err := c.handleAuthError(terr) res, err := c.handleAuthError(terr)
return res, nil, err return res, nil, err
}
case defs.ErrPathNoOnePublishing: var terr2 defs.PathNoOnePublishingError
if errors.As(res.Err, &terr2) {
return &base.Response{ return &base.Response{
StatusCode: base.StatusNotFound, StatusCode: base.StatusNotFound,
}, nil, res.Err }, nil, res.Err
default:
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, res.Err
} }
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, res.Err
} }
if res.Redirect != "" { if res.Redirect != "" {

31
internal/servers/rtsp/session.go

@ -2,6 +2,7 @@ package rtsp
import ( import (
"encoding/hex" "encoding/hex"
"errors"
"fmt" "fmt"
"net" "net"
"sync" "sync"
@ -125,15 +126,14 @@ func (s *session) onAnnounce(c *conn, ctx *gortsplib.ServerHandlerOnAnnounceCtx)
}) })
if res.Err != nil { if res.Err != nil {
switch terr := res.Err.(type) { var terr defs.AuthenticationError
case *defs.ErrAuthentication: if errors.As(res.Err, &terr) {
return c.handleAuthError(terr) return c.handleAuthError(terr)
default:
return &base.Response{
StatusCode: base.StatusBadRequest,
}, res.Err
} }
return &base.Response{
StatusCode: base.StatusBadRequest,
}, res.Err
} }
s.path = res.Path s.path = res.Path
@ -211,21 +211,22 @@ func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx,
}) })
if res.Err != nil { if res.Err != nil {
switch terr := res.Err.(type) { var terr defs.AuthenticationError
case *defs.ErrAuthentication: if errors.As(res.Err, &terr) {
res, err := c.handleAuthError(terr) res, err := c.handleAuthError(terr)
return res, nil, err return res, nil, err
}
case defs.ErrPathNoOnePublishing: var terr2 defs.PathNoOnePublishingError
if errors.As(res.Err, &terr2) {
return &base.Response{ return &base.Response{
StatusCode: base.StatusNotFound, StatusCode: base.StatusNotFound,
}, nil, res.Err }, nil, res.Err
default:
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, res.Err
} }
return &base.Response{
StatusCode: base.StatusBadRequest,
}, nil, res.Err
} }
s.path = res.Path s.path = res.Path

8
internal/servers/srt/conn.go

@ -195,7 +195,8 @@ func (c *conn) runPublish(req srtNewConnReq, pathName string, user string, pass
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// TODO: re-enable. Currently this freezes the listener. // TODO: re-enable. Currently this freezes the listener.
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
// <-time.After(srtPauseAfterAuthError) // <-time.After(srtPauseAfterAuthError)
@ -294,11 +295,12 @@ func (c *conn) runRead(req srtNewConnReq, pathName string, user string, pass str
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// TODO: re-enable. Currently this freezes the listener. // TODO: re-enable. Currently this freezes the listener.
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
// <-time.After(srtPauseAfterAuthError) // <-time.After(srtPauseAfterAuthError)
return false, terr return false, res.Err
} }
return false, res.Err return false, res.Err
} }

4
internal/servers/webrtc/http_server.go

@ -2,6 +2,7 @@ package webrtc
import ( import (
_ "embed" _ "embed"
"errors"
"fmt" "fmt"
"io" "io"
"net" "net"
@ -123,7 +124,8 @@ func (s *httpServer) checkAuthOutsideSession(ctx *gin.Context, path string, publ
}, },
}) })
if res.Err != nil { if res.Err != nil {
if terr, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
if !hasCredentials { if !hasCredentials {
ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`) ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`)
ctx.Writer.WriteHeader(http.StatusUnauthorized) ctx.Writer.WriteHeader(http.StatusUnauthorized)

7
internal/servers/webrtc/session.go

@ -3,6 +3,7 @@ package webrtc
import ( import (
"context" "context"
"encoding/hex" "encoding/hex"
"errors"
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
@ -368,7 +369,8 @@ func (s *session) runPublish() (int, error) {
}, },
}) })
if res.Err != nil { if res.Err != nil {
if _, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
<-time.After(webrtcPauseAfterAuthError) <-time.After(webrtcPauseAfterAuthError)
@ -498,7 +500,8 @@ func (s *session) runRead() (int, error) {
}, },
}) })
if res.Err != nil { if res.Err != nil {
if _, ok := res.Err.(*defs.ErrAuthentication); ok { var terr defs.AuthenticationError
if errors.As(res.Err, &terr) {
// wait some seconds to stop brute force attacks // wait some seconds to stop brute force attacks
<-time.After(webrtcPauseAfterAuthError) <-time.After(webrtcPauseAfterAuthError)

Loading…
Cancel
Save