diff --git a/cmd/connect.go b/cmd/connect.go index 478af0988a67202ef3af7f5f8df86eb241e142ed..badb69b3afe8fe2a9958d3397dfb3dfb796cf07d 100644 --- a/cmd/connect.go +++ b/cmd/connect.go @@ -308,8 +308,16 @@ func insecureConnServer(forceLegacy bool, statePass []byte, statePath, regCode s func secureConnClient(forceLegacy bool, statePass []byte, statePath, regCode string, cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) { // Load client ------------------------------------------------------------------ - messenger := loadOrInitMessenger(forceLegacy, statePass, statePath, regCode, - cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + var messenger *xxdk.E2e + if viper.GetBool(connectionEphemeralFlag) { + fmt.Println("Loading ephemerally") + messenger = loadOrInitMessengerEphemeral(forceLegacy, statePass, statePath, regCode, + cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + } else { + fmt.Println("Loading non-ephemerally") + messenger = loadOrInitMessenger(forceLegacy, statePass, statePath, regCode, + cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + } // Start network threads--------------------------------------------------------- @@ -374,8 +382,16 @@ func insecureConnClient(forceLegacy bool, statePass []byte, statePath, regCode s cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) { // Load client ------------------------------------------------------------------ - messenger := loadOrInitMessenger(forceLegacy, statePass, statePath, regCode, - cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + var messenger *xxdk.E2e + if viper.GetBool(connectionEphemeralFlag) { + fmt.Println("Loading ephemerally") + messenger = loadOrInitMessengerEphemeral(forceLegacy, statePass, statePath, regCode, + cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + } else { + fmt.Println("Loading non-ephemerally") + messenger = loadOrInitMessenger(forceLegacy, statePass, statePath, regCode, + cmixParams, e2eParams, xxdk.DefaultAuthCallbacks{}) + } // Start network threads--------------------------------------------------------- @@ -554,5 +570,12 @@ func init() { " will call the applicable authenticated counterpart") bindFlagHelper(connectionAuthenticatedFlag, connectionCmd) + connectionCmd.Flags().Bool(connectionEphemeralFlag, false, + "This flag is available to both server and client. "+ + "This flag operates as a switch determining the initialization path."+ + "If present, the messenger will be initialized ephemerally. Without this flag, "+ + "the messenger will be initialized as stateful.") + bindFlagHelper(connectionEphemeralFlag, connectionCmd) + rootCmd.AddCommand(connectionCmd) } diff --git a/cmd/flags.go b/cmd/flags.go index 32ce750fae4f6efe97a546b60b24f7633063a52e..5244b7a12b62ee1e1c7d5a718f45b2bbccfad005 100644 --- a/cmd/flags.go +++ b/cmd/flags.go @@ -100,6 +100,7 @@ const ( connectionServerTimeoutFlag = "serverTimeout" connectionDisconnectFlag = "disconnect" connectionAuthenticatedFlag = "authenticated" + connectionEphemeralFlag = "ephemeral" ///////////////// File Transfer subcommand flags ////////////////////////// fileSendFlag = "sendFile" diff --git a/cmd/init.go b/cmd/init.go index 58995ef081ec4a6ff051210fbebaee9b36b3d19d..ca1fadbd2153d194d5d3aa2665b95d6b0753b864 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -123,6 +123,57 @@ func loadOrInitMessenger(forceLegacy bool, password []byte, storeDir, regCode st return messenger } +// loadOrInitMessengerEphemeral will build a new ephemeral xxdk.E2e. +func loadOrInitMessengerEphemeral(forceLegacy bool, password []byte, storeDir, regCode string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams, cbs xxdk.AuthCallbacks) *xxdk.E2e { + jww.INFO.Printf("Using normal sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString("ndf")) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.NewCmix(string(ndfJson), storeDir, password, regCode) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + if forceLegacy { + jww.INFO.Printf("Forcing legacy sender") + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + } else { + identity, err = xxdk.MakeReceptionIdentity(net) + } + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.LoginEphemeral(net, cbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} + // loadOrInitNet will build a new xxdk.Cmix from existing storage // or from a new storage that it will create if none already exists func loadOrInitNet(password []byte, storeDir, regCode string,