From 895dda9e588f878b9fe109204563bbcb4db1b63a Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:19:26 +0100 Subject: [PATCH 01/11] move utils/config to internals/ --- {utils => internals}/config/loader.go | 35 +++--- .../config/structure/structure.go | 0 {utils => internals}/config/tokens.go | 16 +-- internals/proxy/middlewares/auth.go | 2 +- internals/proxy/middlewares/common.go | 4 +- internals/proxy/middlewares/mapping.go | 2 +- internals/proxy/middlewares/policy.go | 4 +- internals/proxy/middlewares/server.go | 2 +- utils/{config => configutils}/config.go | 102 ++++++++++-------- 9 files changed, 91 insertions(+), 76 deletions(-) rename {utils => internals}/config/loader.go (59%) rename {utils => internals}/config/structure/structure.go (100%) rename {utils => internals}/config/tokens.go (71%) rename utils/{config => configutils}/config.go (52%) diff --git a/utils/config/loader.go b/internals/config/loader.go similarity index 59% rename from utils/config/loader.go rename to internals/config/loader.go index 9c484dd9..de59d83a 100644 --- a/utils/config/loader.go +++ b/internals/config/loader.go @@ -7,7 +7,8 @@ import ( "strconv" "strings" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" + "github.com/codeshelldev/secured-signal-api/utils/configutils" jsonutils "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" @@ -24,6 +25,12 @@ var ENV *structure.ENV = &structure.ENV{ INSECURE: false, } +var defaultsLayer = configutils.New() +var userLayer = configutils.New() +var tokensLayer = configutils.New() + +var configLayer = configutils.New() + func Load() { LoadDefaults() @@ -31,12 +38,12 @@ func Load() { LoadTokens() - LoadEnv(userLayer) + userLayer.LoadEnv() - config = mergeLayers() + configLayer.MergeLayers() - normalizeKeys(config) - templateConfig(config) + configLayer.NormalizeKeys() + configLayer.TemplateConfig() InitTokens() @@ -44,28 +51,28 @@ func Load() { log.Info("Finished Loading Configuration") - log.Dev("Loaded Config:\n" + jsonutils.ToJson(config.All())) - log.Dev("Loaded Token Configs:\n" + jsonutils.ToJson(tokensLayer.All())) + log.Dev("Loaded Config:\n" + jsonutils.ToJson(configLayer.Layer.All())) + log.Dev("Loaded Token Configs:\n" + jsonutils.ToJson(tokensLayer.Layer.All())) } func InitEnv() { - ENV.PORT = strconv.Itoa(config.Int("service.port")) + ENV.PORT = strconv.Itoa(configLayer.Layer.Int("service.port")) - ENV.LOG_LEVEL = strings.ToLower(config.String("loglevel")) + ENV.LOG_LEVEL = strings.ToLower(configLayer.Layer.String("loglevel")) - ENV.API_URL = config.String("api.url") + ENV.API_URL = configLayer.Layer.String("api.url") var settings structure.SETTINGS - transformChildren(config, "settings.message.variables", transformVariables) + configLayer.TransformChildren("settings.message.variables", transformVariables) - config.Unmarshal("settings", &settings) + configLayer.Layer.Unmarshal("settings", &settings) ENV.SETTINGS["*"] = &settings } func LoadDefaults() { - _, err := LoadFile(ENV.DEFAULTS_PATH, defaultsLayer, yaml.Parser()) + _, err := defaultsLayer.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) if err != nil { log.Warn("Could not Load Defaults", ENV.DEFAULTS_PATH) @@ -73,7 +80,7 @@ func LoadDefaults() { } func LoadConfig() { - _, err := LoadFile(ENV.CONFIG_PATH, userLayer, yaml.Parser()) + _, err := userLayer.LoadFile(ENV.CONFIG_PATH, yaml.Parser()) if err != nil { _, fsErr := os.Stat(ENV.CONFIG_PATH) diff --git a/utils/config/structure/structure.go b/internals/config/structure/structure.go similarity index 100% rename from utils/config/structure/structure.go rename to internals/config/structure/structure.go diff --git a/utils/config/tokens.go b/internals/config/tokens.go similarity index 71% rename from utils/config/tokens.go rename to internals/config/tokens.go index fcc852c5..6c9c6341 100644 --- a/utils/config/tokens.go +++ b/internals/config/tokens.go @@ -3,7 +3,7 @@ package config import ( "strconv" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" log "github.com/codeshelldev/secured-signal-api/utils/logger" "github.com/knadh/koanf/parsers/yaml" ) @@ -16,25 +16,25 @@ type TOKEN_CONFIG_ struct { func LoadTokens() { log.Debug("Loading Configs in ", ENV.TOKENS_DIR) - err := LoadDir("tokenconfigs", ENV.TOKENS_DIR, tokensLayer, yaml.Parser()) + err := tokensLayer.LoadDir("tokenconfigs", ENV.TOKENS_DIR, yaml.Parser()) if err != nil { log.Error("Could not Load Configs in ", ENV.TOKENS_DIR, ": ", err.Error()) } - normalizeKeys(tokensLayer) + tokensLayer.NormalizeKeys() - templateConfig(tokensLayer) + tokensLayer.TemplateConfig() } func InitTokens() { - apiTokens := config.Strings("api.tokens") + apiTokens := configLayer.Layer.Strings("api.tokens") var tokenConfigs []TOKEN_CONFIG_ - transformChildrenUnderArray(tokensLayer, "tokenconfigs", "overrides.message.variables", transformVariables) + tokensLayer.TransformChildrenUnderArray("tokenconfigs", "overrides.message.variables", transformVariables) - tokensLayer.Unmarshal("tokenconfigs", &tokenConfigs) + tokensLayer.Layer.Unmarshal("tokenconfigs", &tokenConfigs) overrides := parseTokenConfigs(tokenConfigs) @@ -53,7 +53,7 @@ func InitTokens() { // Set Blocked Endpoints on Config to User Layer Value // => effectively ignoring Default Layer - config.Set("settings.access.endpoints", userLayer.Strings("settings.access.endpoints")) + configLayer.Layer.Set("settings.access.endpoints", userLayer.Layer.Strings("settings.access.endpoints")) } if len(apiTokens) > 0 { diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 202c0ecd..21e767ae 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -7,7 +7,7 @@ import ( "slices" "strings" - "github.com/codeshelldev/secured-signal-api/utils/config" + "github.com/codeshelldev/secured-signal-api/internals/config" log "github.com/codeshelldev/secured-signal-api/utils/logger" ) diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index 432fa78a..c3f56bb8 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -3,8 +3,8 @@ package middlewares import ( "net/http" - "github.com/codeshelldev/secured-signal-api/utils/config" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" + "github.com/codeshelldev/secured-signal-api/internals/config" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" ) type Context struct { diff --git a/internals/proxy/middlewares/mapping.go b/internals/proxy/middlewares/mapping.go index d66c2ba5..a5f51790 100644 --- a/internals/proxy/middlewares/mapping.go +++ b/internals/proxy/middlewares/mapping.go @@ -6,7 +6,7 @@ import ( "net/http" "strconv" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" jsonutils "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" request "github.com/codeshelldev/secured-signal-api/utils/request" diff --git a/internals/proxy/middlewares/policy.go b/internals/proxy/middlewares/policy.go index b252c251..b34c8e7e 100644 --- a/internals/proxy/middlewares/policy.go +++ b/internals/proxy/middlewares/policy.go @@ -5,8 +5,8 @@ import ( "net/http" "strings" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" - "github.com/codeshelldev/secured-signal-api/utils/jsonutils" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" + jsonutils "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" request "github.com/codeshelldev/secured-signal-api/utils/request" ) diff --git a/internals/proxy/middlewares/server.go b/internals/proxy/middlewares/server.go index 84af5737..0495d431 100644 --- a/internals/proxy/middlewares/server.go +++ b/internals/proxy/middlewares/server.go @@ -3,7 +3,7 @@ package middlewares import ( "net/http" - "github.com/codeshelldev/secured-signal-api/utils/config" + "github.com/codeshelldev/secured-signal-api/internals/config" ) var Server Middleware = Middleware{ diff --git a/utils/config/config.go b/utils/configutils/config.go similarity index 52% rename from utils/config/config.go rename to utils/configutils/config.go index 5422647e..22700078 100644 --- a/utils/config/config.go +++ b/utils/configutils/config.go @@ -1,4 +1,4 @@ -package config +package configutils import ( "errors" @@ -16,31 +16,40 @@ import ( "github.com/knadh/koanf/v2" ) -var defaultsLayer = koanf.New(".") -var userLayer = koanf.New(".") -var tokensLayer = koanf.New(".") +var configLock sync.Mutex -var config *koanf.Koanf +type Config struct { + Layer *koanf.Koanf + LoadFunc func() +} -var configLock sync.Mutex +func New() Config { + return Config{ + Layer: koanf.New("."), + } +} -func LoadFile(path string, config *koanf.Koanf, parser koanf.Parser) (koanf.Provider, error) { +func (config Config) OnLoad(onLoad func()) { + config.LoadFunc = onLoad +} + +func (config Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider, error) { log.Debug("Loading Config File: ", path) f := file.Provider(path) - err := config.Load(f, parser) + err := config.Layer.Load(f, parser) if err != nil { return nil, err } - WatchFile(path, f) + WatchFile(path, f, config.LoadFunc) return f, err } -func WatchFile(path string, f *file.File) { +func WatchFile(path string, f *file.File, loadFunc func()) { f.Watch(func(event any, err error) { if err != nil { return @@ -51,11 +60,11 @@ func WatchFile(path string, f *file.File) { configLock.Lock() defer configLock.Unlock() - Load() + loadFunc() }) } -func LoadDir(path string, dir string, config *koanf.Koanf, parser koanf.Parser) error { +func (config Config) LoadDir(path string, dir string, parser koanf.Parser) error { files, err := filepath.Glob(filepath.Join(dir, "*.yml")) if err != nil { @@ -65,30 +74,30 @@ func LoadDir(path string, dir string, config *koanf.Koanf, parser koanf.Parser) var array []any for _, f := range files { - tmp := koanf.New(".") + tmp := New() - _, err := LoadFile(f, tmp, parser) + _, err := tmp.LoadFile(f, parser) if err != nil { return err } - array = append(array, tmp.Raw()) + array = append(array, tmp.Layer.Raw()) } wrapper := map[string]any{ path: array, } - return config.Load(confmap.Provider(wrapper, "."), nil) + return config.Layer.Load(confmap.Provider(wrapper, "."), nil) } -func LoadEnv(config *koanf.Koanf) (koanf.Provider, error) { +func (config Config) LoadEnv() (koanf.Provider, error) { e := env.Provider(".", env.Opt{ - TransformFunc: normalizeEnv, + TransformFunc: config.NormalizeEnv, }) - err := config.Load(e, nil) + err := config.Layer.Load(e, nil) if err != nil { log.Fatal("Error loading env: ", err.Error()) @@ -97,8 +106,8 @@ func LoadEnv(config *koanf.Koanf) (koanf.Provider, error) { return e, err } -func templateConfig(config *koanf.Koanf) { - data := config.All() +func (config Config) TemplateConfig() { + data := config.Layer.All() for key, value := range data { str, isStr := value.(string) @@ -112,42 +121,41 @@ func templateConfig(config *koanf.Koanf) { } } - config.Load(confmap.Provider(data, "."), nil) + config.Layer.Load(confmap.Provider(data, "."), nil) } -func mergeLayers() *koanf.Koanf { - final := koanf.New(".") - - final.Merge(defaultsLayer) - final.Merge(userLayer) +func (config Config) MergeLayers(layers ...*koanf.Koanf) *koanf.Koanf { + for _, layer := range layers { + config.Layer.Merge(layer) + } - return final + return config.Layer } -func normalizeKeys(config *koanf.Koanf) { +func (config Config) NormalizeKeys() { data := map[string]any{} - for _, key := range config.Keys() { + for _, key := range config.Layer.Keys() { lower := strings.ToLower(key) log.Dev("Lowering key: ", key) - data[lower] = config.Get(key) + data[lower] = config.Layer.Get(key) } - config.Delete("") - config.Load(confmap.Provider(data, "."), nil) + config.Layer.Delete("") + config.Layer.Load(confmap.Provider(data, "."), nil) } // Transforms Children of path -func transformChildren(config *koanf.Koanf, path string, transform func(key string, value any) (string, any)) error { +func (config Config) TransformChildren(path string, transform func(key string, value any) (string, any)) error { var sub map[string]any - if !config.Exists(path) { + if !config.Layer.Exists(path) { return errors.New("invalid path") } - err := config.Unmarshal(path, &sub) + err := config.Layer.Unmarshal(path, &sub) if err != nil { return err @@ -161,9 +169,9 @@ func transformChildren(config *koanf.Koanf, path string, transform func(key stri transformed[newKey] = newVal } - config.Delete(path) + config.Layer.Delete(path) - config.Load(confmap.Provider(map[string]any{ + config.Layer.Load(confmap.Provider(map[string]any{ path: transformed, }, "."), nil) @@ -171,10 +179,10 @@ func transformChildren(config *koanf.Koanf, path string, transform func(key stri } // Does the same thing as transformChildren() but does it for each Array Item inside of root and transforms subPath -func transformChildrenUnderArray(config *koanf.Koanf, root string, subPath string, transform func(key string, value any) (string, any)) error { +func (config Config) TransformChildrenUnderArray(root string, subPath string, transform func(key string, value any) (string, any)) error { var array []map[string]any - err := config.Unmarshal(root, &array) + err := config.Layer.Unmarshal(root, &array) if err != nil { return err } @@ -182,19 +190,19 @@ func transformChildrenUnderArray(config *koanf.Koanf, root string, subPath strin transformed := []map[string]any{} for _, data := range array { - tmp := koanf.New(".") + tmp := New() - tmp.Load(confmap.Provider(map[string]any{ + tmp.Layer.Load(confmap.Provider(map[string]any{ "item": data, }, "."), nil) - err := transformChildren(tmp, "item."+subPath, transform) + err := tmp.TransformChildren("item."+subPath, transform) if err != nil { return err } - item := tmp.Get("item") + item := tmp.Layer.Get("item") if item != nil { itemMap, ok := item.(map[string]any) @@ -205,16 +213,16 @@ func transformChildrenUnderArray(config *koanf.Koanf, root string, subPath strin } } - config.Delete(root) + config.Layer.Delete(root) - config.Load(confmap.Provider(map[string]any{ + config.Layer.Load(confmap.Provider(map[string]any{ root: transformed, }, "."), nil) return nil } -func normalizeEnv(key string, value string) (string, any) { +func (config Config) NormalizeEnv(key string, value string) (string, any) { key = strings.ToLower(key) key = strings.ReplaceAll(key, "__", ".") key = strings.ReplaceAll(key, "_", "") From 9fe386a043473d7e1eb6fe83f8be4ac3dc6bea61 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:20:07 +0100 Subject: [PATCH 02/11] rename config.go to configutils.go --- utils/configutils/{config.go => configutils.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename utils/configutils/{config.go => configutils.go} (100%) diff --git a/utils/configutils/config.go b/utils/configutils/configutils.go similarity index 100% rename from utils/configutils/config.go rename to utils/configutils/configutils.go From c1fc5419d830f11ebbe4f64fbbbe180bb2fa3a25 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:27:11 +0100 Subject: [PATCH 03/11] fix old imports --- internals/config/loader.go | 4 ++++ internals/config/tokens.go | 2 ++ main.go | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internals/config/loader.go b/internals/config/loader.go index de59d83a..ebacc737 100644 --- a/internals/config/loader.go +++ b/internals/config/loader.go @@ -72,6 +72,8 @@ func InitEnv() { } func LoadDefaults() { + defaultsLayer.OnLoad(Load) + _, err := defaultsLayer.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) if err != nil { @@ -80,6 +82,8 @@ func LoadDefaults() { } func LoadConfig() { + userLayer.OnLoad(Load) + _, err := userLayer.LoadFile(ENV.CONFIG_PATH, yaml.Parser()) if err != nil { diff --git a/internals/config/tokens.go b/internals/config/tokens.go index 6c9c6341..5f83e683 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -16,6 +16,8 @@ type TOKEN_CONFIG_ struct { func LoadTokens() { log.Debug("Loading Configs in ", ENV.TOKENS_DIR) + tokensLayer.OnLoad(Load) + err := tokensLayer.LoadDir("tokenconfigs", ENV.TOKENS_DIR, yaml.Parser()) if err != nil { diff --git a/main.go b/main.go index f8dcd2ec..d69ca4f4 100644 --- a/main.go +++ b/main.go @@ -4,9 +4,9 @@ import ( "net/http" "os" + config "github.com/codeshelldev/secured-signal-api/internals/config" + "github.com/codeshelldev/secured-signal-api/internals/config/structure" reverseProxy "github.com/codeshelldev/secured-signal-api/internals/proxy" - config "github.com/codeshelldev/secured-signal-api/utils/config" - "github.com/codeshelldev/secured-signal-api/utils/config/structure" docker "github.com/codeshelldev/secured-signal-api/utils/docker" log "github.com/codeshelldev/secured-signal-api/utils/logger" ) From d7e1e57c0feb0f1fb34223efa202bd5144a44500 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:09:42 +0100 Subject: [PATCH 04/11] added pointers for `Config` --- utils/configutils/configutils.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index 22700078..f80e78a8 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -23,17 +23,17 @@ type Config struct { LoadFunc func() } -func New() Config { - return Config{ +func New() *Config { + return &Config{ Layer: koanf.New("."), } } -func (config Config) OnLoad(onLoad func()) { +func (config *Config) OnLoad(onLoad func()) { config.LoadFunc = onLoad } -func (config Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider, error) { +func (config *Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider, error) { log.Debug("Loading Config File: ", path) f := file.Provider(path) @@ -64,7 +64,7 @@ func WatchFile(path string, f *file.File, loadFunc func()) { }) } -func (config Config) LoadDir(path string, dir string, parser koanf.Parser) error { +func (config *Config) LoadDir(path string, dir string, parser koanf.Parser) error { files, err := filepath.Glob(filepath.Join(dir, "*.yml")) if err != nil { @@ -92,7 +92,7 @@ func (config Config) LoadDir(path string, dir string, parser koanf.Parser) error return config.Layer.Load(confmap.Provider(wrapper, "."), nil) } -func (config Config) LoadEnv() (koanf.Provider, error) { +func (config *Config) LoadEnv() (koanf.Provider, error) { e := env.Provider(".", env.Opt{ TransformFunc: config.NormalizeEnv, }) @@ -106,7 +106,7 @@ func (config Config) LoadEnv() (koanf.Provider, error) { return e, err } -func (config Config) TemplateConfig() { +func (config *Config) TemplateConfig() { data := config.Layer.All() for key, value := range data { @@ -124,15 +124,13 @@ func (config Config) TemplateConfig() { config.Layer.Load(confmap.Provider(data, "."), nil) } -func (config Config) MergeLayers(layers ...*koanf.Koanf) *koanf.Koanf { +func (config *Config) MergeLayers(layers ...*koanf.Koanf) { for _, layer := range layers { config.Layer.Merge(layer) } - - return config.Layer } -func (config Config) NormalizeKeys() { +func (config *Config) NormalizeKeys() { data := map[string]any{} for _, key := range config.Layer.Keys() { @@ -148,7 +146,7 @@ func (config Config) NormalizeKeys() { } // Transforms Children of path -func (config Config) TransformChildren(path string, transform func(key string, value any) (string, any)) error { +func (config *Config) TransformChildren(path string, transform func(key string, value any) (string, any)) error { var sub map[string]any if !config.Layer.Exists(path) { @@ -179,7 +177,7 @@ func (config Config) TransformChildren(path string, transform func(key string, v } // Does the same thing as transformChildren() but does it for each Array Item inside of root and transforms subPath -func (config Config) TransformChildrenUnderArray(root string, subPath string, transform func(key string, value any) (string, any)) error { +func (config *Config) TransformChildrenUnderArray(root string, subPath string, transform func(key string, value any) (string, any)) error { var array []map[string]any err := config.Layer.Unmarshal(root, &array) @@ -222,7 +220,7 @@ func (config Config) TransformChildrenUnderArray(root string, subPath string, tr return nil } -func (config Config) NormalizeEnv(key string, value string) (string, any) { +func (config *Config) NormalizeEnv(key string, value string) (string, any) { key = strings.ToLower(key) key = strings.ReplaceAll(key, "__", ".") key = strings.ReplaceAll(key, "_", "") From 0c74ad2f018d4d1feeb019064a6374f63063feb2 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:18:27 +0100 Subject: [PATCH 05/11] move to own func --- internals/config/loader.go | 12 ++++++++---- internals/config/tokens.go | 6 ++---- utils/configutils/configutils.go | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/internals/config/loader.go b/internals/config/loader.go index ebacc737..29559259 100644 --- a/internals/config/loader.go +++ b/internals/config/loader.go @@ -32,6 +32,8 @@ var tokensLayer = configutils.New() var configLayer = configutils.New() func Load() { + InitReload() + LoadDefaults() LoadConfig() @@ -55,6 +57,12 @@ func Load() { log.Dev("Loaded Token Configs:\n" + jsonutils.ToJson(tokensLayer.Layer.All())) } +func InitReload() { + defaultsLayer.OnLoad(Load) + userLayer.OnLoad(Load) + tokensLayer.OnLoad(Load) +} + func InitEnv() { ENV.PORT = strconv.Itoa(configLayer.Layer.Int("service.port")) @@ -72,8 +80,6 @@ func InitEnv() { } func LoadDefaults() { - defaultsLayer.OnLoad(Load) - _, err := defaultsLayer.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) if err != nil { @@ -82,8 +88,6 @@ func LoadDefaults() { } func LoadConfig() { - userLayer.OnLoad(Load) - _, err := userLayer.LoadFile(ENV.CONFIG_PATH, yaml.Parser()) if err != nil { diff --git a/internals/config/tokens.go b/internals/config/tokens.go index 5f83e683..8d7c2a08 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -15,10 +15,8 @@ type TOKEN_CONFIG_ struct { func LoadTokens() { log.Debug("Loading Configs in ", ENV.TOKENS_DIR) - - tokensLayer.OnLoad(Load) - - err := tokensLayer.LoadDir("tokenconfigs", ENV.TOKENS_DIR, yaml.Parser()) + + err := tokensLayer.LoadDir("tokenconfigs", ENV.TOKENS_DIR, ".yml", yaml.Parser()) if err != nil { log.Error("Could not Load Configs in ", ENV.TOKENS_DIR, ": ", err.Error()) diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index f80e78a8..cba8908e 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -64,8 +64,8 @@ func WatchFile(path string, f *file.File, loadFunc func()) { }) } -func (config *Config) LoadDir(path string, dir string, parser koanf.Parser) error { - files, err := filepath.Glob(filepath.Join(dir, "*.yml")) +func (config *Config) LoadDir(path string, dir string, ext string, parser koanf.Parser) error { + files, err := filepath.Glob(filepath.Join(dir, "*" + ext)) if err != nil { return nil From 75f4d3139ccbf5b1d6cc62bdfdf4a2915afb10df Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:26:52 +0100 Subject: [PATCH 06/11] debug pointers --- utils/configutils/configutils.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index cba8908e..cb07e781 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -7,6 +7,7 @@ import ( "strings" "sync" + "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" stringutils "github.com/codeshelldev/secured-signal-api/utils/stringutils" @@ -38,6 +39,8 @@ func (config *Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider f := file.Provider(path) + log.Info("*Config: ", jsonutils.ToJson(config)) + err := config.Layer.Load(f, parser) if err != nil { From ff45896c13950e1f4bd3bfa2ce370b5d80dfe51f Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:30:49 +0100 Subject: [PATCH 07/11] add default warning for when loadfunc is null --- utils/configutils/configutils.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index cb07e781..6885a074 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -7,7 +7,6 @@ import ( "strings" "sync" - "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" stringutils "github.com/codeshelldev/secured-signal-api/utils/stringutils" @@ -27,6 +26,9 @@ type Config struct { func New() *Config { return &Config{ Layer: koanf.New("."), + LoadFunc: func() { + log.Dev("Config.LoadFunc not initialized!") + }, } } @@ -39,8 +41,6 @@ func (config *Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider f := file.Provider(path) - log.Info("*Config: ", jsonutils.ToJson(config)) - err := config.Layer.Load(f, parser) if err != nil { From ad6523a645e6cb1723f2c04e2efb34d9dce39118 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:31:40 +0100 Subject: [PATCH 08/11] testing config output --- utils/configutils/configutils.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index 6885a074..68b055dc 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -43,6 +43,8 @@ func (config *Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider err := config.Layer.Load(f, parser) + log.Info("Config after load:\n", config.Layer.Sprint()) + if err != nil { return nil, err } From 22aac4cdb477fe7be8999bb00da3341a73bd1dd0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:40:51 +0100 Subject: [PATCH 09/11] further debugging of pointers and config load --- internals/config/loader.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internals/config/loader.go b/internals/config/loader.go index 29559259..a482bb51 100644 --- a/internals/config/loader.go +++ b/internals/config/loader.go @@ -82,6 +82,8 @@ func InitEnv() { func LoadDefaults() { _, err := defaultsLayer.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) + log.Info("Back in loader.go:\n", defaultsLayer.Layer.Sprint()) + if err != nil { log.Warn("Could not Load Defaults", ENV.DEFAULTS_PATH) } From 345ebd7ccd476a2191ad22cb2308af9270c9bf44 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:44:47 +0100 Subject: [PATCH 10/11] fix missing params in merge --- internals/config/loader.go | 42 +++++++++++++++----------------- internals/config/tokens.go | 16 ++++++------ utils/configutils/configutils.go | 4 +-- 3 files changed, 29 insertions(+), 33 deletions(-) diff --git a/internals/config/loader.go b/internals/config/loader.go index a482bb51..b4ca9c8d 100644 --- a/internals/config/loader.go +++ b/internals/config/loader.go @@ -25,11 +25,11 @@ var ENV *structure.ENV = &structure.ENV{ INSECURE: false, } -var defaultsLayer = configutils.New() -var userLayer = configutils.New() -var tokensLayer = configutils.New() +var defaultsConf = configutils.New() +var userConf = configutils.New() +var tokenConf = configutils.New() -var configLayer = configutils.New() +var config = configutils.New() func Load() { InitReload() @@ -40,12 +40,12 @@ func Load() { LoadTokens() - userLayer.LoadEnv() + userConf.LoadEnv() - configLayer.MergeLayers() + config.MergeLayers(defaultsConf.Layer, userConf.Layer) - configLayer.NormalizeKeys() - configLayer.TemplateConfig() + config.NormalizeKeys() + config.TemplateConfig() InitTokens() @@ -53,36 +53,34 @@ func Load() { log.Info("Finished Loading Configuration") - log.Dev("Loaded Config:\n" + jsonutils.ToJson(configLayer.Layer.All())) - log.Dev("Loaded Token Configs:\n" + jsonutils.ToJson(tokensLayer.Layer.All())) + log.Dev("Loaded Config:\n" + jsonutils.ToJson(config.Layer.All())) + log.Dev("Loaded Token Configs:\n" + jsonutils.ToJson(tokenConf.Layer.All())) } func InitReload() { - defaultsLayer.OnLoad(Load) - userLayer.OnLoad(Load) - tokensLayer.OnLoad(Load) + defaultsConf.OnLoad(Load) + userConf.OnLoad(Load) + tokenConf.OnLoad(Load) } func InitEnv() { - ENV.PORT = strconv.Itoa(configLayer.Layer.Int("service.port")) + ENV.PORT = strconv.Itoa(config.Layer.Int("service.port")) - ENV.LOG_LEVEL = strings.ToLower(configLayer.Layer.String("loglevel")) + ENV.LOG_LEVEL = strings.ToLower(config.Layer.String("loglevel")) - ENV.API_URL = configLayer.Layer.String("api.url") + ENV.API_URL = config.Layer.String("api.url") var settings structure.SETTINGS - configLayer.TransformChildren("settings.message.variables", transformVariables) + config.TransformChildren("settings.message.variables", transformVariables) - configLayer.Layer.Unmarshal("settings", &settings) + config.Layer.Unmarshal("settings", &settings) ENV.SETTINGS["*"] = &settings } func LoadDefaults() { - _, err := defaultsLayer.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) - - log.Info("Back in loader.go:\n", defaultsLayer.Layer.Sprint()) + _, err := defaultsConf.LoadFile(ENV.DEFAULTS_PATH, yaml.Parser()) if err != nil { log.Warn("Could not Load Defaults", ENV.DEFAULTS_PATH) @@ -90,7 +88,7 @@ func LoadDefaults() { } func LoadConfig() { - _, err := userLayer.LoadFile(ENV.CONFIG_PATH, yaml.Parser()) + _, err := userConf.LoadFile(ENV.CONFIG_PATH, yaml.Parser()) if err != nil { _, fsErr := os.Stat(ENV.CONFIG_PATH) diff --git a/internals/config/tokens.go b/internals/config/tokens.go index 8d7c2a08..d963312f 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -15,26 +15,26 @@ type TOKEN_CONFIG_ struct { func LoadTokens() { log.Debug("Loading Configs in ", ENV.TOKENS_DIR) - - err := tokensLayer.LoadDir("tokenconfigs", ENV.TOKENS_DIR, ".yml", yaml.Parser()) + + err := tokenConf.LoadDir("tokenconfigs", ENV.TOKENS_DIR, ".yml", yaml.Parser()) if err != nil { log.Error("Could not Load Configs in ", ENV.TOKENS_DIR, ": ", err.Error()) } - tokensLayer.NormalizeKeys() + tokenConf.NormalizeKeys() - tokensLayer.TemplateConfig() + tokenConf.TemplateConfig() } func InitTokens() { - apiTokens := configLayer.Layer.Strings("api.tokens") + apiTokens := config.Layer.Strings("api.tokens") var tokenConfigs []TOKEN_CONFIG_ - tokensLayer.TransformChildrenUnderArray("tokenconfigs", "overrides.message.variables", transformVariables) + tokenConf.TransformChildrenUnderArray("tokenconfigs", "overrides.message.variables", transformVariables) - tokensLayer.Layer.Unmarshal("tokenconfigs", &tokenConfigs) + tokenConf.Layer.Unmarshal("tokenconfigs", &tokenConfigs) overrides := parseTokenConfigs(tokenConfigs) @@ -53,7 +53,7 @@ func InitTokens() { // Set Blocked Endpoints on Config to User Layer Value // => effectively ignoring Default Layer - configLayer.Layer.Set("settings.access.endpoints", userLayer.Layer.Strings("settings.access.endpoints")) + config.Layer.Set("settings.access.endpoints", userConf.Layer.Strings("settings.access.endpoints")) } if len(apiTokens) > 0 { diff --git a/utils/configutils/configutils.go b/utils/configutils/configutils.go index 68b055dc..df5b0b62 100644 --- a/utils/configutils/configutils.go +++ b/utils/configutils/configutils.go @@ -42,9 +42,7 @@ func (config *Config) LoadFile(path string, parser koanf.Parser) (koanf.Provider f := file.Provider(path) err := config.Layer.Load(f, parser) - - log.Info("Config after load:\n", config.Layer.Sprint()) - + if err != nil { return nil, err } From 007d0fe3f47d50a1223b7da4800521a3e73f3231 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Tue, 28 Oct 2025 20:47:40 +0100 Subject: [PATCH 11/11] unrelated: removed unneeded logs --- internals/proxy/middlewares/policy.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/internals/proxy/middlewares/policy.go b/internals/proxy/middlewares/policy.go index b34c8e7e..3e3a4558 100644 --- a/internals/proxy/middlewares/policy.go +++ b/internals/proxy/middlewares/policy.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/codeshelldev/secured-signal-api/internals/config/structure" - jsonutils "github.com/codeshelldev/secured-signal-api/utils/jsonutils" log "github.com/codeshelldev/secured-signal-api/utils/logger" request "github.com/codeshelldev/secured-signal-api/utils/request" ) @@ -103,9 +102,6 @@ func doBlock(body map[string]any, headers map[string]any, policies map[string]st for field, policy := range allowed { value, err := getField(field, body, headers) - log.Dev("Checking ", field, "...") - log.Dev("Got Value of ", jsonutils.ToJson(value)) - if value == policy.Value && err == nil { isExplictlyAllowed = true cause = field @@ -116,9 +112,6 @@ func doBlock(body map[string]any, headers map[string]any, policies map[string]st for field, policy := range blocked { value, err := getField(field, body, headers) - log.Dev("Checking ", field, "...") - log.Dev("Got Value of ", jsonutils.ToJson(value)) - if value == policy.Value && err == nil { isExplicitlyBlocked = true cause = field