133 lines
3.3 KiB
Go
133 lines
3.3 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package mgmt
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/hyperledger/fabric/bccsp"
|
|
"github.com/hyperledger/fabric/common/flogging"
|
|
"github.com/hyperledger/fabric/msp"
|
|
"github.com/hyperledger/fabric/msp/cache"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
// FIXME: AS SOON AS THE CHAIN MANAGEMENT CODE IS COMPLETE,
|
|
// THESE MAPS AND HELPER FUNCTIONS SHOULD DISAPPEAR BECAUSE
|
|
// OWNERSHIP OF PER-CHAIN MSP MANAGERS WILL BE HANDLED BY IT;
|
|
// HOWEVER IN THE INTERIM, THESE HELPER FUNCTIONS ARE REQUIRED
|
|
|
|
var (
|
|
m sync.Mutex
|
|
localMsp msp.MSP
|
|
mspMap = make(map[string]msp.MSPManager)
|
|
mspLogger = flogging.MustGetLogger("msp")
|
|
)
|
|
|
|
// TODO - this is a temporary solution to allow the peer to track whether the
|
|
// MSPManager has been setup for a channel, which indicates whether the channel
|
|
// exists or not
|
|
type mspMgmtMgr struct {
|
|
msp.MSPManager
|
|
}
|
|
|
|
// GetManagerForChain returns the msp manager for the supplied
|
|
// chain; if no such manager exists, one is created
|
|
func GetManagerForChain(chainID string) msp.MSPManager {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
mspMgr, ok := mspMap[chainID]
|
|
if !ok {
|
|
mspLogger.Debugf("Created new msp manager for channel `%s`", chainID)
|
|
mspMgmtMgr := &mspMgmtMgr{msp.NewMSPManager()}
|
|
mspMap[chainID] = mspMgmtMgr
|
|
mspMgr = mspMgmtMgr
|
|
}
|
|
return mspMgr
|
|
}
|
|
|
|
// GetManagers returns all the managers registered
|
|
func GetDeserializers() map[string]msp.IdentityDeserializer {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
clone := make(map[string]msp.IdentityDeserializer)
|
|
|
|
for key, mspManager := range mspMap {
|
|
clone[key] = mspManager
|
|
}
|
|
|
|
return clone
|
|
}
|
|
|
|
// XXXSetMSPManager is a stopgap solution to transition from the custom MSP config block
|
|
// parsing to the channelconfig.Resources interface, while preserving the problematic singleton
|
|
// nature of the MSP manager
|
|
func XXXSetMSPManager(chainID string, manager msp.MSPManager) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
mspMap[chainID] = &mspMgmtMgr{manager}
|
|
}
|
|
|
|
// GetLocalMSP returns the local msp (and creates it if it doesn't exist)
|
|
func GetLocalMSP(cryptoProvider bccsp.BCCSP) msp.MSP {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
if localMsp != nil {
|
|
return localMsp
|
|
}
|
|
|
|
localMsp = loadLocalMSP(cryptoProvider)
|
|
|
|
return localMsp
|
|
}
|
|
|
|
func loadLocalMSP(bccsp bccsp.BCCSP) msp.MSP {
|
|
// determine the type of MSP (by default, we'll use bccspMSP)
|
|
mspType := viper.GetString("peer.localMspType")
|
|
if mspType == "" {
|
|
mspType = msp.ProviderTypeToString(msp.FABRIC)
|
|
}
|
|
|
|
newOpts, found := msp.Options[mspType]
|
|
if !found {
|
|
mspLogger.Panicf("msp type " + mspType + " unknown")
|
|
}
|
|
|
|
mspInst, err := msp.New(newOpts, bccsp)
|
|
if err != nil {
|
|
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
|
|
}
|
|
switch mspType {
|
|
case msp.ProviderTypeToString(msp.FABRIC):
|
|
mspInst, err = cache.New(mspInst)
|
|
if err != nil {
|
|
mspLogger.Fatalf("Failed to initialize local MSP, received err %+v", err)
|
|
}
|
|
case msp.ProviderTypeToString(msp.IDEMIX):
|
|
// Do nothing
|
|
default:
|
|
panic("msp type " + mspType + " unknown")
|
|
}
|
|
|
|
mspLogger.Debugf("Created new local MSP")
|
|
|
|
return mspInst
|
|
}
|
|
|
|
// GetIdentityDeserializer returns the IdentityDeserializer for the given chain
|
|
func GetIdentityDeserializer(chainID string, cryptoProvider bccsp.BCCSP) msp.IdentityDeserializer {
|
|
if chainID == "" {
|
|
return GetLocalMSP(cryptoProvider)
|
|
}
|
|
|
|
return GetManagerForChain(chainID)
|
|
}
|