From f91ea4bc19f418449c8be2b11949059e7196fc07 Mon Sep 17 00:00:00 2001
From: Daniel <dhaavi@users.noreply.github.com>
Date: Mon, 8 Aug 2022 14:47:20 +0200
Subject: [PATCH] Add option to immediately export/backup generated signet

---
 cmd/cfg-signet.go   | 46 +++++++++++++++++++++++---------------------
 cmd/cmd-generate.go | 47 +++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 67 insertions(+), 26 deletions(-)

diff --git a/cmd/cfg-signet.go b/cmd/cfg-signet.go
index 9ef217e..9029f7c 100644
--- a/cmd/cfg-signet.go
+++ b/cmd/cfg-signet.go
@@ -12,7 +12,7 @@ import (
 )
 
 //nolint:gocognit
-func newSignet(name, scheme string) (*jess.Signet, error) {
+func newSignet(name, scheme string, saveToTrustStore bool) (*jess.Signet, error) {
 	// get name
 	name = strings.TrimSpace(name)
 	if name == "" {
@@ -110,28 +110,30 @@ func newSignet(name, scheme string) (*jess.Signet, error) {
 		Created: time.Now(),
 	}
 
-	// write signet
-	err = trustStore.StoreSignet(signet)
-	if err != nil {
-		return nil, err
-	}
+	if saveToTrustStore {
+		// write signet
+		err = trustStore.StoreSignet(signet)
+		if err != nil {
+			return nil, err
+		}
 
-	// export as recipient
-	switch scheme {
-	case jess.SignetSchemePassword, jess.SignetSchemeKey:
-		// is secret, no recipient
-	default:
-		rcpt, err := signet.AsRecipient()
-		if err != nil {
-			return nil, err
-		}
-		err = rcpt.StoreKey()
-		if err != nil {
-			return nil, err
-		}
-		err = trustStore.StoreSignet(rcpt)
-		if err != nil {
-			return nil, err
+		// export as recipient
+		switch scheme {
+		case jess.SignetSchemePassword, jess.SignetSchemeKey:
+			// is secret, no recipient
+		default:
+			rcpt, err := signet.AsRecipient()
+			if err != nil {
+				return nil, err
+			}
+			err = rcpt.StoreKey()
+			if err != nil {
+				return nil, err
+			}
+			err = trustStore.StoreSignet(rcpt)
+			if err != nil {
+				return nil, err
+			}
 		}
 	}
 
diff --git a/cmd/cmd-generate.go b/cmd/cmd-generate.go
index e4f9b21..09bff8f 100644
--- a/cmd/cmd-generate.go
+++ b/cmd/cmd-generate.go
@@ -1,6 +1,8 @@
 package main
 
 import (
+	"fmt"
+
 	"github.com/spf13/cobra"
 )
 
@@ -8,11 +10,13 @@ func init() {
 	rootCmd.AddCommand(generateCmd)
 	generateCmd.Flags().StringVarP(&generateFlagName, "name", "l", "", "specify signet name/label")
 	generateCmd.Flags().StringVarP(&generateFlagScheme, "scheme", "t", "", "specify signet scheme/tool")
+	generateCmd.Flags().BoolVarP(&generateFlagTextOnly, "textonly", "", false, "do not save to trust store and only output directly as text")
 }
 
 var (
-	generateFlagName   string
-	generateFlagScheme string
+	generateFlagName     string
+	generateFlagScheme   string
+	generateFlagTextOnly bool
 
 	generateCmd = &cobra.Command{
 		Use:                   "generate",
@@ -21,8 +25,43 @@ var (
 		Args:                  cobra.NoArgs,
 		PreRunE:               requireTrustStore,
 		RunE: func(cmd *cobra.Command, args []string) error {
-			_, err := newSignet(generateFlagName, generateFlagScheme)
-			return err
+			// Generate new signet
+			signet, err := newSignet(generateFlagName, generateFlagScheme, !generateFlagTextOnly)
+			if err != nil {
+				return err
+			}
+
+			// Output as text if not saved to trust store.
+			if generateFlagTextOnly {
+				// Make text backup.
+				backup, err := signet.Backup(false)
+				if err != nil {
+					return err
+				}
+
+				// Convert to recipient and serialize key.
+				rcpt, err := signet.AsRecipient()
+				if err != nil {
+					return err
+				}
+				err = rcpt.StoreKey()
+				if err != nil {
+					return err
+				}
+
+				// Make text export.
+				export, err := rcpt.Export(false)
+				if err != nil {
+					return err
+				}
+
+				// Write output.
+				fmt.Printf("Generated %s key with ID %s and name %q\n", signet.Scheme, signet.ID, signet.Info.Name)
+				fmt.Printf("Backup (private key): %s\n", backup)
+				fmt.Printf("Export (public key): %s\n", export)
+			}
+
+			return nil
 		},
 	}
 )