diff --git a/backend/internal/bootstrap/router_bootstrap.go b/backend/internal/bootstrap/router_bootstrap.go index cc9e3a91..caeceb1a 100644 --- a/backend/internal/bootstrap/router_bootstrap.go +++ b/backend/internal/bootstrap/router_bootstrap.go @@ -9,13 +9,11 @@ import ( "net" "net/http" "os" - "strconv" "strings" "sync" "sync/atomic" "time" - "github.com/coreos/go-systemd/activation" "github.com/fsnotify/fsnotify" sloggin "github.com/gin-contrib/slog" "github.com/gin-gonic/gin" @@ -211,64 +209,6 @@ func initServerProtocols() (*http.Protocols, *tls.Config, *tlsCertProvider, erro return protocols, tlsConfig, certProvider, nil } -type socket struct { - addr string - listener net.Listener -} - -func systemdSocket() (*socket, error) { - listeners, err := activation.Listeners() - if err != nil { - return nil, fmt.Errorf("failed to receive socket from systemd: %w", err) - } - - if len(listeners) == 0 { - return nil, errors.New("did not receive any sockets from systemd") - } - - if len(listeners) > 1 { - return nil, errors.New("received too many sockets from systemd") - } - - return &socket{"(systemd)", listeners[0]}, nil -} - -func unixSocket() (*socket, error) { - addr := common.EnvConfig.UnixSocket - os.Remove(addr) // remove dangling the socket file to avoid file-exist error - - listener, err := net.Listen("unix", addr) //nolint:noctx - if err != nil { - return nil, fmt.Errorf("failed to create UNIX socket: %w", err) - } - - if common.EnvConfig.UnixSocketMode != "" { - mode, err := strconv.ParseUint(common.EnvConfig.UnixSocketMode, 8, 32) - if err != nil { - listener.Close() - return nil, fmt.Errorf("failed to parse UNIX socket mode '%s': %w", common.EnvConfig.UnixSocketMode, err) - } - - if err := os.Chmod(addr, os.FileMode(mode)); err != nil { - listener.Close() - return nil, fmt.Errorf("failed to set UNIX socket mode '%s': %w", common.EnvConfig.UnixSocketMode, err) - } - } - - return &socket{addr, listener}, nil -} - -func tcpSocket() (*socket, error) { - addr := net.JoinHostPort(common.EnvConfig.Host, common.EnvConfig.Port) - - listener, err := net.Listen("tcp", addr) //nolint:noctx - if err != nil { - return nil, fmt.Errorf("failed to create TCP socket: %w", err) - } - - return &socket{addr, listener}, nil -} - func newHTTPServer(r *gin.Engine, protocols *http.Protocols) *http.Server { return &http.Server{ MaxHeaderBytes: 1 << 20, diff --git a/backend/internal/bootstrap/socket.go b/backend/internal/bootstrap/socket.go new file mode 100644 index 00000000..8c1870df --- /dev/null +++ b/backend/internal/bootstrap/socket.go @@ -0,0 +1,51 @@ +package bootstrap + +import ( + "fmt" + "net" + "os" + "strconv" + + "github.com/pocket-id/pocket-id/backend/internal/common" +) + +type socket struct { + addr string + listener net.Listener +} + +func unixSocket() (*socket, error) { + addr := common.EnvConfig.UnixSocket + os.Remove(addr) // remove dangling the socket file to avoid file-exist error + + listener, err := net.Listen("unix", addr) //nolint:noctx + if err != nil { + return nil, fmt.Errorf("failed to create UNIX socket: %w", err) + } + + if common.EnvConfig.UnixSocketMode != "" { + mode, err := strconv.ParseUint(common.EnvConfig.UnixSocketMode, 8, 32) + if err != nil { + listener.Close() + return nil, fmt.Errorf("failed to parse UNIX socket mode '%s': %w", common.EnvConfig.UnixSocketMode, err) + } + + if err := os.Chmod(addr, os.FileMode(mode)); err != nil { + listener.Close() + return nil, fmt.Errorf("failed to set UNIX socket mode '%s': %w", common.EnvConfig.UnixSocketMode, err) + } + } + + return &socket{addr, listener}, nil +} + +func tcpSocket() (*socket, error) { + addr := net.JoinHostPort(common.EnvConfig.Host, common.EnvConfig.Port) + + listener, err := net.Listen("tcp", addr) //nolint:noctx + if err != nil { + return nil, fmt.Errorf("failed to create TCP socket: %w", err) + } + + return &socket{addr, listener}, nil +} diff --git a/backend/internal/bootstrap/systemd_socket_linux.go b/backend/internal/bootstrap/systemd_socket_linux.go new file mode 100644 index 00000000..0579ef36 --- /dev/null +++ b/backend/internal/bootstrap/systemd_socket_linux.go @@ -0,0 +1,27 @@ +//go:build linux + +package bootstrap + +import ( + "errors" + "fmt" + + "github.com/coreos/go-systemd/activation" +) + +func systemdSocket() (*socket, error) { + listeners, err := activation.Listeners() + if err != nil { + return nil, fmt.Errorf("failed to receive socket from systemd: %w", err) + } + + if len(listeners) == 0 { + return nil, errors.New("did not receive any sockets from systemd") + } + + if len(listeners) > 1 { + return nil, errors.New("received too many sockets from systemd") + } + + return &socket{"(systemd)", listeners[0]}, nil +} diff --git a/backend/internal/bootstrap/systemd_socket_nonlinux.go b/backend/internal/bootstrap/systemd_socket_nonlinux.go new file mode 100644 index 00000000..45dfb406 --- /dev/null +++ b/backend/internal/bootstrap/systemd_socket_nonlinux.go @@ -0,0 +1,9 @@ +//go:build !linux + +package bootstrap + +import "errors" + +func systemdSocket() (*socket, error) { + return nil, errors.New("systemd socket activation is only supported on Linux") +} diff --git a/backend/internal/utils/image/metadata.go b/backend/internal/utils/image/metadata.go index 1ea59a77..9bf02dd0 100644 --- a/backend/internal/utils/image/metadata.go +++ b/backend/internal/utils/image/metadata.go @@ -96,7 +96,7 @@ func stripWEBPMetadata(data []byte) []byte { // WEBP image can max be 4GB in size riffSize := out.Len() - 8 - if riffSize < 0 || riffSize > int(maxRIFFSize) { + if riffSize < 0 || uint64(riffSize) > uint64(maxRIFFSize) { return data }