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  }