Skip to content

Commit

Permalink
[FABG-750] Make UserStore persistence optional
Browse files Browse the repository at this point in the history
client.credentialStore.path is no longer required when
an SDK instance is created. When it's not provided, the SDK
will internally create an empty in-memory user store that
will be gone when the SDK instance is closed.

Change-Id: Iede63efd549c3e5519f9b98969e70c6fb9c946ed
Signed-off-by: Aleksandar Likic <aleksandar.likic@securekey.com>
  • Loading branch information
Aleksandar Likic committed Sep 2, 2018
1 parent dcb2645 commit 33034df
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 15 deletions.
21 changes: 13 additions & 8 deletions pkg/fabsdk/factory/defmsp/mspfactory.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,19 @@ func (f *ProviderFactory) CreateUserStore(config msp.IdentityConfig) (msp.UserSt

stateStorePath := config.Client().CredentialStore.Path

stateStore, err := kvs.New(&kvs.FileKeyValueStoreOptions{Path: stateStorePath})
if err != nil {
return nil, errors.WithMessage(err, "CreateNewFileKeyValueStore failed")
}

userStore, err := mspimpl.NewCertFileUserStore1(stateStore)
if err != nil {
return nil, errors.Wrapf(err, "creating a user store failed")
var userStore msp.UserStore

if stateStorePath == "" {
userStore = mspimpl.NewMemoryUserStore()
} else {
stateStore, err := kvs.New(&kvs.FileKeyValueStoreOptions{Path: stateStorePath})
if err != nil {
return nil, errors.WithMessage(err, "CreateNewFileKeyValueStore failed")
}
userStore, err = mspimpl.NewCertFileUserStore1(stateStore)
if err != nil {
return nil, errors.Wrapf(err, "creating a user store failed")
}
}

return userStore, nil
Expand Down
37 changes: 32 additions & 5 deletions pkg/fabsdk/factory/defmsp/mspfactory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ package defmsp
import (
"testing"

"strings"
"reflect"

"github.com/golang/mock/gomock"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/msp"
Expand All @@ -20,6 +20,7 @@ import (
"github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/factory/defcore"
mspimpl "github.com/hyperledger/fabric-sdk-go/pkg/msp"
"github.com/stretchr/testify/assert"
)

func TestCreateUserStore(t *testing.T) {
Expand Down Expand Up @@ -79,8 +80,8 @@ func TestCreateUserStoreEmptyConfig(t *testing.T) {
mockConfig.EXPECT().Client().Return(&mockClientConfig)

_, err := factory.CreateUserStore(mockConfig)
if err == nil {
t.Fatal("Expected error creating user store")
if err != nil {
t.Fatal("Expected user store created")
}
}

Expand All @@ -95,8 +96,8 @@ func TestCreateUserStoreFailConfig(t *testing.T) {
mockConfig.EXPECT().Client().Return(&mockClientConfig)

_, err := factory.CreateUserStore(mockConfig)
if err == nil || !strings.Contains(err.Error(), "FileKeyValueStore path is empty") {
t.Fatal("Expected error creating user store")
if err != nil {
t.Fatal("Expected user store created")
}
}

Expand Down Expand Up @@ -150,3 +151,29 @@ func TestCreateIdentityManager(t *testing.T) {
t.Fatal("Unexpected signing manager created")
}
}

func TestCreateUserStoreWithoutCredentialStorePath(t *testing.T) {

configBackend, err := config.FromFile("../../../core/config/testdata/config_test_embedded_pems.yaml")()
if err != nil {
t.Fatal(err)
}

identityCfg, err := mspimpl.ConfigFromBackend(configBackend...)
if err != nil {
t.Fatal(err)
}

assert.Empty(t, identityCfg.CredentialStorePath())

factory := NewProviderFactory()
userStore, err := factory.CreateUserStore(identityCfg)
if err != nil {
t.Fatalf("Unexpected error creating user store %s", err)
}

_, err = userStore.Load(msp.IdentityIdentifier{MSPID: "abc", ID: "ef"})
assert.Equal(t, msp.ErrUserNotFound, err)

assert.Equal(t, reflect.TypeOf(mspimpl.NewMemoryUserStore()), reflect.TypeOf(userStore))
}
63 changes: 61 additions & 2 deletions test/integration/pkg/client/msp/identity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ import (
"fmt"

"github.com/hyperledger/fabric-sdk-go/pkg/client/msp"
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/core"
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
"github.com/hyperledger/fabric-sdk-go/test/integration"
"github.com/stretchr/testify/assert"
)

func TestIdentity(t *testing.T) {
Expand Down Expand Up @@ -233,10 +235,33 @@ func containsIdentity(identities []*msp.IdentityResponse, request *msp.IdentityR
return false
}

func setupClient(t *testing.T) (*msp.Client, *fabsdk.FabricSDK) {
type setupOptions struct {
configProvider core.ConfigProvider
}

type setupOption func(*setupOptions) error

func withConfigProvider(configProvider core.ConfigProvider) setupOption {
return func(s *setupOptions) error {
s.configProvider = configProvider
return nil
}
}

func setupClient(t *testing.T, opts ...setupOption) (*msp.Client, *fabsdk.FabricSDK) {

o := setupOptions{
configProvider: integration.ConfigBackend,
}
for _, param := range opts {
err := param(&o)
if err != nil {
t.Fatalf("failed to create setup: %s", err)
}
}

// Instantiate the SDK
sdk, err := fabsdk.New(integration.ConfigBackend)
sdk, err := fabsdk.New(o.configProvider)
if err != nil {
t.Fatalf("SDK init failed: %s", err)
}
Expand Down Expand Up @@ -298,3 +323,37 @@ func containsAttribute(att msp.Attribute, attributes []msp.Attribute) bool {
}
return false
}

type emptyCredentialStorePathBackend struct {
}

func (c *emptyCredentialStorePathBackend) Lookup(key string) (interface{}, bool) {
if key == "client.credentialStore.path" {
return "", true
}
return nil, false
}

func TestCreateSDKWithoutCredentialStorePath(t *testing.T) {

integrationConfigProvider, err := integration.ConfigBackend()
assert.Nil(t, err)

emptyCredentialStorePathConfigProvider := func() ([]core.ConfigBackend, error) {
emptyCredentialStorePathBackendSlice := []core.ConfigBackend{
&emptyCredentialStorePathBackend{},
}
return append(emptyCredentialStorePathBackendSlice, integrationConfigProvider...), nil
}

client, sdk := setupClient(t, withConfigProvider(emptyCredentialStorePathConfigProvider))
defer integration.CleanupUserData(t, sdk)

ctxProvider := sdk.Context()
registrarEnrollID, _ := getRegistrarEnrollmentCredentials(t, ctxProvider)

// CA registrar should have been enrolled after the SDK was created
sid, err := client.GetSigningIdentity(registrarEnrollID)
assert.Nil(t, err)
assert.NotNil(t, sid)
}

0 comments on commit 33034df

Please sign in to comment.