Skip to content

Commit 997d4e4

Browse files
committed
Fixed permission checks for characterization and feature analysis.
1 parent cf1a863 commit 997d4e4

2 files changed

Lines changed: 54 additions & 24 deletions

File tree

js/pages/characterizations/services/PermissionService.js

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,78 +5,91 @@ define([
55
) {
66

77
function isPermittedCreateCC() {
8-
return AuthAPI.isPermitted(`cohort-characterization:post`);
8+
return AuthAPI.isPermitted(`create:cohort-characterization`);
99
}
1010

1111
function isPermittedImportCC() {
12-
return AuthAPI.isPermitted(`cohort-characterization:import:post`);
12+
return AuthAPI.isPermitted(`create:cohort-characterization`);
1313
}
1414

1515
function isPermittedGetCCList() {
16-
return AuthAPI.isPermitted(`cohort-characterization:get`);
16+
return true; // we do not need to restrict list opertions
1717
}
1818

19-
function isPermittedGetCC(id) {
20-
return AuthAPI.isPermitted(`cohort-characterization:${id}:get`);
19+
var isPermittedGetCC = function(id) {
20+
var grant = AuthAPI.getCCGrant(id);
21+
return grant.isOwner ||
22+
AuthAPI.isPermitted("read:cohort-characterization") ||
23+
AuthAPI.isPermitted("write:cohort-characterization") ||
24+
AuthAPI.checkAccess("READ", grant.accessTypes);
2125
}
2226

23-
function isPermittedUpdateCC(id) {
24-
return AuthAPI.isPermitted(`cohort-characterization:${id}:put`);
25-
}
27+
var isPermittedUpdateCC = function(id) {
28+
var grant = AuthAPI.getCCGrant(id);
29+
return grant.isOwner ||
30+
AuthAPI.isPermitted("write:cohort-characterization") ||
31+
AuthAPI.checkAccess("WRITE", grant.accessTypes);
32+
}
2633

2734
function isPermittedDeleteCC(id) {
28-
return AuthAPI.isPermitted(`cohort-characterization:${id}:delete`);
35+
return isPermittedUpdateCC(id);
2936
}
3037

3138
function isPermittedListGenerations(id) {
32-
return AuthAPI.isPermitted(`cohort-characterization:${id}:generation:get`);
39+
return true; // TODO: do we need to restrict listing generations?
3340
}
3441

3542
function isPermittedGenerate(id, sourceKey) {
36-
return AuthAPI.isPermitted(`cohort-characterization:${id}:generation:${sourceKey}:post`);
43+
return AuthAPI.hasSourceAccess(sourceKey, "WRITE"); // TODO: Do we need read/write checks on the design?
3744
}
3845

3946
function isPermittedResults(sourceKey) {
40-
return (AuthAPI.isPermitted(`cohort-characterization:generation:*:result:post`))
41-
&& AuthAPI.isPermitted(`source:${sourceKey}:access`);
47+
return AuthAPI.hasSourceAccess(sourceKey, "READ");
4248
}
4349

4450
function isPermittedExportGenerationDesign(id) {
45-
return AuthAPI.isPermitted(`cohort-characterization:generation:${id}:design:get`);
51+
return isPermittedGetCC(id);
4652
}
4753

4854
function isPermittedExportCC(id) {
49-
return AuthAPI.isPermitted(`cohort-characterization:${id}:export:get`);
55+
return isPermittedGetCC(id);
5056
}
5157

5258
function isPermittedCopyCC(id) {
53-
return AuthAPI.isPermitted(`cohort-characterization:${id}:post`);
59+
return isPermittedGetCC(id) && isPermittedCreateCC();
5460
}
5561

56-
//
62+
// FA Permissions
5763

5864
function isPermittedGetFaList() {
59-
return AuthAPI.isPermitted(`feature-analysis:get`);
65+
return true; // TODO: do we need perms to list assets?
6066
}
6167

6268
function isPermittedCreateFa() {
63-
return AuthAPI.isPermitted(`feature-analysis:post`);
69+
return AuthAPI.isPermitted(`create:feature-analysis`);
6470
}
6571

6672
function isPermittedGetFa(id) {
67-
return AuthAPI.isPermitted(`feature-analysis:${id}:get`);
73+
var grant = AuthAPI.getFAGrant(id);
74+
return grant.isOwner ||
75+
AuthAPI.isPermitted("read:feature-analysis") ||
76+
AuthAPI.isPermitted("write:feature-analysis") ||
77+
AuthAPI.checkAccess("READ", grant.accessTypes);
6878
}
6979

7080
function isPermittedUpdateFa(id) {
71-
return AuthAPI.isPermitted(`feature-analysis:${id}:put`);
81+
var grant = AuthAPI.getFAGrant(id);
82+
return grant.isOwner ||
83+
AuthAPI.isPermitted("write:feature-analysis") ||
84+
AuthAPI.checkAccess("WRITE", grant.accessTypes);
7285
}
7386

7487
function isPermittedDeleteFa(id) {
75-
return AuthAPI.isPermitted(`feature-analysis:${id}:delete`);
88+
return isPermittedUpdateFa(id);
7689
}
7790

7891
function isPermittedCopyFa(id) {
79-
return AuthAPI.isPermitted(`feature-analysis:${id}:copy:get`);
92+
return isPermittedGetFa(id) && isPermittedCreateFa();
8093
}
8194

8295
return {

js/services/AuthAPI.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,18 @@ define(function(require, exports) {
230230
return granted.includes(check);
231231
}
232232

233+
var getCCGrant = function(id) {
234+
var ccId = +id; // force to numeric
235+
var authz = permissions().cohortCharacterizationAccess;
236+
return authz[ccId] || NONE_ENTITY_GRANT; // assign a falsy entity grant if not found
237+
}
238+
239+
var getFAGrant = function(id) {
240+
var faId = +id; // force to numeric
241+
var authz = permissions().feAnalysisAccess;
242+
return authz[faId] || NONE_ENTITY_GRANT; // assign a falsy entity grant if not found
243+
}
244+
233245
function base64urldecode(arg) {
234246
var s = arg;
235247
s = s.replace(/-/g, '+'); // 62nd char of encoding
@@ -451,7 +463,6 @@ define(function(require, exports) {
451463
}
452464

453465
const hasSourceAccess = function (sourceKey, accessType = "READ") {
454-
var sourceKey = sharedState.sourceKeyOfVocabUrl();
455466
var sourceId = (sharedState.sources().find(s => s.sourceKey == sourceKey) || {}).sourceId;
456467

457468
if (!sourceId) return false; // source not found
@@ -516,6 +527,7 @@ define(function(require, exports) {
516527
var api = {
517528
AUTH_PROVIDERS: AUTH_PROVIDERS,
518529
AUTH_CLIENTS: AUTH_CLIENTS,
530+
NONE_ENTITY_GRANT: NONE_ENTITY_GRANT,
519531

520532
token: token,
521533
authClient: authClient,
@@ -534,11 +546,16 @@ define(function(require, exports) {
534546
isAuthenticated: isAuthenticated,
535547
signInOpened: signInOpened,
536548
isPermitted: isPermitted,
549+
checkAccess: checkAccess,
537550

538551
isPermittedGetAllNotifications: isPermittedGetAllNotifications,
539552
isPermittedGetViewedNotifications: isPermittedGetViewedNotifications,
540553
isPermittedPostViewedNotifications: isPermittedPostViewedNotifications,
541554

555+
// will add the various get{entity} grants here
556+
getCCGrant: getCCGrant,
557+
getFAGrant: getFAGrant,
558+
542559
isPermittedCreateConceptset: isPermittedCreateConceptset,
543560
isPermittedReadConceptset: isPermittedReadConceptset,
544561
isPermittedUpdateConceptset: isPermittedUpdateConceptset,

0 commit comments

Comments
 (0)