From 9062609eeca44721047fe4e191cc56606685fef3 Mon Sep 17 00:00:00 2001 From: trev Date: Tue, 18 Mar 2025 14:18:24 -0400 Subject: [PATCH] fix: conditional client build --- .dockerignore | 3 +- .gitignore | 3 +- flake.nix | 5 +- server/internal/handlers/client.go | 19 ------- server/internal/handlers/client/client.go | 17 +++++++ .../internal/handlers/client/client_prod.go | 16 ++++++ server/internal/interceptors/auth.go | 51 +++++++++++-------- server/main.go | 7 +-- 8 files changed, 74 insertions(+), 47 deletions(-) delete mode 100644 server/internal/handlers/client.go create mode 100644 server/internal/handlers/client/client.go create mode 100644 server/internal/handlers/client/client_prod.go diff --git a/.dockerignore b/.dockerignore index 1e96827..1942cbd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,4 +9,5 @@ result # Server /server/client -/server/tmp \ No newline at end of file +/server/tmp +/server/internal/handlers/client/client \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1e96827..1942cbd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ result # Server /server/client -/server/tmp \ No newline at end of file +/server/tmp +/server/internal/handlers/client/client \ No newline at end of file diff --git a/flake.nix b/flake.nix index 37a3a13..20684d2 100644 --- a/flake.nix +++ b/flake.nix @@ -69,6 +69,9 @@ # Svelte frontend nodejs_22 + # Nix + nix-update + # Helper scripts (writeShellApplication { name = "run"; @@ -117,7 +120,7 @@ vendorHash = "sha256-FyqcKhJy58uL3UiGA9tg7pSt0OQ1NIZw+khTictyzcw="; preBuild = '' - cp -r ${client} client + cp -r ${client} internal/handlers/client/client ''; }; } diff --git a/server/internal/handlers/client.go b/server/internal/handlers/client.go deleted file mode 100644 index 5c18a5d..0000000 --- a/server/internal/handlers/client.go +++ /dev/null @@ -1,19 +0,0 @@ -package handlers - -import ( - "embed" - "io/fs" - "log" - "net/http" - - "github.com/spotdemo4/trevstack/server/internal/interceptors" -) - -func NewClientHandler(client embed.FS, key string) http.Handler { - clientFs, err := fs.Sub(client, "client") - if err != nil { - log.Fatalf("failed to get sub filesystem: %v", err) - } - - return interceptors.WithAuthRedirect(http.FileServer(http.FS(clientFs)), key) -} diff --git a/server/internal/handlers/client/client.go b/server/internal/handlers/client/client.go new file mode 100644 index 0000000..c2c8a55 --- /dev/null +++ b/server/internal/handlers/client/client.go @@ -0,0 +1,17 @@ +package client + +import ( + "net/http" + + "github.com/spotdemo4/trevstack/server/internal/interceptors" +) + +var embedfs *http.FileSystem + +func NewClientHandler(key string) http.Handler { + if embedfs != nil { + return interceptors.WithAuthRedirect(http.FileServer(*embedfs), key) + } + + return http.NotFoundHandler() +} diff --git a/server/internal/handlers/client/client_prod.go b/server/internal/handlers/client/client_prod.go new file mode 100644 index 0000000..60117c4 --- /dev/null +++ b/server/internal/handlers/client/client_prod.go @@ -0,0 +1,16 @@ +// go:build !dev + +package client + +import ( + "embed" + "net/http" +) + +//go:embed client +var eclient embed.FS + +func init() { + fs := http.FS(eclient) + embedfs = &fs +} diff --git a/server/internal/interceptors/auth.go b/server/internal/interceptors/auth.go index a4163f0..d56e0b5 100644 --- a/server/internal/interceptors/auth.go +++ b/server/internal/interceptors/auth.go @@ -18,40 +18,51 @@ func WithAuthRedirect(next http.Handler, key string) http.Handler { pathItems := strings.Split(r.URL.Path, "/") if len(pathItems) < 2 { - next.ServeHTTP(w, r) + http.Error(w, "Not found", http.StatusNotFound) return } + // Check if the user is authenticated + authenticated := false + cookies := getCookies(r.Header.Get("Cookie")) + for _, cookie := range cookies { + if cookie.Name == "token" { + subject, err := validateToken(cookie.Value, key) + if err == nil { + ctx, err := newUserContext(r.Context(), subject) + if err == nil { + r = r.WithContext(ctx) + authenticated = true + } + } + + break + } + } + switch pathItems[1] { case "auth": - fallthrough + if authenticated { + http.Redirect(w, r, "/", http.StatusFound) + return + } + next.ServeHTTP(w, r) + case "_app": - fallthrough + next.ServeHTTP(w, r) + case "favicon.png": next.ServeHTTP(w, r) - return default: - // Check if the request contains a valid cookie token - cookies := getCookies(r.Header.Get("Cookie")) - for _, cookie := range cookies { - if cookie.Name == "token" { - subject, err := validateToken(cookie.Value, key) - if err == nil { - ctx, err := newUserContext(r.Context(), subject) - if err == nil { - r = r.WithContext(ctx) - next.ServeHTTP(w, r) - return - } - } - } + if authenticated { + next.ServeHTTP(w, r) + return } - // Otherwise redirect + // Redirect if not authenticated http.Redirect(w, r, "/auth", http.StatusFound) - return } }) } diff --git a/server/main.go b/server/main.go index 9973bee..edc867e 100644 --- a/server/main.go +++ b/server/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "embed" "fmt" "log" "net/http" @@ -20,11 +19,9 @@ import ( "github.com/spotdemo4/trevstack/server/internal/database" "github.com/spotdemo4/trevstack/server/internal/handlers" + "github.com/spotdemo4/trevstack/server/internal/handlers/client" ) -//go:embed all:client -var client embed.FS - type env struct { DBType string DBUser string @@ -116,7 +113,7 @@ func main() { // Serve web interface mux := http.NewServeMux() - mux.Handle("/", handlers.NewClientHandler(client, env.Key)) + mux.Handle("/", client.NewClientHandler(env.Key)) mux.Handle("/file/", handlers.NewFileHandler(db, env.Key)) mux.Handle("/grpc/", http.StripPrefix("/grpc", api))