Skip to content

Commit

Permalink
[FAB-5214] Move Identity from Client to User
Browse files Browse the repository at this point in the history
- Moved Identity function
- Renamed MSP package to Identity

Change-Id: I12e69f1f03f886d9f9cada2a6aa14d639fef59fa
Signed-off-by: Troy Ronda <troy@troyronda.com>
  • Loading branch information
troyronda committed Jul 7, 2017
1 parent 1d36d9e commit 223e728
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 48 deletions.
2 changes: 2 additions & 0 deletions api/apifabca/user.go
Expand Up @@ -33,6 +33,8 @@ type User interface {
EnrollmentCertificate() []byte
PrivateKey() bccsp.Key

Identity() ([]byte, error)

// TODO: TCerts
//GenerateTcerts(count int, attributes []string)
}
1 change: 0 additions & 1 deletion api/apifabclient/fabricclient.go
Expand Up @@ -47,7 +47,6 @@ type FabricClient interface {
InstallChaincode(chaincodeName string, chaincodePath string, chaincodeVersion string, chaincodePackage []byte, targets []Peer) ([]*txn.TransactionProposalResponse, string, error)
QueryChannels(peer Peer) (*pb.ChannelQueryResponse, error)
QueryInstalledChaincodes(peer Peer) (*pb.ChaincodeQueryResponse, error)
GetIdentity() ([]byte, error)
GetUserContext() User
SetUserContext(user User)
GetConfig() config.Config // TODO: refactor to a fab client config interface
Expand Down
1 change: 1 addition & 0 deletions api/apifabclient/msp.go → api/apifabclient/identity.go
Expand Up @@ -30,4 +30,5 @@ type User interface {
EnrollmentCertificate() []byte
PrivateKey() bccsp.Key
Roles() []string
Identity() ([]byte, error)
}
6 changes: 3 additions & 3 deletions def/fabapi/fabapi.go
Expand Up @@ -18,8 +18,8 @@ import (
fabricCAClient "github.com/hyperledger/fabric-sdk-go/pkg/fabric-ca-client"
clientImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client"
eventsImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/events"
identityImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/identity"
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
mspImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/msp"
ordererImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/orderer"
peerImpl "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/peer"
bccsp "github.com/hyperledger/fabric/bccsp"
Expand Down Expand Up @@ -119,7 +119,7 @@ func NewUser(config config.Config, msp fabca.FabricCAClient, name string, pwd st
if err != nil {
return nil, fmt.Errorf("Enroll returned error: %v", err)
}
user := mspImpl.NewUser(name, mspID)
user := identityImpl.NewUser(name, mspID)
user.SetPrivateKey(key)
user.SetEnrollmentCertificate(cert)

Expand All @@ -139,7 +139,7 @@ func NewPreEnrolledUser(config config.Config, privateKeyPath string,
return nil, fmt.Errorf("Error reading from the enrollment cert path: %v", err)
}

user := mspImpl.NewUser(username, mspID)
user := identityImpl.NewUser(username, mspID)
user.SetEnrollmentCertificate(enrollmentCert)
user.SetPrivateKey(privateKey)

Expand Down
5 changes: 5 additions & 0 deletions pkg/fabric-ca-client/mocks/mockuser.go
Expand Up @@ -98,6 +98,11 @@ func (u *MockUser) MspID() string {
return u.mspID
}

// Identity returns MockUser's serialized identity
func (u *MockUser) Identity() ([]byte, error) {
return []byte("test"), nil
}

// GenerateTcerts ...
/**
* Gets a batch of TCerts to use for transaction. there is a 1-to-1 relationship between
Expand Down
10 changes: 8 additions & 2 deletions pkg/fabric-client/channel/block.go
Expand Up @@ -42,7 +42,10 @@ func (c *Channel) GenesisBlock(request *fab.GenesisBlockRequest) (*common.Block,
return nil, fmt.Errorf("GenesisBlock - error: Missing nonce input parameter with the required single use number")
}

creator, err := c.clientContext.GetIdentity()
if c.clientContext.GetUserContext() == nil {
return nil, fmt.Errorf("User context needs to be set")
}
creator, err := c.clientContext.GetUserContext().Identity()
if err != nil {
return nil, fmt.Errorf("Error getting creator: %v", err)
}
Expand Down Expand Up @@ -90,7 +93,10 @@ func (c *Channel) block(pos *ab.SeekPosition) (*common.Block, error) {
return nil, fmt.Errorf("error when generating nonce: %v", err)
}

creator, err := c.clientContext.GetIdentity()
if c.clientContext.GetUserContext() == nil {
return nil, fmt.Errorf("User context needs to be set")
}
creator, err := c.clientContext.GetUserContext().Identity()
if err != nil {
return nil, fmt.Errorf("error when serializing identity: %v", err)
}
Expand Down
1 change: 0 additions & 1 deletion pkg/fabric-client/channel/channel.go
Expand Up @@ -35,7 +35,6 @@ type Channel struct {
// ClientContext ...
type ClientContext interface {
GetUserContext() fab.User
GetIdentity() ([]byte, error)
GetCryptoSuite() bccsp.BCCSP
NewTxnID() (apitxn.TransactionID, error)
// TODO: ClientContext.IsSecurityEnabled()
Expand Down
10 changes: 8 additions & 2 deletions pkg/fabric-client/channel/txnproposer.go
Expand Up @@ -113,7 +113,10 @@ func newTransactionProposal(channelID string, request apitxn.ChaincodeInvokeRequ
Input: &pb.ChaincodeInput{Args: argsArray}}}

// create a proposal from a ChaincodeInvocationSpec
creator, err := clientContext.GetIdentity()
if clientContext.GetUserContext() == nil {
return nil, fmt.Errorf("User context needs to be set")
}
creator, err := clientContext.GetUserContext().Identity()
if err != nil {
return nil, fmt.Errorf("Error getting creator: %v", err)
}
Expand Down Expand Up @@ -229,7 +232,10 @@ func (c *Channel) JoinChannel(request *fab.JoinChannelRequest) error {
return fmt.Errorf("JoinChannel - error: Missing block input parameter with the required genesis block")
}

creator, err := c.clientContext.GetIdentity()
if c.clientContext.GetUserContext() == nil {
return fmt.Errorf("User context needs to be set")
}
creator, err := c.clientContext.GetUserContext().Identity()
if err != nil {
return fmt.Errorf("Error getting creator ID: %v", err)
}
Expand Down
5 changes: 4 additions & 1 deletion pkg/fabric-client/channel/txnsender.go
Expand Up @@ -185,7 +185,10 @@ func (c *Channel) SendInstantiateProposal(chaincodeName string,
Type: pb.ChaincodeSpec_GOLANG, ChaincodeId: &pb.ChaincodeID{Name: chaincodeName, Path: chaincodePath, Version: chaincodeVersion},
Input: &pb.ChaincodeInput{Args: argsArray}}}

creator, err := c.clientContext.GetIdentity()
if c.clientContext.GetUserContext() == nil {
return nil, apitxn.TransactionID{}, fmt.Errorf("User context needs to be set")
}
creator, err := c.clientContext.GetUserContext().Identity()
if err != nil {
return nil, apitxn.TransactionID{}, fmt.Errorf("Error getting creator: %v", err)
}
Expand Down
44 changes: 20 additions & 24 deletions pkg/fabric-client/client.go
Expand Up @@ -17,9 +17,9 @@ import (
fab "github.com/hyperledger/fabric-sdk-go/api/apifabclient"
"github.com/hyperledger/fabric-sdk-go/api/apitxn"
channel "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/channel"
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/identity"
fc "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/internal"
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/internal/txnproc"
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/msp"
packager "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/packager"
peer "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/peer"

Expand All @@ -29,7 +29,6 @@ import (
"github.com/hyperledger/fabric/common/crypto"
fcutils "github.com/hyperledger/fabric/common/util"
"github.com/hyperledger/fabric/protos/common"
pb_msp "github.com/hyperledger/fabric/protos/msp"
pb "github.com/hyperledger/fabric/protos/peer"
protos_utils "github.com/hyperledger/fabric/protos/utils"
)
Expand Down Expand Up @@ -153,7 +152,7 @@ func (c *Client) SaveUserToStateStore(user fab.User, skipPersistence bool) error
if c.stateStore == nil {
return fmt.Errorf("stateStore is nil")
}
userJSON := &msp.JSON{
userJSON := &identity.JSON{
MspID: user.MspID(),
Roles: user.Roles(),
PrivateKeySKI: user.PrivateKey().SKI(),
Expand Down Expand Up @@ -195,12 +194,12 @@ func (c *Client) LoadUserFromStateStore(name string) (fab.User, error) {
if err != nil {
return nil, nil
}
var userJSON msp.JSON
var userJSON identity.JSON
err = json.Unmarshal(value, &userJSON)
if err != nil {
return nil, fmt.Errorf("stateStore GetValue return error: %v", err)
}
user := msp.NewUser(name, userJSON.MspID)
user := identity.NewUser(name, userJSON.MspID)
user.SetRoles(userJSON.Roles)
user.SetEnrollmentCertificate(userJSON.EnrollmentCertificate)
key, err := c.cryptoSuite.GetKey(userJSON.PrivateKeySKI)
Expand Down Expand Up @@ -259,7 +258,10 @@ func (c *Client) SignChannelConfig(config []byte) (*common.ConfigSignature, erro
return nil, fmt.Errorf("Channel configuration parameter is required")
}

creator, err := c.GetIdentity()
if c.userContext == nil {
return nil, fmt.Errorf("User context needs to be set")
}
creator, err := c.userContext.Identity()
if err != nil {
return nil, fmt.Errorf("Error getting creator: %v", err)
}
Expand Down Expand Up @@ -389,7 +391,10 @@ func (c *Client) createOrUpdateChannel(request fab.CreateChannelRequest, haveEnv
if err != nil {
return fmt.Errorf("error when building channel header: %v", err)
}
creator, err := c.GetIdentity()
if c.userContext == nil {
return fmt.Errorf("User context needs to be set")
}
creator, err := c.userContext.Identity()
if err != nil {
return fmt.Errorf("Error getting creator: %v", err)
}
Expand Down Expand Up @@ -496,7 +501,10 @@ func (c *Client) InstallChaincode(chaincodeName string, chaincodePath string, ch
Type: pb.ChaincodeSpec_GOLANG, ChaincodeId: &pb.ChaincodeID{Name: chaincodeName, Path: chaincodePath, Version: chaincodeVersion}},
CodePackage: chaincodePackage, EffectiveDate: &google_protobuf.Timestamp{Seconds: int64(now.Second()), Nanos: int32(now.Nanosecond())}}

creator, err := c.GetIdentity()
if c.userContext == nil {
return nil, "", fmt.Errorf("User context needs to be set")
}
creator, err := c.userContext.Identity()
if err != nil {
return nil, "", fmt.Errorf("Error getting creator: %v", err)
}
Expand Down Expand Up @@ -532,21 +540,6 @@ func (c *Client) InstallChaincode(chaincodeName string, chaincodePath string, ch
return transactionProposalResponse, txID, err
}

// GetIdentity returns client's serialized identity
func (c *Client) GetIdentity() ([]byte, error) {

if c.userContext == nil {
return nil, fmt.Errorf("User is nil")
}
serializedIdentity := &pb_msp.SerializedIdentity{Mspid: c.userContext.MspID(),
IdBytes: c.userContext.EnrollmentCertificate()}
identity, err := proto.Marshal(serializedIdentity)
if err != nil {
return nil, fmt.Errorf("Could not Marshal serializedIdentity, err %s", err)
}
return identity, nil
}

// GetUserContext ...
func (c *Client) GetUserContext() fab.User {
return c.userContext
Expand All @@ -565,7 +558,10 @@ func (c *Client) NewTxnID() (apitxn.TransactionID, error) {
return apitxn.TransactionID{}, err
}

creator, err := c.GetIdentity()
if c.userContext == nil {
return apitxn.TransactionID{}, fmt.Errorf("User context needs to be set")
}
creator, err := c.userContext.Identity()
if err != nil {
return apitxn.TransactionID{}, err
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/fabric-client/client_test.go
Expand Up @@ -13,8 +13,8 @@ import (
"time"

fab "github.com/hyperledger/fabric-sdk-go/api/apifabclient"
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/identity"
mocks "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/mocks"
msp "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/msp"

kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
bccspFactory "github.com/hyperledger/fabric/bccsp/factory"
Expand Down Expand Up @@ -66,7 +66,7 @@ func TestClientMethods(t *testing.T) {
}

//Client tests: successfully SaveUserToStateStore with skipPersistence true
user = msp.NewUser("someUser", testMsp)
user = identity.NewUser("someUser", testMsp)
err = client.SaveUserToStateStore(user, true)
if err != nil {
t.Fatalf("client.SaveUserToStateStore return error[%s]", err)
Expand Down
5 changes: 4 additions & 1 deletion pkg/fabric-client/events/consumer/consumer.go
Expand Up @@ -101,7 +101,10 @@ func (ec *eventsClient) send(emsg *ehpb.Event) error {

// RegisterAsync - registers interest in a event and doesn't wait for a response
func (ec *eventsClient) RegisterAsync(ies []*ehpb.Interest) error {
creator, err := ec.client.GetIdentity()
if ec.client.GetUserContext() == nil {
return fmt.Errorf("User context needs to be set")
}
creator, err := ec.client.GetUserContext().Identity()
if err != nil {
return fmt.Errorf("Error getting creator: %v", err)
}
Expand Down
Expand Up @@ -4,10 +4,14 @@ Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package msp
package identity

import (
"fmt"

"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric/bccsp"
pb_msp "github.com/hyperledger/fabric/protos/msp"
)

// User represents a Fabric user registered at an MSP
Expand Down Expand Up @@ -84,6 +88,17 @@ func (u *User) MspID() string {
return u.mspID
}

// Identity returns client's serialized identity
func (u *User) Identity() ([]byte, error) {
serializedIdentity := &pb_msp.SerializedIdentity{Mspid: u.MspID(),
IdBytes: u.EnrollmentCertificate()}
identity, err := proto.Marshal(serializedIdentity)
if err != nil {
return nil, fmt.Errorf("Could not Marshal serializedIdentity, err %s", err)
}
return identity, nil
}

// GenerateTcerts Gets a batch of TCerts to use for transaction. there is a 1-to-1 relationship between
// TCert and Transaction. The TCert can be generated locally by the SDK using the user’s crypto materials.
// @param {int} count how many in the batch to obtain
Expand Down
Expand Up @@ -4,7 +4,7 @@ Copyright SecureKey Technologies Inc. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/

package msp
package identity

import (
"testing"
Expand Down
6 changes: 0 additions & 6 deletions pkg/fabric-client/mocks/mockclient.go
Expand Up @@ -134,12 +134,6 @@ func (c *MockClient) InstallChaincode(chaincodeName string, chaincodePath string

}

// GetIdentity returns MockClient's serialized identity
func (c *MockClient) GetIdentity() ([]byte, error) {
return []byte("test"), nil

}

// GetUserContext ...
func (c *MockClient) GetUserContext() fab.User {
return c.userContext
Expand Down
5 changes: 5 additions & 0 deletions pkg/fabric-client/mocks/mockuser.go
Expand Up @@ -104,6 +104,11 @@ func (u *MockUser) MspID() string {
return u.mspID
}

// Identity returns MockUser's serialized identity
func (u *MockUser) Identity() ([]byte, error) {
return []byte("test"), nil
}

// GenerateTcerts ...
/**
* Gets a batch of TCerts to use for transaction. there is a 1-to-1 relationship between
Expand Down
6 changes: 3 additions & 3 deletions test/integration/fabric_ca_test.go
Expand Up @@ -22,8 +22,8 @@ import (
config "github.com/hyperledger/fabric-sdk-go/api/apiconfig"

client "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client"
"github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/identity"
kvs "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/keyvaluestore"
msp "github.com/hyperledger/fabric-sdk-go/pkg/fabric-client/msp"
bccspFactory "github.com/hyperledger/fabric/bccsp/factory"

fabricCAClient "github.com/hyperledger/fabric-sdk-go/pkg/fabric-ca-client"
Expand Down Expand Up @@ -113,7 +113,7 @@ func TestRegisterEnrollRevoke(t *testing.T) {
if cert509.Subject.CommonName != "admin" {
t.Fatalf("CommonName in x509 cert is not the enrollmentID")
}
adminUser2 := msp.NewUser("admin", mspID)
adminUser2 := identity.NewUser("admin", mspID)
adminUser2.SetPrivateKey(key)
adminUser2.SetEnrollmentCertificate(cert)
err = client.SaveUserToStateStore(adminUser2, false)
Expand Down Expand Up @@ -150,7 +150,7 @@ func TestRegisterEnrollRevoke(t *testing.T) {
//re-enroll
fmt.Printf("** Attempt to re-enrolled user: '%s'\n", userName)
//create new user object and set certificate and private key of the previously enrolled user
enrolleduser := msp.NewUser(userName, mspID)
enrolleduser := identity.NewUser(userName, mspID)
enrolleduser.SetEnrollmentCertificate(ecert)
enrolleduser.SetPrivateKey(ekey)
//reenroll
Expand Down

0 comments on commit 223e728

Please sign in to comment.