Skip to content

Commit

Permalink
[FAB-8874] Refactor Identity interface
Browse files Browse the repository at this point in the history
SDK now exposes only SigningIdentity interface,
modelled after the MSP identity interfaces in Fabric.

Change-Id: I01afb5109323e4d9d25fd8c8c6be5ac870c57714
Signed-off-by: Aleksandar Likic <aleksandar.likic@securekey.com>
  • Loading branch information
troyronda authored and Aleksandar Likic committed Mar 15, 2018
1 parent 6cd78cf commit 7582442
Show file tree
Hide file tree
Showing 76 changed files with 669 additions and 694 deletions.
3 changes: 2 additions & 1 deletion pkg/client/channel/api_test.go
Expand Up @@ -13,6 +13,7 @@ import (

"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
fcmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/mocks"
"github.com/stretchr/testify/assert"
)

Expand Down Expand Up @@ -72,7 +73,7 @@ func TestWithTargetURLsValid(t *testing.T) {
}

func setupMockTestContext(username string, mspID string) *fcmocks.MockContext {
user := fcmocks.NewMockUserWithMSPID(username, mspID)
user := mspmocks.NewMockSigningIdentity(username, mspID)
ctx := fcmocks.NewMockContext(user)
return ctx
}
Expand Down
5 changes: 3 additions & 2 deletions pkg/client/channel/chclient_test.go
Expand Up @@ -25,6 +25,7 @@ import (
fcmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/peer"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/txn"
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/mocks"
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
)
Expand Down Expand Up @@ -507,13 +508,13 @@ func setupTestChannelService(ctx context.Client, orderers []fab.Orderer) (fab.Ch
}

func setupTestContext() context.Client {
user := fcmocks.NewMockUser("test")
user := mspmocks.NewMockSigningIdentity("test", "test")
ctx := fcmocks.NewMockContext(user)
return ctx
}

