Skip to content

Commit f66c930

Browse files
committed
Introducing self revoke
1 parent 0f333ef commit f66c930

6 files changed

Lines changed: 89 additions & 3 deletions

File tree

docs/hds-lib.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/hds-lib.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/appTemplates/Collector.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,28 @@ class Collector {
320320
return newSharingApiEndpoint;
321321
}
322322

323+
/**
324+
* @private
325+
* @param {CollectorInvite} invite
326+
* @returns {CollectorInvite}
327+
*/
328+
async revokeInvite (invite) {
329+
// invalidate this access
330+
const updateInvite = {
331+
id: invite.eventData.id,
332+
update: {
333+
content: structuredClone(invite.eventData.content),
334+
streamIds: [this.streamIdFor(Collector.STREAMID_SUFFIXES.error)]
335+
}
336+
};
337+
// TODO revoke updateInvite.apiEndPoint
338+
339+
updateInvite.update.content.errorType = 'revoked';
340+
const eventData = await this.appManaging.connection.apiOne('events.update', updateInvite, 'event');
341+
invite.eventData = eventData;
342+
return invite;
343+
}
344+
323345
/**
324346
* check if required streams are present, if not create them
325347
*/

src/appTemplates/CollectorClient.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CollectorClient {
4343
/** @property {string} - one of 'Incoming', 'Active', 'Deactivated', 'Refused' */
4444
get status () {
4545
const eventStatus = this.eventData.content.status;
46-
if (eventStatus === 'Deactivated' || eventStatus === 'Refused') {
46+
if (eventStatus === CollectorClient.STATUSES.deactivated || eventStatus === CollectorClient.STATUSES.refused) {
4747
if (!this.accessData?.deleted) {
4848
logger.error('>> CollectorClient.status TODO check consitency when access is still valid and deactivated or refused', this.accessData);
4949
}
@@ -188,6 +188,27 @@ class CollectorClient {
188188
return null;
189189
}
190190

191+
async revoke () {
192+
if (!this.accessData) {
193+
throw new HDSLibError('Cannot revoke if no accessData');
194+
}
195+
if (this.accessData.deleted && this.status === CollectorClient.STATUSES.deactivated) {
196+
throw new HDSLibError('Already revoked');
197+
}
198+
// revoke access
199+
await this.app.connection.apiOne('accesses.delete', { id: this.accessData.id }, 'accessDeletion');
200+
// lazyly flag currentAccess as deleted
201+
this.accessData.deleted = Date.now() / 1000;
202+
203+
const responseContent = { };
204+
const requesterEvent = await this.#updateRequester('revoke', responseContent);
205+
if (requesterEvent != null) {
206+
await this.#updateStatus(CollectorClient.STATUSES.deactivated);
207+
return { requesterEvent };
208+
}
209+
return null;
210+
}
211+
191212
async refuse () {
192213
const responseContent = { };
193214

src/appTemplates/CollectorInvite.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class CollectorInvite {
2222
eventData;
2323
/** @type {pryv.Connection} */
2424
#connection;
25+
/** @type {Object} accessInfo from account */
26+
#accessInfo;
2527

2628
get key () {
2729
return CollectorInvite.getKeyForEvent(this.eventData);
@@ -51,6 +53,26 @@ class CollectorInvite {
5153
return this.#connection;
5254
}
5355

56+
/**
57+
* Check if connection is valid. (only if active)
58+
* If result is "forbidden" update and set as revoked
59+
* @returns {Object} accessInfo if valid.
60+
*/
61+
async checkAndGetAccessInfo (forceRefresh = false) {
62+
if (!forceRefresh && this.#accessInfo) return this.#accessInfo;
63+
try {
64+
this.#accessInfo = await this.connection.accessInfo();
65+
return this.#accessInfo;
66+
} catch (e) {
67+
this.#accessInfo = null;
68+
if (e.response?.body?.error?.id === 'invalid-access-token') {
69+
await this.collector.revokeInvite(this);
70+
return null;
71+
}
72+
throw e;
73+
}
74+
}
75+
5476
get displayName () {
5577
return this.eventData.content.name;
5678
}

tests/apptemplates.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,27 @@ describe('[APTX] appTemplates', function () {
261261
assert.equal(invitesFromInbox[0].errorType, 'refused');
262262
});
263263

264+
it('[APCR] Collector invite revoke', async () => {
265+
const { collector, collectorClient, invite } = await helperNewInvite(appManaging, appClient, 'APCR');
266+
await collectorClient.accept();
267+
268+
// check collector
269+
const invitesFromInbox1 = await collector.checkInbox();
270+
assert.equal(invitesFromInbox1[0], invite);
271+
assert.equal(invite.status, 'active');
272+
273+
// client revoke
274+
await collectorClient.revoke();
275+
assert.equal(collectorClient.status, 'Deactivated');
276+
assert.ok(collectorClient.accessData.deleted);
277+
278+
// check collector
279+
const invitesFromInbox2 = await collector.checkInbox();
280+
assert.equal(invitesFromInbox2[0], invite);
281+
assert.equal(invite.status, 'error');
282+
assert.equal(invite.errorType, 'revoked');
283+
});
284+
264285
describe('[APCX] app Templates Client', function () {
265286
it('[APCE] Should throw error if not initialized with a personal or master token', async () => {
266287
const permissionsDummy = [{ streamId: 'dummy', level: 'manage' }];

0 commit comments

Comments
 (0)