package onvif import ( "crypto/sha1" "encoding/base64" "fmt" "net/url" "time" "github.com/AlexxIT/go2rtc/pkg/core" ) type Envelope struct { buf []byte } const ( prefix1 = ` ` prefix2 = ` ` suffix = ` ` ) func NewEnvelope() *Envelope { e := &Envelope{buf: make([]byte, 0, 1024)} e.Append(prefix1, prefix2) return e } func NewEnvelopeWithUser(user *url.Userinfo) *Envelope { if user == nil { return NewEnvelope() } nonce := core.RandString(16, 36) created := time.Now().UTC().Format(time.RFC3339Nano) pass, _ := user.Password() h := sha1.New() h.Write([]byte(nonce + created + pass)) e := &Envelope{buf: make([]byte, 0, 1024)} e.Append(prefix1) e.Appendf(` %s %s %s %s `, user.Username(), base64.StdEncoding.EncodeToString(h.Sum(nil)), base64.StdEncoding.EncodeToString([]byte(nonce)), created) e.Append(prefix2) return e } func (e *Envelope) Append(args ...string) { for _, s := range args { e.buf = append(e.buf, s...) } } func (e *Envelope) Appendf(format string, args ...any) { e.buf = fmt.Appendf(e.buf, format, args...) } func (e *Envelope) Bytes() []byte { return append(e.buf, suffix...) }