mirror of
https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.git
synced 2025-10-14 05:11:19 -04:00
Implement String() method on events
To make it safe for logging safelog.Scrub function is now public. Closes: #40141
This commit is contained in:
parent
9757784c5a
commit
1d592b06e5
3 changed files with 38 additions and 69 deletions
|
@ -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())
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue