github.com/ewagmig/fabric@v2.1.1+incompatible/msp/mspmgrimpl.go (about)

     1  /*
     2  Copyright IBM Corp. 2016 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package msp
    18  
    19  import (
    20  	"github.com/golang/protobuf/proto"
    21  	"github.com/hyperledger/fabric-protos-go/msp"
    22  	"github.com/hyperledger/fabric/common/flogging"
    23  	"github.com/pkg/errors"
    24  )
    25  
    26  var mspLogger = flogging.MustGetLogger("msp")
    27  
    28  type mspManagerImpl struct {
    29  	// map that contains all MSPs that we have setup or otherwise added
    30  	mspsMap map[string]MSP
    31  
    32  	// map that maps MSPs by their provider types
    33  	mspsByProviders map[ProviderType][]MSP
    34  
    35  	// error that might have occurred at startup
    36  	up bool
    37  }
    38  
    39  // NewMSPManager returns a new MSP manager instance;
    40  // note that this instance is not initialized until
    41  // the Setup method is called
    42  func NewMSPManager() MSPManager {
    43  	return &mspManagerImpl{}
    44  }
    45  
    46  // Setup initializes the internal data structures of this manager and creates MSPs
    47  func (mgr *mspManagerImpl) Setup(msps []MSP) error {
    48  	if mgr.up {
    49  		mspLogger.Infof("MSP manager already up")
    50  		return nil
    51  	}
    52  
    53  	mspLogger.Debugf("Setting up the MSP manager (%d msps)", len(msps))
    54  
    55  	// create the map that assigns MSP IDs to their manager instance - once
    56  	mgr.mspsMap = make(map[string]MSP)
    57  
    58  	// create the map that sorts MSPs by their provider types
    59  	mgr.mspsByProviders = make(map[ProviderType][]MSP)
    60  
    61  	for _, msp := range msps {
    62  		// add the MSP to the map of active MSPs
    63  		mspID, err := msp.GetIdentifier()
    64  		if err != nil {
    65  			return errors.WithMessage(err, "could not extract msp identifier")
    66  		}
    67  		mgr.mspsMap[mspID] = msp
    68  		providerType := msp.GetType()
    69  		mgr.mspsByProviders[providerType] = append(mgr.mspsByProviders[providerType], msp)
    70  	}
    71  
    72  	mgr.up = true
    73  
    74  	mspLogger.Debugf("MSP manager setup complete, setup %d msps", len(msps))
    75  
    76  	return nil
    77  }
    78  
    79  // GetMSPs returns the MSPs that are managed by this manager
    80  func (mgr *mspManagerImpl) GetMSPs() (map[string]MSP, error) {
    81  	return mgr.mspsMap, nil
    82  }
    83  
    84  // DeserializeIdentity returns an identity given its serialized version supplied as argument
    85  func (mgr *mspManagerImpl) DeserializeIdentity(serializedID []byte) (Identity, error) {
    86  	// We first deserialize to a SerializedIdentity to get the MSP ID
    87  	sId := &msp.SerializedIdentity{}
    88  	err := proto.Unmarshal(serializedID, sId)
    89  	if err != nil {
    90  		return nil, errors.Wrap(err, "could not deserialize a SerializedIdentity")
    91  	}
    92  
    93  	// we can now attempt to obtain the MSP
    94  	msp := mgr.mspsMap[sId.Mspid]
    95  	if msp == nil {
    96  		return nil, errors.Errorf("MSP %s is unknown", sId.Mspid)
    97  	}
    98  
    99  	switch t := msp.(type) {
   100  	case *bccspmsp:
   101  		return t.deserializeIdentityInternal(sId.IdBytes)
   102  	case *idemixmsp:
   103  		return t.deserializeIdentityInternal(sId.IdBytes)
   104  	default:
   105  		return t.DeserializeIdentity(serializedID)
   106  	}
   107  }
   108  
   109  func (mgr *mspManagerImpl) IsWellFormed(identity *msp.SerializedIdentity) error {
   110  	// Iterate over all the MSPs by their providers, and find at least 1 MSP that can attest
   111  	// that this identity is well formed
   112  	for _, mspList := range mgr.mspsByProviders {
   113  		// We are guaranteed to have at least 1 MSP in each list from the initialization at Setup()
   114  		msp := mspList[0]
   115  		if err := msp.IsWellFormed(identity); err == nil {
   116  			return nil
   117  		}
   118  	}
   119  	return errors.New("no MSP provider recognizes the identity")
   120  }