Update golangci-lint

This commit is contained in:
Antonio Mika
2025-05-24 17:06:40 -04:00
parent 9fd9b0b089
commit 47a56f6844
12 changed files with 235 additions and 54 deletions

View File

@@ -34,10 +34,9 @@ jobs:
- name: Checkout repo - name: Checkout repo
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Lint the codebase - name: Lint the codebase
uses: golangci/golangci-lint-action@v3 uses: golangci/golangci-lint-action@v8
with: with:
version: latest version: latest
args: -E goimports -E godot
- name: Run tests - name: Run tests
run: | run: |
go test -v ./... -cover -race -coverprofile=coverage.out go test -v ./... -cover -race -coverprofile=coverage.out

9
.golangci.yml Normal file
View File

@@ -0,0 +1,9 @@
version: "2"
linters:
enable:
- godot
formatters:
enable:
- goimports

View File

@@ -459,7 +459,12 @@ func Start(state *utils.State) {
state.TCPListeners.Store(httpsServer.Addr, tH) state.TCPListeners.Store(httpsServer.Addr, tH)
} }
defer httpsListener.Close() defer func() {
err := httpsListener.Close()
if err != nil {
log.Println("Error closing https listener:", err)
}
}()
log.Fatal(httpsServer.ServeTLS(httpsListener, "", "")) log.Fatal(httpsServer.ServeTLS(httpsListener, "", ""))
}() }()
@@ -491,7 +496,12 @@ func Start(state *utils.State) {
httpListener = l httpListener = l
} }
defer httpListener.Close() defer func() {
err := httpListener.Close()
if err != nil {
log.Println("Error closing http listener:", err)
}
}()
log.Fatal(httpServer.Serve(httpListener)) log.Fatal(httpServer.Serve(httpListener))
} }

View File

@@ -26,7 +26,15 @@ func (pL *proxyListener) Accept() (net.Conn, error) {
clientRemote, _, err := net.SplitHostPort(cl.RemoteAddr().String()) clientRemote, _, err := net.SplitHostPort(cl.RemoteAddr().String())
if err != nil || pL.State.IPFilter.Blocked(clientRemote) { if err != nil || pL.State.IPFilter.Blocked(clientRemote) {
cl.Close() err := cl.Close()
if err != nil {
log.Println("Error closing connection:", err)
}
if viper.GetBool("debug") {
log.Printf("Blocked connection from %s to %s", cl.RemoteAddr().String(), cl.LocalAddr().String())
}
return pL.Accept() return pL.Accept()
} }
@@ -58,14 +66,24 @@ func (pL *proxyListener) Accept() (net.Conn, error) {
connectionLocation, err := balancer.NextServer() connectionLocation, err := balancer.NextServer()
if err != nil { if err != nil {
log.Println("Unable to load connection location:", err) log.Println("Unable to load connection location:", err)
teeConn.Close()
err := teeConn.Close()
if err != nil {
log.Println("Error closing teeConn:", err)
}
return pL.Accept() return pL.Accept()
} }
host, err := base64.StdEncoding.DecodeString(connectionLocation.Host) host, err := base64.StdEncoding.DecodeString(connectionLocation.Host)
if err != nil { if err != nil {
log.Println("Unable to decode connection location:", err) log.Println("Unable to decode connection location:", err)
teeConn.Close()
err := teeConn.Close()
if err != nil {
log.Println("Error closing teeConn:", err)
}
return pL.Accept() return pL.Accept()
} }
@@ -93,7 +111,12 @@ func (pL *proxyListener) Accept() (net.Conn, error) {
conn, err := net.Dial("unix", hostAddr) conn, err := net.Dial("unix", hostAddr)
if err != nil { if err != nil {
log.Println("Error connecting to tcp balancer:", err) log.Println("Error connecting to tcp balancer:", err)
teeConn.Close()
err := teeConn.Close()
if err != nil {
log.Println("Error closing teeConn:", err)
}
return pL.Accept() return pL.Accept()
} }

View File

@@ -421,14 +421,14 @@ func getProxyProtoVersion(proxyProtoUserVersion string) byte {
proxyProtoUserVersion = viper.GetString("proxy-protocol-version") proxyProtoUserVersion = viper.GetString("proxy-protocol-version")
} }
realProtoVersion := 0 switch proxyProtoUserVersion {
if proxyProtoUserVersion == "1" { case "1":
realProtoVersion = 1 return 1
} else if proxyProtoUserVersion == "2" { case "2":
realProtoVersion = 2 return 2
default:
return 0
} }
return byte(realProtoVersion)
} }
// parseDeadline parses the deadline string provided by the client to a time object. // parseDeadline parses the deadline string provided by the client to a time object.

