@@ -52,23 +52,27 @@ import (
5252)
5353
5454const (
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
6771var 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
357442func 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