From f305e5b2e96569bdf2c74f44e19095044701a222 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 11 Dec 2025 16:53:30 -0500 Subject: [PATCH 1/8] tsk-10: Added cors package --- go.mod | 1 + go.sum | 2 ++ 2 files changed, 3 insertions(+) diff --git a/go.mod b/go.mod index ec78ef3..2bb269f 100644 --- a/go.mod +++ b/go.mod @@ -30,6 +30,7 @@ require ( github.com/mailru/easyjson v0.7.6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect golang.org/x/mod v0.27.0 // indirect golang.org/x/sync v0.17.0 // indirect diff --git a/go.sum b/go.sum index 07186f6..c85d5bf 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= From c7b45952fe2305b74430c1a1a23d8cd8db794483 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 11 Dec 2025 17:29:12 -0500 Subject: [PATCH 2/8] tsk-10: go mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2bb269f..2deadb7 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/gorilla/mux v1.8.1 github.com/jackc/pgx/v5 v5.7.5 github.com/joho/godotenv v1.5.1 + github.com/rs/cors v1.11.1 github.com/stretchr/testify v1.11.1 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.6 @@ -30,7 +31,6 @@ require ( github.com/mailru/easyjson v0.7.6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/rs/cors v1.11.1 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect golang.org/x/mod v0.27.0 // indirect golang.org/x/sync v0.17.0 // indirect From 225dc0c96318106c9542be1174cd861eb3604cf2 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 11 Dec 2025 17:29:34 -0500 Subject: [PATCH 3/8] tsk-10: Added cors --- cmd/api/main.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/cmd/api/main.go b/cmd/api/main.go index b280401..03494f3 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -12,6 +12,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" + "github.com/rs/cors" "github.com/swaggo/http-swagger/v2" _ "git.kundeng.us/phoenix/textsender-auth/docs" @@ -97,10 +98,23 @@ func main() { httpSwagger.URL(fmt.Sprintf("http://localhost:%s/swagger/doc.json", config.Port)), )) + + // Configure CORS + c := cors.New(cors.Options{ + AllowedOrigins: []string{fmt.Sprintf("http://localhost:%s", config.Port), "https://textsender.com"}, + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"}, + AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, + ExposedHeaders: []string{"Link", "X-Total-Count"}, + AllowCredentials: true, + MaxAge: 300, // 5 minutes + }) + + rr := c.Handler(router) + // Start server server := &http.Server{ Addr: ":" + cfg.ServerPort, - Handler: router, + Handler: rr, ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, From 093888f7fb5bf422f7f0ed1a9de2da3f4b81bc4b Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 13 Dec 2025 15:17:55 -0500 Subject: [PATCH 4/8] tsk-10: Package change --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2deadb7..3c687c6 100644 --- a/go.mod +++ b/go.mod @@ -5,12 +5,12 @@ go 1.25.4 require ( git.kundeng.us/phoenix/textsender-models v0.0.10 github.com/go-chi/chi/v5 v5.2.3 + github.com/go-chi/cors v1.2.2 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/jackc/pgx/v5 v5.7.5 github.com/joho/godotenv v1.5.1 - github.com/rs/cors v1.11.1 github.com/stretchr/testify v1.11.1 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.6 diff --git a/go.sum b/go.sum index c85d5bf..accaf7e 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-chi/cors v1.2.2 h1:Jmey33TE+b+rB7fT8MUy1u0I4L+NARQlK6LhzKPSyQE= +github.com/go-chi/cors v1.2.2/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -54,8 +56,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= -github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= From 66221e504c0eee368801309404f7fea51a811308 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 13 Dec 2025 15:18:06 -0500 Subject: [PATCH 5/8] tsk-10: Got it working --- cmd/api/main.go | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/cmd/api/main.go b/cmd/api/main.go index 03494f3..8430d1d 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -12,7 +12,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" - "github.com/rs/cors" + "github.com/go-chi/cors" "github.com/swaggo/http-swagger/v2" _ "git.kundeng.us/phoenix/textsender-auth/docs" @@ -83,6 +83,15 @@ func main() { router := chi.NewRouter() + // Configure CORS + router.Use(cors.Handler(cors.Options{ + AllowedOrigins: []string{fmt.Sprintf("http://localhost:%s", config.Port), "http://localhost:5173", "https://textsender.com"}, + AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"}, + AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, + ExposedHeaders: []string{"Link", "X-Total-Count"}, + AllowCredentials: true, + MaxAge: 300, // 5 minutes + })) router.Use(middleware.Logger) router.Use(middleware.Recoverer) router.Use(middleware.Timeout(60 * time.Second)) @@ -98,23 +107,10 @@ func main() { httpSwagger.URL(fmt.Sprintf("http://localhost:%s/swagger/doc.json", config.Port)), )) - - // Configure CORS - c := cors.New(cors.Options{ - AllowedOrigins: []string{fmt.Sprintf("http://localhost:%s", config.Port), "https://textsender.com"}, - AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"}, - AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, - ExposedHeaders: []string{"Link", "X-Total-Count"}, - AllowCredentials: true, - MaxAge: 300, // 5 minutes - }) - - rr := c.Handler(router) - // Start server server := &http.Server{ Addr: ":" + cfg.ServerPort, - Handler: rr, + Handler: router, ReadTimeout: 15 * time.Second, WriteTimeout: 15 * time.Second, IdleTimeout: 60 * time.Second, From 223b7919f9764ca5dc6b60fbafa6022085abbc21 Mon Sep 17 00:00:00 2001 From: phoenix Date: Tue, 16 Dec 2025 19:09:18 +0000 Subject: [PATCH 6/8] tsk-29: Expand LoginResult (#31) Closes #29 Reviewed-on: https://git.kundeng.us/phoenix/textsender-auth/pulls/31 Co-authored-by: phoenix Co-committed-by: phoenix --- go.mod | 2 +- go.sum | 4 ++-- internal/utility/token.go | 9 ++++----- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 3c687c6..1cb1312 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.kundeng.us/phoenix/textsender-auth go 1.25.4 require ( - git.kundeng.us/phoenix/textsender-models v0.0.10 + git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/cors v1.2.2 github.com/golang-jwt/jwt/v5 v5.3.0 diff --git a/go.sum b/go.sum index accaf7e..6b03a8f 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -git.kundeng.us/phoenix/textsender-models v0.0.10 h1:0AMe/zm4Xte2BcuqqhRP7+42m+4To+rUnHkR2a9eXlI= -git.kundeng.us/phoenix/textsender-models v0.0.10/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= +git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556 h1:zDoezot79fzI4voSW02O4/o2p1lBzmQ2Gq8Ukub8460= +git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= diff --git a/internal/utility/token.go b/internal/utility/token.go index c241ff0..6a69169 100644 --- a/internal/utility/token.go +++ b/internal/utility/token.go @@ -6,8 +6,8 @@ import ( "git.kundeng.us/phoenix/textsender-models/tx0/token" "git.kundeng.us/phoenix/textsender-models/tx0/user" - "github.com/google/uuid" "github.com/golang-jwt/jwt/v5" + "github.com/google/uuid" "git.kundeng.us/phoenix/textsender-auth/internal/config" ) @@ -16,7 +16,7 @@ const ROLE_TYPE = "regular" const TOKEN_TYPE = "Bearer" type TokenGenerator struct { - SecretKey []byte + SecretKey []byte hourOffset time.Duration } @@ -48,7 +48,7 @@ func (t *TokenGenerator) GenerateToken(usr any) (*token.Login, error) { if tokenString, err := myToken.SignedString(t.SecretKey); err != nil { return nil, err } else { - return &token.Login{AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil + return &token.Login{UserId: claims.UserId, AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil } } } @@ -97,11 +97,10 @@ func (t *TokenGenerator) ExtractIdFromToken(accessToken string) (uuid.UUID, erro } } - func (t *TokenGenerator) parseTokenWithClaims(accessToken string, claims *token.Claims) (*jwt.Token, error) { tken, err := jwt.ParseWithClaims(accessToken, claims, func(tken *jwt.Token) (any, error) { if _, ok := tken.Method.(*jwt.SigningMethodHMAC); !ok { - return nil, fmt.Errorf("unexpected signing method: %v", tken.Header["alg"]) + return nil, fmt.Errorf("unexpected signing method: %v", tken.Header["alg"]) } return t.SecretKey, nil }, jwt.WithValidMethods([]string{jwt.SigningMethodHS256.Alg()})) From 636b0280c7afb093d61ae73d956059cd5c89ddbc Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 21 Dec 2025 00:28:08 +0000 Subject: [PATCH 7/8] tsk-10: CORS support (#28) Closes #10 Reviewed-on: https://git.kundeng.us/phoenix/textsender-auth/pulls/28 Co-authored-by: phoenix Co-committed-by: phoenix --- .env.docker.sample | 1 + .env.sample | 1 + .gitea/workflows/workflow.yaml | 1 + cmd/api/main.go | 2 +- internal/config/config.go | 28 +++++++++++++++++++++++----- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.env.docker.sample b/.env.docker.sample index a795df2..7fce7cd 100644 --- a/.env.docker.sample +++ b/.env.docker.sample @@ -6,3 +6,4 @@ DB_HOST=auth_db DB_PORT=5432 DB_SSLMODE=disable ENABLE_REGISTRATION=true +ALLOWED_ORIGINS="http://textsender.com" diff --git a/.env.sample b/.env.sample index 4574f22..dc73a18 100644 --- a/.env.sample +++ b/.env.sample @@ -6,3 +6,4 @@ DB_HOST=localhost DB_PORT=5432 DB_SSLMODE=disable ENABLE_REGISTRATION=true +ALLOWED_ORIGINS="http://textsender.com" diff --git a/.gitea/workflows/workflow.yaml b/.gitea/workflows/workflow.yaml index 80d1c9b..1b5f0c3 100644 --- a/.gitea/workflows/workflow.yaml +++ b/.gitea/workflows/workflow.yaml @@ -107,6 +107,7 @@ jobs: echo "DB_PORT=$DB_PORT" >> .env echo "DB_SSLMODE=$DB_SSLMODE" >> .env echo "ENABLE_REGISTRATION=true" >> .env + echo "ALLOWED_ORIGINS=http://localhost:9080" >> .env echo "Initializing config" mkdir -p ~/.ssh diff --git a/cmd/api/main.go b/cmd/api/main.go index 8430d1d..b5e70f3 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -85,7 +85,7 @@ func main() { // Configure CORS router.Use(cors.Handler(cors.Options{ - AllowedOrigins: []string{fmt.Sprintf("http://localhost:%s", config.Port), "http://localhost:5173", "https://textsender.com"}, + AllowedOrigins: cfg.AllowedOrigins, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"}, AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, ExposedHeaders: []string{"Link", "X-Total-Count"}, diff --git a/internal/config/config.go b/internal/config/config.go index e292820..74ec025 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -19,6 +19,7 @@ type Config struct { ServerPort string ResetDB bool EnableRegistration bool + AllowedOrigins []string } type ConnectionInfo struct { @@ -67,12 +68,23 @@ func Load() *Config { unpackedConnString := UnpackDBConnString() dbConnString := unpackedConnString.Parse() + allowedOrigins := unpackAllowedOrigin() - return &Config{ - DBConnString: dbConnString, - ServerPort: *port, - ResetDB: *resetDb, - EnableRegistration: CheckRegistration(), + if len(allowedOrigins) > 0 { + return &Config{ + DBConnString: dbConnString, + ServerPort: *port, + ResetDB: *resetDb, + EnableRegistration: CheckRegistration(), + AllowedOrigins: allowedOrigins, + } + } else { + return &Config{ + DBConnString: dbConnString, + ServerPort: *port, + ResetDB: *resetDb, + EnableRegistration: CheckRegistration(), + } } } @@ -131,6 +143,12 @@ func UnpackDBConnString() (connInfo ConnectionInfo) { return } +func unpackAllowedOrigin() []string { + allowedOriginsRaw := os.Getenv("ALLOWED_ORIGINS") + allowedOriginsSplit := strings.Split(allowedOriginsRaw, ",") + return allowedOriginsSplit +} + func CheckRegistration() bool { if flagValue := os.Getenv("ENABLE_REGISTRATION"); flagValue != "" { if val := strings.ToUpper(flagValue); val == "TRUE" { From 7597e05243237b130a20fb001b9b0933f90e242f Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 22 Dec 2025 17:40:08 -0500 Subject: [PATCH 8/8] textsender-models version bump --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1cb1312..6a732d6 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.kundeng.us/phoenix/textsender-auth go 1.25.4 require ( - git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556 + git.kundeng.us/phoenix/textsender-models v0.0.12 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/cors v1.2.2 github.com/golang-jwt/jwt/v5 v5.3.0 diff --git a/go.sum b/go.sum index 6b03a8f..f828db4 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556 h1:zDoezot79fzI4voSW02O4/o2p1lBzmQ2Gq8Ukub8460= -git.kundeng.us/phoenix/textsender-models v0.0.11-16-f9b55b6bb7-556/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= +git.kundeng.us/phoenix/textsender-models v0.0.12 h1:ps9H3FS5LyCwQhAiIvg4vYyfLZZ64dex1y9ytb0o9C4= +git.kundeng.us/phoenix/textsender-models v0.0.12/go.mod h1:9iPDQJg1Tc6WMNoW5+f8YKmnosMwlWHJ++hmxNLDEe0= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=