Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit adcd251

Browse files
committed
[FABG-764] revoke user integration test
- also improved existing peer revoke query cc test - refactored revoke test to make them run in standalone fashion, previously it was dependent on expired peer test. Change-Id: I070172bc41449fae1fa44dd05049ca61da7332f3 Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent b99fa1e commit adcd251

File tree

1 file changed

+142
-56
lines changed

1 file changed

+142
-56
lines changed

test/integration/negative/revoked/revoked_peer_test.go renamed to test/integration/negative/revoked/revoked_test.go

Lines changed: 142 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,27 @@ import (
5252
)
5353

5454
const (
55-
org1AdminUser = "Admin"
56-
org2AdminUser = "Admin"
57-
org1User = "User1"
58-
org1 = "Org1"
59-
org2 = "Org2"
60-
channelID = "orgchannel"
61-
configFilename = "config_test.yaml"
62-
pathRevokeCaRoot = "peerOrganizations/org1.example.com/ca/"
63-
pathParentCert = "peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem"
64-
pathCertToBeRevokd = "peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem"
55+
org1AdminUser = "Admin"
56+
org2AdminUser = "Admin"
57+
org1User = "User1"
58+
org2User = "User1"
59+
org1 = "Org1"
60+
org2 = "Org2"
61+
ordererAdminUser = "Admin"
62+
ordererOrgName = "OrdererOrg"
63+
channelID = "orgchannel"
64+
configFilename = "config_test.yaml"
65+
pathRevokeCaRoot = "peerOrganizations/org1.example.com/ca/"
66+
pathParentCert = "peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem"
67+
peerCertToBeRevoked = "peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem"
68+
userCertToBeRevoked = "peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem"
6569
)
6670

6771
var CRLTestRetryOpts = retry.Opts{
6872
Attempts: 20,
6973
InitialBackoff: 1 * time.Second,
70-
MaxBackoff: 10 * time.Second,
71-
BackoffFactor: 2.0,
74+
MaxBackoff: 15 * time.Second,
75+
BackoffFactor: 1.5,
7276
RetryableCodes: retry.TestRetryableCodes,
7377
}
7478

