Skip to content

Commit c44bfed

Browse files
committed
[FAB-9014] Add new config element for peer ACLs
Implements protos for ACL Resources and use it to parse and generate config for the Application:ACLs defined in configtx.yaml Change-Id: I6796171dab05f33eca257fd0e61c300ff98699e3 Signed-off-by: Srinivasan Muralidharan <srinivasan.muralidharan99@gmail.com>
1 parent 38e3bc1 commit c44bfed

16 files changed

+187
-104
lines changed

common/channelconfig/api.go

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ type Application interface {
3939
// Organizations returns a map of org ID to ApplicationOrg
4040
Organizations() map[string]ApplicationOrg
4141

42+
// ACLs returns map of string to APIResource
43+
ACLs() map[string]*pb.APIResource
44+
4245
// Capabilities defines the capabilities for the application portion of a channel
4346
Capabilities() ApplicationCapabilities
4447
}

common/channelconfig/application.go

+10
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,22 @@ package channelconfig
99
import (
1010
"github.com/hyperledger/fabric/common/capabilities"
1111
cb "github.com/hyperledger/fabric/protos/common"
12+
pb "github.com/hyperledger/fabric/protos/peer"
1213

1314
"github.com/pkg/errors"
1415
)
1516

1617
const (
1718
// ApplicationGroupKey is the group name for the Application config
1819
ApplicationGroupKey = "Application"
20+
21+
// ACLsKey is the name of the ACLs config
22+
ACLsKey = "ACLs"
1923
)
2024

2125
// ApplicationProtos is used as the source of the ApplicationConfig
2226
type ApplicationProtos struct {
27+
ACLs *pb.ACLs
2328
Capabilities *cb.Capabilities
2429
}
2530

@@ -60,3 +65,8 @@ func (ac *ApplicationConfig) Organizations() map[string]ApplicationOrg {
6065
func (ac *ApplicationConfig) Capabilities() ApplicationCapabilities {
6166
return capabilities.NewApplicationProvider(ac.protos.Capabilities.Capabilities)
6267
}
68+
69+
// ACLs returns a map of resource name to APIResource
70+
func (ac *ApplicationConfig) ACLs() map[string]*pb.APIResource {
71+
return ac.protos.ACLs.Acls
72+
}

common/channelconfig/util.go

+17
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,20 @@ func ChannelCreationPolicyValue(policy *cb.Policy) *StandardConfigValue {
205205
value: policy,
206206
}
207207
}
208+
209+
// ACLsValues returns the config definition for an applications resources based ACL definitions.
210+
// It is a value for the /Channel/Application/.
211+
func ACLValues(acls map[string]string) *StandardConfigValue {
212+
a := &pb.ACLs{
213+
Acls: make(map[string]*pb.APIResource),
214+
}
215+
216+
for apiResource, policyRef := range acls {
217+
a.Acls[apiResource] = &pb.APIResource{PolicyRef: policyRef}
218+
}
219+
220+
return &StandardConfigValue{
221+
key: ACLsKey,
222+
value: a,
223+
}
224+
}

common/channelconfig/util_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ func TestUtilsBasic(t *testing.T) {
4242
basicTest(t, CapabilitiesValue(map[string]bool{"foo": true, "bar": false}))
4343
basicTest(t, AnchorPeersValue([]*pb.AnchorPeer{{}, {}}))
4444
basicTest(t, ChannelCreationPolicyValue(&cb.Policy{}))
45+
basicTest(t, ACLValues(map[string]string{"foo": "fooval", "bar": "barval"}))
4546
}

common/mocks/config/application.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ SPDX-License-Identifier: Apache-2.0
66

77
package config
88

9-
import "github.com/hyperledger/fabric/common/channelconfig"
9+
import (
10+
"github.com/hyperledger/fabric/common/channelconfig"
11+
pb "github.com/hyperledger/fabric/protos/peer"
12+
)
1013

1114
type MockApplication struct {
1215
CapabilitiesRv channelconfig.ApplicationCapabilities
16+
Acls map[string]*pb.APIResource
1317
}
1418

