github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/hyperledger/fabric-config/configtx/capabilities.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package configtx
     8  
     9  import (
    10  	"errors"
    11  	"fmt"
    12  
    13  	"github.com/golang/protobuf/proto"
    14  	cb "github.com/hyperledger/fabric-protos-go/common"
    15  )
    16  
    17  // capabilitiesValue returns the config definition for a set of capabilities.
    18  // It is a value for the /Channel/Orderer, Channel/Application/, and /Channel groups.
    19  func capabilitiesValue(capabilities []string) *standardConfigValue {
    20  	c := &cb.Capabilities{
    21  		Capabilities: make(map[string]*cb.Capability),
    22  	}
    23  
    24  	for _, capability := range capabilities {
    25  		c.Capabilities[capability] = &cb.Capability{}
    26  	}
    27  
    28  	return &standardConfigValue{
    29  		key:   CapabilitiesKey,
    30  		value: c,
    31  	}
    32  }
    33  
    34  func addCapability(configGroup *cb.ConfigGroup, capabilities []string, modPolicy string, capability string) error {
    35  	for _, c := range capabilities {
    36  		if c == capability {
    37  			// if capability already exist, do nothing.
    38  			return nil
    39  		}
    40  	}
    41  	capabilities = append(capabilities, capability)
    42  
    43  	err := setValue(configGroup, capabilitiesValue(capabilities), modPolicy)
    44  	if err != nil {
    45  		return fmt.Errorf("adding capability: %v", err)
    46  	}
    47  
    48  	return nil
    49  }
    50  
    51  func removeCapability(configGroup *cb.ConfigGroup, capabilities []string, modPolicy string, capability string) error {
    52  	var updatedCapabilities []string
    53  
    54  	for _, c := range capabilities {
    55  		if c != capability {
    56  			updatedCapabilities = append(updatedCapabilities, c)
    57  		}
    58  	}
    59  
    60  	if len(updatedCapabilities) == len(capabilities) {
    61  		return errors.New("capability not set")
    62  	}
    63  
    64  	err := setValue(configGroup, capabilitiesValue(updatedCapabilities), modPolicy)
    65  	if err != nil {
    66  		return fmt.Errorf("removing capability: %v", err)
    67  	}
    68  
    69  	return nil
    70  }
    71  
    72  func getCapabilities(configGroup *cb.ConfigGroup) ([]string, error) {
    73  	capabilitiesValue, ok := configGroup.Values[CapabilitiesKey]
    74  	if !ok {
    75  		// no capabilities defined/enabled
    76  		return nil, nil
    77  	}
    78  
    79  	capabilitiesProto := &cb.Capabilities{}
    80  
    81  	err := proto.Unmarshal(capabilitiesValue.Value, capabilitiesProto)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("unmarshaling capabilities: %v", err)
    84  	}
    85  
    86  	capabilities := []string{}
    87  
    88  	for capability := range capabilitiesProto.Capabilities {
    89  		capabilities = append(capabilities, capability)
    90  	}
    91  
    92  	return capabilities, nil
    93  }