func setupCustomTestContext(t *testing.T, selectionService fab.SelectionService, discoveryService fab.DiscoveryService, orderers []fab.Orderer) context.ClientProvider {
user := fcmocks.NewMockUser("test")
user := mspmocks.NewMockSigningIdentity("test", "test")
ctx := fcmocks.NewMockContext(user)

if orderers == nil {
Expand Down
3 changes: 2 additions & 1 deletion pkg/client/channel/invoke/txnhandler_test.go
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
fcmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/mocks"
pb "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
)

Expand Down Expand Up @@ -250,7 +251,7 @@ func setupChannelClientContext(discErr error, selectionErr error, peers []fab.Pe
}

func setupTestContext() context.Client {
user := fcmocks.NewMockUser("test")
user := mspmocks.NewMockSigningIdentity("test", "test")
ctx := fcmocks.NewMockContext(user)
return ctx
}
Expand Down
Expand Up @@ -61,7 +61,7 @@ func newCCPolicyProvider(providers api.Providers, channelID string, username str
return nil, errors.New("invalid options to create identity, invalid org name")
}

identity, err := mgr.GetUser(username)
identity, err := mgr.GetSigningIdentity(username)
if err != nil {
return nil, errors.WithMessage(err, "unable to create identity for ccl policy provider")
}
Expand All @@ -83,7 +83,7 @@ type ccPolicyProvider struct {
config core.Config
providers context.Providers
channelID string
identity msp.Identity
identity msp.SigningIdentity
targetPeers []core.ChannelPeer
ccDataMap map[string]*ccprovider.ChaincodeData // TODO: Add expiry and configurable timeout for map entries
mutex sync.RWMutex
Expand Down Expand Up @@ -214,7 +214,7 @@ func (dp *ccPolicyProvider) getChannelContext() context.ChannelProvider {
return func() (context.Channel, error) {
//Get Client Context
clientProvider := func() (context.Client, error) {
return &contextImpl.Client{Providers: dp.providers, Identity: dp.identity}, nil
return &contextImpl.Client{Providers: dp.providers, SigningIdentity: dp.identity}, nil
}

return contextImpl.NewChannel(clientProvider, dp.channelID)
Expand Down
Expand Up @@ -16,10 +16,11 @@ import (
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
mocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
"github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/factory/defsvc"
"github.com/hyperledger/fabric-sdk-go/pkg/logging"
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/mocks"
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/core/common/ccprovider"
"github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/common"
)
Expand Down Expand Up @@ -473,7 +474,7 @@ func (lbp *customLBP) Choose(peerGroups []pgresolver.PeerGroup) pgresolver.PeerG
}

func setupMockContext(username, orgName string) context.Providers {
user := mocks.NewMockUserWithMSPID(username, orgName)
user := mspmocks.NewMockSigningIdentity(username, orgName)
ctx := mocks.NewMockContext(user)
return ctx
}
4 changes: 2 additions & 2 deletions pkg/client/ledger/ledger.go
Expand Up @@ -81,10 +81,10 @@ func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client
// check if target filter was set - if not set the default
if ledgerClient.filter == nil {
// Default target filter is based on user msp
if channelContext.MSPID() == "" {
if channelContext.Identifier().MSPID == "" {
return nil, errors.New("mspID not available in user context")
}
filter := &mspFilter{mspID: channelContext.MSPID()}
filter := &mspFilter{mspID: channelContext.Identifier().MSPID}
ledgerClient.filter = filter
}

Expand Down
3 changes: 2 additions & 1 deletion pkg/client/ledger/opts_test.go
Expand Up @@ -12,6 +12,7 @@ import (

"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
fcmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
mspmocks "github.com/hyperledger/fabric-sdk-go/pkg/msp/mocks"
"github.com/stretchr/testify/assert"
)

Expand Down Expand Up @@ -71,7 +72,7 @@ func TestWithTargetURLsValid(t *testing.T) {
}

func setupTestContext(username string, mspID string) *fcmocks.MockContext {
user := fcmocks.NewMockUserWithMSPID(username, mspID)
user := mspmocks.NewMockSigningIdentity(username, mspID)
ctx := fcmocks.NewMockContext(user)
return ctx
}
Expand Down
File renamed without changes.
21 changes: 4 additions & 17 deletions pkg/client/msp/msp.go → pkg/client/msp/client.go
Expand Up @@ -180,28 +180,15 @@ func (c *Client) Revoke(request *RevocationRequest) (*RevocationResponse, error)
}, nil
}

// GetSigningIdentity returns a signing identity for the given user name
func (c *Client) GetSigningIdentity(username string) (*SigningIdentity, error) {
user, err := c.GetUser(username)
if err != nil {
if err == mspctx.ErrUserNotFound {
return nil, ErrUserNotFound
}
return nil, err
}
signingIdentity := &SigningIdentity{MSPID: user.MSPID(), PrivateKey: user.PrivateKey(), EnrollmentCert: user.EnrollmentCertificate()}
return signingIdentity, nil
}

// GetUser returns a user for the given user name
func (c *Client) GetUser(username string) (User, error) {
// GetSigningIdentity returns signing identity for id
func (c *Client) GetSigningIdentity(id string) (mspctx.SigningIdentity, error) {
im, _ := c.ctx.IdentityManager(c.orgName)
user, err := im.GetUser(username)
si, err := im.GetSigningIdentity(id)
if err != nil {
if err == mspctx.ErrUserNotFound {
return nil, ErrUserNotFound
}
return nil, err
}
return user, nil
return si, nil
}
14 changes: 7 additions & 7 deletions pkg/client/msp/msp_test.go → pkg/client/msp/client_test.go
Expand Up @@ -73,16 +73,16 @@ func TestMSP(t *testing.T) {
t.Fatalf("Expected to find user")
}

enrolledUser, err := msp.GetUser(enrollUsername)
enrolledUser, err := msp.GetSigningIdentity(enrollUsername)
if err != nil {
t.Fatalf("Expected to find user")
}

if enrolledUser.Name() != enrollUsername {
if enrolledUser.Identifier().ID != enrollUsername {
t.Fatalf("Enrolled user name doesn't match")
}

if enrolledUser.MSPID() != "Org1MSP" {
if enrolledUser.Identifier().MSPID != "Org1MSP" {
t.Fatalf("Enrolled user mspID doesn't match")
}

Expand All @@ -96,7 +96,7 @@ func TestMSP(t *testing.T) {
}

// Reenroll with appropriate user
err = msp.Reenroll(enrolledUser.Name())
err = msp.Reenroll(enrolledUser.Identifier().ID)
if err != nil {
t.Fatalf("Reenroll return error %v", err)
}
Expand All @@ -114,16 +114,16 @@ func TestMSP(t *testing.T) {
t.Fatalf("Enroll return error %v", err)
}

org2EnrolledUser, err := msp.GetUser(org2lUsername)
org2EnrolledUser, err := msp.GetSigningIdentity(org2lUsername)
if err != nil {
t.Fatalf("Expected to find user")
}

if org2EnrolledUser.Name() != org2lUsername {
if org2EnrolledUser.Identifier().ID != org2lUsername {
t.Fatalf("Enrolled user name doesn't match")
}

if org2EnrolledUser.MSPID() != "Org2MSP" {
if org2EnrolledUser.Identifier().MSPID != "Org2MSP" {
t.Fatalf("Enrolled user mspID doesn't match")
}

Expand Down
22 changes: 22 additions & 0 deletions pkg/client/msp/identity.go
@@ -0,0 +1,22 @@
/*
Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package msp

import (
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/msp"
"github.com/pkg/errors"
)

var (
// ErrUserNotFound indicates the user was not found
ErrUserNotFound = errors.New("user not found")
)

// IdentityManager provides management of identities in a Fabric network
type IdentityManager interface {
GetSigningIdentity(name string) (msp.SigningIdentity, error)
}
93 changes: 0 additions & 93 deletions pkg/client/msp/user.go

This file was deleted.

16 changes: 8 additions & 8 deletions pkg/client/resmgmt/resmgmt.go
Expand Up @@ -88,9 +88,9 @@ type requestOptions struct {
//SaveChannelRequest used to save channel request
type SaveChannelRequest struct {
ChannelID string
ChannelConfig io.Reader // ChannelConfig data source
ChannelConfigPath string // Convenience option to use the named file as ChannelConfig reader
SigningIdentities []msp.Identity // Users that sign channel configuration
ChannelConfig io.Reader // ChannelConfig data source
ChannelConfigPath string // Convenience option to use the named file as ChannelConfig reader
SigningIdentities []msp.SigningIdentity // Users that sign channel configuration
// TODO: support pre-signed signature blocks
}

Expand Down Expand Up @@ -155,10 +155,10 @@ func New(clientProvider context.ClientProvider, opts ...ClientOption) (*Client,
//check if target filter was set - if not set the default
if resourceClient.filter == nil {
// Default target filter is based on user msp
if ctx.MSPID() == "" {
if ctx.Identifier().MSPID == "" {
return nil, errors.New("mspID not available in user context")
}
rcFilter := &mspFilter{mspID: ctx.MSPID()}
rcFilter := &mspFilter{mspID: ctx.Identifier().MSPID}
resourceClient.filter = rcFilter
}
return resourceClient, nil
Expand Down Expand Up @@ -670,7 +670,7 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)

// Signing user has to belong to one of configured channel organisations
// In case that order org is one of channel orgs we can use context user
var signers []msp.Identity
var signers []msp.SigningIdentity

if len(req.SigningIdentities) > 0 {
for _, id := range req.SigningIdentities {
Expand Down Expand Up @@ -698,8 +698,8 @@ func (rc *Client) SaveChannel(req SaveChannelRequest, options ...RequestOption)
for _, signer := range signers {

sigCtx := contextImpl.Client{
Identity: signer,
Providers: rc.ctx,
SigningIdentity: signer,
Providers: rc.ctx,
}

configSignature, err := resource.CreateConfigSignature(&sigCtx, chConfig)
Expand Down

0 comments on commit 7582442

Please sign in to comment.