View File

@@ -66,7 +66,12 @@ func handleCancelRemoteForward(newRequest *ssh.Request, sshConn *utils.SSHConnec
if holder.OriginalAddr == check.Addr && holder.OriginalPort == check.Rport { if holder.OriginalAddr == check.Addr && holder.OriginalPort == check.Rport {
closed = true closed = true
holder.Close()
err := holder.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
return false return false
} }
@@ -174,8 +179,16 @@ func handleRemoteForward(newRequest *ssh.Request, sshConn *utils.SSHConnection,
} }
return return
} }
tmpfile.Close()
os.Remove(tmpfile.Name()) err = tmpfile.Close()
if err != nil {
log.Println("Error closing temporary file:", err)
}
err = os.Remove(tmpfile.Name())
if err != nil {
log.Println("Error removing temporary file:", err)
}
listenAddr := tmpfile.Name() listenAddr := tmpfile.Name()
@@ -205,10 +218,19 @@ func handleRemoteForward(newRequest *ssh.Request, sshConn *utils.SSHConnection,
deferHandler := func() {} deferHandler := func() {}
cleanupChanListener := func() { cleanupChanListener := func() {
listenerHolder.Close() err := listenerHolder.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
state.Listeners.Delete(listenAddr) state.Listeners.Delete(listenAddr)
sshConn.Listeners.Delete(listenAddr) sshConn.Listeners.Delete(listenAddr)
os.Remove(listenAddr)
err = os.Remove(listenAddr)
if err != nil {
log.Println("Error removing unix socket:", err)
}
deferHandler() deferHandler()
} }
@@ -334,7 +356,11 @@ func handleRemoteForward(newRequest *ssh.Request, sshConn *utils.SSHConnection,
}) })
if balancers == 0 { if balancers == 0 {
tH.Listener.Close() err := tH.Listener.Close()
if err != nil {
log.Println("Error closing TCPListener:", err)
}
state.Listeners.Delete(tcpAddr) state.Listeners.Delete(tcpAddr)
state.TCPListeners.Delete(tcpAddr) state.TCPListeners.Delete(tcpAddr)
} }
@@ -373,7 +399,11 @@ func handleRemoteForward(newRequest *ssh.Request, sshConn *utils.SSHConnection,
newChan, newReqs, err := sshConn.SSHConn.OpenChannel("forwarded-tcpip", ssh.Marshal(resp)) newChan, newReqs, err := sshConn.SSHConn.OpenChannel("forwarded-tcpip", ssh.Marshal(resp))
if err != nil { if err != nil {
sshConn.SendMessage(err.Error(), true) sshConn.SendMessage(err.Error(), true)
cl.Close()
err := cl.Close()
if err != nil {
log.Println("Error closing client connection:", err)
}
} }
if sshConn.ProxyProto != 0 && listenerType == utils.TCPListener { if sshConn.ProxyProto != 0 && listenerType == utils.TCPListener {

View File

@@ -182,7 +182,11 @@ func Start() {
state.Listeners.Store(viper.GetString("ssh-address"), listener) state.Listeners.Store(viper.GetString("ssh-address"), listener)
defer func() { defer func() {
listener.Close() err := listener.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
state.Listeners.Delete(viper.GetString("ssh-address")) state.Listeners.Delete(viper.GetString("ssh-address"))
}() }()
@@ -205,7 +209,15 @@ func Start() {
clientRemote, _, err := net.SplitHostPort(conn.RemoteAddr().String()) clientRemote, _, err := net.SplitHostPort(conn.RemoteAddr().String())
if err != nil || state.IPFilter.Blocked(clientRemote) { if err != nil || state.IPFilter.Blocked(clientRemote) {
conn.Close() err := conn.Close()
if err != nil {
log.Println("Error closing connection:", err)
}
if viper.GetBool("debug") {
log.Printf("Blocked connection from %s to %s", conn.RemoteAddr().String(), conn.LocalAddr().String())
}
return return
} }
@@ -220,7 +232,10 @@ func Start() {
<-time.After(viper.GetDuration("cleanup-unauthed-timeout")) <-time.After(viper.GetDuration("cleanup-unauthed-timeout"))
clientLoggedInMutex.Lock() clientLoggedInMutex.Lock()
if !clientLoggedIn { if !clientLoggedIn {
conn.Close() err := conn.Close()
if err != nil {
log.Println("Error closing connection:", err)
}
} }
clientLoggedInMutex.Unlock() clientLoggedInMutex.Unlock()
}() }()
@@ -233,8 +248,12 @@ func Start() {
clientLoggedIn = true clientLoggedIn = true
clientLoggedInMutex.Unlock() clientLoggedInMutex.Unlock()
if err != nil { if err != nil {
conn.Close() err := conn.Close()
log.Println(err) if err != nil {
log.Println("Error closing connection:", err)
}
log.Println("SSH connection could not be established", err)
return return
} }

View File

@@ -92,7 +92,13 @@ func HandleSSHConn(sshListener net.Listener, successAuth *chan bool) {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
defer conn.Close()
defer func() {
err := conn.Close()
if err != nil {
log.Print("Error closing connection", err)
}
}()
// GetSSHConfig is the method we are testing to validate that it // GetSSHConfig is the method we are testing to validate that it
// can use an http request to validate client public key auth // can use an http request to validate client public key auth
@@ -102,7 +108,11 @@ func HandleSSHConn(sshListener net.Listener, successAuth *chan bool) {
*successAuth <- false *successAuth <- false
return return
} }
connection.Close()
err = connection.Close()
if err != nil {
log.Print("Error closing connection", err)
}
*successAuth <- true *successAuth <- true
} }
@@ -117,7 +127,14 @@ func TestAuthenticationKeyRequest(t *testing.T) {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
defer os.RemoveAll(dir)
defer func() {
err := os.RemoveAll(dir)
if err != nil {
t.Error(err)
}
}()
viper.Set("private-keys-directory", dir) viper.Set("private-keys-directory", dir)
viper.Set("authentication", true) viper.Set("authentication", true)
@@ -193,7 +210,12 @@ func TestAuthenticationKeyRequest(t *testing.T) {
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
defer sshListener.Close() defer func() {
err := sshListener.Close()
if err != nil {
t.Error(err)
}
}()
successAuth := make(chan bool) successAuth := make(chan bool)
go HandleSSHConn(sshListener, &successAuth) go HandleSSHConn(sshListener, &successAuth)
@@ -217,7 +239,10 @@ func TestAuthenticationKeyRequest(t *testing.T) {
t.Log("ssh client rejected", err) t.Log("ssh client rejected", err)
} else { } else {
t.Log("ssh client connected") t.Log("ssh client connected")
client.Close() err := client.Close()
if err != nil {
t.Error(err)
}
} }
didAuth := <-successAuth didAuth := <-successAuth

View File

@@ -82,7 +82,12 @@ func (s *SSHConnection) ListenerCount() int {
func (s *SSHConnection) CleanUp(state *State) { func (s *SSHConnection) CleanUp(state *State) {
s.Closed.Do(func() { s.Closed.Do(func() {
close(s.Close) close(s.Close)
s.SSHConn.Close()
err := s.SSHConn.Close()
if err != nil {
log.Println("Error closing SSH connection:", err)
}
state.SSHConnections.Delete(s.SSHConn.RemoteAddr().String()) state.SSHConnections.Delete(s.SSHConn.RemoteAddr().String())
log.Println("Closed SSH connection for:", s.SSHConn.RemoteAddr().String(), "user:", s.SSHConn.User()) log.Println("Closed SSH connection for:", s.SSHConn.RemoteAddr().String(), "user:", s.SSHConn.User())
}) })
@@ -208,8 +213,15 @@ func (i IdleTimeoutConn) Write(buf []byte) (int, error) {
// CopyBoth copies betwen a reader and writer and will cleanup each. // CopyBoth copies betwen a reader and writer and will cleanup each.
func CopyBoth(writer net.Conn, reader io.ReadWriteCloser) { func CopyBoth(writer net.Conn, reader io.ReadWriteCloser) {
closeBoth := func() { closeBoth := func() {
reader.Close() err := reader.Close()
writer.Close() if err != nil {
log.Println("Error closing reader:", err)
}
err = writer.Close()
if err != nil {
log.Println("Error closing writer:", err)
}
} }
var tcon io.ReadWriter var tcon io.ReadWriter

View File

@@ -169,7 +169,10 @@ func (c *WebConsole) HandleDisconnectRoute(proxyUrl string, g *gin.Context) {
listener, ok := listenerTmp.(*ListenerHolder) listener, ok := listenerTmp.(*ListenerHolder)
if ok { if ok {
listener.Close() err := listener.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
} }
} }
@@ -194,12 +197,7 @@ func (c *WebConsole) HandleClients(proxyUrl string, g *gin.Context) {
routeListeners := map[string]map[string]any{} routeListeners := map[string]map[string]any{}
sshConn.Listeners.Range(func(name string, val net.Listener) bool { sshConn.Listeners.Range(func(name string, val net.Listener) bool {
ok := true if name != "" {
if name == "" {
ok = false
}
if ok {
listeners = append(listeners, name) listeners = append(listeners, name)
} }
@@ -347,7 +345,10 @@ func (c *WebConsole) RemoveRoute(route string) {
} }
for _, client := range clients { for _, client := range clients {
client.Conn.Close() err := client.Conn.Close()
if err != nil {
log.Println("Error closing websocket connection:", err)
}
} }
c.Clients.Delete(route) c.Clients.Delete(route)
@@ -407,7 +408,11 @@ func (c *WebConsole) BroadcastRoute(route string, message []byte) {
// Handle is the only place socket reads and writes happen. // Handle is the only place socket reads and writes happen.
func (c *WebClient) Handle() { func (c *WebClient) Handle() {
defer func() { defer func() {
c.Conn.Close() err := c.Conn.Close()
if err != nil {
log.Println("Error closing websocket connection:", err)
}
c.Console.RemoveClient(c.Route, c) c.Console.RemoveClient(c.Route, c)
}() }()

View File

@@ -92,7 +92,15 @@ func (tH *TCPHolder) Handle(state *State) {
clientRemote, _, err := net.SplitHostPort(cl.RemoteAddr().String()) clientRemote, _, err := net.SplitHostPort(cl.RemoteAddr().String())
if err != nil || state.IPFilter.Blocked(clientRemote) { if err != nil || state.IPFilter.Blocked(clientRemote) {
cl.Close() err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
if viper.GetBool("debug") {
log.Printf("Blocked connection from %s to %s", cl.RemoteAddr().String(), cl.LocalAddr().String())
}
return return
} }
@@ -103,7 +111,12 @@ func (tH *TCPHolder) Handle(state *State) {
tlsHello, teeConn, err := PeekTLSHello(cl) tlsHello, teeConn, err := PeekTLSHello(cl)
if tlsHello == nil { if tlsHello == nil {
log.Printf("Unable to read TLS hello: %s", err) log.Printf("Unable to read TLS hello: %s", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
@@ -112,7 +125,12 @@ func (tH *TCPHolder) Handle(state *State) {
_, err = io.ReadFull(teeConn, bufBytes) _, err = io.ReadFull(teeConn, bufBytes)
if err != nil { if err != nil {
log.Printf("Unable to read buffered data: %s", err) log.Printf("Unable to read buffered data: %s", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
@@ -131,7 +149,12 @@ func (tH *TCPHolder) Handle(state *State) {
if pB == nil { if pB == nil {
log.Printf("Unable to load connection location: %s not found on TCP listener %s", balancerName, tH.TCPHost) log.Printf("Unable to load connection location: %s not found on TCP listener %s", balancerName, tH.TCPHost)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
} }
@@ -141,14 +164,24 @@ func (tH *TCPHolder) Handle(state *State) {
connectionLocation, err := balancer.NextServer() connectionLocation, err := balancer.NextServer()
if err != nil { if err != nil {
log.Println("Unable to load connection location:", err) log.Println("Unable to load connection location:", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
host, err := base64.StdEncoding.DecodeString(connectionLocation.Host) host, err := base64.StdEncoding.DecodeString(connectionLocation.Host)
if err != nil { if err != nil {
log.Println("Unable to decode connection location:", err) log.Println("Unable to decode connection location:", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
@@ -176,7 +209,12 @@ func (tH *TCPHolder) Handle(state *State) {
conn, err := net.Dial("unix", hostAddr) conn, err := net.Dial("unix", hostAddr)
if err != nil { if err != nil {
log.Println("Error connecting to tcp balancer:", err) log.Println("Error connecting to tcp balancer:", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
@@ -184,7 +222,12 @@ func (tH *TCPHolder) Handle(state *State) {
_, err := conn.Write(bufBytes) _, err := conn.Write(bufBytes)
if err != nil { if err != nil {
log.Println("Unable to write to conn:", err) log.Println("Unable to write to conn:", err)
cl.Close()
err := cl.Close()
if err != nil {
log.Printf("Unable to close connection: %s", err)
}
return return
} }
} }

View File

@@ -176,7 +176,10 @@ func GetRandomPortInRange(listenAddr string, portRange string) uint32 {
return GetRandomPortInRange(listenAddr, portRange) return GetRandomPortInRange(listenAddr, portRange)
} }
ln.Close() err = ln.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
return bindPort return bindPort
} }
@@ -742,7 +745,10 @@ func GetOpenPort(addr string, port uint32, state *State, sshConn *SSHConnection,
if listenErr != nil { if listenErr != nil {
err = listenErr err = listenErr
} else { } else {
ln.Close() err := ln.Close()
if err != nil {
log.Println("Error closing listener:", err)
}
} }
} }