From a7bd17c605e79446d8bf02e474c91986c615b36a Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 17 Aug 2025 13:31:41 +0800 Subject: Linting --- forged/.golangci.yaml | 1 + forged/internal/incoming/hooks/hooks.go | 5 ++- forged/internal/incoming/lmtp/config.go | 73 -------------------------------- forged/internal/incoming/lmtp/lmtp.go | 75 +++++++++++++++++++++++++++++++++ forged/internal/incoming/ssh/ssh.go | 18 +++++--- forged/internal/incoming/web/web.go | 22 +++++----- forged/internal/server/server.go | 12 ++++-- 7 files changed, 113 insertions(+), 93 deletions(-) delete mode 100644 forged/internal/incoming/lmtp/config.go create mode 100644 forged/internal/incoming/lmtp/lmtp.go (limited to 'forged') diff --git a/forged/.golangci.yaml b/forged/.golangci.yaml index 1cf650d..7d93d90 100644 --- a/forged/.golangci.yaml +++ b/forged/.golangci.yaml @@ -18,6 +18,7 @@ linters: - lll - mnd # tmp - revive # tmp + - godox # tmp linters-settings: revive: diff --git a/forged/internal/incoming/hooks/hooks.go b/forged/internal/incoming/hooks/hooks.go index 52ccb0f..65277d4 100644 --- a/forged/internal/incoming/hooks/hooks.go +++ b/forged/internal/incoming/hooks/hooks.go @@ -40,6 +40,7 @@ func New(config Config) (server *Server) { return &Server{ socketPath: config.Socket, executablesPath: config.Execs, + hookMap: cmap.Map[string, hookInfo]{}, } } @@ -71,7 +72,9 @@ func (server *Server) Run(ctx context.Context) error { } func (server *Server) handleConn(ctx context.Context, conn net.Conn) { - defer conn.Close() + defer func() { + _ = conn.Close() + }() unblock := context.AfterFunc(ctx, func() { _ = conn.SetDeadline(time.Now()) _ = conn.Close() diff --git a/forged/internal/incoming/lmtp/config.go b/forged/internal/incoming/lmtp/config.go deleted file mode 100644 index def3ce9..0000000 --- a/forged/internal/incoming/lmtp/config.go +++ /dev/null @@ -1,73 +0,0 @@ -package lmtp - -import ( - "context" - "errors" - "fmt" - "net" - "time" - - "go.lindenii.runxiyu.org/forge/forged/internal/common/misc" -) - -type Server struct { - socket string - domain string - maxSize int64 - writeTimeout uint32 - readTimeout uint32 -} - -type Config struct { - Socket string `scfg:"socket"` - Domain string `scfg:"domain"` - MaxSize int64 `scfg:"max_size"` - WriteTimeout uint32 `scfg:"write_timeout"` - ReadTimeout uint32 `scfg:"read_timeout"` -} - -func New(config Config) (server *Server) { - return &Server{ - socket: config.Socket, - domain: config.Domain, - maxSize: config.MaxSize, - writeTimeout: config.WriteTimeout, - readTimeout: config.ReadTimeout, - } -} - -func (server *Server) Run(ctx context.Context) error { - listener, _, err := misc.ListenUnixSocket(server.socket) - if err != nil { - return fmt.Errorf("listen unix socket for LMTP: %w", err) - } - defer func() { - _ = listener.Close() - }() - - stop := context.AfterFunc(ctx, func() { - _ = listener.Close() - }) - defer stop() - - for { - conn, err := listener.Accept() - if err != nil { - if errors.Is(err, net.ErrClosed) || ctx.Err() != nil { - return nil - } - return fmt.Errorf("accept conn: %w", err) - } - - go server.handleConn(ctx, conn) - } -} - -func (server *Server) handleConn(ctx context.Context, conn net.Conn) { - defer conn.Close() - unblock := context.AfterFunc(ctx, func() { - _ = conn.SetDeadline(time.Now()) - _ = conn.Close() - }) - defer unblock() -} diff --git a/forged/internal/incoming/lmtp/lmtp.go b/forged/internal/incoming/lmtp/lmtp.go new file mode 100644 index 0000000..cf5618c --- /dev/null +++ b/forged/internal/incoming/lmtp/lmtp.go @@ -0,0 +1,75 @@ +package lmtp + +import ( + "context" + "errors" + "fmt" + "net" + "time" + + "go.lindenii.runxiyu.org/forge/forged/internal/common/misc" +) + +type Server struct { + socket string + domain string + maxSize int64 + writeTimeout uint32 + readTimeout uint32 +} + +type Config struct { + Socket string `scfg:"socket"` + Domain string `scfg:"domain"` + MaxSize int64 `scfg:"max_size"` + WriteTimeout uint32 `scfg:"write_timeout"` + ReadTimeout uint32 `scfg:"read_timeout"` +} + +func New(config Config) (server *Server) { + return &Server{ + socket: config.Socket, + domain: config.Domain, + maxSize: config.MaxSize, + writeTimeout: config.WriteTimeout, + readTimeout: config.ReadTimeout, + } +} + +func (server *Server) Run(ctx context.Context) error { + listener, _, err := misc.ListenUnixSocket(server.socket) + if err != nil { + return fmt.Errorf("listen unix socket for LMTP: %w", err) + } + defer func() { + _ = listener.Close() + }() + + stop := context.AfterFunc(ctx, func() { + _ = listener.Close() + }) + defer stop() + + for { + conn, err := listener.Accept() + if err != nil { + if errors.Is(err, net.ErrClosed) || ctx.Err() != nil { + return nil + } + return fmt.Errorf("accept conn: %w", err) + } + + go server.handleConn(ctx, conn) + } +} + +func (server *Server) handleConn(ctx context.Context, conn net.Conn) { + defer func() { + _ = conn.Close() + }() + unblock := context.AfterFunc(ctx, func() { + _ = conn.SetDeadline(time.Now()) + _ = conn.Close() + }) + defer unblock() +} diff --git a/forged/internal/incoming/ssh/ssh.go b/forged/internal/incoming/ssh/ssh.go index 0c722c0..e551863 100644 --- a/forged/internal/incoming/ssh/ssh.go +++ b/forged/internal/incoming/ssh/ssh.go @@ -37,15 +37,20 @@ func New(config Config) (server *Server, err error) { addr: config.Addr, root: config.Root, shutdownTimeout: config.ShutdownTimeout, - } + } //exhaustruct:ignore var privkeyBytes []byte - if privkeyBytes, err = os.ReadFile(config.Key); err != nil { + + privkeyBytes, err = os.ReadFile(config.Key) + if err != nil { return server, fmt.Errorf("read SSH private key: %w", err) } - if server.privkey, err = gossh.ParsePrivateKey(privkeyBytes); err != nil { + + server.privkey, err = gossh.ParsePrivateKey(privkeyBytes) + if err != nil { return server, fmt.Errorf("parse SSH private key: %w", err) } + server.pubkeyString = misc.BytesToString(gossh.MarshalAuthorizedKey(server.privkey.PublicKey())) server.pubkeyFP = gossh.FingerprintSHA256(server.privkey.PublicKey()) @@ -53,10 +58,10 @@ func New(config Config) (server *Server, err error) { Handler: handle, PublicKeyHandler: func(ctx gliderssh.Context, key gliderssh.PublicKey) bool { return true }, KeyboardInteractiveHandler: func(ctx gliderssh.Context, challenge gossh.KeyboardInteractiveChallenge) bool { return true }, - } + } //exhaustruct:ignore server.gliderServer.AddHostKey(server.privkey) - return + return server, nil } func (server *Server) Run(ctx context.Context) (err error) { @@ -76,7 +81,8 @@ func (server *Server) Run(ctx context.Context) (err error) { }) defer stop() - if err = server.gliderServer.Serve(listener); err != nil { + err = server.gliderServer.Serve(listener) + if err != nil { if errors.Is(err, gliderssh.ErrServerClosed) || ctx.Err() != nil { return nil } diff --git a/forged/internal/incoming/web/web.go b/forged/internal/incoming/web/web.go index dc2d9b4..fb5bedc 100644 --- a/forged/internal/incoming/web/web.go +++ b/forged/internal/incoming/web/web.go @@ -2,6 +2,7 @@ package web import ( "context" + "errors" "fmt" "net" "net/http" @@ -37,19 +38,19 @@ type Config struct { } func New(config Config) (server *Server) { - handler := &handler{} + httpServer := &http.Server{ + Handler: &handler{}, + ReadTimeout: time.Duration(config.ReadTimeout) * time.Second, + WriteTimeout: time.Duration(config.WriteTimeout) * time.Second, + IdleTimeout: time.Duration(config.IdleTimeout) * time.Second, + MaxHeaderBytes: config.MaxHeaderBytes, + } //exhaustruct:ignore return &Server{ net: config.Net, addr: config.Addr, root: config.Root, shutdownTimeout: config.ShutdownTimeout, - httpServer: &http.Server{ - Handler: handler, - ReadTimeout: time.Duration(config.ReadTimeout) * time.Second, - WriteTimeout: time.Duration(config.WriteTimeout) * time.Second, - IdleTimeout: time.Duration(config.IdleTimeout) * time.Second, - MaxHeaderBytes: config.MaxHeaderBytes, - }, + httpServer: httpServer, } } @@ -72,8 +73,9 @@ func (server *Server) Run(ctx context.Context) (err error) { }) defer stop() - if err = server.httpServer.Serve(listener); err != nil { - if err == http.ErrServerClosed || ctx.Err() != nil { + err = server.httpServer.Serve(listener) + if err != nil { + if errors.Is(err, http.ErrServerClosed) || ctx.Err() != nil { return nil } return fmt.Errorf("serve web: %w", err) diff --git a/forged/internal/server/server.go b/forged/internal/server/server.go index ab677e0..86332a7 100644 --- a/forged/internal/server/server.go +++ b/forged/internal/server/server.go @@ -30,7 +30,7 @@ type Server struct { } func New(configPath string) (server *Server, err error) { - server = &Server{} + server = &Server{} //exhaustruct:ignore server.config, err = config.Open(configPath) if err != nil { @@ -65,9 +65,15 @@ func (server *Server) Run(ctx context.Context) (err error) { g.Go(func() error { return server.webServer.Run(gctx) }) g.Go(func() error { return server.sshServer.Run(gctx) }) - if err := g.Wait(); err != nil { + err = g.Wait() + if err != nil { return fmt.Errorf("server error: %w", err) } - return ctx.Err() + err = ctx.Err() + if err != nil { + return fmt.Errorf("context exceeded: %w", err) + } + + return nil } -- cgit v1.2.3