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 }