80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
/*
|
|
Copyright IBM Corp. 2017 All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package channelconfig
|
|
|
|
import (
|
|
cb "github.com/hyperledger/fabric-protos-go/common"
|
|
pb "github.com/hyperledger/fabric-protos-go/peer"
|
|
"github.com/hyperledger/fabric/common/capabilities"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
const (
|
|
// ApplicationGroupKey is the group name for the Application config
|
|
ApplicationGroupKey = "Application"
|
|
|
|
// ACLsKey is the name of the ACLs config
|
|
ACLsKey = "ACLs"
|
|
)
|
|
|
|
// ApplicationProtos is used as the source of the ApplicationConfig
|
|
type ApplicationProtos struct {
|
|
ACLs *pb.ACLs
|
|
Capabilities *cb.Capabilities
|
|
}
|
|
|
|
// ApplicationConfig implements the Application interface
|
|
type ApplicationConfig struct {
|
|
applicationOrgs map[string]ApplicationOrg
|
|
protos *ApplicationProtos
|
|
}
|
|
|
|
// NewApplicationConfig creates config from an Application config group
|
|
func NewApplicationConfig(appGroup *cb.ConfigGroup, mspConfig *MSPConfigHandler) (*ApplicationConfig, error) {
|
|
ac := &ApplicationConfig{
|
|
applicationOrgs: make(map[string]ApplicationOrg),
|
|
protos: &ApplicationProtos{},
|
|
}
|
|
|
|
if err := DeserializeProtoValuesFromGroup(appGroup, ac.protos); err != nil {
|
|
return nil, errors.Wrap(err, "failed to deserialize values")
|
|
}
|
|
|
|
if !ac.Capabilities().ACLs() {
|
|
if _, ok := appGroup.Values[ACLsKey]; ok {
|
|
return nil, errors.New("ACLs may not be specified without the required capability")
|
|
}
|
|
}
|
|
|
|
var err error
|
|
for orgName, orgGroup := range appGroup.Groups {
|
|
ac.applicationOrgs[orgName], err = NewApplicationOrgConfig(orgName, orgGroup, mspConfig)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return ac, nil
|
|
}
|
|
|
|
// Organizations returns a map of org ID to ApplicationOrg
|
|
func (ac *ApplicationConfig) Organizations() map[string]ApplicationOrg {
|
|
return ac.applicationOrgs
|
|
}
|
|
|
|
// Capabilities returns a map of capability name to Capability
|
|
func (ac *ApplicationConfig) Capabilities() ApplicationCapabilities {
|
|
return capabilities.NewApplicationProvider(ac.protos.Capabilities.Capabilities)
|
|
}
|
|
|
|
// APIPolicyMapper returns a PolicyMapper that maps API names to policies
|
|
func (ac *ApplicationConfig) APIPolicyMapper() PolicyMapper {
|
|
pm := newAPIsProvider(ac.protos.ACLs.Acls)
|
|
|
|
return pm
|
|
}
|