github.com/decred/politeia@v1.4.0/politeiawww/cmd/pictl/dcrwallet.go (about) 1 // Copyright (c) 2020-2021 The Decred developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "crypto/tls" 10 "crypto/x509" 11 "fmt" 12 "os" 13 14 "decred.org/dcrwallet/rpc/walletrpc" 15 "golang.org/x/crypto/ssh/terminal" 16 "google.golang.org/grpc" 17 "google.golang.org/grpc/credentials" 18 ) 19 20 type dcrwalletClient struct { 21 conn *grpc.ClientConn 22 wallet walletrpc.WalletServiceClient 23 } 24 25 func newDcrwalletClient(walletHost, walletCert, clientCert, clientKey string) (*dcrwalletClient, error) { 26 serverCAs := x509.NewCertPool() 27 serverCert, err := os.ReadFile(walletCert) 28 if err != nil { 29 return nil, err 30 } 31 if !serverCAs.AppendCertsFromPEM(serverCert) { 32 return nil, fmt.Errorf("no certificates found in %v", 33 walletCert) 34 } 35 keypair, err := tls.LoadX509KeyPair(clientCert, clientKey) 36 if err != nil { 37 return nil, err 38 } 39 creds := credentials.NewTLS(&tls.Config{ 40 Certificates: []tls.Certificate{keypair}, 41 RootCAs: serverCAs, 42 }) 43 conn, err := grpc.Dial(walletHost, grpc.WithTransportCredentials(creds)) 44 if err != nil { 45 return nil, err 46 } 47 return &dcrwalletClient{ 48 conn: conn, 49 wallet: walletrpc.NewWalletServiceClient(conn), 50 }, nil 51 } 52 53 // promptWalletPassword prints a message to stdout prompting the user for their 54 // wallet password then reads in the password from stdin. 55 func promptWalletPassword() ([]byte, error) { 56 printf("Enter the private passphrase of your wallet: ") 57 pass, err := terminal.ReadPassword(int(os.Stdin.Fd())) 58 if err != nil { 59 return nil, err 60 } 61 printf("\n") 62 return bytes.TrimSpace(pass), nil 63 }