rpc: verify wallet version (#42)

This commit is contained in:
David Hill 2020-05-21 02:21:50 -05:00 committed by GitHub
parent bb416e8bc9
commit 033ac95c33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 3 deletions

2
go.mod
View File

@ -3,7 +3,7 @@ module github.com/jholdstock/dcrvsp
go 1.13 go 1.13
require ( require (
decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317 decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05
github.com/decred/dcrd/blockchain/stake/v3 v3.0.0-20200511175520-d08cb3f72b3b github.com/decred/dcrd/blockchain/stake/v3 v3.0.0-20200511175520-d08cb3f72b3b
github.com/decred/dcrd/chaincfg/chainhash v1.0.2 github.com/decred/dcrd/chaincfg/chainhash v1.0.2
github.com/decred/dcrd/chaincfg/v3 v3.0.0-20200511175520-d08cb3f72b3b github.com/decred/dcrd/chaincfg/v3 v3.0.0-20200511175520-d08cb3f72b3b

4
go.sum
View File

@ -1,7 +1,7 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
decred.org/cspp v0.3.0/go.mod h1:UygjYilC94dER3BEU65Zzyoqy9ngJfWCD2rdJqvUs2A= decred.org/cspp v0.3.0/go.mod h1:UygjYilC94dER3BEU65Zzyoqy9ngJfWCD2rdJqvUs2A=
decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317 h1:j1fUXpVowoLVVFlaJO7bibK4aSPeQa0EF+nPFuy76Hg= decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05 h1:xongFmW2UgEOGu4zQ4VcQFduExKVBa+dC4aLRQLCCnQ=
decred.org/dcrwallet v1.2.3-0.20200507155221-397dd551e317/go.mod h1:V6pzOHJuuWZaUPUZZL2kiyx9Co3lVD0DRqDXJTWA+3c= decred.org/dcrwallet v1.2.3-0.20200519180100-f1aa4c354e05/go.mod h1:V6pzOHJuuWZaUPUZZL2kiyx9Co3lVD0DRqDXJTWA+3c=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI= github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=

View File

@ -4,13 +4,20 @@ import (
"context" "context"
"crypto/tls" "crypto/tls"
"crypto/x509" "crypto/x509"
"fmt"
"sync" "sync"
wallettypes "decred.org/dcrwallet/rpc/jsonrpc/types"
dcrdtypes "github.com/decred/dcrd/rpc/jsonrpc/types/v2"
"github.com/jrick/wsrpc/v2" "github.com/jrick/wsrpc/v2"
) )
type Client func() (*wsrpc.Client, error) type Client func() (*wsrpc.Client, error)
const (
requiredWalletVersion = "8.1.0"
)
// Setup accepts RPC connection details, creates an RPC client, and returns a // Setup accepts RPC connection details, creates an RPC client, and returns a
// function which can be called to access the client. The returned function will // function which can be called to access the client. The returned function will
// try to handle any client disconnects by attempting to reconnect, but will // try to handle any client disconnects by attempting to reconnect, but will
@ -72,6 +79,40 @@ func Setup(ctx context.Context, shutdownWg *sync.WaitGroup, user, pass, addr str
return nil, err return nil, err
} }
log.Infof("Dialed RPC websocket %v", addr) log.Infof("Dialed RPC websocket %v", addr)
// Verify dcrwallet at is at the required api version
var verMap map[string]dcrdtypes.VersionResult
err = c.Call(ctx, "version", &verMap)
if err != nil {
c.Close()
return nil, fmt.Errorf("wallet %v version failed: %v",
addr, err)
}
walletVersion, exists := verMap["dcrwalletjsonrpcapi"]
if !exists {
c.Close()
return nil, fmt.Errorf("wallet %v version response "+
"missing 'dcrwalletjsonrpcapi'", addr)
}
if walletVersion.VersionString != requiredWalletVersion {
c.Close()
return nil, fmt.Errorf("wallet %v is not at the "+
"proper version: %s != %s", addr,
walletVersion.VersionString, requiredWalletVersion)
}
// Verify dcrwallet is voting
var walletInfo wallettypes.WalletInfoResult
err = c.Call(ctx, "walletinfo", &walletInfo)
if err != nil {
c.Close()
return nil, err
}
if !walletInfo.Voting || !walletInfo.Unlocked {
c.Close()
return nil, fmt.Errorf("wallet %s has voting disabled", addr)
}
return c, nil return c, nil
} }
} }