Skip to content

Commit c029a93

Browse files
aleem1314Alessio Tregliaamaury1093
authored
[Backport] fix: grpc-gateway error codes (#9015) (#9078)
Co-authored-by: Alessio Treglia <[email protected]> Co-authored-by: Amaury <[email protected]>
1 parent 1e03826 commit c029a93

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ Ref: https://keepachangelog.com/en/1.0.0/
3434

3535
# Changelog
3636

37+
## [Unreleased]
38+
39+
### Bug Fixes
40+
41+
* (gRPC) [\#9015](https://github.com/cosmos/cosmos-sdk/pull/9015) Fix invalid status code when accessing gRPC endpoints.
42+
3743
## [v0.42.3](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.42.3) - 2021-03-24
3844

3945
This release fixes a security vulnerability identified in x/bank.

client/query.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ import (
66
"strings"
77

88
"github.com/pkg/errors"
9+
"google.golang.org/grpc/codes"
10+
"google.golang.org/grpc/status"
911

1012
abci "github.com/tendermint/tendermint/abci/types"
1113
tmbytes "github.com/tendermint/tendermint/libs/bytes"
1214
rpcclient "github.com/tendermint/tendermint/rpc/client"
1315

1416
"github.com/cosmos/cosmos-sdk/store/rootmulti"
1517
sdk "github.com/cosmos/cosmos-sdk/types"
18+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
1619
)
1720

1821
// GetNode returns an RPC client. If the context's client is not defined, an
@@ -79,7 +82,7 @@ func (ctx Context) queryABCI(req abci.RequestQuery) (abci.ResponseQuery, error)
7982
}
8083

8184
if !result.Response.IsOK() {
82-
return abci.ResponseQuery{}, errors.New(result.Response.Log)
85+
return abci.ResponseQuery{}, sdkErrorToGRPCError(result.Response)
8386
}
8487

8588
// data from trusted node or subspace query doesn't need verification
@@ -90,6 +93,19 @@ func (ctx Context) queryABCI(req abci.RequestQuery) (abci.ResponseQuery, error)
9093
return result.Response, nil
9194
}
9295

96+
func sdkErrorToGRPCError(resp abci.ResponseQuery) error {
97+
switch resp.Code {
98+
case sdkerrors.ErrInvalidRequest.ABCICode():
99+
return status.Error(codes.InvalidArgument, resp.Log)
100+
case sdkerrors.ErrUnauthorized.ABCICode():
101+
return status.Error(codes.Unauthenticated, resp.Log)
102+
case sdkerrors.ErrKeyNotFound.ABCICode():
103+
return status.Error(codes.NotFound, resp.Log)
104+
default:
105+
return status.Error(codes.Unknown, resp.Log)
106+
}
107+
}
108+
93109
// query performs a query to a Tendermint node with the provided store name
94110
// and path. It returns the result and height of the query upon success
95111
// or an error if the query fails.

x/staking/client/rest/grpc_query_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@ package rest_test
44

55
import (
66
"fmt"
7+
"io/ioutil"
8+
"net/http"
79
"testing"
810

911
"github.com/gogo/protobuf/proto"
1012
"github.com/stretchr/testify/suite"
1113

14+
"github.com/cosmos/cosmos-sdk/client/flags"
15+
"github.com/cosmos/cosmos-sdk/crypto/hd"
16+
"github.com/cosmos/cosmos-sdk/crypto/keyring"
1217
"github.com/cosmos/cosmos-sdk/testutil"
1318
"github.com/cosmos/cosmos-sdk/testutil/network"
1419
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -401,6 +406,35 @@ func (s *IntegrationTestSuite) TestQueryUnbondingDelegationGRPC() {
401406
}
402407
}
403408

409+
func (s *IntegrationTestSuite) TestQueryDelegationsResponseCode() {
410+
val := s.network.Validators[0]
411+
412+
// Create new account in the keyring.
413+
info, _, err := val.ClientCtx.Keyring.NewMnemonic("test", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1)
414+
s.Require().NoError(err)
415+
newAddr := sdk.AccAddress(info.GetPubKey().Address())
416+
417+
s.T().Log("expect 404 error for address without delegations")
418+
res, statusCode, err := getRequest(fmt.Sprintf("%s/cosmos/staking/v1beta1/delegations/%s", val.APIAddress, newAddr.String()))
419+
s.Require().NoError(err)
420+
s.Require().Contains(string(res), "\"code\": 5")
421+
s.Require().Equal(404, statusCode)
422+
}
423+
424+
func getRequest(url string) ([]byte, int, error) {
425+
res, err := http.Get(url) // nolint:gosec
426+
body, err := ioutil.ReadAll(res.Body)
427+
if err != nil {
428+
return nil, res.StatusCode, err
429+
}
430+
431+
if err = res.Body.Close(); err != nil {
432+
return nil, res.StatusCode, err
433+
}
434+
435+
return body, res.StatusCode, nil
436+
}
437+
404438
func (s *IntegrationTestSuite) TestQueryDelegatorDelegationsGRPC() {
405439
val := s.network.Validators[0]
406440
baseURL := val.APIAddress

0 commit comments

Comments
 (0)