From 7857dba57aebf54ef9d57bfdb1ee6fffc7ad4711 Mon Sep 17 00:00:00 2001 From: Stavros Date: Wed, 17 Dec 2025 23:31:24 +0200 Subject: [PATCH] chore: remove unused code --- internal/bootstrap/app_bootstrap.go | 33 ++++- internal/service/docker_service.go | 2 +- internal/utils/app_utils.go | 120 ------------------ internal/utils/app_utils_test.go | 91 ------------- internal/utils/decoders/decoders.go | 80 ------------ internal/utils/decoders/env_decoder.go | 19 --- internal/utils/decoders/env_decoder_test.go | 37 ------ internal/utils/decoders/flags_decoder.go | 30 ----- internal/utils/decoders/flags_decoder_test.go | 37 ------ internal/utils/decoders/label_decoder.go | 12 +- internal/utils/decoders/label_decoder_test.go | 2 +- 11 files changed, 34 insertions(+), 429 deletions(-) delete mode 100644 internal/utils/decoders/decoders.go delete mode 100644 internal/utils/decoders/env_decoder.go delete mode 100644 internal/utils/decoders/env_decoder_test.go delete mode 100644 internal/utils/decoders/flags_decoder.go delete mode 100644 internal/utils/decoders/flags_decoder_test.go diff --git a/internal/bootstrap/app_bootstrap.go b/internal/bootstrap/app_bootstrap.go index b56eab1..400dd1a 100644 --- a/internal/bootstrap/app_bootstrap.go +++ b/internal/bootstrap/app_bootstrap.go @@ -51,14 +51,35 @@ func (app *BootstrapApp) Setup() error { app.context.users = users - // Get OAuth configs - oauthProviders, err := utils.GetOAuthProvidersConfig(os.Environ(), os.Args, app.config.AppURL) + // Setup OAuth providers + app.context.oauthProviders = app.config.OAuth.Providers - if err != nil { - return err + for name, provider := range app.context.oauthProviders { + secret := utils.GetSecret(provider.ClientSecret, provider.ClientSecretFile) + provider.ClientSecret = secret + provider.ClientSecretFile = "" + app.context.oauthProviders[name] = provider } - app.context.oauthProviders = oauthProviders + for id := range config.OverrideProviders { + if provider, exists := app.context.oauthProviders[id]; exists { + if provider.RedirectURL == "" { + provider.RedirectURL = app.config.AppURL + "/api/oauth/callback/" + id + app.context.oauthProviders[id] = provider + } + } + } + + for id, provider := range app.context.oauthProviders { + if provider.Name == "" { + if name, ok := config.OverrideProviders[id]; ok { + provider.Name = name + } else { + provider.Name = utils.Capitalize(id) + } + } + app.context.oauthProviders[id] = provider + } // Get cookie domain cookieDomain, err := utils.GetCookieDomain(app.config.AppURL) @@ -98,7 +119,7 @@ func (app *BootstrapApp) Setup() error { // Configured providers configuredProviders := make([]controller.Provider, 0) - for id, provider := range oauthProviders { + for id, provider := range app.context.oauthProviders { configuredProviders = append(configuredProviders, controller.Provider{ Name: provider.Name, ID: id, diff --git a/internal/service/docker_service.go b/internal/service/docker_service.go index b0f977d..1c39778 100644 --- a/internal/service/docker_service.go +++ b/internal/service/docker_service.go @@ -82,7 +82,7 @@ func (docker *DockerService) GetLabels(appDomain string) (config.App, error) { return config.App{}, err } - labels, err := decoders.DecodeLabels(inspect.Config.Labels) + labels, err := decoders.DecodeLabels[config.Apps](inspect.Config.Labels, "apps") if err != nil { return config.App{}, err } diff --git a/internal/utils/app_utils.go b/internal/utils/app_utils.go index 40f48e8..a2b23c8 100644 --- a/internal/utils/app_utils.go +++ b/internal/utils/app_utils.go @@ -6,12 +6,8 @@ import ( "net/url" "strings" "tinyauth/internal/config" - "tinyauth/internal/utils/decoders" - - "maps" "github.com/gin-gonic/gin" - "github.com/rs/zerolog" "github.com/weppos/publicsuffix-go/publicsuffix" ) @@ -104,119 +100,3 @@ func IsRedirectSafe(redirectURL string, domain string) bool { return hostname == domain } - -func GetLogLevel(level string) zerolog.Level { - switch strings.ToLower(level) { - case "trace": - return zerolog.TraceLevel - case "debug": - return zerolog.DebugLevel - case "info": - return zerolog.InfoLevel - case "warn": - return zerolog.WarnLevel - case "error": - return zerolog.ErrorLevel - case "fatal": - return zerolog.FatalLevel - case "panic": - return zerolog.PanicLevel - default: - return zerolog.InfoLevel - } -} - -func GetOAuthProvidersConfig(env []string, args []string, appUrl string) (map[string]config.OAuthServiceConfig, error) { - providers := make(map[string]config.OAuthServiceConfig) - - // Get from environment variables - envMap := make(map[string]string) - - for _, e := range env { - pair := strings.SplitN(e, "=", 2) - if len(pair) == 2 { - envMap[pair[0]] = pair[1] - } - } - - envProviders, err := decoders.DecodeEnv[config.Providers, config.OAuthServiceConfig](envMap, "providers") - - if err != nil { - return nil, err - } - - maps.Copy(providers, envProviders.Providers) - - // Get from flags - flagsMap := make(map[string]string) - - for _, arg := range args[1:] { - if strings.HasPrefix(arg, "--") { - pair := strings.SplitN(arg[2:], "=", 2) - if len(pair) == 2 { - flagsMap[pair[0]] = pair[1] - } - } - } - - flagProviders, err := decoders.DecodeFlags[config.Providers, config.OAuthServiceConfig](flagsMap, "providers") - - if err != nil { - return nil, err - } - - maps.Copy(providers, flagProviders.Providers) - - // For every provider get correct secret from file if set - for name, provider := range providers { - secret := GetSecret(provider.ClientSecret, provider.ClientSecretFile) - provider.ClientSecret = secret - provider.ClientSecretFile = "" - providers[name] = provider - } - - // If we have google/github providers and no redirect URL then set a default - for id := range config.OverrideProviders { - if provider, exists := providers[id]; exists { - if provider.RedirectURL == "" { - provider.RedirectURL = appUrl + "/api/oauth/callback/" + id - providers[id] = provider - } - } - } - - // Set names - for id, provider := range providers { - if provider.Name == "" { - if name, ok := config.OverrideProviders[id]; ok { - provider.Name = name - } else { - provider.Name = Capitalize(id) - } - } - providers[id] = provider - } - - // Return combined providers - return providers, nil -} - -func ShoudLogJSON(environ []string, args []string) bool { - for _, e := range environ { - pair := strings.SplitN(e, "=", 2) - if len(pair) == 2 && pair[0] == "LOG_JSON" && strings.ToLower(pair[1]) == "true" { - return true - } - } - - for _, arg := range args[1:] { - if strings.HasPrefix(arg, "--log-json=") { - value := strings.SplitN(arg, "=", 2)[1] - if strings.ToLower(value) == "true" { - return true - } - } - } - - return false -} diff --git a/internal/utils/app_utils_test.go b/internal/utils/app_utils_test.go index 71c1aa0..55fde36 100644 --- a/internal/utils/app_utils_test.go +++ b/internal/utils/app_utils_test.go @@ -1,7 +1,6 @@ package utils_test import ( - "os" "testing" "tinyauth/internal/config" "tinyauth/internal/utils" @@ -206,93 +205,3 @@ func TestIsRedirectSafe(t *testing.T) { result = utils.IsRedirectSafe(redirectURL, domain) assert.Equal(t, false, result) } - -func TestGetOAuthProvidersConfig(t *testing.T) { - env := []string{"PROVIDERS_CLIENT1_CLIENT_ID=client1-id", "PROVIDERS_CLIENT1_CLIENT_SECRET=client1-secret"} - args := []string{"/tinyauth/tinyauth", "--providers-client2-client-id=client2-id", "--providers-client2-client-secret=client2-secret"} - - expected := map[string]config.OAuthServiceConfig{ - "client1": { - ClientID: "client1-id", - ClientSecret: "client1-secret", - Name: "Client1", - }, - "client2": { - ClientID: "client2-id", - ClientSecret: "client2-secret", - Name: "Client2", - }, - } - - result, err := utils.GetOAuthProvidersConfig(env, args, "") - assert.NilError(t, err) - assert.DeepEqual(t, expected, result) - - // Case with no providers - env = []string{} - args = []string{"/tinyauth/tinyauth"} - expected = map[string]config.OAuthServiceConfig{} - - result, err = utils.GetOAuthProvidersConfig(env, args, "") - assert.NilError(t, err) - assert.DeepEqual(t, expected, result) - - // Case with secret from file - file, err := os.Create("/tmp/tinyauth_test_file") - assert.NilError(t, err) - - _, err = file.WriteString("file content\n") - assert.NilError(t, err) - - err = file.Close() - assert.NilError(t, err) - defer os.Remove("/tmp/tinyauth_test_file") - - env = []string{"PROVIDERS_CLIENT1_CLIENT_ID=client1-id", "PROVIDERS_CLIENT1_CLIENT_SECRET_FILE=/tmp/tinyauth_test_file"} - args = []string{"/tinyauth/tinyauth"} - expected = map[string]config.OAuthServiceConfig{ - "client1": { - ClientID: "client1-id", - ClientSecret: "file content", - Name: "Client1", - }, - } - - result, err = utils.GetOAuthProvidersConfig(env, args, "") - assert.NilError(t, err) - assert.DeepEqual(t, expected, result) - - // Case with google provider and no redirect URL - env = []string{"PROVIDERS_GOOGLE_CLIENT_ID=google-id", "PROVIDERS_GOOGLE_CLIENT_SECRET=google-secret"} - args = []string{"/tinyauth/tinyauth"} - expected = map[string]config.OAuthServiceConfig{ - "google": { - ClientID: "google-id", - ClientSecret: "google-secret", - RedirectURL: "http://app.url/api/oauth/callback/google", - Name: "Google", - }, - } - - result, err = utils.GetOAuthProvidersConfig(env, args, "http://app.url") - assert.NilError(t, err) - assert.DeepEqual(t, expected, result) -} - -func TestShoudLogJSON(t *testing.T) { - // Test with no env or args - result := utils.ShoudLogJSON([]string{"FOO=bar"}, []string{"tinyauth", "--foo-bar=baz"}) - assert.Equal(t, false, result) - - // Test with env variable set - result = utils.ShoudLogJSON([]string{"LOG_JSON=true"}, []string{"tinyauth", "--foo-bar=baz"}) - assert.Equal(t, true, result) - - // Test with flag set - result = utils.ShoudLogJSON([]string{"FOO=bar"}, []string{"tinyauth", "--log-json=true"}) - assert.Equal(t, true, result) - - // Test with both env and flag set to false - result = utils.ShoudLogJSON([]string{"LOG_JSON=false"}, []string{"tinyauth", "--log-json=false"}) - assert.Equal(t, false, result) -} diff --git a/internal/utils/decoders/decoders.go b/internal/utils/decoders/decoders.go deleted file mode 100644 index 0c3d22d..0000000 --- a/internal/utils/decoders/decoders.go +++ /dev/null @@ -1,80 +0,0 @@ -package decoders - -import ( - "reflect" - "strings" - - "github.com/stoewer/go-strcase" -) - -func normalizeKeys[T any](input map[string]string, root string, sep string) map[string]string { - knownKeys := getKnownKeys[T]() - normalized := make(map[string]string) - - for k, v := range input { - parts := []string{"tinyauth"} - - key := strings.ToLower(k) - key = strings.ReplaceAll(key, sep, "-") - - if !strings.HasPrefix(key, root+"-") { - continue - } - - suffix := "" - - for _, known := range knownKeys { - if strings.HasSuffix(key, known) { - suffix = known - break - } - } - - if suffix == "" { - continue - } - - parts = append(parts, root) - - id := strings.TrimPrefix(key, root+"-") - id = strings.TrimSuffix(id, "-"+suffix) - - if id == "" { - continue - } - - parts = append(parts, id) - parts = append(parts, suffix) - - final := "" - - for i, part := range parts { - if i > 0 { - final += "." - } - final += strcase.LowerCamelCase(part) - } - - normalized[final] = v - } - - return normalized -} - -func getKnownKeys[T any]() []string { - var keys []string - var t T - - v := reflect.ValueOf(t) - typeOfT := v.Type() - - for field := range typeOfT.NumField() { - if typeOfT.Field(field).Tag.Get("field") != "" { - keys = append(keys, typeOfT.Field(field).Tag.Get("field")) - continue - } - keys = append(keys, strcase.KebabCase(typeOfT.Field(field).Name)) - } - - return keys -} diff --git a/internal/utils/decoders/env_decoder.go b/internal/utils/decoders/env_decoder.go deleted file mode 100644 index 532ec64..0000000 --- a/internal/utils/decoders/env_decoder.go +++ /dev/null @@ -1,19 +0,0 @@ -package decoders - -import ( - "github.com/traefik/paerser/parser" -) - -func DecodeEnv[T any, C any](env map[string]string, subName string) (T, error) { - var result T - - normalized := normalizeKeys[C](env, subName, "_") - - err := parser.Decode(normalized, &result, "tinyauth", "tinyauth."+subName) - - if err != nil { - return result, err - } - - return result, nil -} diff --git a/internal/utils/decoders/env_decoder_test.go b/internal/utils/decoders/env_decoder_test.go deleted file mode 100644 index da679f0..0000000 --- a/internal/utils/decoders/env_decoder_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package decoders_test - -import ( - "testing" - "tinyauth/internal/config" - "tinyauth/internal/utils/decoders" - - "gotest.tools/v3/assert" -) - -func TestDecodeEnv(t *testing.T) { - // Setup - env := map[string]string{ - "PROVIDERS_GOOGLE_CLIENT_ID": "google-client-id", - "PROVIDERS_GOOGLE_CLIENT_SECRET": "google-client-secret", - "PROVIDERS_MY_GITHUB_CLIENT_ID": "github-client-id", - "PROVIDERS_MY_GITHUB_CLIENT_SECRET": "github-client-secret", - } - - expected := config.Providers{ - Providers: map[string]config.OAuthServiceConfig{ - "google": { - ClientID: "google-client-id", - ClientSecret: "google-client-secret", - }, - "myGithub": { - ClientID: "github-client-id", - ClientSecret: "github-client-secret", - }, - }, - } - - // Execute - result, err := decoders.DecodeEnv[config.Providers, config.OAuthServiceConfig](env, "providers") - assert.NilError(t, err) - assert.DeepEqual(t, result, expected) -} diff --git a/internal/utils/decoders/flags_decoder.go b/internal/utils/decoders/flags_decoder.go deleted file mode 100644 index 0aae234..0000000 --- a/internal/utils/decoders/flags_decoder.go +++ /dev/null @@ -1,30 +0,0 @@ -package decoders - -import ( - "strings" - - "github.com/traefik/paerser/parser" -) - -func DecodeFlags[T any, C any](flags map[string]string, subName string) (T, error) { - var result T - - filtered := filterFlags(flags) - normalized := normalizeKeys[C](filtered, subName, "_") - - err := parser.Decode(normalized, &result, "tinyauth", "tinyauth."+subName) - - if err != nil { - return result, err - } - - return result, nil -} - -func filterFlags(flags map[string]string) map[string]string { - filtered := make(map[string]string) - for k, v := range flags { - filtered[strings.TrimPrefix(k, "--")] = v - } - return filtered -} diff --git a/internal/utils/decoders/flags_decoder_test.go b/internal/utils/decoders/flags_decoder_test.go deleted file mode 100644 index 935dea0..0000000 --- a/internal/utils/decoders/flags_decoder_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package decoders_test - -import ( - "testing" - "tinyauth/internal/config" - "tinyauth/internal/utils/decoders" - - "gotest.tools/v3/assert" -) - -func TestDecodeFlags(t *testing.T) { - // Setup - flags := map[string]string{ - "--providers-google-client-id": "google-client-id", - "--providers-google-client-secret": "google-client-secret", - "--providers-my-github-client-id": "github-client-id", - "--providers-my-github-client-secret": "github-client-secret", - } - - expected := config.Providers{ - Providers: map[string]config.OAuthServiceConfig{ - "google": { - ClientID: "google-client-id", - ClientSecret: "google-client-secret", - }, - "myGithub": { - ClientID: "github-client-id", - ClientSecret: "github-client-secret", - }, - }, - } - - // Execute - result, err := decoders.DecodeFlags[config.Providers, config.OAuthServiceConfig](flags, "providers") - assert.NilError(t, err) - assert.DeepEqual(t, result, expected) -} diff --git a/internal/utils/decoders/label_decoder.go b/internal/utils/decoders/label_decoder.go index e83e275..8a9862f 100644 --- a/internal/utils/decoders/label_decoder.go +++ b/internal/utils/decoders/label_decoder.go @@ -1,19 +1,17 @@ package decoders import ( - "tinyauth/internal/config" - "github.com/traefik/paerser/parser" ) -func DecodeLabels(labels map[string]string) (config.Apps, error) { - var appLabels config.Apps +func DecodeLabels[T any](labels map[string]string, root string) (T, error) { + var labelsDecoded T - err := parser.Decode(labels, &appLabels, "tinyauth", "tinyauth.apps") + err := parser.Decode(labels, &labelsDecoded, "tinyauth", "tinyauth."+root) if err != nil { - return config.Apps{}, err + return labelsDecoded, err } - return appLabels, nil + return labelsDecoded, nil } diff --git a/internal/utils/decoders/label_decoder_test.go b/internal/utils/decoders/label_decoder_test.go index 63189d1..c8874f4 100644 --- a/internal/utils/decoders/label_decoder_test.go +++ b/internal/utils/decoders/label_decoder_test.go @@ -62,7 +62,7 @@ func TestDecodeLabels(t *testing.T) { } // Test - result, err := decoders.DecodeLabels(test) + result, err := decoders.DecodeLabels[config.Apps](test, "apps") assert.NilError(t, err) assert.DeepEqual(t, expected, result) }