From 16c850222f2158d179a8fe091b5cf5133a5a5d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ku=CC=88ng?= Date: Fri, 30 Jan 2026 21:20:53 +0100 Subject: [PATCH 1/3] feat: add PostgreSQL database URL creation and JWT key retrieval functions for macOS --- database_darwin.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++ jwt_darwin.go | 31 ++++++++++++++++++++++++ logger_darwin.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 database_darwin.go create mode 100644 jwt_darwin.go diff --git a/database_darwin.go b/database_darwin.go new file mode 100644 index 0000000..1136c7c --- /dev/null +++ b/database_darwin.go @@ -0,0 +1,59 @@ +//go:build darwin + +package utils + +import ( + "fmt" + "net/url" + "os" + "text/template" + + "gopkg.in/ini.v1" +) + +func CreatePostgresDatabaseURL() (string, error) { + // First check for environment variable (useful for development) + if envURL := os.Getenv("OPENUEM_DATABASE_URL"); envURL != "" { + return envURL, nil + } + + var err error + + // Open ini file + cfg, err := ini.Load(GetConfigFile()) + if err != nil { + return "", err + } + + user, err := cfg.Section("DB").GetKey("PostgresUser") + if err != nil { + return "", fmt.Errorf("could not read PostgresUser from INI") + } + username := url.PathEscape(user.String()) + + host, err := cfg.Section("DB").GetKey("PostgresHost") + if err != nil { + return "", fmt.Errorf("could not read PostgresHost from INI") + } + hostname := url.PathEscape(host.String()) + + port, err := cfg.Section("DB").GetKey("PostgresPort") + if err != nil { + return "", fmt.Errorf("could not read PostgresPort from INI") + } + dbPort := url.PathEscape(port.String()) + + database, err := cfg.Section("DB").GetKey("PostgresDatabase") + if err != nil { + return "", fmt.Errorf("could not read PostgresDatabase from INI") + } + databaseName := url.PathEscape(database.String()) + + pass, err := cfg.Section("DB").GetKey("PostgresPassword") + if err != nil { + return "", fmt.Errorf("could not read PostgresPassword from INI") + } + password := template.URLQueryEscaper(pass.String()) + + return fmt.Sprintf("postgres://%s:%s@%s:%s/%s", username, password, hostname, dbPort, databaseName), nil +} diff --git a/jwt_darwin.go b/jwt_darwin.go new file mode 100644 index 0000000..1f2d63b --- /dev/null +++ b/jwt_darwin.go @@ -0,0 +1,31 @@ +//go:build darwin + +package utils + +import ( + "fmt" + "os" + + "gopkg.in/ini.v1" +) + +func GetJWTKey() (string, error) { + // First check for environment variable (useful for development) + if envKey := os.Getenv("OPENUEM_JWT_KEY"); envKey != "" { + return envKey, nil + } + + // Open ini file + configFile := GetConfigFile() + cfg, err := ini.Load(configFile) + if err != nil { + return "", err + } + + key, err := cfg.Section("JWT").GetKey("Key") + if err != nil { + return "", fmt.Errorf("could not read JWT Key from INI") + } + + return key.String(), nil +} diff --git a/logger_darwin.go b/logger_darwin.go index 7d68a09..5073513 100644 --- a/logger_darwin.go +++ b/logger_darwin.go @@ -3,7 +3,10 @@ package utils import ( + "log" "os" + "path/filepath" + "strings" ) type OpenUEMLogger struct { @@ -13,3 +16,59 @@ type OpenUEMLogger struct { func (l *OpenUEMLogger) Close() { l.LogFile.Close() } + +func NewLogger(logFilename string) *OpenUEMLogger { + var err error + + logger := OpenUEMLogger{} + + // Get user home directory for logs on macOS + homeDir, err := os.UserHomeDir() + if err != nil { + log.Fatalf("[FATAL]: could not get user home directory, reason: %v", err) + } + + wd := filepath.Join(homeDir, ".openuem", "logs") + + if _, err := os.Stat(wd); os.IsNotExist(err) { + if err := os.MkdirAll(wd, 0755); err != nil { + log.Fatalf("[FATAL]: could not create log directory, reason: %v", err) + } + } + + logPath := filepath.Join(wd, logFilename) + logger.LogFile, err = os.Create(logPath) + if err != nil { + log.Fatalf("could not create log file: %v", err) + } + + logPrefix := strings.TrimSuffix(filepath.Base(logFilename), filepath.Ext(logFilename)) + log.SetOutput(logger.LogFile) + log.SetPrefix(logPrefix + ": ") + log.SetFlags(log.Ldate | log.Ltime) + + return &logger +} + +func NewAuthLogger() *log.Logger { + homeDir, err := os.UserHomeDir() + if err != nil { + log.Fatalf("[FATAL]: could not get user home directory, reason: %v", err) + } + + wd := filepath.Join(homeDir, ".openuem", "logs") + + if _, err := os.Stat(wd); os.IsNotExist(err) { + if err := os.MkdirAll(wd, 0755); err != nil { + log.Fatalf("[FATAL]: could not create log directory, reason: %v", err) + } + } + + logPath := filepath.Join(wd, "auth.log") + logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatalf("could not open auth log file: %v", err) + } + + return log.New(logFile, "auth: ", log.Ldate|log.Ltime) +} From f605f7813f87ab6f0db88ee0274e0ee2ac1fbce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ku=CC=88ng?= Date: Fri, 30 Jan 2026 21:20:53 +0100 Subject: [PATCH 2/3] feat: add PostgreSQL database URL creation and JWT key retrieval functions for macOS --- database_darwin.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++ jwt_darwin.go | 31 ++++++++++++++++++++++++ logger_darwin.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 database_darwin.go create mode 100644 jwt_darwin.go diff --git a/database_darwin.go b/database_darwin.go new file mode 100644 index 0000000..1136c7c --- /dev/null +++ b/database_darwin.go @@ -0,0 +1,59 @@ +//go:build darwin + +package utils + +import ( + "fmt" + "net/url" + "os" + "text/template" + + "gopkg.in/ini.v1" +) + +func CreatePostgresDatabaseURL() (string, error) { + // First check for environment variable (useful for development) + if envURL := os.Getenv("OPENUEM_DATABASE_URL"); envURL != "" { + return envURL, nil + } + + var err error + + // Open ini file + cfg, err := ini.Load(GetConfigFile()) + if err != nil { + return "", err + } + + user, err := cfg.Section("DB").GetKey("PostgresUser") + if err != nil { + return "", fmt.Errorf("could not read PostgresUser from INI") + } + username := url.PathEscape(user.String()) + + host, err := cfg.Section("DB").GetKey("PostgresHost") + if err != nil { + return "", fmt.Errorf("could not read PostgresHost from INI") + } + hostname := url.PathEscape(host.String()) + + port, err := cfg.Section("DB").GetKey("PostgresPort") + if err != nil { + return "", fmt.Errorf("could not read PostgresPort from INI") + } + dbPort := url.PathEscape(port.String()) + + database, err := cfg.Section("DB").GetKey("PostgresDatabase") + if err != nil { + return "", fmt.Errorf("could not read PostgresDatabase from INI") + } + databaseName := url.PathEscape(database.String()) + + pass, err := cfg.Section("DB").GetKey("PostgresPassword") + if err != nil { + return "", fmt.Errorf("could not read PostgresPassword from INI") + } + password := template.URLQueryEscaper(pass.String()) + + return fmt.Sprintf("postgres://%s:%s@%s:%s/%s", username, password, hostname, dbPort, databaseName), nil +} diff --git a/jwt_darwin.go b/jwt_darwin.go new file mode 100644 index 0000000..1f2d63b --- /dev/null +++ b/jwt_darwin.go @@ -0,0 +1,31 @@ +//go:build darwin + +package utils + +import ( + "fmt" + "os" + + "gopkg.in/ini.v1" +) + +func GetJWTKey() (string, error) { + // First check for environment variable (useful for development) + if envKey := os.Getenv("OPENUEM_JWT_KEY"); envKey != "" { + return envKey, nil + } + + // Open ini file + configFile := GetConfigFile() + cfg, err := ini.Load(configFile) + if err != nil { + return "", err + } + + key, err := cfg.Section("JWT").GetKey("Key") + if err != nil { + return "", fmt.Errorf("could not read JWT Key from INI") + } + + return key.String(), nil +} diff --git a/logger_darwin.go b/logger_darwin.go index 7d68a09..5073513 100644 --- a/logger_darwin.go +++ b/logger_darwin.go @@ -3,7 +3,10 @@ package utils import ( + "log" "os" + "path/filepath" + "strings" ) type OpenUEMLogger struct { @@ -13,3 +16,59 @@ type OpenUEMLogger struct { func (l *OpenUEMLogger) Close() { l.LogFile.Close() } + +func NewLogger(logFilename string) *OpenUEMLogger { + var err error + + logger := OpenUEMLogger{} + + // Get user home directory for logs on macOS + homeDir, err := os.UserHomeDir() + if err != nil { + log.Fatalf("[FATAL]: could not get user home directory, reason: %v", err) + } + + wd := filepath.Join(homeDir, ".openuem", "logs") + + if _, err := os.Stat(wd); os.IsNotExist(err) { + if err := os.MkdirAll(wd, 0755); err != nil { + log.Fatalf("[FATAL]: could not create log directory, reason: %v", err) + } + } + + logPath := filepath.Join(wd, logFilename) + logger.LogFile, err = os.Create(logPath) + if err != nil { + log.Fatalf("could not create log file: %v", err) + } + + logPrefix := strings.TrimSuffix(filepath.Base(logFilename), filepath.Ext(logFilename)) + log.SetOutput(logger.LogFile) + log.SetPrefix(logPrefix + ": ") + log.SetFlags(log.Ldate | log.Ltime) + + return &logger +} + +func NewAuthLogger() *log.Logger { + homeDir, err := os.UserHomeDir() + if err != nil { + log.Fatalf("[FATAL]: could not get user home directory, reason: %v", err) + } + + wd := filepath.Join(homeDir, ".openuem", "logs") + + if _, err := os.Stat(wd); os.IsNotExist(err) { + if err := os.MkdirAll(wd, 0755); err != nil { + log.Fatalf("[FATAL]: could not create log directory, reason: %v", err) + } + } + + logPath := filepath.Join(wd, "auth.log") + logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatalf("could not open auth log file: %v", err) + } + + return log.New(logFile, "auth: ", log.Ldate|log.Ltime) +} From 9c4db2ee452a0e4f2f7db517c9f3d01e60dfe669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steve=20Ku=CC=88ng?= Date: Tue, 3 Feb 2026 20:04:41 +0100 Subject: [PATCH 3/3] Update module path from open-uem to EigerCode Changed module declaration from github.com/open-uem/utils to github.com/EigerCode/utils --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c348320..0ede8ff 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/open-uem/utils +module github.com/EigerCode/utils go 1.25.5