Implement String() method on events

To make it safe for logging safelog.Scrub function is now public.

Closes: #40141
This commit is contained in:
meskio 2022-05-20 09:43:03 +02:00
parent 9757784c5a
commit 1d592b06e5
No known key found for this signature in database
GPG key ID: 52B8F5AC97A2DA86
3 changed files with 38 additions and 69 deletions

View file

@ -1,12 +1,8 @@
package main package main
import ( import (
"bytes"
"fmt"
pt "git.torproject.org/pluggable-transports/goptlib.git" pt "git.torproject.org/pluggable-transports/goptlib.git"
"git.torproject.org/pluggable-transports/snowflake.git/v2/common/event" "git.torproject.org/pluggable-transports/snowflake.git/v2/common/event"
"git.torproject.org/pluggable-transports/snowflake.git/v2/common/safelog"
"strings"
) )
func NewPTEventLogger() event.SnowflakeEventReceiver { func NewPTEventLogger() event.SnowflakeEventReceiver {
@ -16,67 +12,6 @@ func NewPTEventLogger() event.SnowflakeEventReceiver {
type ptEventLogger struct { type ptEventLogger struct {
} }
type logSeverity int
const (
Debug logSeverity = iota
Info
Notice
Warning
Error
)
func safePTLog(severity logSeverity, format string, a ...interface{}) {
var buff bytes.Buffer
scrubber := &safelog.LogScrubber{Output: &buff}
// make sure logString ends with exactly one "\n" so it's not stuck in scrubber.Write()'s internal buffer
logString := strings.TrimRight(fmt.Sprintf(format, a...), "\n") + "\n"
scrubber.Write([]byte(logString))
// remove newline before calling pt.Log because it adds a newline
msg := strings.TrimRight(buff.String(), "\n")
switch severity {
case Error:
pt.Log(pt.LogSeverityError, msg)
case Warning:
pt.Log(pt.LogSeverityWarning, msg)
case Notice:
pt.Log(pt.LogSeverityWarning, msg)
case Info:
pt.Log(pt.LogSeverityInfo, msg)
case Debug:
pt.Log(pt.LogSeverityDebug, msg)
default:
pt.Log(pt.LogSeverityNotice, msg)
}
}
func (p ptEventLogger) OnNewSnowflakeEvent(e event.SnowflakeEvent) { func (p ptEventLogger) OnNewSnowflakeEvent(e event.SnowflakeEvent) {
switch e.(type) { pt.Log(pt.LogSeverityNotice, e.String())
case event.EventOnOfferCreated:
e := e.(event.EventOnOfferCreated)
if e.Error != nil {
safePTLog(Notice, "offer creation failure %v", e.Error.Error())
} else {
safePTLog(Notice, "offer created")
}
case event.EventOnBrokerRendezvous:
e := e.(event.EventOnBrokerRendezvous)
if e.Error != nil {
safePTLog(Notice, "broker failure %v", e.Error.Error())
} else {
safePTLog(Notice, "broker rendezvous peer received")
}
case event.EventOnSnowflakeConnected:
safePTLog(Notice, "connected")
case event.EventOnSnowflakeConnectionFailed:
e := e.(event.EventOnSnowflakeConnectionFailed)
safePTLog(Notice, "trying a new proxy: %v", e.Error.Error())
}
} }

View file

@ -1,6 +1,11 @@
package event package event
import "github.com/pion/webrtc/v3" import (
"fmt"
"git.torproject.org/pluggable-transports/snowflake.git/v2/common/safelog"
"github.com/pion/webrtc/v3"
)
type SnowflakeEvent interface { type SnowflakeEvent interface {
IsSnowflakeEvent() IsSnowflakeEvent()
@ -13,27 +18,56 @@ type EventOnOfferCreated struct {
Error error Error error
} }
func (e EventOnOfferCreated) String() string {
if e.Error != nil {
scrubbed := safelog.Scrub([]byte(e.Error.Error()))
return fmt.Sprintf("offer creation failure %s", scrubbed)
}
return "offer created"
}
type EventOnBrokerRendezvous struct { type EventOnBrokerRendezvous struct {
SnowflakeEvent SnowflakeEvent
WebRTCRemoteDescription *webrtc.SessionDescription WebRTCRemoteDescription *webrtc.SessionDescription
Error error Error error
} }
func (e EventOnBrokerRendezvous) String() string {
if e.Error != nil {
scrubbed := safelog.Scrub([]byte(e.Error.Error()))
return fmt.Sprintf("broker failure %s", scrubbed)
}
return "broker rendezvous peer received"
}
type EventOnSnowflakeConnected struct { type EventOnSnowflakeConnected struct {
SnowflakeEvent SnowflakeEvent
} }
func (e EventOnSnowflakeConnected) String() string {
return "connected"
}
type EventOnSnowflakeConnectionFailed struct { type EventOnSnowflakeConnectionFailed struct {
SnowflakeEvent SnowflakeEvent
Error error Error error
} }
func (e EventOnSnowflakeConnectionFailed) String() string {
scrubbed := safelog.Scrub([]byte(e.Error.Error()))
return fmt.Sprintf("trying a new proxy: %s", scrubbed)
}
type EventOnProxyConnectionOver struct { type EventOnProxyConnectionOver struct {
SnowflakeEvent SnowflakeEvent
InboundTraffic int InboundTraffic int
OutboundTraffic int OutboundTraffic int
} }
func (e EventOnProxyConnectionOver) String() string {
return fmt.Sprintf("Proxy connection closed (↑ %d, ↓ %d)", e.InboundTraffic, e.OutboundTraffic)
}
type SnowflakeEventReceiver interface { type SnowflakeEventReceiver interface {
// OnNewSnowflakeEvent notify receiver about a new event // OnNewSnowflakeEvent notify receiver about a new event
// This method MUST not block // This method MUST not block

View file

@ -38,7 +38,7 @@ type LogScrubber struct {
func (ls *LogScrubber) Lock() { (*ls).lock.Lock() } func (ls *LogScrubber) Lock() { (*ls).lock.Lock() }
func (ls *LogScrubber) Unlock() { (*ls).lock.Unlock() } func (ls *LogScrubber) Unlock() { (*ls).lock.Unlock() }
func scrub(b []byte) []byte { func Scrub(b []byte) []byte {
scrubbedBytes := b scrubbedBytes := b
for _, pattern := range scrubberPatterns { for _, pattern := range scrubberPatterns {
// this is a workaround since go does not yet support look ahead or look // this is a workaround since go does not yet support look ahead or look
@ -62,7 +62,7 @@ func (ls *LogScrubber) Write(b []byte) (n int, err error) {
return return
} }
fullLines := ls.buffer[:i+1] fullLines := ls.buffer[:i+1]
_, err = ls.Output.Write(scrub(fullLines)) _, err = ls.Output.Write(Scrub(fullLines))
if err != nil { if err != nil {
return return
} }