Browse Source

cli: implement ethereum presale wallet import via cli

zelig 10 years ago
parent
commit
d1b52efdb5
2 changed files with 59 additions and 27 deletions
  1. 12 0
      accounts/account_manager.go
  2. 47 27
      cmd/ethereum/main.go

+ 12 - 0
accounts/account_manager.go

@@ -239,3 +239,15 @@ func (am *Manager) Import(path string, keyAuth string) (Account, error) {
 	}
 	return Account{Address: key.Address}, nil
 }
+
+func (am *Manager) ImportPreSaleKey(keyJSON []byte, password string) (acc Account, err error) {
+	var key *crypto.Key
+	key, err = crypto.ImportPreSaleKey(am.keyStore, keyJSON, password)
+	if err != nil {
+		return
+	}
+	if err = am.keyStore.StoreKey(key, password); err != nil {
+		return
+	}
+	return Account{Address: key.Address}, nil
+}

+ 47 - 27
cmd/ethereum/main.go

@@ -23,6 +23,7 @@ package main
 import (
 	"bufio"
 	"fmt"
+	"io/ioutil"
 	"os"
 	"runtime"
 	"strconv"
@@ -74,6 +75,19 @@ Regular users do not need to execute it.
 The output of this command is supposed to be machine-readable.
 `,
 		},
+
+		{
+			Action: accountList,
+			Name:   "wallet",
+			Usage:  "ethereum presale wallet",
+			Subcommands: []cli.Command{
+				{
+					Action: importWallet,
+					Name:   "import",
+					Usage:  "import ethereum presale wallet",
+				},
+			},
+		},
 		{
 			Action: accountList,
 			Name:   "account",
@@ -280,22 +294,7 @@ func unlockAccount(ctx *cli.Context, am *accounts.Manager, account string) (pass
 		var err error
 		// Load startup keys. XXX we are going to need a different format
 		// Attempt to unlock the account
-		passfile := ctx.GlobalString(utils.PasswordFileFlag.Name)
-		if len(passfile) == 0 {
-			fmt.Println("Please enter a passphrase now.")
-			auth, err := readPassword("Passphrase: ", true)
-			if err != nil {
-				utils.Fatalf("%v", err)
-			}
-
-			passphrase = auth
-
-		} else {
-			if passphrase, err = common.ReadAllFile(passfile); err != nil {
-				utils.Fatalf("Unable to read password file '%s': %v", passfile, err)
-			}
-		}
-
+		passphrase := getPassPhrase(ctx, "", false)
 		err = am.Unlock(common.FromHex(account), passphrase)
 		if err != nil {
 			utils.Fatalf("Unlock account failed '%v'", err)
@@ -335,22 +334,23 @@ func accountList(ctx *cli.Context) {
 	}
 }
 
-func getPassPhrase(ctx *cli.Context) (passphrase string) {
+func getPassPhrase(ctx *cli.Context, desc string, confirmation bool) (passphrase string) {
 	if !ctx.GlobalBool(utils.UnencryptedKeysFlag.Name) {
 		passfile := ctx.GlobalString(utils.PasswordFileFlag.Name)
 		if len(passfile) == 0 {
-			fmt.Println("The new account will be encrypted with a passphrase.")
-			fmt.Println("Please enter a passphrase now.")
+			fmt.Println(desc)
 			auth, err := readPassword("Passphrase: ", true)
 			if err != nil {
 				utils.Fatalf("%v", err)
 			}
-			confirm, err := readPassword("Repeat Passphrase: ", false)
-			if err != nil {
-				utils.Fatalf("%v", err)
-			}
-			if auth != confirm {
-				utils.Fatalf("Passphrases did not match.")
+			if confirmation {
+				confirm, err := readPassword("Repeat Passphrase: ", false)
+				if err != nil {
+					utils.Fatalf("%v", err)
+				}
+				if auth != confirm {
+					utils.Fatalf("Passphrases did not match.")
+				}
 			}
 			passphrase = auth
 
@@ -366,7 +366,7 @@ func getPassPhrase(ctx *cli.Context) (passphrase string) {
 
 func accountCreate(ctx *cli.Context) {
 	am := utils.GetAccountManager(ctx)
-	passphrase := getPassPhrase(ctx)
+	passphrase := getPassPhrase(ctx, "Your new account is locked with a password. Please give a password. Do not forget this password.", true)
 	acct, err := am.NewAccount(passphrase)
 	if err != nil {
 		utils.Fatalf("Could not create the account: %v", err)
@@ -374,13 +374,33 @@ func accountCreate(ctx *cli.Context) {
 	fmt.Printf("Address: %x\n", acct)
 }
 
+func importWallet(ctx *cli.Context) {
+	keyfile := ctx.Args().First()
+	if len(keyfile) == 0 {
+		utils.Fatalf("keyfile must be given as argument")
+	}
+	keyJson, err := ioutil.ReadFile(keyfile)
+	if err != nil {
+		utils.Fatalf("Could not read wallet file: %v", err)
+	}
+
+	am := utils.GetAccountManager(ctx)
+	passphrase := getPassPhrase(ctx, "", false)
+
+	acct, err := am.ImportPreSaleKey(keyJson, passphrase)
+	if err != nil {
+		utils.Fatalf("Could not create the account: %v", err)
+	}
+	fmt.Printf("Address: %x\n", acct)
+}
+
 func accountImport(ctx *cli.Context) {
 	keyfile := ctx.Args().First()
 	if len(keyfile) == 0 {
 		utils.Fatalf("keyfile must be given as argument")
 	}
 	am := utils.GetAccountManager(ctx)
-	passphrase := getPassPhrase(ctx)
+	passphrase := getPassPhrase(ctx, "Your new account is locked with a password. Please give a password. Do not forget this password.", true)
 	acct, err := am.Import(keyfile, passphrase)
 	if err != nil {
 		utils.Fatalf("Could not create the account: %v", err)