1519
func (m *MockApplication) Organizations() map[string]channelconfig.ApplicationOrg {
@@ -20,6 +24,10 @@ func (m *MockApplication) Capabilities() channelconfig.ApplicationCapabilities {
2024
return m.CapabilitiesRv
2125
}
2226

27+
func (m *MockApplication) ACLs() map[string]*pb.APIResource {
28+
return m.Acls
29+
}
30+
2331
type MockApplicationCapabilities struct {
2432
SupportedRv error
2533
ForbidDuplicateTXIdInBlockRv bool

common/tools/configtxgen/encoder/encoder.go

+4
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,10 @@ func NewApplicationGroup(conf *genesisconfig.Application) (*cb.ConfigGroup, erro
271271
}
272272
}
273273

274+
if len(conf.ACLs) > 0 {
275+
addValue(applicationGroup, channelconfig.ACLValues(conf.ACLs), channelconfig.AdminsPolicyKey)
276+
}
277+
274278
if len(conf.Capabilities) > 0 {
275279
addValue(applicationGroup, channelconfig.CapabilitiesValue(conf.Capabilities), channelconfig.AdminsPolicyKey)
276280
}

common/tools/configtxgen/encoder/encoder_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,17 @@ func TestGoodChannelCreateConfigUpdate(t *testing.T) {
7777

7878
createConfig := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile)
7979

80+
//ACLs does not marshal deterministically. Set it to nil is ok as its not
81+
//updated anyway
82+
createConfig.Application.ACLs = nil
83+
8084
configUpdate, err := NewChannelCreateConfigUpdate("channel.id", nil, createConfig)
8185
assert.NoError(t, err)
8286
assert.NotNil(t, configUpdate)
8387

8488
defaultConfigUpdate, err := NewChannelCreateConfigUpdate("channel.id", systemChannel, createConfig)
8589
assert.NoError(t, err)
86-
assert.NotNil(t, configUpdate)
90+
assert.NotNil(t, defaultConfigUpdate)
8791

8892
assert.True(t, proto.Equal(configUpdate, defaultConfigUpdate), "the config used has had no updates, so should equal default")
8993
}

