@data-fair/lib-common-types 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/session/.type/index.d.ts +1 -0
- package/session/.type/validate.js +17 -5
- package/session/index.d.ts +6 -2
- package/session/index.js +13 -10
- package/session/schema.d.ts +3 -0
- package/session/schema.js +3 -0
package/package.json
CHANGED
package/session/.type/index.d.ts
CHANGED
|
@@ -5,10 +5,10 @@ import { fullFormats } from "ajv-formats/dist/formats.js";
|
|
|
5
5
|
"use strict";
|
|
6
6
|
export const validate = validate14;
|
|
7
7
|
export default validate14;
|
|
8
|
-
const schema16 = {"$id":"https://github.com/data-fair/lib/session-state","x-exports":["types","validate"],"type":"object","title":"session state","additionalProperties":false,"properties":{"user":{"$ref":"#/$defs/user"},"organization":{"$ref":"#/$defs/organizationMembership"},"account":{"$ref":"#/$defs/account"},"accountRole":{"type":"string"},"lang":{"type":"string"},"dark":{"type":"boolean"}},"$defs":{"organizationMembership":{"type":"object","additionalProperties":false,"required":["id","name","role"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"},"dflt":{"type":"integer","enum":[1]}}},"userRef":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"user":{"type":"object","additionalProperties":false,"required":["email","id","name","organizations"],"properties":{"email":{"type":"string","format":"email"},"id":{"type":"string"},"name":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/$defs/organizationMembership"}},"isAdmin":{"type":"integer","enum":[1]},"adminMode":{"type":"integer","enum":[1]},"asAdmin":{"$ref":"#/$defs/userRef"},"pd":{"type":"string","format":"date"},"ipa":{"type":"integer","title":"short for ignorePersonalAccount","enum":[1]},"idp":{"type":"integer","title":"Is the user coming from a core ID provider ?","enum":[1]},"os":{"type":"integer","title":"short for orgStorage","enum":[1]}}},"account":{"type":"object","additionalProperties":false,"required":["type","id","name"],"properties":{"type":{"type":"string","enum":["user","organization"]},"id":{"type":"string"},"name":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"}}}}};
|
|
8
|
+
const schema16 = {"$id":"https://github.com/data-fair/lib/session-state","x-exports":["types","validate"],"type":"object","title":"session state","additionalProperties":false,"properties":{"user":{"$ref":"#/$defs/user"},"organization":{"$ref":"#/$defs/organizationMembership"},"account":{"$ref":"#/$defs/account"},"accountRole":{"type":"string"},"lang":{"type":"string"},"dark":{"type":"boolean"}},"$defs":{"organizationMembership":{"type":"object","additionalProperties":false,"required":["id","name","role"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"},"dflt":{"type":"integer","enum":[1]}}},"userRef":{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"user":{"type":"object","additionalProperties":false,"required":["email","id","name","organizations"],"properties":{"email":{"type":"string","format":"email"},"id":{"type":"string"},"name":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/$defs/organizationMembership"}},"isAdmin":{"type":"integer","enum":[1]},"adminMode":{"type":"integer","enum":[1]},"asAdmin":{"$ref":"#/$defs/userRef"},"pd":{"type":"string","format":"date"},"ipa":{"type":"integer","title":"short for ignorePersonalAccount","enum":[1]},"idp":{"type":"integer","title":"Is the user coming from a core ID provider ?","enum":[1]},"os":{"type":"integer","title":"short for orgStorage","enum":[1]},"rememberMe":{"type":"boolean"}}},"account":{"type":"object","additionalProperties":false,"required":["type","id","name"],"properties":{"type":{"type":"string","enum":["user","organization"]},"id":{"type":"string"},"name":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"}}}}};
|
|
9
9
|
const schema18 = {"type":"object","additionalProperties":false,"required":["id","name","role"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"},"dflt":{"type":"integer","enum":[1]}}};
|
|
10
10
|
const schema21 = {"type":"object","additionalProperties":false,"required":["type","id","name"],"properties":{"type":{"type":"string","enum":["user","organization"]},"id":{"type":"string"},"name":{"type":"string"},"department":{"type":"string"},"departmentName":{"type":"string"}}};
|
|
11
|
-
const schema17 = {"type":"object","additionalProperties":false,"required":["email","id","name","organizations"],"properties":{"email":{"type":"string","format":"email"},"id":{"type":"string"},"name":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/$defs/organizationMembership"}},"isAdmin":{"type":"integer","enum":[1]},"adminMode":{"type":"integer","enum":[1]},"asAdmin":{"$ref":"#/$defs/userRef"},"pd":{"type":"string","format":"date"},"ipa":{"type":"integer","title":"short for ignorePersonalAccount","enum":[1]},"idp":{"type":"integer","title":"Is the user coming from a core ID provider ?","enum":[1]},"os":{"type":"integer","title":"short for orgStorage","enum":[1]}}};
|
|
11
|
+
const schema17 = {"type":"object","additionalProperties":false,"required":["email","id","name","organizations"],"properties":{"email":{"type":"string","format":"email"},"id":{"type":"string"},"name":{"type":"string"},"organizations":{"type":"array","items":{"$ref":"#/$defs/organizationMembership"}},"isAdmin":{"type":"integer","enum":[1]},"adminMode":{"type":"integer","enum":[1]},"asAdmin":{"$ref":"#/$defs/userRef"},"pd":{"type":"string","format":"date"},"ipa":{"type":"integer","title":"short for ignorePersonalAccount","enum":[1]},"idp":{"type":"integer","title":"Is the user coming from a core ID provider ?","enum":[1]},"os":{"type":"integer","title":"short for orgStorage","enum":[1]},"rememberMe":{"type":"boolean"}}};
|
|
12
12
|
const schema19 = {"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}};
|
|
13
13
|
const func2 = Object.prototype.hasOwnProperty;
|
|
14
14
|
const formats0 = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
|
|
@@ -486,9 +486,9 @@ vErrors.push(err39);
|
|
|
486
486
|
errors++;
|
|
487
487
|
}
|
|
488
488
|
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
const err40 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "
|
|
489
|
+
if(data.rememberMe !== undefined){
|
|
490
|
+
if(typeof data.rememberMe !== "boolean"){
|
|
491
|
+
const err40 = {instancePath:instancePath+"/rememberMe",schemaPath:"#/properties/rememberMe/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"};
|
|
492
492
|
if(vErrors === null){
|
|
493
493
|
vErrors = [err40];
|
|
494
494
|
}
|
|
@@ -497,6 +497,18 @@ vErrors.push(err40);
|
|
|
497
497
|
}
|
|
498
498
|
errors++;
|
|
499
499
|
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
const err41 = {instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"};
|
|
504
|
+
if(vErrors === null){
|
|
505
|
+
vErrors = [err41];
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
vErrors.push(err41);
|
|
509
|
+
}
|
|
510
|
+
errors++;
|
|
511
|
+
}
|
|
500
512
|
validate15.errors = vErrors;
|
|
501
513
|
return errors === 0;
|
|
502
514
|
}
|
package/session/index.d.ts
CHANGED
|
@@ -5,7 +5,11 @@ export * from './.type/index.js';
|
|
|
5
5
|
export declare function isAuthenticated(sessionState: SessionState): sessionState is SessionStateAuthenticated;
|
|
6
6
|
export declare function assertAuthenticated(sessionState: SessionState): asserts sessionState is SessionStateAuthenticated;
|
|
7
7
|
export declare function assertAdminMode(sessionState: SessionState): asserts sessionState is SessionStateAuthenticated;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
type AssertRoleOptions = {
|
|
9
|
+
allAccounts?: boolean;
|
|
10
|
+
acceptDepAsRoot?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function getAccountRole(sessionState: SessionState, account: AccountKeys, options?: AssertRoleOptions): string | null;
|
|
13
|
+
export declare function assertAccountRole(sessionState: SessionState, account: AccountKeys, roles: string | string[], options?: AssertRoleOptions): void;
|
|
10
14
|
export declare function isValidAccountType(type: string): type is 'user' | 'organization';
|
|
11
15
|
export declare function assertValidAccountType(type: string): asserts type is 'user' | 'organization';
|
package/session/index.js
CHANGED
|
@@ -11,28 +11,31 @@ export function assertAdminMode (sessionState) {
|
|
|
11
11
|
// TODO: use sessionState.locale to internationalize error message
|
|
12
12
|
if (!sessionState.user.adminMode) { throw httpError(403, 'super admin only') }
|
|
13
13
|
}
|
|
14
|
-
function matchAccount (userAccount, resourceAccount) {
|
|
14
|
+
function matchAccount (userAccount, resourceAccount, acceptDepAsRoot = false) {
|
|
15
15
|
if (userAccount.type !== resourceAccount.type) { return false }
|
|
16
16
|
if (userAccount.id !== resourceAccount.id) { return false }
|
|
17
|
-
if (
|
|
17
|
+
if (!acceptDepAsRoot) {
|
|
18
|
+
if (userAccount.department && userAccount.department !== resourceAccount.department) { return false }
|
|
19
|
+
}
|
|
18
20
|
return true
|
|
19
21
|
}
|
|
20
|
-
export function getAccountRole (sessionState, account,
|
|
22
|
+
export function getAccountRole (sessionState, account, options = {}) {
|
|
21
23
|
if (!isAuthenticated(sessionState)) { return null }
|
|
22
24
|
if (sessionState.user.adminMode) { return 'admin' }
|
|
23
|
-
if (
|
|
24
|
-
if (matchAccount(sessionState.account, account)) { return sessionState.accountRole }
|
|
25
|
-
} else {
|
|
25
|
+
if (options.allAccounts) {
|
|
26
26
|
if (account.type === 'user' && sessionState.user.id === account.id) { return 'admin' }
|
|
27
27
|
for (const org of sessionState.user.organizations) {
|
|
28
|
-
if (matchAccount({ type: 'organization', id: org.id, department: org.department }, account)) { return org.role }
|
|
28
|
+
if (matchAccount({ type: 'organization', id: org.id, department: org.department }, account, options.acceptDepAsRoot)) { return org.role }
|
|
29
29
|
}
|
|
30
|
+
} else {
|
|
31
|
+
if (matchAccount(sessionState.account, account, options.acceptDepAsRoot)) { return sessionState.accountRole }
|
|
30
32
|
}
|
|
31
33
|
return null
|
|
32
34
|
}
|
|
33
|
-
export function assertAccountRole (sessionState, account,
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
export function assertAccountRole (sessionState, account, roles, options = {}) {
|
|
36
|
+
if (typeof roles === 'string') { roles = [roles] }
|
|
37
|
+
const accountRole = getAccountRole(sessionState, account, options)
|
|
38
|
+
if (!accountRole || !roles.includes(accountRole)) { throw httpError(403, `requires ${roles.join(', ')} role(s)`) }
|
|
36
39
|
}
|
|
37
40
|
export function isValidAccountType (type) {
|
|
38
41
|
return ['user', 'organization'].includes(type)
|
package/session/schema.d.ts
CHANGED