@@ -82,11 +86,17 @@ var msps = []string{"Org1MSP", "Org2MSP"}
8286
// step 1: generate CRL
8387
// step 2: update MSP revocation_list in channel config
8488
// step 3: perform revoke peer test
85-
func TestPeerRevoke(t *testing.T) {
89+
func TestPeerAndUserRevoke(t *testing.T) {
8690

87-
//generate CRL
88-
crlBytes, err := generateCRL()
89-
require.NoError(t, err, "failed to generate CRL")
91+
var err error
92+
//generate CRLs for Peer & User
93+
crlBytes := make([][]byte, 2)
94+
crlBytes[0], err = generateCRL(peerCertToBeRevoked)
95+
require.NoError(t, err, "failed to generate CRL for", peerCertToBeRevoked)
96+
require.NotEmpty(t, crlBytes, "CRL is empty")
97+
98+
crlBytes[1], err = generateCRL(userCertToBeRevoked)
99+
require.NoError(t, err, "failed to generate CRL for", userCertToBeRevoked)
90100
require.NotEmpty(t, crlBytes, "CRL is empty")
91101

92102
//update revocation list in channel config
@@ -98,12 +108,15 @@ func TestPeerRevoke(t *testing.T) {
98108
//test if peer has been revoked
99109
testRevokedPeer(t)
100110

111+
//test if user1 has been revoked
112+
testRevokedUser(t)
113+
101114
//reset revocation list in channel config for other tests
102115
updateRevocationList(t, nil, false)
103116
}
104117

105118
//updateRevocationList update MSP revocation_list in channel config
106-
func updateRevocationList(t *testing.T, crlBytes []byte, joinCh bool) {
119+
func updateRevocationList(t *testing.T, crlBytes [][]byte, joinCh bool) {
107120

108121
sdk, err := fabsdk.New(config.FromFile(integration.GetConfigPath(configFilename)))
109122
require.NoError(t, err)
@@ -114,23 +127,15 @@ func updateRevocationList(t *testing.T, crlBytes []byte, joinCh bool) {
114127
integration.CleanupUserData(t, sdk)
115128
defer integration.CleanupUserData(t, sdk)
116129

117-
//prepare contexts
118-
org1AdminClientContext := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
119-
org2AdminClientContext := sdk.Context(fabsdk.WithUser(org2AdminUser), fabsdk.WithOrg(org2))
120-
org1AdminChannelClientContext := sdk.ChannelContext(channelID, fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
121-
122-
org1ResMgmt, err := resmgmt.New(org1AdminClientContext)
123-
require.NoError(t, err)
124-
125130
if joinCh {
126131
//join channel
127-
org2ResMgmt, err := resmgmt.New(org2AdminClientContext)
128-
require.NoError(t, err)
129-
130-
//join channel
131-
joinChannel(t, org1ResMgmt, org2ResMgmt)
132+
joinChannel(t, sdk)
132133
}
133134

135+
//prepare contexts
136+
org1AdminClientContext := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
137+
org1AdminChannelClientContext := sdk.ChannelContext(channelID, fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
138+
134139
ledgerClient1, err := ledger.New(org1AdminChannelClientContext)
135140
require.NoError(t, err)
136141

@@ -140,6 +145,9 @@ func updateRevocationList(t *testing.T, crlBytes []byte, joinCh bool) {
140145
org2MspClient, err := mspclient.New(sdk.Context(), mspclient.WithOrg(org2))
141146
require.NoError(t, err)
142147

148+
org1ResMgmt, err := resmgmt.New(org1AdminClientContext)
149+
require.NoError(t, err)
150+
143151
//create read write set for channel config update
144152
readSet, writeSet := prepareReadWriteSets(t, crlBytes, ledgerClient1)
145153
//update channel config MSP revocation lists to generated CRL
@@ -175,7 +183,8 @@ func testRevokedPeer(t *testing.T) {
175183
//prepare contexts
176184
org1AdminClientContext := sdk1.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
177185
org2AdminClientContext := sdk1.Context(fabsdk.WithUser(org2AdminUser), fabsdk.WithOrg(org2))
178-
org1ChannelClientContext := sdk1.ChannelContext(channelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1))
186+
org1UserChannelClientContext := sdk1.ChannelContext(channelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1))
187+
org2UserChannelClientContext := sdk1.ChannelContext(channelID, fabsdk.WithUser(org2User), fabsdk.WithOrg(org2))
179188

180189
org1ResMgmt, err := resmgmt.New(org1AdminClientContext)
181190
require.NoError(t, err)
@@ -190,11 +199,38 @@ func testRevokedPeer(t *testing.T) {
190199
//targets has its certificate revoked
191200
loadOrgPeers(t, org1AdminClientContext)
192201

193-
queryCC(t, org1ChannelClientContext)
202+
//query with revoked user
203+
queryCC(t, org1UserChannelClientContext, "access denied")
204+
//query with valid user
205+
queryCC(t, org2UserChannelClientContext, "could not find chaincode with name 'exampleCC'")
206+
}
207+
208+
//testRevokedUser performs revoke peer test
209+
func testRevokedUser(t *testing.T) {
210+
211+
sdk, err := fabsdk.New(config.FromFile(integration.GetConfigPath(configFilename)))
212+
require.NoError(t, err)
213+
defer sdk.Close()
214+
215+
//Try User2 whose certs are not revoked, should be able to query channel config
216+
user2ChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser(org2User), fabsdk.WithOrg(org2))
217+
ledgerClient, err := ledger.New(user2ChannelContext)
218+
require.NoError(t, err)
219+
cfg, err := ledgerClient.QueryConfig(ledger.WithTargetEndpoints("peer1.org2.example.com"))
220+
require.NoError(t, err)
221+
require.NotEmpty(t, cfg)
222+
223+
//Try User1 whose certs are revoked, shouldn't be able to query channel config
224+
user1ChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1))
225+
ledgerClient, err = ledger.New(user1ChannelContext)
226+
require.NoError(t, err)
227+
cfg, err = ledgerClient.QueryConfig(ledger.WithTargetEndpoints("peer1.org2.example.com"))
228+
require.Error(t, err)
229+
require.Empty(t, cfg)
194230
}
195231

196232
//prepareReadWriteSets prepares read write sets for channel config update
197-
func prepareReadWriteSets(t *testing.T, crlBytes []byte, ledgerClient *ledger.Client) (*common.ConfigGroup, *common.ConfigGroup) {
233+
func prepareReadWriteSets(t *testing.T, crlBytes [][]byte, ledgerClient *ledger.Client) (*common.ConfigGroup, *common.ConfigGroup) {
198234

199235
var readSet, writeSet *common.ConfigGroup
200236

@@ -233,7 +269,7 @@ func prepareReadWriteSets(t *testing.T, crlBytes []byte, ledgerClient *ledger.Cl
233269

234270
if len(crlBytes) > 0 {
235271
//append valid crl bytes to existing revocation list
236-
fabMspCfg.RevocationList = append(fabMspCfg.RevocationList, crlBytes)
272+
fabMspCfg.RevocationList = append(fabMspCfg.RevocationList, crlBytes...)
237273
} else {
238274
//reset
239275
fabMspCfg.RevocationList = nil
@@ -289,8 +325,6 @@ func updateChannelConfig(t *testing.T, readSet *common.ConfigGroup, writeSet *co
289325
org2AdminIdenity, err := org2MspClient.GetSigningIdentity(org2AdminUser)
290326
require.NoError(t, err, "failed to get org2AdminIdentity")
291327

292-
require.NoError(t, err, "failed to get a new channel management client for org1Admin")
293-
294328
//perform save channel for channel config update
295329
req := resmgmt.SaveChannelRequest{ChannelID: channelID,
296330
ChannelConfig: reader,
@@ -322,36 +356,87 @@ func createConfigEnvelopeReader(t *testing.T, blockData []byte, configUpdateByte
322356
return reader
323357
}
324358

325-
func joinChannel(t *testing.T, org1ResMgmt, org2ResMgmt *resmgmt.Client) {
359+
func joinChannel(t *testing.T, sdk *fabsdk.FabricSDK) {
360+
361+
joinChannelFunc := func() error {
362+
363+
org1AdminClientContext := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1))
364+
org2AdminClientContext := sdk.Context(fabsdk.WithUser(org2AdminUser), fabsdk.WithOrg(org2))
326365

327-
// Org1 peers join channel
328-
if err := org1ResMgmt.JoinChannel("orgchannel", resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")); err != nil {
329-
t.Fatalf("Org1 peers failed to JoinChannel: %s", err)
366+
org1ResMgmt, err := resmgmt.New(org1AdminClientContext)
367+
require.NoError(t, err)
368+
369+
org2ResMgmt, err := resmgmt.New(org2AdminClientContext)
370+
require.NoError(t, err)
371+
372+
// Org1 peers join channel
373+
if err := org1ResMgmt.JoinChannel("orgchannel", resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")); err != nil {
374+
return err
375+
}
376+
377+
// Org2 peers join channel
378+
if err := org2ResMgmt.JoinChannel("orgchannel", resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")); err != nil {
379+
return err
380+
}
381+
382+
t.Log("joined channel successfully")
383+
return nil
384+
}
385+
386+
//join channel
387+
err := joinChannelFunc()
388+
if err == nil {
389+
return
330390
}
331391

332-
// Org2 peers join channel
333-
if err := org2ResMgmt.JoinChannel("orgchannel", resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com")); err != nil {
334-
t.Fatalf("Org2 peers failed to JoinChannel: %s", err)
392+
if !strings.Contains(err.Error(), "genesis block retrieval failed: Orderer Server Status Code: (404) NOT_FOUND.") {
393+
t.Fatalf("Failed to join channel, error : %v", err)
335394
}
336395

396+
t.Logf("Failed to join channel due to : %v, \n Now performing save channel with orderer client and retrying", err)
397+
398+
ordererClientContext := sdk.Context(fabsdk.WithUser(ordererAdminUser), fabsdk.WithOrg(ordererOrgName))
399+
400+
ordererResMgmt, err := resmgmt.New(ordererClientContext)
401+
require.NoError(t, err)
402+
403+
org1MspClient, err := mspclient.New(sdk.Context(), mspclient.WithOrg(org1))
404+
require.NoError(t, err)
405+
406+
org2MspClient, err := mspclient.New(sdk.Context(), mspclient.WithOrg(org2))
407+
require.NoError(t, err)
408+
409+
org1AdminIdentity, err := org1MspClient.GetSigningIdentity(org1AdminUser)
410+
require.NoError(t, err, "failed to get org1AdminIdentity")
411+
412+
org2AdminIdenity, err := org2MspClient.GetSigningIdentity(org2AdminUser)
413+
require.NoError(t, err, "failed to get org2AdminIdentity")
414+
415+
req := resmgmt.SaveChannelRequest{ChannelID: "orgchannel",
416+
ChannelConfigPath: integration.GetChannelConfigPath("orgchannel.tx"),
417+
SigningIdentities: []msp2.SigningIdentity{org1AdminIdentity, org2AdminIdenity}}
418+
txID, err := ordererResMgmt.SaveChannel(req, resmgmt.WithRetry(retry.DefaultResMgmtOpts), resmgmt.WithOrdererEndpoint("orderer.example.com"))
419+
require.Nil(t, err, "error should be nil")
420+
require.NotEmpty(t, txID, "transaction ID should be populated")
421+
422+
//Try again now
423+
err = joinChannelFunc()
424+
require.NoError(t, err, "failed to join channel...")
425+
337426
}
338427

339-
func queryCC(t *testing.T, org1ChannelClientContext contextAPI.ChannelProvider) {
340-
// Org1 user connects to 'orgchannel'
428+
func queryCC(t *testing.T, org1ChannelClientContext contextAPI.ChannelProvider, expectedMsg string) {
341429
chClientOrg1User, err := channel.New(org1ChannelClientContext)
342430
if err != nil {
343431
t.Fatalf("Failed to create new channel client for Org1 user: %s", err)
344432
}
345-
// Org1 user queries initial value on both peers
346-
// Since one of the peers on channel has certificate revoked, eror is expected here
347-
// Error in container is :
348-
// .... identity 0 does not satisfy principal:
349-
// Could not validate identity against certification chain, err The certificate has been revoked
350433
_, err = chClientOrg1User.Query(channel.Request{ChaincodeID: "exampleCC", Fcn: "invoke", Args: integration.ExampleCCDefaultQueryArgs()},
351-
channel.WithRetry(retry.DefaultChannelOpts))
352-
if err == nil {
353-
t.Fatal("Expected error: '....Description: could not find chaincode with name 'exampleCC',,, ")
434+
channel.WithRetry(retry.DefaultChannelOpts), channel.WithTargetEndpoints("peer0.org1.example.com"))
435+
if err == nil || !strings.Contains(err.Error(), expectedMsg) {
436+
t.Fatalf("Expected error: '%s' , but got '%s'", expectedMsg, err.Error())
354437
}
438+
_, ok := status.FromError(err)
439+
assert.True(t, ok, "Expected status error")
355440
}
356441

357442
func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Client) {
@@ -385,6 +470,7 @@ func createCC(t *testing.T, org1ResMgmt *resmgmt.Client, org2ResMgmt *resmgmt.Cl
385470
},
386471
resmgmt.WithTargetEndpoints("peer0.org1.example.com", "peer0.org2.example.com"),
387472
)
473+
388474
require.Errorf(t, err, "Expecting error instantiating CC on peer with revoked certificate")
389475
stat, ok := status.FromError(err)
390476
require.Truef(t, ok, "Expecting error to be a status error, but got ", err)
@@ -452,14 +538,14 @@ func isChannelConfigUpdated(t *testing.T, client *ledger.Client, config fab.Endp
452538
continue
453539
}
454540
t.Logf("length of revocation list found in peer[%s] is %d", chPeer.URL, len(fabMspCfg.RevocationList))
455-
updated = updated && len(fabMspCfg.RevocationList) > 0
541+
updated = updated && len(fabMspCfg.RevocationList) > 1
456542
}
457543
}
458544
t.Logf("check result :%v \n\n", updated)
459545
return updated
460546
}
461547

462-
func generateCRL() ([]byte, error) {
548+
func generateCRL(cerPath string) ([]byte, error) {
463549

464550
root := integration.GetCryptoConfigPath(pathRevokeCaRoot)
465551
var parentKey string
@@ -483,7 +569,7 @@ func generateCRL() ([]byte, error) {
483569
return nil, errors.WithMessage(err, "Failed to load cert")
484570
}
485571

486-
certToBeRevoked, err := loadCert(integration.GetCryptoConfigPath(pathCertToBeRevokd))
572+
certToBeRevoked, err := loadCert(integration.GetCryptoConfigPath(cerPath))
487573
if err != nil {
488574
return nil, errors.WithMessage(err, "Failed to load cert")
489575
}

0 commit comments

Comments
 (0)