Skip to content

Commit

Permalink
Remove metadata variables to context
Browse files Browse the repository at this point in the history
  • Loading branch information
jaksi committed Jul 10, 2021
1 parent 6281979 commit 8d4599c
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 69 deletions.
8 changes: 4 additions & 4 deletions auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
func (cfg *config) getAuthLogCallback() func(conn ssh.ConnMetadata, method string, err error) {
return func(conn ssh.ConnMetadata, method string, err error) {
if method == "none" {
connMetadata{conn, cfg}.logEvent(noAuthLog{authLog: authLog{
connContext{ConnMetadata: conn, cfg: cfg}.logEvent(noAuthLog{authLog: authLog{
User: conn.User(),
Accepted: err == nil,
}})
Expand All @@ -24,7 +24,7 @@ func (cfg *config) getPasswordCallback() func(conn ssh.ConnMetadata, password []
return nil
}
return func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
connMetadata{conn, cfg}.logEvent(passwordAuthLog{
connContext{ConnMetadata: conn, cfg: cfg}.logEvent(passwordAuthLog{
authLog: authLog{
User: conn.User(),
Accepted: authAccepted(cfg.Auth.PasswordAuth.Accepted),
Expand All @@ -43,7 +43,7 @@ func (cfg *config) getPublicKeyCallback() func(conn ssh.ConnMetadata, key ssh.Pu
return nil
}
return func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
connMetadata{conn, cfg}.logEvent(publicKeyAuthLog{
connContext{ConnMetadata: conn, cfg: cfg}.logEvent(publicKeyAuthLog{
authLog: authLog{
User: conn.User(),
Accepted: authAccepted(cfg.Auth.PublicKeyAuth.Accepted),
Expand Down Expand Up @@ -73,7 +73,7 @@ func (cfg *config) getKeyboardInteractiveCallback() func(conn ssh.ConnMetadata,
warningLogger.Printf("Failed to process keyboard interactive authentication: %v", err)
return nil, errors.New("")
}
connMetadata{conn, cfg}.logEvent(keyboardInteractiveAuthLog{
connContext{ConnMetadata: conn, cfg: cfg}.logEvent(keyboardInteractiveAuthLog{
authLog: authLog{
User: conn.User(),
Accepted: authAccepted(cfg.Auth.KeyboardInteractiveAuth.Accepted),
Expand Down
48 changes: 24 additions & 24 deletions auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,29 @@ import (
"testing"
)

type mockConnMetadata struct{}
type mockConnContext struct{}

func (metadata mockConnMetadata) User() string {
func (context mockConnContext) User() string {
return "root"
}

func (metadata mockConnMetadata) SessionID() []byte {
func (context mockConnContext) SessionID() []byte {
return []byte("somesession")
}

func (metadata mockConnMetadata) ClientVersion() []byte {
func (context mockConnContext) ClientVersion() []byte {
return []byte("SSH-2.0-testclient")
}

func (metadata mockConnMetadata) ServerVersion() []byte {
func (context mockConnContext) ServerVersion() []byte {
return []byte("SSH-2.0-testserver")
}

func (metadata mockConnMetadata) RemoteAddr() net.Addr {
func (context mockConnContext) RemoteAddr() net.Addr {
return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 1234}
}

func (metadata mockConnMetadata) LocalAddr() net.Addr {
func (context mockConnContext) LocalAddr() net.Addr {
return &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 2022}
}

Expand All @@ -38,7 +38,7 @@ func TestAuthLogUninteresting(t *testing.T) {
cfg.Auth.NoAuth = false
callback := cfg.getAuthLogCallback()
logBuffer := setupLogBuffer(t, cfg)
callback(mockConnMetadata{}, "password", nil)
callback(mockConnContext{}, "password", nil)
logs := logBuffer.String()
expectedLogs := ``
if logs != expectedLogs {
Expand All @@ -51,7 +51,7 @@ func TestNoAuthFail(t *testing.T) {
cfg.Auth.NoAuth = false
callback := cfg.getAuthLogCallback()
logBuffer := setupLogBuffer(t, cfg)
callback(mockConnMetadata{}, "none", errors.New(""))
callback(mockConnContext{}, "none", errors.New(""))
logs := logBuffer.String()
expectedLogs := `[127.0.0.1:1234] authentication for user "root" without credentials rejected
`
Expand All @@ -65,7 +65,7 @@ func TestNoAuthSuccess(t *testing.T) {
cfg.Auth.NoAuth = false
callback := cfg.getAuthLogCallback()
logBuffer := setupLogBuffer(t, cfg)
callback(mockConnMetadata{}, "none", nil)
callback(mockConnContext{}, "none", nil)
logs := logBuffer.String()
expectedLogs := `[127.0.0.1:1234] authentication for user "root" without credentials accepted
`
Expand All @@ -92,7 +92,7 @@ func TestPasswordFail(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, []byte("hunter2"))
permissions, err := callback(mockConnContext{}, []byte("hunter2"))
logs := logBuffer.String()
if err == nil {
t.Errorf("err=nil, want an error")
Expand All @@ -116,7 +116,7 @@ func TestPasswordSuccess(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, []byte("hunter2"))
permissions, err := callback(mockConnContext{}, []byte("hunter2"))
logs := logBuffer.String()
if err != nil {
t.Errorf("err=%v, want nil", err)
Expand All @@ -141,7 +141,7 @@ func TestPasswordFailJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, []byte("hunter2"))
permissions, err := callback(mockConnContext{}, []byte("hunter2"))
logs := logBuffer.String()
if err == nil {
t.Errorf("err=nil, want an error")
Expand All @@ -166,7 +166,7 @@ func TestPasswordSuccessJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, []byte("hunter2"))
permissions, err := callback(mockConnContext{}, []byte("hunter2"))
logs := logBuffer.String()
if err != nil {
t.Errorf("err=%v, want nil", err)
Expand Down Expand Up @@ -199,7 +199,7 @@ func TestPublicKeyFail(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, mockPublicKey{})
permissions, err := callback(mockConnContext{}, mockPublicKey{})
logs := logBuffer.String()
if err == nil {
t.Errorf("err=nil, want an error")
Expand All @@ -223,7 +223,7 @@ func TestPublicKeySuccess(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, mockPublicKey{})
permissions, err := callback(mockConnContext{}, mockPublicKey{})
logs := logBuffer.String()
if err != nil {
t.Errorf("err=%v, want nil", err)
Expand All @@ -248,7 +248,7 @@ func TestPublicKeyFailJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, mockPublicKey{})
permissions, err := callback(mockConnContext{}, mockPublicKey{})
logs := logBuffer.String()
if err == nil {
t.Errorf("err=nil, want an error")
Expand All @@ -273,7 +273,7 @@ func TestPublicKeySuccessJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, mockPublicKey{})
permissions, err := callback(mockConnContext{}, mockPublicKey{})
logs := logBuffer.String()
if err != nil {
t.Errorf("err=%v, want nil", err)
Expand Down Expand Up @@ -316,7 +316,7 @@ func TestKeyboardInteractiveError(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
permissions, err := callback(mockConnContext{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
if user != "root" {
t.Errorf("user=%v, want root", user)
}
Expand Down Expand Up @@ -358,7 +358,7 @@ func TestKeyboardInteractiveFail(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
permissions, err := callback(mockConnContext{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
return []string{"a1", "a2"}, nil
})
logs := logBuffer.String()
Expand Down Expand Up @@ -389,7 +389,7 @@ func TestKeyboardInteractiveSuccess(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
permissions, err := callback(mockConnContext{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
return []string{"a1", "a2"}, nil
})
logs := logBuffer.String()
Expand Down Expand Up @@ -421,7 +421,7 @@ func TestKeyboardInteractiveFailJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
permissions, err := callback(mockConnContext{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
return []string{"a1", "a2"}, nil
})
logs := logBuffer.String()
Expand Down Expand Up @@ -453,7 +453,7 @@ func TestKeyboardInteractiveSuccessJSON(t *testing.T) {
t.Fatalf("callback=nil, want a function")
}
logBuffer := setupLogBuffer(t, cfg)
permissions, err := callback(mockConnMetadata{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
permissions, err := callback(mockConnContext{}, func(user, instruction string, questions []string, echos []bool) (answers []string, err error) {
return []string{"a1", "a2"}, nil
})
logs := logBuffer.String()
Expand Down Expand Up @@ -486,7 +486,7 @@ func TestBanner(t *testing.T) {
if callback == nil {
t.Fatalf("callback=nil, want a function")
}
banner := callback(mockConnMetadata{})
banner := callback(mockConnContext{})
expectedBanner := "Lorem\r\nIpsum\r\nDolor\r\n\r\nSit Amet\r\n"
if banner != expectedBanner {
t.Errorf("banner=%v, want %v", banner, expectedBanner)
Expand Down
18 changes: 9 additions & 9 deletions connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ import (
"golang.org/x/crypto/ssh"
)

type connMetadata struct {
type connContext struct {
ssh.ConnMetadata
cfg *config
}

type channelMetadata struct {
connMetadata
type channelContext struct {
connContext
channelID int
}

var channelHandlers = map[string]func(newChannel ssh.NewChannel, metadata channelMetadata) error{
var channelHandlers = map[string]func(newChannel ssh.NewChannel, context channelContext) error{
"session": handleSessionChannel,
"direct-tcpip": handleDirectTCPIPChannel,
}
Expand All @@ -29,16 +29,16 @@ func handleConnection(conn net.Conn, cfg *config) {
return
}
channelsDone := []chan interface{}{}
metadata := connMetadata{serverConn, cfg}
context := connContext{ConnMetadata: serverConn, cfg: cfg}
defer func() {
serverConn.Close()
for _, channelDone := range channelsDone {
<-channelDone
}
metadata.logEvent(connectionCloseLog{})
context.logEvent(connectionCloseLog{})
}()

metadata.logEvent(connectionLog{
context.logEvent(connectionLog{
ClientVersion: string(serverConn.ClientVersion()),
})

Expand All @@ -49,7 +49,7 @@ func handleConnection(conn net.Conn, cfg *config) {

go func() {
for request := range requests {
if err := handleGlobalRequest(request, metadata); err != nil {
if err := handleGlobalRequest(request, context); err != nil {
warningLogger.Printf("Failed to handle global request: %v", err)
serverConn.Close()
}
Expand All @@ -72,7 +72,7 @@ func handleConnection(conn net.Conn, cfg *config) {
channelDone := make(chan interface{})
channelsDone = append(channelsDone, channelDone)
defer func() { channelDone <- nil }()
if err := handler(newChannel, channelMetadata{metadata, channelID}); err != nil {
if err := handler(newChannel, channelContext{context, channelID}); err != nil {
warningLogger.Printf("Failed to handle new channel: %v", err)
serverConn.Close()
}
Expand Down
12 changes: 6 additions & 6 deletions logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,22 +287,22 @@ func (entry windowChangeLog) eventType() string {
return "window_change"
}

func (metadata connMetadata) logEvent(entry logEntry) {
if metadata.cfg.Logging.JSON {
func (context connContext) logEvent(entry logEntry) {
if context.cfg.Logging.JSON {
var jsonEntry interface{}
if metadata.cfg.Logging.Timestamps {
if context.cfg.Logging.Timestamps {
jsonEntry = struct {
Time string `json:"time"`
Source string `json:"source"`
EventType string `json:"event_type"`
Event logEntry `json:"event"`
}{time.Now().Format(time.RFC3339), metadata.RemoteAddr().String(), entry.eventType(), entry}
}{time.Now().Format(time.RFC3339), context.RemoteAddr().String(), entry.eventType(), entry}
} else {
jsonEntry = struct {
Source string `json:"source"`
EventType string `json:"event_type"`
Event logEntry `json:"event"`
}{metadata.RemoteAddr().String(), entry.eventType(), entry}
}{context.RemoteAddr().String(), entry.eventType(), entry}
}
logBytes, err := json.Marshal(jsonEntry)
if err != nil {
Expand All @@ -311,6 +311,6 @@ func (metadata connMetadata) logEvent(entry logEntry) {
}
log.Print(string(logBytes))
} else {
log.Printf("[%v] %v", metadata.RemoteAddr().String(), entry)
log.Printf("[%v] %v", context.RemoteAddr().String(), entry)
}
}
8 changes: 4 additions & 4 deletions logging_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestPlainWithTimestamps(t *testing.T) {
},
}
logBuffer := setupLogBuffer(t, cfg)
connMetadata{mockConnMetadata{}, cfg}.logEvent(mockLogEntry{"lorem"})
connContext{ConnMetadata: mockConnContext{}, cfg: cfg}.logEvent(mockLogEntry{"lorem"})
logs := logBuffer.String()
expectedLogs := regexp.MustCompile(`^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} \[127\.0\.0\.1:1234\] test lorem
$`)
Expand All @@ -43,7 +43,7 @@ func TestJSONWithTimestamps(t *testing.T) {
},
}
logBuffer := setupLogBuffer(t, cfg)
connMetadata{mockConnMetadata{}, cfg}.logEvent(mockLogEntry{"ipsum"})
connContext{ConnMetadata: mockConnContext{}, cfg: cfg}.logEvent(mockLogEntry{"ipsum"})
logs := logBuffer.String()
expectedLogs := regexp.MustCompile(`^{"time":"[^"]+","source":"127\.0\.0\.1:1234","event_type":"test","event":{"content":"ipsum"}}
$`)
Expand All @@ -60,7 +60,7 @@ func TestPlainWithoutTimestamps(t *testing.T) {
},
}
logBuffer := setupLogBuffer(t, cfg)
connMetadata{mockConnMetadata{}, cfg}.logEvent(mockLogEntry{"dolor"})
connContext{ConnMetadata: mockConnContext{}, cfg: cfg}.logEvent(mockLogEntry{"dolor"})
logs := logBuffer.String()
expectedLogs := `[127.0.0.1:1234] test dolor
`
Expand All @@ -77,7 +77,7 @@ func TestJSONWithoutTimestamps(t *testing.T) {
},
}
logBuffer := setupLogBuffer(t, cfg)
connMetadata{mockConnMetadata{}, cfg}.logEvent(mockLogEntry{"sit"})
connContext{ConnMetadata: mockConnContext{}, cfg: cfg}.logEvent(mockLogEntry{"sit"})
logs := logBuffer.String()
expectedLogs := `{"source":"127.0.0.1:1234","event_type":"test","event":{"content":"sit"}}
`
Expand Down
4 changes: 2 additions & 2 deletions request.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ var globalRequestPayloads = map[string]globalRequestPayloadParser{
},
}

func handleGlobalRequest(request *ssh.Request, metadata connMetadata) error {
func handleGlobalRequest(request *ssh.Request, context connContext) error {
parser := globalRequestPayloads[request.Type]
if parser == nil {
warningLogger.Printf("Unsupported global request type %v", request.Type)
Expand All @@ -107,7 +107,7 @@ func handleGlobalRequest(request *ssh.Request, metadata connMetadata) error {
return err
}
}
metadata.logEvent(payload.logEntry())
context.logEvent(payload.logEntry())
return nil
}

Expand Down
Loading

0 comments on commit 8d4599c

Please sign in to comment.