github.com/yacovm/fabric@v2.0.0-alpha.0.20191128145320-c5d4087dc723+incompatible/common/channelconfig/application.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package channelconfig
     8  
     9  import (
    10  	cb "github.com/hyperledger/fabric-protos-go/common"
    11  	pb "github.com/hyperledger/fabric-protos-go/peer"
    12  	"github.com/hyperledger/fabric/common/capabilities"
    13  	"github.com/pkg/errors"
    14  )
    15  
    16  const (
    17  	// ApplicationGroupKey is the group name for the Application config
    18  	ApplicationGroupKey = "Application"
    19  
    20  	// ACLsKey is the name of the ACLs config
    21  	ACLsKey = "ACLs"
    22  )
    23  
    24  // ApplicationProtos is used as the source of the ApplicationConfig
    25  type ApplicationProtos struct {
    26  	ACLs         *pb.ACLs
    27  	Capabilities *cb.Capabilities
    28  }
    29  
    30  // ApplicationConfig implements the Application interface
    31  type ApplicationConfig struct {
    32  	applicationOrgs map[string]ApplicationOrg
    33  	protos          *ApplicationProtos
    34  }
    35  
    36  // NewApplicationConfig creates config from an Application config group
    37  func NewApplicationConfig(appGroup *cb.ConfigGroup, mspConfig *MSPConfigHandler) (*ApplicationConfig, error) {
    38  	ac := &ApplicationConfig{
    39  		applicationOrgs: make(map[string]ApplicationOrg),
    40  		protos:          &ApplicationProtos{},
    41  	}
    42  
    43  	if err := DeserializeProtoValuesFromGroup(appGroup, ac.protos); err != nil {
    44  		return nil, errors.Wrap(err, "failed to deserialize values")
    45  	}
    46  
    47  	if !ac.Capabilities().ACLs() {
    48  		if _, ok := appGroup.Values[ACLsKey]; ok {
    49  			return nil, errors.New("ACLs may not be specified without the required capability")
    50  		}
    51  	}
    52  
    53  	var err error
    54  	for orgName, orgGroup := range appGroup.Groups {
    55  		ac.applicationOrgs[orgName], err = NewApplicationOrgConfig(orgName, orgGroup, mspConfig)
    56  		if err != nil {
    57  			return nil, err
    58  		}
    59  	}
    60  
    61  	return ac, nil
    62  }
    63  
    64  // Organizations returns a map of org ID to ApplicationOrg
    65  func (ac *ApplicationConfig) Organizations() map[string]ApplicationOrg {
    66  	return ac.applicationOrgs
    67  }
    68  
    69  // Capabilities returns a map of capability name to Capability
    70  func (ac *ApplicationConfig) Capabilities() ApplicationCapabilities {
    71  	return capabilities.NewApplicationProvider(ac.protos.Capabilities.Capabilities)
    72  }
    73  
    74  // APIPolicyMapper returns a PolicyMapper that maps API names to policies
    75  func (ac *ApplicationConfig) APIPolicyMapper() PolicyMapper {
    76  	pm := newAPIsProvider(ac.protos.ACLs.Acls)
    77  
    78  	return pm
    79  }