From 7ccbb905c172053f719cf21ba969e63b96f2acfc Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 15:36:54 +0100 Subject: [PATCH 01/14] add middleware logger (per-token logger) --- go.mod | 4 +- go.sum | 18 ++++ internals/config/structure/structure.go | 1 + internals/config/tokens.go | 30 ++++++- internals/proxy/middlewares/auth.go | 100 +++++++++++++--------- internals/proxy/middlewares/common.go | 30 ++++++- internals/proxy/middlewares/endpoints.go | 4 +- internals/proxy/middlewares/log.go | 41 +++++++-- internals/proxy/middlewares/mapping.go | 3 +- internals/proxy/middlewares/message.go | 6 +- internals/proxy/middlewares/middleware.go | 8 +- internals/proxy/middlewares/policy.go | 3 +- internals/proxy/middlewares/port.go | 4 +- internals/proxy/middlewares/template.go | 3 +- internals/proxy/proxy.go | 3 +- 15 files changed, 194 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index ed4ec3ea..536fe5b7 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,9 @@ module github.com/codeshelldev/secured-signal-api go 1.25.5 -require github.com/codeshelldev/gotl v0.0.9 +require github.com/codeshelldev/gotl v0.0.10-9 -require go.uber.org/zap v1.27.1 // indirect +require go.uber.org/zap v1.27.1 require ( github.com/fsnotify/fsnotify v1.9.0 // indirect diff --git a/go.sum b/go.sum index e272a597..9386e648 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,23 @@ github.com/codeshelldev/gotl v0.0.9 h1:cdLA6XzPt+f4RIW24Yx3dqBbRAq5JO0obzuwhaOgsEo= github.com/codeshelldev/gotl v0.0.9/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-1 h1:x7lOZMNzwpfssvznUxetzmK8Tiwe26xH0bdpl31/hX0= +github.com/codeshelldev/gotl v0.0.10-1/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-2 h1:ZwKGk3hA+mLIoS9SwAVJFs0urSYxYvaAuy/qYOuX9Fo= +github.com/codeshelldev/gotl v0.0.10-2/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-3 h1:qOm5pEsMGcL432PMnEa4H1Hjzf0jkrPttgZ+UW7R60U= +github.com/codeshelldev/gotl v0.0.10-3/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-4 h1:b+GONwZ0bkQwZQWfOuamt+9R9pFms8ZUzCwRKq5wNrc= +github.com/codeshelldev/gotl v0.0.10-4/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-5 h1:NmOkvi51HoCeutHZMNgfEU9c0XHBSWnixQjmJg3slt8= +github.com/codeshelldev/gotl v0.0.10-5/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-6 h1:yUccL8JKUsHNd4XnvpKxiAdpZTpTn74j/M8QLqIXRoE= +github.com/codeshelldev/gotl v0.0.10-6/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-7 h1:LX4JG9XXUkIkiUVbA5HMZDEs7IJdjUsN7yvX3VjhwCs= +github.com/codeshelldev/gotl v0.0.10-7/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-8 h1:2+R/pn71w9NnwTA6kkEwZ/f6TUCBwkEIy40sReAVlLg= +github.com/codeshelldev/gotl v0.0.10-8/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10-9 h1:kV9DRsALEhNYIp5IAhA7MnYzLjrBVgfWKLborEScPxI= +github.com/codeshelldev/gotl v0.0.10-9/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= 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/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= diff --git a/internals/config/structure/structure.go b/internals/config/structure/structure.go index ba2ce910..b276d57d 100644 --- a/internals/config/structure/structure.go +++ b/internals/config/structure/structure.go @@ -11,6 +11,7 @@ type ENV struct { } type CONFIG struct { + NAME string `koanf:"name"` SERVICE SERVICE `koanf:"service"` API API `koanf:"api"` //TODO: deprecate overrides for tkconfigs diff --git a/internals/config/tokens.go b/internals/config/tokens.go index bf37a16b..fd3e04ed 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -1,6 +1,7 @@ package config import ( + "reflect" "strconv" "github.com/codeshelldev/gotl/pkg/configutils" @@ -12,7 +13,7 @@ import ( func LoadTokens() { logger.Debug("Loading Configs in ", ENV.TOKENS_DIR) - err := tokenConf.LoadDir("tokenconfigs", ENV.TOKENS_DIR, ".yml", yaml.Parser()) + err := tokenConf.LoadDir("tokenconfigs", ENV.TOKENS_DIR, ".yml", yaml.Parser(), setTokenConfigName) if err != nil { logger.Error("Could not Load Configs in ", ENV.TOKENS_DIR, ": ", err.Error()) @@ -84,3 +85,30 @@ func parseTokenConfigs(configArray []structure.CONFIG) map[string]structure.CONF return configs } + +func getSchemeTagByPointer(config any, tag string, fieldPointer any) string { + v := reflect.ValueOf(config) + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + + fieldValue := reflect.ValueOf(fieldPointer).Elem() + + for i := 0; i < v.NumField(); i++ { + if v.Field(i).Addr().Interface() == fieldValue.Addr().Interface() { + field := v.Type().Field(i) + + return field.Tag.Get(tag) + } + } + + return "" +} + +func setTokenConfigName(config *configutils.Config, path string) { + schema := reflect.TypeOf(structure.CONFIG{}) + + nameField := getSchemeTagByPointer(schema, "koanf", structure.CONFIG{}.NAME) + + config.Layer.Set(nameField, path) +} \ No newline at end of file diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 23967ed9..3c1ac114 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -1,7 +1,6 @@ package middlewares import ( - "context" "encoding/base64" "errors" "maps" @@ -21,13 +20,67 @@ var Auth Middleware = Middleware{ } const tokenKey contextKey = "token" +const isAuthKey contextKey = "isAuthenticated" + +func authHandler(next http.Handler) http.Handler { + tokenKeys := maps.Keys(config.ENV.CONFIGS) + tokens := slices.Collect(tokenKeys) + + if tokens == nil { + tokens = []string{} + } + + var authChain = NewAuthChain(). + Use(BearerAuth). + Use(BasicAuth). + Use(BodyAuth). + Use(QueryAuth). + Use(PathAuth) + + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if len(tokens) <= 0 { + next.ServeHTTP(w, req) + return + } + + token, _ := authChain.Eval(w, req, tokens) + + if token == "" { + onUnauthorized(w) + + setContext(req, isAuthKey, false) + } else { + setContext(req, isAuthKey, true) + setContext(req, tokenKey, token) + } + + next.ServeHTTP(w, req) + }) +} + +var InternalAuthRequirement Middleware = Middleware{ + Name: "_Auth_Requirement", + Use: authRequirementHandler, +} + +func authRequirementHandler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + isAuthenticated := getContext[bool](req, isAuthKey) + + if !isAuthenticated { + return + } + + next.ServeHTTP(w, req) + }) +} type AuthMethod struct { Name string Authenticate func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) } -var BearerAuth = AuthMethod { +var BearerAuth = AuthMethod{ Name: "Bearer", Authenticate: func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) { header := req.Header.Get("Authorization") @@ -50,7 +103,7 @@ var BearerAuth = AuthMethod { }, } -var BasicAuth = AuthMethod { +var BasicAuth = AuthMethod{ Name: "Basic", Authenticate: func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) { header := req.Header.Get("Authorization") @@ -92,7 +145,7 @@ var BasicAuth = AuthMethod { }, } -var BodyAuth = AuthMethod { +var BodyAuth = AuthMethod{ Name: "Body", Authenticate: func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) { const authField = "auth" @@ -133,7 +186,7 @@ var BodyAuth = AuthMethod { }, } -var QueryAuth = AuthMethod { +var QueryAuth = AuthMethod{ Name: "Query", Authenticate: func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) { const authQuery = "@authorization" @@ -158,7 +211,7 @@ var QueryAuth = AuthMethod { }, } -var PathAuth = AuthMethod { +var PathAuth = AuthMethod{ Name: "Path", Authenticate: func(w http.ResponseWriter, req *http.Request, tokens []string) (string, error) { parts := strings.Split(req.URL.Path, "/") @@ -187,41 +240,6 @@ var PathAuth = AuthMethod { }, } -func authHandler(next http.Handler) http.Handler { - tokenKeys := maps.Keys(config.ENV.CONFIGS) - tokens := slices.Collect(tokenKeys) - - if tokens == nil { - tokens = []string{} - } - - var authChain = NewAuthChain(). - Use(BearerAuth). - Use(BasicAuth). - Use(BodyAuth). - Use(QueryAuth). - Use(PathAuth) - - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - if len(tokens) <= 0 { - next.ServeHTTP(w, req) - return - } - - token, _ := authChain.Eval(w, req, tokens) - - if token == "" { - onUnauthorized(w) - return - } - - ctx := context.WithValue(req.Context(), tokenKey, token) - req = req.WithContext(ctx) - - next.ServeHTTP(w, req) - }) -} - func onUnauthorized(w http.ResponseWriter) { w.Header().Set("WWW-Authenticate", "Basic realm=\"Login Required\", Bearer realm=\"Access Token Required\"") diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index 4cb4e6c1..31523ee0 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -1,8 +1,10 @@ package middlewares import ( + "context" "net/http" + "github.com/codeshelldev/gotl/pkg/logger" "github.com/codeshelldev/secured-signal-api/internals/config" "github.com/codeshelldev/secured-signal-api/internals/config/structure" ) @@ -13,10 +15,32 @@ type Context struct { type contextKey string -func getConfigByReq(req *http.Request) *structure.CONFIG { - token := req.Context().Value(tokenKey).(string) +func setContext(req *http.Request, key, value any) { + ctx := context.WithValue(req.Context(), tokenKey, value) + req = req.WithContext(ctx) +} + +func getContext[T any](req *http.Request, key any) T { + value, ok := req.Context().Value(key).(T) + + if !ok { + var zero T + return zero + } + + return value +} + +func getLogger(req *http.Request) *logger.Logger { + return getContext[*logger.Logger](req, loggerKey) +} - return getConfig(token) +func getToken(req *http.Request) string { + return getContext[string](req, tokenKey) +} + +func getConfigByReq(req *http.Request) *structure.CONFIG { + return getConfig(getToken(req)) } func getConfig(token string) *structure.CONFIG { diff --git a/internals/proxy/middlewares/endpoints.go b/internals/proxy/middlewares/endpoints.go index 363c1d5b..707ef844 100644 --- a/internals/proxy/middlewares/endpoints.go +++ b/internals/proxy/middlewares/endpoints.go @@ -5,8 +5,6 @@ import ( "path" "slices" "strings" - - "github.com/codeshelldev/gotl/pkg/logger" ) var Endpoints Middleware = Middleware{ @@ -16,6 +14,8 @@ var Endpoints Middleware = Middleware{ func endpointsHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) endpoints := conf.SETTINGS.ACCESS.ENDPOINTS diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index edcfbd47..0a84c5e0 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -2,30 +2,59 @@ package middlewares import ( "net/http" + "strings" "github.com/codeshelldev/gotl/pkg/logger" "github.com/codeshelldev/gotl/pkg/request" + "go.uber.org/zap/zapcore" ) -var Logging Middleware = Middleware{ +var RequestLogger Middleware = Middleware{ Name: "Logging", Use: loggingHandler, } +const loggerKey contextKey = "logger" + func loggingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - if !logger.IsDev() { - logger.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) + conf := getConfigByReq(req) + + logLevel := conf.SERVICE.LOG_LEVEL + + if strings.TrimSpace(logLevel) == "" { + logLevel = getConfig("").SERVICE.LOG_LEVEL + } + + options := logger.DefaultOptions() + options.EncodeCaller = func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { + enc.AppendString(caller.TrimmedPath() + conf.NAME) + } + + l, err := logger.New(logLevel, options) + + if err != nil { + logger.Error("Could not create Middleware Logger: ", err.Error()) + } + + if l == nil { + l = logger.Get() + } + + setContext(req, loggerKey, l) + + if !l.IsDev() { + l.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) } else { body, _ := request.GetReqBody(req) if body.Data != nil && !body.Empty { - logger.Dev(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery, body.Data) + l.Dev(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery, body.Data) } else { - logger.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) + l.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) } } next.ServeHTTP(w, req) }) -} +} \ No newline at end of file diff --git a/internals/proxy/middlewares/mapping.go b/internals/proxy/middlewares/mapping.go index 74b1cba3..14418ead 100644 --- a/internals/proxy/middlewares/mapping.go +++ b/internals/proxy/middlewares/mapping.go @@ -4,7 +4,6 @@ import ( "net/http" jsonutils "github.com/codeshelldev/gotl/pkg/jsonutils" - "github.com/codeshelldev/gotl/pkg/logger" request "github.com/codeshelldev/gotl/pkg/request" "github.com/codeshelldev/secured-signal-api/internals/config/structure" ) @@ -16,6 +15,8 @@ var Mapping Middleware = Middleware{ func mappingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) variables := conf.SETTINGS.MESSAGE.VARIABLES diff --git a/internals/proxy/middlewares/message.go b/internals/proxy/middlewares/message.go index c5543074..51a1748c 100644 --- a/internals/proxy/middlewares/message.go +++ b/internals/proxy/middlewares/message.go @@ -2,8 +2,8 @@ package middlewares import ( "net/http" + "strings" - "github.com/codeshelldev/gotl/pkg/logger" request "github.com/codeshelldev/gotl/pkg/request" ) @@ -14,6 +14,8 @@ var Message Middleware = Middleware{ func messageHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) variables := conf.SETTINGS.MESSAGE.VARIABLES @@ -23,7 +25,7 @@ func messageHandler(next http.Handler) http.Handler { variables = getConfig("").SETTINGS.MESSAGE.VARIABLES } - if messageTemplate == "" { + if strings.TrimSpace(messageTemplate) == "" { messageTemplate = getConfig("").SETTINGS.MESSAGE.TEMPLATE } diff --git a/internals/proxy/middlewares/middleware.go b/internals/proxy/middlewares/middleware.go index 3588e161..a6e76861 100644 --- a/internals/proxy/middlewares/middleware.go +++ b/internals/proxy/middlewares/middleware.go @@ -2,6 +2,7 @@ package middlewares import ( "net/http" + "strings" "github.com/codeshelldev/gotl/pkg/logger" ) @@ -22,7 +23,12 @@ func NewChain() *Chain { func (chain *Chain) Use(middleware Middleware) *Chain { chain.middlewares = append(chain.middlewares, middleware) - logger.Debug("Registered ", middleware.Name, " middleware") + if strings.HasPrefix(middleware.Name, "_") { + logger.Dev("Registered ", middleware.Name, " middleware") + } else { + logger.Debug("Registered ", middleware.Name, " middleware") + } + return chain } diff --git a/internals/proxy/middlewares/policy.go b/internals/proxy/middlewares/policy.go index 9371696f..bb00ab23 100644 --- a/internals/proxy/middlewares/policy.go +++ b/internals/proxy/middlewares/policy.go @@ -5,7 +5,6 @@ import ( "net/http" "reflect" - "github.com/codeshelldev/gotl/pkg/logger" request "github.com/codeshelldev/gotl/pkg/request" "github.com/codeshelldev/secured-signal-api/internals/config/structure" "github.com/codeshelldev/secured-signal-api/utils/requestkeys" @@ -18,6 +17,8 @@ var Policy Middleware = Middleware{ func policyHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) policies := conf.SETTINGS.ACCESS.FIELD_POLICIES diff --git a/internals/proxy/middlewares/port.go b/internals/proxy/middlewares/port.go index f7f6151f..716e04a3 100644 --- a/internals/proxy/middlewares/port.go +++ b/internals/proxy/middlewares/port.go @@ -5,8 +5,6 @@ import ( "net" "net/http" "strings" - - "github.com/codeshelldev/gotl/pkg/logger" ) var Port Middleware = Middleware{ @@ -16,6 +14,8 @@ var Port Middleware = Middleware{ func portHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) allowedPort := conf.SERVICE.PORT diff --git a/internals/proxy/middlewares/template.go b/internals/proxy/middlewares/template.go index 4577df46..f2eccb91 100644 --- a/internals/proxy/middlewares/template.go +++ b/internals/proxy/middlewares/template.go @@ -8,7 +8,6 @@ import ( "strings" jsonutils "github.com/codeshelldev/gotl/pkg/jsonutils" - "github.com/codeshelldev/gotl/pkg/logger" query "github.com/codeshelldev/gotl/pkg/query" request "github.com/codeshelldev/gotl/pkg/request" templating "github.com/codeshelldev/gotl/pkg/templating" @@ -22,6 +21,8 @@ var Template Middleware = Middleware{ func templateHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + logger := getLogger(req) + conf := getConfigByReq(req) variables := conf.SETTINGS.MESSAGE.VARIABLES diff --git a/internals/proxy/proxy.go b/internals/proxy/proxy.go index c549e7d9..1ee5def7 100644 --- a/internals/proxy/proxy.go +++ b/internals/proxy/proxy.go @@ -31,9 +31,10 @@ func Create(targetUrl string) Proxy { func (proxy Proxy) Init() http.Handler { handler := m.NewChain(). - Use(m.Logging). Use(m.Server). Use(m.Auth). + Use(m.RequestLogger). + Use(m.InternalAuthRequirement). Use(m.Port). Use(m.Template). Use(m.Endpoints). From c8e52579e51861c1524217e1d850105cf593eafb Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 16:57:45 +0100 Subject: [PATCH 02/14] use pointer --- internals/config/tokens.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/internals/config/tokens.go b/internals/config/tokens.go index fd3e04ed..763d860d 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -106,9 +106,11 @@ func getSchemeTagByPointer(config any, tag string, fieldPointer any) string { } func setTokenConfigName(config *configutils.Config, path string) { - schema := reflect.TypeOf(structure.CONFIG{}) + schema := structure.CONFIG{ + NAME: "", + } - nameField := getSchemeTagByPointer(schema, "koanf", structure.CONFIG{}.NAME) + nameField := getSchemeTagByPointer(&schema, "koanf", &schema.NAME) config.Layer.Set(nameField, path) } \ No newline at end of file From 9081abdd6936eea4da67c60a974afe5cbbcb26e9 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:16:48 +0100 Subject: [PATCH 03/14] debug port --- internals/proxy/middlewares/port.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internals/proxy/middlewares/port.go b/internals/proxy/middlewares/port.go index 716e04a3..2aaf67e8 100644 --- a/internals/proxy/middlewares/port.go +++ b/internals/proxy/middlewares/port.go @@ -27,6 +27,8 @@ func portHandler(next http.Handler) http.Handler { port, err := getPort(req) + logger.Dev(port) + if err != nil { logger.Error("Could not get Port: ", err.Error()) http.Error(w, "Bad Request", http.StatusBadRequest) From cae51f51f766923babb4b6bc38d727a2a454a7b0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:29:18 +0100 Subject: [PATCH 04/14] debugging logger --- internals/config/tokens.go | 9 +++++++-- internals/proxy/middlewares/auth.go | 1 + internals/proxy/middlewares/log.go | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/internals/config/tokens.go b/internals/config/tokens.go index 763d860d..485b39cd 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -1,8 +1,10 @@ package config import ( + "path/filepath" "reflect" "strconv" + "strings" "github.com/codeshelldev/gotl/pkg/configutils" "github.com/codeshelldev/gotl/pkg/logger" @@ -105,12 +107,15 @@ func getSchemeTagByPointer(config any, tag string, fieldPointer any) string { return "" } -func setTokenConfigName(config *configutils.Config, path string) { +func setTokenConfigName(config *configutils.Config, p string) { schema := structure.CONFIG{ NAME: "", } nameField := getSchemeTagByPointer(&schema, "koanf", &schema.NAME) - config.Layer.Set(nameField, path) + filename := filepath.Base(p) + filenameWithoutExt := strings.TrimSuffix(filename, filepath.Ext(filename)) + + config.Layer.Set(nameField, filenameWithoutExt) } \ No newline at end of file diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 3c1ac114..3ce21bbe 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -68,6 +68,7 @@ func authRequirementHandler(next http.Handler) http.Handler { isAuthenticated := getContext[bool](req, isAuthKey) if !isAuthenticated { + logger.Dev("Unauthenticated: returning") return } diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index 0a84c5e0..ef5ae353 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -55,6 +55,8 @@ func loggingHandler(next http.Handler) http.Handler { } } + l.Info("Init") + next.ServeHTTP(w, req) }) } \ No newline at end of file From 471a6777d890e4ee590b57b848d9c18dd29bf5d8 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:36:13 +0100 Subject: [PATCH 05/14] fix --- internals/proxy/middlewares/common.go | 2 +- internals/proxy/middlewares/log.go | 2 -- internals/proxy/middlewares/port.go | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index 31523ee0..0000c5ac 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -16,7 +16,7 @@ type Context struct { type contextKey string func setContext(req *http.Request, key, value any) { - ctx := context.WithValue(req.Context(), tokenKey, value) + ctx := context.WithValue(req.Context(), key, value) req = req.WithContext(ctx) } diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index ef5ae353..0a84c5e0 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -55,8 +55,6 @@ func loggingHandler(next http.Handler) http.Handler { } } - l.Info("Init") - next.ServeHTTP(w, req) }) } \ No newline at end of file diff --git a/internals/proxy/middlewares/port.go b/internals/proxy/middlewares/port.go index 2aaf67e8..716e04a3 100644 --- a/internals/proxy/middlewares/port.go +++ b/internals/proxy/middlewares/port.go @@ -27,8 +27,6 @@ func portHandler(next http.Handler) http.Handler { port, err := getPort(req) - logger.Dev(port) - if err != nil { logger.Error("Could not get Port: ", err.Error()) http.Error(w, "Bad Request", http.StatusBadRequest) From 41454fa0aa356f1c299590f9d10ee486d35660e0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:41:08 +0100 Subject: [PATCH 06/14] . --- internals/config/tokens.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internals/config/tokens.go b/internals/config/tokens.go index 485b39cd..beb3dcc1 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -90,7 +90,7 @@ func parseTokenConfigs(configArray []structure.CONFIG) map[string]structure.CONF func getSchemeTagByPointer(config any, tag string, fieldPointer any) string { v := reflect.ValueOf(config) - if v.Kind() == reflect.Ptr { + if v.Kind() == reflect.Pointer { v = v.Elem() } From 85a907a7e3725b6c3292fdd352f0ff0ff522e9eb Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:45:21 +0100 Subject: [PATCH 07/14] debugging isAuthKey --- internals/proxy/middlewares/auth.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 3ce21bbe..d71a604b 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -67,6 +67,9 @@ func authRequirementHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { isAuthenticated := getContext[bool](req, isAuthKey) + logger.Dev(req.Context().Value(isAuthKey)) + logger.Dev(req.Context()) + if !isAuthenticated { logger.Dev("Unauthenticated: returning") return From 2d5a75c4a745716634d1f050ee9a3250656e4b5e Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:52:32 +0100 Subject: [PATCH 08/14] debugging context --- internals/proxy/middlewares/auth.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index d71a604b..8e370120 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -45,6 +45,8 @@ func authHandler(next http.Handler) http.Handler { token, _ := authChain.Eval(w, req, tokens) + logger.Dev("Eval(): ", token) + if token == "" { onUnauthorized(w) @@ -54,6 +56,8 @@ func authHandler(next http.Handler) http.Handler { setContext(req, tokenKey, token) } + logger.Dev(req.Context().Value(isAuthKey)) + next.ServeHTTP(w, req) }) } @@ -67,9 +71,6 @@ func authRequirementHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { isAuthenticated := getContext[bool](req, isAuthKey) - logger.Dev(req.Context().Value(isAuthKey)) - logger.Dev(req.Context()) - if !isAuthenticated { logger.Dev("Unauthenticated: returning") return From 6ef46ca22d1a8c5da43946cd1024e679e61f3f14 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 17:58:52 +0100 Subject: [PATCH 09/14] assign req to req ptr after WithContext() --- internals/proxy/middlewares/auth.go | 11 +++-------- internals/proxy/middlewares/common.go | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 8e370120..a6757d33 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -45,19 +45,15 @@ func authHandler(next http.Handler) http.Handler { token, _ := authChain.Eval(w, req, tokens) - logger.Dev("Eval(): ", token) - if token == "" { onUnauthorized(w) - setContext(req, isAuthKey, false) + req = setContext(req, isAuthKey, false) } else { - setContext(req, isAuthKey, true) - setContext(req, tokenKey, token) + req = setContext(req, isAuthKey, true) + req = setContext(req, tokenKey, token) } - logger.Dev(req.Context().Value(isAuthKey)) - next.ServeHTTP(w, req) }) } @@ -72,7 +68,6 @@ func authRequirementHandler(next http.Handler) http.Handler { isAuthenticated := getContext[bool](req, isAuthKey) if !isAuthenticated { - logger.Dev("Unauthenticated: returning") return } diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index 0000c5ac..cd497e20 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -15,9 +15,9 @@ type Context struct { type contextKey string -func setContext(req *http.Request, key, value any) { +func setContext(req *http.Request, key, value any) *http.Request { ctx := context.WithValue(req.Context(), key, value) - req = req.WithContext(ctx) + return req.WithContext(ctx) } func getContext[T any](req *http.Request, key any) T { From 1e080b1125bb2ef32b00134d540b4920b6f80795 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:02:22 +0100 Subject: [PATCH 10/14] ... log.go --- internals/proxy/middlewares/log.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index 0a84c5e0..c71f3775 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -41,7 +41,7 @@ func loggingHandler(next http.Handler) http.Handler { l = logger.Get() } - setContext(req, loggerKey, l) + req = setContext(req, loggerKey, l) if !l.IsDev() { l.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) From d0ca8a26e59c801daec3f3738a58c3a28583b491 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:05:51 +0100 Subject: [PATCH 11/14] add missing space in caller stack --- internals/proxy/middlewares/log.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index c71f3775..f922ddd6 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -28,7 +28,7 @@ func loggingHandler(next http.Handler) http.Handler { options := logger.DefaultOptions() options.EncodeCaller = func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { - enc.AppendString(caller.TrimmedPath() + conf.NAME) + enc.AppendString(caller.TrimmedPath() + " " + conf.NAME) } l, err := logger.New(logLevel, options) From 6195a19aa7205abfbebd1d15fffb0f16a7d427ef Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:09:56 +0100 Subject: [PATCH 12/14] only print name if set --- internals/proxy/middlewares/log.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index f922ddd6..96fe536c 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -28,7 +28,13 @@ func loggingHandler(next http.Handler) http.Handler { options := logger.DefaultOptions() options.EncodeCaller = func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) { - enc.AppendString(caller.TrimmedPath() + " " + conf.NAME) + var name string + + if strings.TrimSpace(conf.NAME) != "" { + name = " " + conf.NAME + } + + enc.AppendString(caller.TrimmedPath() + name) } l, err := logger.New(logLevel, options) From d379594b73477d0182d42c52c74364298a2969f0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:10:12 +0100 Subject: [PATCH 13/14] bump gotl to v0.0.10 --- go.mod | 2 +- go.sum | 22 ++-------------------- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 536fe5b7..8fc41b9c 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/codeshelldev/secured-signal-api go 1.25.5 -require github.com/codeshelldev/gotl v0.0.10-9 +require github.com/codeshelldev/gotl v0.0.10 require go.uber.org/zap v1.27.1 diff --git a/go.sum b/go.sum index 9386e648..72f06e3e 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,5 @@ -github.com/codeshelldev/gotl v0.0.9 h1:cdLA6XzPt+f4RIW24Yx3dqBbRAq5JO0obzuwhaOgsEo= -github.com/codeshelldev/gotl v0.0.9/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-1 h1:x7lOZMNzwpfssvznUxetzmK8Tiwe26xH0bdpl31/hX0= -github.com/codeshelldev/gotl v0.0.10-1/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-2 h1:ZwKGk3hA+mLIoS9SwAVJFs0urSYxYvaAuy/qYOuX9Fo= -github.com/codeshelldev/gotl v0.0.10-2/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-3 h1:qOm5pEsMGcL432PMnEa4H1Hjzf0jkrPttgZ+UW7R60U= -github.com/codeshelldev/gotl v0.0.10-3/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-4 h1:b+GONwZ0bkQwZQWfOuamt+9R9pFms8ZUzCwRKq5wNrc= -github.com/codeshelldev/gotl v0.0.10-4/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-5 h1:NmOkvi51HoCeutHZMNgfEU9c0XHBSWnixQjmJg3slt8= -github.com/codeshelldev/gotl v0.0.10-5/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-6 h1:yUccL8JKUsHNd4XnvpKxiAdpZTpTn74j/M8QLqIXRoE= -github.com/codeshelldev/gotl v0.0.10-6/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-7 h1:LX4JG9XXUkIkiUVbA5HMZDEs7IJdjUsN7yvX3VjhwCs= -github.com/codeshelldev/gotl v0.0.10-7/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-8 h1:2+R/pn71w9NnwTA6kkEwZ/f6TUCBwkEIy40sReAVlLg= -github.com/codeshelldev/gotl v0.0.10-8/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= -github.com/codeshelldev/gotl v0.0.10-9 h1:kV9DRsALEhNYIp5IAhA7MnYzLjrBVgfWKLborEScPxI= -github.com/codeshelldev/gotl v0.0.10-9/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= +github.com/codeshelldev/gotl v0.0.10 h1:/2HOPXTlG1HplbXvkB1cZG6NQlGHCiZfWR1pMj6X55M= +github.com/codeshelldev/gotl v0.0.10/go.mod h1:rDkJma6eQSRfCr7ieX9/esn3/uAWNzjHfpjlr9j6FFk= 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/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= From 8bd9b91878c717cac9f4047bf5c57cecf2cbe55e Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sat, 3 Jan 2026 18:15:35 +0100 Subject: [PATCH 14/14] dont overwrite name if not empty --- internals/config/tokens.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internals/config/tokens.go b/internals/config/tokens.go index beb3dcc1..6fb44532 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -117,5 +117,9 @@ func setTokenConfigName(config *configutils.Config, p string) { filename := filepath.Base(p) filenameWithoutExt := strings.TrimSuffix(filename, filepath.Ext(filename)) - config.Layer.Set(nameField, filenameWithoutExt) + name := config.Layer.String(nameField) + + if strings.TrimSpace(name) == "" { + config.Layer.Set(nameField, filenameWithoutExt) + } } \ No newline at end of file