core/chaincode/chaincode_support_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ var theChaincodeSupport *ChaincodeSupport
146146
//initialize peer and start up. If security==enabled, login as vp
147147
func initMockPeer(chainIDs ...string) error {
148148
msi := &cmp.MockSupportImpl{
149-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
149+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
150150
GetApplicationConfigBoolRv: true,
151151
}
152152
sysccprovider.RegisterSystemChaincodeProviderFactory(

core/endorser/endorser_test.go

+21-21
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func TestEndorserNilProp(t *testing.T) {
6060
return nil
6161
}, &em.MockSupport{
6262
GetApplicationConfigBoolRv: true,
63-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
63+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
6464
GetTransactionByIDErr: errors.New(""),
6565
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
6666
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -76,7 +76,7 @@ func TestEndorserUninvokableSysCC(t *testing.T) {
7676
return nil
7777
}, &em.MockSupport{
7878
GetApplicationConfigBoolRv: true,
79-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
79+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
8080
GetTransactionByIDErr: errors.New(""),
8181
IsSysCCAndNotInvokableExternalRv: true,
8282
})
@@ -92,7 +92,7 @@ func TestEndorserCCInvocationFailed(t *testing.T) {
9292
return nil
9393
}, &em.MockSupport{
9494
GetApplicationConfigBoolRv: true,
95-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
95+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
9696
GetTransactionByIDErr: errors.New(""),
9797
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
9898
ExecuteResp: &pb.Response{Status: 1000, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -110,7 +110,7 @@ func TestEndorserNoCCDef(t *testing.T) {
110110
return nil
111111
}, &em.MockSupport{
112112
GetApplicationConfigBoolRv: true,
113-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
113+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
114114
GetTransactionByIDErr: errors.New(""),
115115
ChaincodeDefinitionError: errors.New(""),
116116
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -128,7 +128,7 @@ func TestEndorserBadInstPolicy(t *testing.T) {
128128
return nil
129129
}, &em.MockSupport{
130130
GetApplicationConfigBoolRv: true,
131-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
131+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
132132
GetTransactionByIDErr: errors.New(""),
133133
CheckInstantiationPolicyError: errors.New(""),
134134
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -147,7 +147,7 @@ func TestEndorserSysCC(t *testing.T) {
147147
return nil
148148
}, &em.MockSupport{
149149
GetApplicationConfigBoolRv: true,
150-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
150+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
151151
GetTransactionByIDErr: errors.New(""),
152152
IsSysCCRv: true,
153153
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -166,7 +166,7 @@ func TestEndorserCCInvocationError(t *testing.T) {
166166
return nil
167167
}, &em.MockSupport{
168168
GetApplicationConfigBoolRv: true,
169-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
169+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
170170
GetTransactionByIDErr: errors.New(""),
171171
ExecuteError: errors.New(""),
172172
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -184,7 +184,7 @@ func TestEndorserLSCCBadType(t *testing.T) {
184184
return nil
185185
}, &em.MockSupport{
186186
GetApplicationConfigBoolRv: true,
187-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
187+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
188188
GetTransactionByIDErr: errors.New(""),
189189
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
190190
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -210,7 +210,7 @@ func TestEndorserDupTXId(t *testing.T) {
210210
return nil
211211
}, &em.MockSupport{
212212
GetApplicationConfigBoolRv: true,
213-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
213+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
214214
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
215215
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
216216
GetTxSimulatorRv: &ccprovider.MockTxSim{&ledger.TxSimulationResults{PubSimulationResults: &rwset.TxReadWriteSet{}}},
@@ -227,7 +227,7 @@ func TestEndorserBadACL(t *testing.T) {
227227
return nil
228228
}, &em.MockSupport{
229229
GetApplicationConfigBoolRv: true,
230-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
230+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
231231
CheckACLErr: errors.New(""),
232232
GetTransactionByIDErr: errors.New(""),
233233
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -246,7 +246,7 @@ func TestEndorserGoodPathEmptyChannel(t *testing.T) {
246246
return nil
247247
}, &em.MockSupport{
248248
GetApplicationConfigBoolRv: true,
249-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
249+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
250250
GetTransactionByIDErr: errors.New(""),
251251
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
252252
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -264,7 +264,7 @@ func TestEndorserLSCCInitFails(t *testing.T) {
264264
return nil
265265
}, &em.MockSupport{
266266
GetApplicationConfigBoolRv: true,
267-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
267+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
268268
GetTransactionByIDErr: errors.New(""),
269269
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
270270
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -294,7 +294,7 @@ func TestEndorserLSCCDeploySysCC(t *testing.T) {
294294
return nil
295295
}, &em.MockSupport{
296296
GetApplicationConfigBoolRv: true,
297-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
297+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
298298
GetTransactionByIDErr: errors.New(""),
299299
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
300300
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -325,7 +325,7 @@ func TestEndorserLSCCJava1(t *testing.T) {
325325
return nil
326326
}, &em.MockSupport{
327327
GetApplicationConfigBoolRv: true,
328-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
328+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
329329
IsJavaRV: true,
330330
GetTransactionByIDErr: errors.New(""),
331331
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -356,7 +356,7 @@ func TestEndorserLSCCJava2(t *testing.T) {
356356
return nil
357357
}, &em.MockSupport{
358358
GetApplicationConfigBoolRv: true,
359-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
359+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
360360
IsJavaErr: errors.New(""),
361361
GetTransactionByIDErr: errors.New(""),
362362
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
@@ -383,7 +383,7 @@ func TestEndorserGoodPathWEvents(t *testing.T) {
383383
return nil
384384
}, &em.MockSupport{
385385
GetApplicationConfigBoolRv: true,
386-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
386+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
387387
GetTransactionByIDErr: errors.New(""),
388388
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
389389
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -402,7 +402,7 @@ func TestEndorserBadChannel(t *testing.T) {
402402
return nil
403403
}, &em.MockSupport{
404404
GetApplicationConfigBoolRv: true,
405-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
405+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
406406
GetTransactionByIDErr: errors.New(""),
407407
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
408408
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -420,7 +420,7 @@ func TestEndorserGoodPath(t *testing.T) {
420420
return nil
421421
}, &em.MockSupport{
422422
GetApplicationConfigBoolRv: true,
423-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
423+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
424424
GetTransactionByIDErr: errors.New(""),
425425
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
426426
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -438,7 +438,7 @@ func TestEndorserLSCC(t *testing.T) {
438438
return nil
439439
}, &em.MockSupport{
440440
GetApplicationConfigBoolRv: true,
441-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
441+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
442442
GetTransactionByIDErr: errors.New(""),
443443
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
444444
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -464,7 +464,7 @@ func TestSimulateProposal(t *testing.T) {
464464
return nil
465465
}, &em.MockSupport{
466466
GetApplicationConfigBoolRv: true,
467-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
467+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
468468
GetTransactionByIDErr: errors.New(""),
469469
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
470470
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},
@@ -484,7 +484,7 @@ func TestEndorserJavaChecks(t *testing.T) {
484484
return nil
485485
}, &em.MockSupport{
486486
GetApplicationConfigBoolRv: true,
487-
GetApplicationConfigRv: &mc.MockApplication{&mc.MockApplicationCapabilities{}},
487+
GetApplicationConfigRv: &mc.MockApplication{CapabilitiesRv: &mc.MockApplicationCapabilities{}},
488488
GetTransactionByIDErr: errors.New(""),
489489
ChaincodeDefinitionRv: &resourceconfig.MockChaincodeDefinition{EndorsementStr: "ESCC"},
490490
ExecuteResp: &pb.Response{Status: 200, Payload: utils.MarshalOrPanic(&pb.ProposalResponse{Response: &pb.Response{}})},

0 commit comments

Comments
 (0)