From 662028f045126a4f4712d434313dd7ddd1378c9f Mon Sep 17 00:00:00 2001 From: n0s09by Date: Tue, 26 Dec 2023 13:31:59 +0530 Subject: [PATCH] Set Correct policy while channel update Signed-off-by: n0s09by --- .../rest/client/service/ChannelService.java | 10 +++ .../AddOrgToChannelWriteSetBuilderImpl.java | 63 ++++++++++--------- .../service/impl/ChannelServiceImpl.java | 27 +++++--- 3 files changed, 63 insertions(+), 37 deletions(-) diff --git a/src/main/java/hlf/java/rest/client/service/ChannelService.java b/src/main/java/hlf/java/rest/client/service/ChannelService.java index e62684a3..bc91b4a5 100644 --- a/src/main/java/hlf/java/rest/client/service/ChannelService.java +++ b/src/main/java/hlf/java/rest/client/service/ChannelService.java @@ -2,7 +2,9 @@ import hlf.java.rest.client.model.ChannelOperationRequest; import hlf.java.rest.client.model.ClientResponseModel; +import java.util.HashMap; import java.util.Set; +import org.hyperledger.fabric.protos.common.Configtx; public interface ChannelService { @@ -31,4 +33,12 @@ public interface ChannelService { * @return */ Set getChannelMembersMSPID(String channelName); + + /** + * get default configuration policy for org MSP that maps the roles. + * + * @param orgMSPId Org MSP ID + * @return HashMap with role and the configuration policy + */ + HashMap getDefaultRolePolicy(String orgMSPId); } diff --git a/src/main/java/hlf/java/rest/client/service/impl/AddOrgToChannelWriteSetBuilderImpl.java b/src/main/java/hlf/java/rest/client/service/impl/AddOrgToChannelWriteSetBuilderImpl.java index d8952ef5..0e42dbfa 100644 --- a/src/main/java/hlf/java/rest/client/service/impl/AddOrgToChannelWriteSetBuilderImpl.java +++ b/src/main/java/hlf/java/rest/client/service/impl/AddOrgToChannelWriteSetBuilderImpl.java @@ -6,6 +6,7 @@ import hlf.java.rest.client.model.AnchorPeerDTO; import hlf.java.rest.client.model.NewOrgParamsDTO; import hlf.java.rest.client.service.AddOrgToChannelWriteSetBuilder; +import hlf.java.rest.client.service.ChannelService; import hlf.java.rest.client.util.FabricClientConstants; import java.util.ArrayList; import java.util.HashMap; @@ -28,12 +29,14 @@ import org.hyperledger.fabric.protos.msp.MspConfigPackage.MSPConfig; import org.hyperledger.fabric.protos.peer.Configuration.AnchorPeer; import org.hyperledger.fabric.protos.peer.Configuration.AnchorPeers; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class AddOrgToChannelWriteSetBuilderImpl implements AddOrgToChannelWriteSetBuilder { private NewOrgParamsDTO organizationDetails; + @Autowired private ChannelService channelService; private static final int DEFAULT_VERSION = 0; @Override @@ -44,25 +47,27 @@ public ConfigGroup buildWriteset(ConfigGroup readset, NewOrgParamsDTO organizati // Get existing organizations in the channel and set with as objects and their // version to prevent deletion or modification // Omitting existing groups results in their deletion. - Map organizations = new HashMap<>(); + Map existingOrganizations = new HashMap<>(); ConfigGroup applicationConfigGroup = readset.getGroupsOrThrow(FabricClientConstants.CHANNEL_CONFIG_GROUP_APPLICATION); applicationConfigGroup .getGroupsMap() .forEach( (k, v) -> - organizations.put( - k, setEmptyGroup(retrieveGroupVersionFromReadset(applicationConfigGroup, k)))); + existingOrganizations.put( + k, + setEmptyGroup(retrieveMSPGroupVersionFromReadset(applicationConfigGroup, k)))); // The "Application" group ConfigGroup applicationGroup = ConfigGroup.newBuilder() .setModPolicy(FabricClientConstants.CHANNEL_CONFIG_MOD_POLICY_ADMINS) .putAllPolicies(setApplicationPolicies(readset)) .putGroups(newOrgMspId, setNewOrgGroup(newOrgMspId)) - .putAllGroups(organizations) + // putAllGroups excludes new organization + .putAllGroups(existingOrganizations) // Application group version .setVersion( - retrieveGroupVersionFromReadset( + retrieveMSPGroupVersionFromReadset( readset, FabricClientConstants.CHANNEL_CONFIG_GROUP_APPLICATION) + 1) // will // be @@ -84,17 +89,17 @@ public ConfigGroup buildWriteset(ConfigGroup readset, NewOrgParamsDTO organizati .build(); } - private long retrieveGroupVersionFromReadset(ConfigGroup readset, String groupName) + private long retrieveMSPGroupVersionFromReadset(ConfigGroup readset, String mspId) throws ServiceException { long versionLong = DEFAULT_VERSION; try { - ConfigGroup group = readset.getGroupsOrThrow(groupName); + ConfigGroup group = readset.getGroupsOrThrow(mspId); versionLong = group.getVersion(); } catch (IllegalArgumentException e) { throw new ServiceException( ErrorCode.NOT_FOUND, "WriteBuilder version iteration error: ConfigGroup with name - \"" - + groupName + + mspId + "\" - not found in Readset", e); } @@ -150,8 +155,9 @@ private Map setApplicationPolicies(ConfigGroup readset) { .setModPolicy("") .setVersion(map.get(FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_WRITERS)) .build(); - Map applicationPoliciesMap = new HashMap<>(); + // add Admins, Readers, Writers, Endorsement and LifeCycle Endorsement policies at the channel + // level applicationPoliciesMap.put( FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ADMINS, adminPolicy); applicationPoliciesMap.put( @@ -177,9 +183,9 @@ private ConfigGroup setNewOrgGroup(String newOrgMspId) { return ConfigGroup.newBuilder() .setModPolicy(FabricClientConstants.CHANNEL_CONFIG_MOD_POLICY_ADMINS) - .putAllPolicies(setNewOrgPolicies(newOrgMspId)) + .putAllPolicies(channelService.getDefaultRolePolicy(newOrgMspId)) .putAllValues(valueMap) - .setVersion(0) + .setVersion(0) // First time update, hence version is 0 .build(); } @@ -187,23 +193,24 @@ private ConfigGroup setEmptyGroup(long version) { return ConfigGroup.newBuilder().setModPolicy("").setVersion(version).build(); } - private Map setNewOrgPolicies(String newOrgName) { - Map applicationPoliciesMap = new HashMap<>(); - applicationPoliciesMap.put( - FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ADMINS, - setNewOrgPolicy(newOrgName, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ADMINS)); - applicationPoliciesMap.put( - FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ENDORSEMENT, - setNewOrgPolicy(newOrgName, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ENDORSEMENT)); - applicationPoliciesMap.put( - FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_READERS, - setNewOrgPolicy(newOrgName, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_READERS)); - applicationPoliciesMap.put( - FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_WRITERS, - setNewOrgPolicy(newOrgName, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_WRITERS)); - - return applicationPoliciesMap; - } + // private Map setNewOrgPolicies(String newOrgMspId) { + // Map applicationPoliciesMap = new HashMap<>(); + // applicationPoliciesMap.put( + // FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ADMINS, + // setNewOrgPolicy(newOrgMspId, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ADMINS)); + // applicationPoliciesMap.put( + // FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ENDORSEMENT, + // setNewOrgPolicy(newOrgMspId, + // FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_ENDORSEMENT)); + // applicationPoliciesMap.put( + // FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_READERS, + // setNewOrgPolicy(newOrgMspId, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_READERS)); + // applicationPoliciesMap.put( + // FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_WRITERS, + // setNewOrgPolicy(newOrgMspId, FabricClientConstants.CHANNEL_CONFIG_POLICY_TYPE_WRITERS)); + // + // return applicationPoliciesMap; + // } private ConfigPolicy setNewOrgPolicy(String newOrgName, String policyTarget) { return ConfigPolicy.newBuilder() diff --git a/src/main/java/hlf/java/rest/client/service/impl/ChannelServiceImpl.java b/src/main/java/hlf/java/rest/client/service/impl/ChannelServiceImpl.java index ebe5b1b4..5c233190 100644 --- a/src/main/java/hlf/java/rest/client/service/impl/ChannelServiceImpl.java +++ b/src/main/java/hlf/java/rest/client/service/impl/ChannelServiceImpl.java @@ -371,11 +371,16 @@ private Configtx.ConfigGroup getMSPConfigGroup(hlf.java.rest.client.model.Peer p .build(); } - // The method returns a default policy for each organization - // that maps the roles. The policy type is signature. Roles - // are identified by their signatures, as those signatures - // represent the certificate. - private HashMap getDefaultRolePolicy(String orgMSPId) { + /** + * get default configuration policy for organization that maps the roles. The policy type is + * signature. Roles are identified by their signatures, as those signatures represent the + * certificate. + * + * @param orgMSPId Org MSP ID + * @return HashMap with role and the configuration policy + */ + @Override + public HashMap getDefaultRolePolicy(String orgMSPId) { HashMap defaultOrgRolePolicy = new HashMap<>(); // add Admins, Readers, Writers and Endorsement policies defaultOrgRolePolicy.put( @@ -488,8 +493,13 @@ private List getRolesFor(String policyFor, String org return mspPrincipals; } - // The method returns a ConfigPolicy of type signature for the - // passed organization's MSP ID. + /** + * returns a ConfigPolicy of type signature for the passed organization's MSP ID + * + * @param policyFor Policy for which role + * @param orgMSPId new org MSP ID + * @return configuration policy + */ private Configtx.ConfigPolicy getDefaultRoleConfigPolicyForMSP( String policyFor, String orgMSPId) { List mspPrincipals = getRolesFor(policyFor, orgMSPId); @@ -653,8 +663,7 @@ private Policies.Policy getImplicitMetaPolicy(String subPolicyName, int rule) { * @param modPolicy * @return */ - private Configtx.ConfigPolicy getConfigPolicy( - String subPolicyName, int rule, String modPolicy) { + private Configtx.ConfigPolicy getConfigPolicy(String subPolicyName, int rule, String modPolicy) { return Configtx.ConfigPolicy.newBuilder() .setPolicy(getImplicitMetaPolicy(subPolicyName, rule)) .setModPolicy(modPolicy)