frostfs-node/pkg/core/client/util.go
Leonard Lyubich 4661f65975 [#645] client/cache: Check response public key in all client operations
There is a need to check if public key in the RPC response matches the
public key of the related storage node declared in network map.

Define `ErrWrongPublicKey` error. Implement RPC response handler's
constructor `AssertKeyResponseCallback` which checks public key. Construct
handler and pass it to client's option `WithResponseInfoHandler`.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
2021-09-30 20:57:00 +03:00

56 lines
1.5 KiB
Go

package client
import (
"bytes"
"fmt"
"github.com/nspcc-dev/neofs-api-go/pkg/client"
"github.com/nspcc-dev/neofs-node/pkg/network"
)
func nodeInfoFromKeyAddr(dst *NodeInfo, k []byte, a network.AddressGroup) {
dst.SetPublicKey(k)
dst.SetAddressGroup(a)
}
// NodeInfoFromRawNetmapElement fills NodeInfo structure from the interface of raw netmap member's descriptor.
//
// Args must not be nil.
func NodeInfoFromRawNetmapElement(dst *NodeInfo, info interface {
PublicKey() []byte
IterateAddresses(func(string) bool)
NumberOfAddresses() int
}) error {
var a network.AddressGroup
err := a.FromIterator(info)
if err != nil {
return fmt.Errorf("parse network address: %w", err)
}
nodeInfoFromKeyAddr(dst, info.PublicKey(), a)
return nil
}
// NodeInfoFromNetmapElement fills NodeInfo structure from the interface of parsed netmap member's descriptor.
//
// Args must not be nil.
func NodeInfoFromNetmapElement(dst *NodeInfo, info interface {
PublicKey() []byte
Addresses() network.AddressGroup
}) {
nodeInfoFromKeyAddr(dst, info.PublicKey(), info.Addresses())
}
// AssertKeyResponseCallback returns client response callback which checks if the response was signed by expected key.
// Returns ErrWrongPublicKey in case of key mismatch.
func AssertKeyResponseCallback(expectedKey []byte) func(client.ResponseMetaInfo) error {
return func(info client.ResponseMetaInfo) error {
if !bytes.Equal(info.ResponderKey(), expectedKey) {
return ErrWrongPublicKey
}
return nil
}
}