Skip to content

Commit fb31d92

Browse files
author
Jason Yellick
committed
[FAb-2680] Set default ModPolicy in configtxgen
https://jira.hyperledger.org/browse/FAB-2680 The ModPolicy field of the configuration elements is currently set to the empty string. This causes all configuration updates to be denied by default (As there is no policy with name empty string). This CR enhances configtxgen to set the default modification policy of "Admins" for all items. This is a sane default, and there is currently no mechanism to change it. This is a very low risk change from a regression standpoint, because it only affect configuration updates (which are currently exercised nowhere in the system). Change-Id: Ica16c0a56f8cd42e5f02c770f0f10c59328b63d7 Signed-off-by: Jason Yellick <[email protected]>
1 parent 1066230 commit fb31d92

File tree

3 files changed

+97
-11
lines changed

3 files changed

+97
-11
lines changed

common/configtx/template.go

+51-1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,57 @@ func (ct *compositeTemplate) Envelope(chainID string) (*cb.ConfigUpdateEnvelope,
144144
return &cb.ConfigUpdateEnvelope{ConfigUpdate: marshaledConfig}, nil
145145
}
146146

147+
type modPolicySettingTemplate struct {
148+
modPolicy string
149+
template Template
150+
}
151+
152+
// NewModPolicySettingTemplate wraps another template and sets the ModPolicy of
153+
// every ConfigGroup/ConfigValue/ConfigPolicy to modPolicy
154+
func NewModPolicySettingTemplate(modPolicy string, template Template) Template {
155+
return &modPolicySettingTemplate{
156+
modPolicy: modPolicy,
157+
template: template,
158+
}
159+
}
160+
161+
func setGroupModPolicies(modPolicy string, group *cb.ConfigGroup) {
162+
group.ModPolicy = modPolicy
163+
164+
for _, value := range group.Values {
165+
value.ModPolicy = modPolicy
166+
}
167+
168+
for _, policy := range group.Policies {
169+
policy.ModPolicy = modPolicy
170+
}
171+
172+
for _, nextGroup := range group.Groups {
173+
setGroupModPolicies(modPolicy, nextGroup)
174+
}
175+
}
176+
177+
func (mpst *modPolicySettingTemplate) Envelope(channelID string) (*cb.ConfigUpdateEnvelope, error) {
178+
configUpdateEnv, err := mpst.template.Envelope(channelID)
179+
if err != nil {
180+
return nil, err
181+
}
182+
183+
config, err := UnmarshalConfigUpdate(configUpdateEnv.ConfigUpdate)
184+
if err != nil {
185+
return nil, err
186+
}
187+
188+
setGroupModPolicies(mpst.modPolicy, config.WriteSet)
189+
configUpdateEnv.ConfigUpdate = utils.MarshalOrPanic(config)
190+
return configUpdateEnv, nil
191+
}
192+
193+
type channelCreationTemplate struct {
194+
consortiumName string
195+
orgs []string
196+
}
197+
147198
// NewChainCreationTemplate takes a CreationPolicy and a Template to produce a
148199
// Template which outputs an appropriately constructed list of ConfigUpdateEnvelopes.
149200
func NewChainCreationTemplate(creationPolicy string, template Template) Template {
@@ -154,7 +205,6 @@ func NewChainCreationTemplate(creationPolicy string, template Template) Template
154205
Policy: creationPolicy,
155206
}),
156207
}
157-
158208
return NewCompositeTemplate(NewSimpleTemplate(result), template)
159209
}
160210

common/configtx/template_test.go

+27
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,33 @@ func TestCompositeTemplate(t *testing.T) {
7777
verifyItemsResult(t, composite, 3)
7878
}
7979

80+
func TestModPolicySettingTemplate(t *testing.T) {
81+
subGroup := "group"
82+
input := cb.NewConfigGroup()
83+
input.Groups[subGroup] = cb.NewConfigGroup()
84+
85+
policyName := "policy"
86+
valueName := "value"
87+
for _, group := range []*cb.ConfigGroup{input, input.Groups[subGroup]} {
88+
group.Values[valueName] = &cb.ConfigValue{}
89+
group.Policies[policyName] = &cb.ConfigPolicy{}
90+
}
91+
92+
modPolicyName := "foo"
93+
mpst := NewModPolicySettingTemplate(modPolicyName, NewSimpleTemplate(input))
94+
output, err := mpst.Envelope("bar")
95+
assert.NoError(t, err, "Creating envelope")
96+
97+
configUpdate := UnmarshalConfigUpdateOrPanic(output.ConfigUpdate)
98+
99+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.ModPolicy)
100+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Values[valueName].ModPolicy)
101+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Policies[policyName].ModPolicy)
102+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].ModPolicy)
103+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].Values[valueName].ModPolicy)
104+
assert.Equal(t, modPolicyName, configUpdate.WriteSet.Groups[subGroup].Policies[policyName].ModPolicy)
105+
}
106+
80107
func TestNewChainTemplate(t *testing.T) {
81108
simple := NewSimpleTemplate(
82109
simpleGroup(0),

common/configtx/tool/provisional/provisional.go

+19-10
Original file line numberDiff line numberDiff line change
@@ -169,19 +169,25 @@ func New(conf *genesisconfig.Profile) Generator {
169169
}
170170

171171
func (bs *bootstrapper) ChannelTemplate() configtx.Template {
172-
return configtx.NewCompositeTemplate(
173-
configtx.NewSimpleTemplate(bs.channelGroups...),
174-
configtx.NewSimpleTemplate(bs.ordererGroups...),
175-
configtx.NewSimpleTemplate(bs.applicationGroups...),
172+
return configtx.NewModPolicySettingTemplate(
173+
configvaluesmsp.AdminsPolicyKey,
174+
configtx.NewCompositeTemplate(
175+
configtx.NewSimpleTemplate(bs.channelGroups...),
176+
configtx.NewSimpleTemplate(bs.ordererGroups...),
177+
configtx.NewSimpleTemplate(bs.applicationGroups...),
178+
),
176179
)
177180
}
178181

179182
// XXX deprecate and remove
180183
func (bs *bootstrapper) GenesisBlock() *cb.Block {
181184
block, err := genesis.NewFactoryImpl(
182-
configtx.NewCompositeTemplate(
183-
configtx.NewSimpleTemplate(bs.ordererSystemChannelGroups...),
184-
bs.ChannelTemplate(),
185+
configtx.NewModPolicySettingTemplate(
186+
configvaluesmsp.AdminsPolicyKey,
187+
configtx.NewCompositeTemplate(
188+
configtx.NewSimpleTemplate(bs.ordererSystemChannelGroups...),
189+
bs.ChannelTemplate(),
190+
),
185191
),
186192
).Block(TestChainID)
187193

@@ -193,9 +199,12 @@ func (bs *bootstrapper) GenesisBlock() *cb.Block {
193199

194200
func (bs *bootstrapper) GenesisBlockForChannel(channelID string) *cb.Block {
195201
block, err := genesis.NewFactoryImpl(
196-
configtx.NewCompositeTemplate(
197-
configtx.NewSimpleTemplate(bs.ordererSystemChannelGroups...),
198-
bs.ChannelTemplate(),
202+
configtx.NewModPolicySettingTemplate(
203+
configvaluesmsp.AdminsPolicyKey,
204+
configtx.NewCompositeTemplate(
205+
configtx.NewSimpleTemplate(bs.ordererSystemChannelGroups...),
206+
bs.ChannelTemplate(),
207+
),
199208
),
200209
).Block(channelID)
201210

0 commit comments

Comments
 (0)