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

Commit 1223f39

Browse files
committed
[FAB-9175] update fabric-ca-client IdentityService
update fabric-ca-client IdentityService to setup caName for getOne() and getAll() method Change-Id: Iab9ad02af8b9431bf974401008119f45f9224de9 Signed-off-by: zhaochy <zhaochy_2015@hotmail.com>
1 parent 763dc5d commit 1223f39

File tree

2 files changed

+108
-56
lines changed

2 files changed

+108
-56
lines changed

fabric-ca-client/lib/IdentityService.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class IdentityService {
172172
throw new Error('Can not get signingIdentity from registrar');
173173
}
174174

175-
const url = 'identities/' + enrollmentID;
175+
const url = 'identities/' + enrollmentID + '?ca='+this.client._caName;;
176176
return this.client.get(url, signingIdentity);
177177
}
178178

@@ -190,17 +190,18 @@ class IdentityService {
190190
throw new Error('Can not get signingIdentity from registrar');
191191
}
192192

193-
return this.client.get('identities', signingIdentity);
193+
return this.client.get('identities?ca=' + this.client._caName, signingIdentity);
194194
}
195195

196196
/**
197197
* Delete an existing identity. The caller must have `hf.Registrar` authority.
198198
*
199199
* @param {string} enrollmentID
200200
* @param {User} registrar
201+
* @param {boolean} force - Optional. With force, some identity can delete itself
201202
* @return {Promise} {@link ServiceResponse}
202203
*/
203-
delete(enrollmentID, registrar) {
204+
delete(enrollmentID, registrar, force) {
204205
if (!enrollmentID || typeof enrollmentID !== 'string') {
205206
throw new Error('Missing required argument "enrollmentID", or argument "enrollmentID" is not a valid string');
206207
}
@@ -211,7 +212,10 @@ class IdentityService {
211212
throw new Error('Can not get signingIdentity from registrar');
212213
}
213214

214-
const url = 'identities/' + enrollmentID;
215+
let url = 'identities/' + enrollmentID;
216+
if (force === true) {
217+
url = url + '?force=true';
218+
}
215219
return this.client.delete(url, signingIdentity);
216220
}
217221

test/integration/fabric-ca-identity-service-tests.js

Lines changed: 100 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,86 +6,134 @@ let _test = require('tape-promise');
66
let test = _test(tape);
77
const path = require('path');
88
let FabricCAServices = require('../../fabric-ca-client');
9+
const HFCAIdentityAttributes = require('../../fabric-ca-client/lib/IdentityService').HFCAIdentityAttributes;
910
const User = require('../../fabric-ca-client/lib/User');
1011

11-
let userOrg = 'org1';
12+
let userOrg1 = 'org1';
13+
let userOrg2 = 'org2';
1214
let tlsOptions = {
1315
trustedRoots: [],
1416
verify: false
1517
};
1618

1719
let ORGS;
1820

19-
test('\n\n ** FabricCAServices - IdentityService Test **\n\n', (t) => {
21+
test('\n\n ** FabricCAServices - IdentityService Test **\n\n', async (t) => {
2022

2123
FabricCAServices.addConfigFile(path.join(__dirname, 'e2e', 'config.json'));
2224
ORGS = FabricCAServices.getConfigSetting('test-network');
2325

24-
let fabricCAEndpoint = ORGS[userOrg].ca.url;
26+
const fabricCAEndpoint1 = ORGS[userOrg1].ca.url;
27+
const fabricCAEndpoint2 = ORGS[userOrg2].ca.url;
2528

2629
FabricCAServices.getConfigSetting('crypto-keysize', '256'); //force for gulp test
2730
FabricCAServices.setConfigSetting('crypto-hash-algo', 'SHA2'); //force for gulp test
2831

29-
let caService = new FabricCAServices(fabricCAEndpoint, tlsOptions, ORGS[userOrg].ca.name);
32+
let caService1 = new FabricCAServices(fabricCAEndpoint1, tlsOptions, ORGS[userOrg1].ca.name);
33+
let caService2 = new FabricCAServices(fabricCAEndpoint2, tlsOptions, ORGS[userOrg2].ca.name);
3034

3135
let bootstrapUser = {
3236
enrollmentID: 'admin',
3337
enrollmentSecret: 'adminpw'
3438
};
3539

36-
let admin;
40+
let admin1;
41+
let admin2;
3742
let testIdentity = {
38-
enrollmentID: 'user_' + Math.random().toFixed(2).toString(),
43+
enrollmentID: 'user_' + Math.random().toFixed(3).toString(),
3944
enrollmentSecret: 'userpw',
40-
affiliation: 'org1'
45+
affiliation: 'org1',
46+
// set this identity can manage identities of the role client
47+
attrs: [{ name: HFCAIdentityAttributes.HFREGISTRARROLES, value: 'client' }]
4148
};
49+
50+
// update the enrollment secret for testIdentity
4251
let update = {
43-
affiliation: 'org2',
4452
enrollmentSecret: 'mysecret'
4553
};
46-
let hfcaIdentityService;
47-
48-
caService.enroll(bootstrapUser)
49-
.then((enrollment) => {
50-
t.pass('Successfully enrolled \'' + bootstrapUser.enrollmentID + '\'.');
51-
admin = new User('admin');
52-
return admin.setEnrollment(enrollment.key, enrollment.certificate, 'Org1MSP');
53-
}).then(() => {
54-
t.pass('Successfully set enrollment for user admin');
55-
hfcaIdentityService = caService.newIdentityService();
56-
57-
// create a new Identity with admin
58-
return hfcaIdentityService.create(testIdentity, admin);
59-
}).then((resp) => {
60-
t.equal(resp, testIdentity.enrollmentSecret);
61-
t.pass('Successfully created new Identity ' + testIdentity.enrollmentID);
62-
63-
// get this Identity
64-
return hfcaIdentityService.getOne(testIdentity.enrollmentID, admin);
65-
}).then((resp) => {
66-
t.pass('Successfully get indentity ' + testIdentity.enrollmentID);
67-
t.equal(resp.success, true);
68-
t.equal(resp.result.id, testIdentity.enrollmentID);
69-
t.equal(resp.result.affiliation, testIdentity.affiliation);
70-
71-
return hfcaIdentityService.update(testIdentity.enrollmentID, update, admin);
72-
}).then((resp) => {
73-
t.equal(resp.result.secret, update.enrollmentSecret);
74-
t.equal(resp.result.affiliation, update.affiliation);
75-
t.pass('Successfully updated indentity ' + testIdentity.enrollmentID);
76-
77-
return hfcaIdentityService.getAll(admin);
78-
}).then((resp)=>{
79-
t.equal(resp.success, true);
80-
// should be two identities, 'admin' and the new created user
81-
t.equal(resp.result.identities.length, 2);
82-
83-
return hfcaIdentityService.delete(testIdentity.enrollmentID, admin);
84-
}).then((resp)=>{
85-
t.pass('Successfully deleted identity ' + testIdentity.enrollmentID);
86-
t.end();
87-
}).catch((e) => {
88-
t.fail(e.message);
54+
let hfcaIdentityService1;
55+
let hfcaIdentityService2;
56+
57+
try {
58+
const enrollment1 = await caService1.enroll(bootstrapUser);
59+
t.pass('Successfully enrolled admin at ca_Org1');
60+
61+
const enrollment2 = await caService2.enroll(bootstrapUser);
62+
t.pass('Successfully enrolled admin at ca_Org2');
63+
64+
admin1 = new User('admin');
65+
await admin1.setEnrollment(enrollment1.key, enrollment1.certificate, 'Org1MSP');
66+
t.pass('Successfully set enrollment for user admin1');
67+
68+
admin2 = new User('admin2');
69+
await admin2.setEnrollment(enrollment2.key, enrollment2.certificate, 'Org2MSP');
70+
t.pass('Successfully set enrollment for user admin2');
71+
72+
hfcaIdentityService1 = caService1.newIdentityService();
73+
hfcaIdentityService2 = caService2.newIdentityService();
74+
75+
// create a new Identity with admin1
76+
let resp = await hfcaIdentityService1.create(testIdentity, admin1);
77+
t.equal(resp, testIdentity.enrollmentSecret);
78+
t.pass('Successfully created new Identity %s by admin1', testIdentity.enrollmentID);
79+
80+
let enrollment;
81+
let identity;
82+
// enroll the new created user at ca_Org1
83+
enrollment = await caService1.enroll({ enrollmentID: testIdentity.enrollmentID, enrollmentSecret: testIdentity.enrollmentSecret });
84+
t.pass(`Successfully enrolled ${testIdentity.enrollmentID} at ca_Org1`);
85+
identity = new User(testIdentity.enrollmentID);
86+
await identity.setEnrollment(enrollment.key, enrollment.certificate, 'Org1MSP');
87+
88+
// should throw error if we enroll this new identity at ca_Org2
89+
try {
90+
enrollment = await caService2.enroll({ enrollmentID: testIdentity.enrollmentID, enrollmentSecret: testIdentity.enrollmentSecret });
91+
t.fail('should throw error if we enroll this new identity at ca_Org2');
8992
t.end();
90-
});
93+
} catch (e) {
94+
t.equal(e.message.indexOf('"message":"Authorization failure"') >= 0, true);
95+
t.pass('should throw error if we enroll this new identity at ca_Org2');
96+
}
97+
98+
// get this Identity from ca_Org1 by identity
99+
resp = await hfcaIdentityService1.getOne(testIdentity.enrollmentID, identity);
100+
t.pass(`Successfully get indentity ${testIdentity.enrollmentID}`);
101+
t.equal(resp.success, true);
102+
t.equal(resp.result.id, testIdentity.enrollmentID);
103+
t.equal(resp.result.affiliation, testIdentity.affiliation);
104+
105+
// get this Identity from ca_Org1 by admin1
106+
resp = await hfcaIdentityService1.getOne(testIdentity.enrollmentID, admin1);
107+
t.equal(resp.success, true);
108+
109+
// identity can only find itself
110+
resp = await hfcaIdentityService1.getAll(identity);
111+
t.equal(resp.success, true);
112+
t.equal(resp.result.identities.length, 1);
113+
114+
// admin of ca1 can find two identities
115+
resp = await hfcaIdentityService1.getAll(admin1);
116+
t.equal(resp.success, true);
117+
t.equal(resp.result.identities.length, 2);
118+
119+
// admin of ca2 can only find 1 identity
120+
resp = await hfcaIdentityService2.getAll(admin2);
121+
t.equal(resp.success, true);
122+
t.equal(resp.result.identities.length, 1);
123+
124+
// update test identity with admin1
125+
resp = await hfcaIdentityService1.update(identity._name, update, admin1);
126+
t.equal(resp.result.secret, update.enrollmentSecret);
127+
t.pass('Successfully updated indentity ' + identity._name);
128+
129+
// identity delete itself
130+
resp = await hfcaIdentityService1.delete(identity._name, identity, true);
131+
t.equal(resp.success, true);
132+
t.equal(resp.result.id, identity._name);
133+
t.pass('Successfully deleted identity ' + identity._name);
134+
t.end();
135+
} catch (e) {
136+
t.fail(e);
137+
t.end();
138+
}
91139
});

0 commit comments

Comments
 (0)