From ad5b6ed83a702b8860d3f1bd34f7e4e9ecf4a568 Mon Sep 17 00:00:00 2001 From: Ivan Date: Mon, 1 Dec 2025 20:30:27 -0600 Subject: [PATCH] Add LoadOrCreateTransportIdentity function to manage transport identity loading and creation; implement storage path handling and error logging for improved identity management. --- pkg/identity/identity.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pkg/identity/identity.go b/pkg/identity/identity.go index 05ef7de..4890425 100644 --- a/pkg/identity/identity.go +++ b/pkg/identity/identity.go @@ -532,6 +532,41 @@ func FromFile(path string) (*Identity, error) { return ident, nil } +func LoadOrCreateTransportIdentity() (*Identity, error) { + storagePath := os.Getenv("RETICULUM_STORAGE_PATH") + if storagePath == "" { + homeDir, err := os.UserHomeDir() + if err != nil { + return nil, fmt.Errorf("failed to get home directory: %w", err) + } + storagePath = fmt.Sprintf("%s/.reticulum/storage", homeDir) + } + + if err := os.MkdirAll(storagePath, 0700); err != nil { + return nil, fmt.Errorf("failed to create storage directory: %w", err) + } + + transportIdentityPath := fmt.Sprintf("%s/transport_identity", storagePath) + + if ident, err := FromFile(transportIdentityPath); err == nil { + debug.Log(debug.DEBUG_INFO, "Loaded transport identity from storage") + return ident, nil + } + + debug.Log(debug.DEBUG_INFO, "No valid transport identity in storage, creating new one") + ident, err := New() + if err != nil { + return nil, fmt.Errorf("failed to create transport identity: %w", err) + } + + if err := ident.ToFile(transportIdentityPath); err != nil { + return nil, fmt.Errorf("failed to save transport identity: %w", err) + } + + debug.Log(debug.DEBUG_INFO, "Created and saved transport identity") + return ident, nil +} + func (i *Identity) loadPrivateKey(privateKey, signingSeed []byte) error { if len(privateKey) != 32 || len(signingSeed) != 32 { return errors.New("invalid private key length")