@things-factory/auth-base 6.2.50 → 6.2.52

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.
Files changed (36) hide show
  1. package/client/directive/privileged.ts +1 -1
  2. package/client/profiled.ts +16 -11
  3. package/dist-client/directive/privileged.d.ts +2 -2
  4. package/dist-client/directive/privileged.js.map +1 -1
  5. package/dist-client/profiled.d.ts +2 -2
  6. package/dist-client/profiled.js +15 -9
  7. package/dist-client/profiled.js.map +1 -1
  8. package/dist-client/tsconfig.tsbuildinfo +1 -1
  9. package/dist-server/index.d.ts +1 -0
  10. package/dist-server/index.js +1 -0
  11. package/dist-server/index.js.map +1 -1
  12. package/dist-server/service/domain-generator/domain-generator-mutation.js +1 -1
  13. package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
  14. package/dist-server/service/privilege/privilege-directive.js +9 -12
  15. package/dist-server/service/privilege/privilege-directive.js.map +1 -1
  16. package/dist-server/service/privilege/privilege-query.d.ts +3 -3
  17. package/dist-server/service/privilege/privilege-query.js +23 -21
  18. package/dist-server/service/privilege/privilege-query.js.map +1 -1
  19. package/dist-server/service/privilege/privilege.d.ts +0 -2
  20. package/dist-server/service/privilege/privilege.js +0 -8
  21. package/dist-server/service/privilege/privilege.js.map +1 -1
  22. package/dist-server/service/user/user.d.ts +2 -2
  23. package/dist-server/service/user/user.js +5 -5
  24. package/dist-server/service/user/user.js.map +1 -1
  25. package/dist-server/tsconfig.tsbuildinfo +1 -1
  26. package/dist-server/utils/check-permission.d.ts +7 -0
  27. package/dist-server/utils/check-permission.js +38 -0
  28. package/dist-server/utils/check-permission.js.map +1 -0
  29. package/package.json +5 -5
  30. package/server/index.ts +2 -0
  31. package/server/service/domain-generator/domain-generator-mutation.ts +1 -1
  32. package/server/service/privilege/privilege-directive.ts +21 -13
  33. package/server/service/privilege/privilege-query.ts +15 -13
  34. package/server/service/privilege/privilege.ts +0 -6
  35. package/server/service/user/user.ts +5 -5
  36. package/server/utils/check-permission.ts +52 -0
@@ -0,0 +1,7 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { PrivilegeObject } from '../service/privilege/privilege';
3
+ import { User } from '../service/user/user';
4
+ export declare function checkPermission(privilegeObject: PrivilegeObject, user: User, domain: Domain, unsafeIP?: boolean, prohibitedPrivileges?: {
5
+ category: string;
6
+ privilege: string;
7
+ }[]): Promise<boolean>;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkPermission = void 0;
4
+ const user_1 = require("../service/user/user");
5
+ async function checkPermission(privilegeObject, user, domain, unsafeIP, prohibitedPrivileges) {
6
+ if (!privilegeObject) {
7
+ return true;
8
+ }
9
+ const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject;
10
+ if (unsafeIP) {
11
+ if (privilege && category) {
12
+ // unsafeIP 상황에서는 ownership granted는 적용되지 않는다.
13
+ if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
14
+ return false;
15
+ }
16
+ return await user_1.User.hasPrivilege(privilege, category, domain, user);
17
+ }
18
+ // privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.
19
+ return !domainOwnerGranted && !superUserGranted;
20
+ }
21
+ else {
22
+ if (!privilege || !category) {
23
+ // privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.
24
+ return ((domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
25
+ (superUserGranted && (await process.superUserGranted(domain, user))));
26
+ }
27
+ if ((domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
28
+ (superUserGranted && (await process.superUserGranted(domain, user)))) {
29
+ return true;
30
+ }
31
+ if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
32
+ return false;
33
+ }
34
+ return await user_1.User.hasPrivilege(privilege, category, domain, user);
35
+ }
36
+ }
37
+ exports.checkPermission = checkPermission;
38
+ //# sourceMappingURL=check-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-permission.js","sourceRoot":"","sources":["../../server/utils/check-permission.ts"],"names":[],"mappings":";;;AAEA,+CAA2C;AAEpC,KAAK,UAAU,eAAe,CACnC,eAAgC,EAChC,IAAU,EACV,MAAc,EACd,QAAkB,EAClB,oBAAgE;IAEhE,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,eAAe,CAAA;IAEnG,IAAI,QAAQ,EAAE;QACZ,IAAI,SAAS,IAAI,QAAQ,EAAE;YACzB,8CAA8C;YAC9C,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;gBACjG,OAAO,KAAK,CAAA;aACb;YAED,OAAO,MAAM,WAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;SAClE;QAED,wEAAwE;QACxE,OAAO,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,CAAA;KAChD;SAAM;QACL,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE;YAC3B,8DAA8D;YAC9D,OAAO,CACL,CAAC,kBAAkB,IAAI,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxE,CAAC,gBAAgB,IAAI,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CACrE,CAAA;SACF;QAED,IACE,CAAC,kBAAkB,IAAI,CAAC,MAAM,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACxE,CAAC,gBAAgB,IAAI,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACpE;YACA,OAAO,IAAI,CAAA;SACZ;QAED,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;YACjG,OAAO,KAAK,CAAA;SACb;QAED,OAAO,MAAM,WAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;KAClE;AACH,CAAC;AA/CD,0CA+CC","sourcesContent":["import { Domain } from '@things-factory/shell'\nimport { PrivilegeObject } from '../service/privilege/privilege'\nimport { User } from '../service/user/user'\n\nexport async function checkPermission(\n privilegeObject: PrivilegeObject,\n user: User,\n domain: Domain,\n unsafeIP?: boolean,\n prohibitedPrivileges?: { category: string; privilege: string }[]\n): Promise<boolean> {\n if (!privilegeObject) {\n return true\n }\n\n const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject\n\n if (unsafeIP) {\n if (privilege && category) {\n // unsafeIP 상황에서는 ownership granted는 적용되지 않는다.\n if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {\n return false\n }\n\n return await User.hasPrivilege(privilege, category, domain, user)\n }\n\n // privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.\n return !domainOwnerGranted && !superUserGranted\n } else {\n if (!privilege || !category) {\n // privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.\n return (\n (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||\n (superUserGranted && (await process.superUserGranted(domain, user)))\n )\n }\n\n if (\n (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||\n (superUserGranted && (await process.superUserGranted(domain, user)))\n ) {\n return true\n }\n\n if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {\n return false\n }\n\n return await User.hasPrivilege(privilege, category, domain, user)\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/auth-base",
3
- "version": "6.2.50",
3
+ "version": "6.2.52",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -30,10 +30,10 @@
30
30
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
31
31
  },
32
32
  "dependencies": {
33
- "@things-factory/email-base": "^6.2.50",
33
+ "@things-factory/email-base": "^6.2.52",
34
34
  "@things-factory/env": "^6.2.33",
35
- "@things-factory/i18n-base": "^6.2.50",
36
- "@things-factory/shell": "^6.2.50",
35
+ "@things-factory/i18n-base": "^6.2.52",
36
+ "@things-factory/shell": "^6.2.52",
37
37
  "@things-factory/utils": "^6.2.48",
38
38
  "jsonwebtoken": "^9.0.0",
39
39
  "koa-passport": "^6.0.0",
@@ -43,5 +43,5 @@
43
43
  "passport-local": "^1.0.0",
44
44
  "popsicle-cookie-jar": "^1.0.0"
45
45
  },
46
- "gitHead": "4dc51db04b745ac434d2bb874038ac4c3b47989b"
46
+ "gitHead": "234f95b63937521f1791a9e2141024ee7816d26d"
47
47
  }
package/server/index.ts CHANGED
@@ -16,6 +16,8 @@ export * from './utils/get-secret'
16
16
  export * from './utils/check-user-belongs-domain'
17
17
  export * from './utils/access-token-cookie'
18
18
  export * from './utils/encrypt-state'
19
+ export * from './utils/check-permission'
20
+
19
21
  export * from './errors'
20
22
 
21
23
  export * from './types'
@@ -11,7 +11,7 @@ import { DomainGeneratorInput, DomainUserRoleInput } from './domain-generator-ty
11
11
 
12
12
  @Resolver()
13
13
  export class DomainGeneratorMutation {
14
- @Directive('@privilege(category: "domain", privilege: "mutation", superUserGranted: true)')
14
+ @Directive('@privilege(superUserGranted: true)')
15
15
  @Directive('@transaction')
16
16
  @Mutation(returns => Domain)
17
17
  async domainRegister(
@@ -3,6 +3,7 @@ import gql from 'graphql-tag'
3
3
 
4
4
  import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils'
5
5
  import { User } from '../user/user'
6
+ import { checkPermission } from '../../utils/check-permission'
6
7
 
7
8
  process['PRIVILEGES'] = {}
8
9
 
@@ -33,22 +34,29 @@ export const privilegeDirectiveResolver = (schema: GraphQLSchema) =>
33
34
  }
34
35
 
35
36
  fieldConfig.resolve = async function (source, args, context, info) {
36
- const { domain, user } = context.state
37
+ const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
37
38
 
38
- if (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) {
39
- return await resolve.call(this, source, args, context, info)
40
- }
41
-
42
- if (superUserGranted && (await process.superUserGranted(domain, user))) {
43
- return await resolve.call(this, source, args, context, info)
44
- }
45
-
46
- if (!category || !privilege) throw new Error(`Unauthorized! Access restricted to authorized personnel only`)
47
-
48
- if (await User.hasPrivilege(privilege, category, domain, user)) {
39
+ if (
40
+ await checkPermission(
41
+ {
42
+ category,
43
+ privilege,
44
+ owner: domainOwnerGranted,
45
+ super: superUserGranted
46
+ },
47
+ user,
48
+ domain,
49
+ unsafeIP,
50
+ prohibitedPrivileges
51
+ )
52
+ ) {
49
53
  return await resolve.call(this, source, args, context, info)
50
54
  } else {
51
- throw new Error(`Unauthorized! ${category}-${privilege} privilege required`)
55
+ throw new Error(
56
+ `Unauthorized! ${
57
+ category && privilege ? category + ':' + privilege + ' privilege' : 'ownership granted'
58
+ } required`
59
+ )
52
60
  }
53
61
  }
54
62
 
@@ -8,14 +8,6 @@ import { PrivilegeList } from './privilege-types'
8
8
 
9
9
  @Resolver(Privilege)
10
10
  export class PrivilegeQuery {
11
- @Directive('@privilege(category: "privilege", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
12
- @Query(returns => Privilege, { description: 'To fetch privilege' })
13
- async privilege(@Arg('name') name: string, @Arg('category') category: string): Promise<Privilege> {
14
- return await getRepository(Privilege).findOne({
15
- where: { name, category }
16
- })
17
- }
18
-
19
11
  @Directive('@privilege(category: "privilege", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
20
12
  @Query(returns => PrivilegeList, { description: 'To fetch multiple privileges' })
21
13
  async privileges(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<PrivilegeList> {
@@ -23,7 +15,12 @@ export class PrivilegeQuery {
23
15
  params,
24
16
  repository: getRepository(Privilege),
25
17
  alias: 'p',
26
- searchables: ['name', 'category']
18
+ searchables: ['privilege', 'category'],
19
+ filtersMap: {
20
+ privilege: {
21
+ columnName: 'name'
22
+ }
23
+ }
27
24
  })
28
25
  .orderBy('p.category', 'ASC')
29
26
  .getManyAndCount()
@@ -42,22 +39,22 @@ export class PrivilegeQuery {
42
39
 
43
40
  @Query(returns => Boolean, { description: 'To query whether I have the given permission' })
44
41
  async hasPrivilege(
45
- @Arg('name') name: string,
42
+ @Arg('privilege') privilege: string,
46
43
  @Arg('category') category: string,
47
44
  @Ctx() context: ResolverContext
48
45
  ): Promise<Boolean> {
49
46
  const { domain, user } = context.state
50
- return await User.hasPrivilege(name, category, domain, user)
47
+ return await User.hasPrivilege(privilege, category, domain, user)
51
48
  }
52
49
 
53
50
  @Query(returns => [Domain], { description: 'To fetch domains with given privilege for user' })
54
51
  async domainsWithPrivilege(
55
- @Arg('name') name: string,
52
+ @Arg('privilege') privilege: string,
56
53
  @Arg('category') category: string,
57
54
  @Ctx() context: ResolverContext
58
55
  ): Promise<Partial<Domain>[]> {
59
56
  const { user } = context.state
60
- return await User.getDomainsWithPrivilege(name, category, user)
57
+ return await User.getDomainsWithPrivilege(privilege, category, user)
61
58
  }
62
59
 
63
60
  @FieldResolver(type => String)
@@ -76,6 +73,11 @@ export class PrivilegeQuery {
76
73
  })
77
74
  }
78
75
 
76
+ @FieldResolver(type => String)
77
+ async privilege(@Root() privilege: Privilege, @Ctx() context: ResolverContext) {
78
+ return privilege.name
79
+ }
80
+
79
81
  @FieldResolver(type => [Role])
80
82
  async roles(@Root() privilege: Privilege) {
81
83
  return (
@@ -27,9 +27,6 @@ export class PrivilegeObject {
27
27
 
28
28
  @Field({ nullable: true })
29
29
  super?: boolean
30
-
31
- @Field({ nullable: true })
32
- protected?: boolean
33
30
  }
34
31
 
35
32
  @InputType()
@@ -45,9 +42,6 @@ export class PrivilegeInput {
45
42
 
46
43
  @Field({ nullable: true })
47
44
  super?: boolean
48
-
49
- @Field({ nullable: true })
50
- protected?: boolean
51
45
  }
52
46
 
53
47
  @Entity()
@@ -312,12 +312,12 @@ export class User {
312
312
  }
313
313
  }
314
314
 
315
- static async hasPrivilege(name: string, category: string, domain: Domain, user: User) {
315
+ static async hasPrivilege(privilege: string, category: string, domain: Domain, user: User) {
316
316
  const result = await getRepository(User).query(
317
317
  `
318
318
  SELECT COUNT(1) AS "has_privilege" FROM "privileges" "PRIVILEGES"
319
319
  WHERE "PRIVILEGES"."category" = '${category}'
320
- AND "PRIVILEGES"."name" = '${name}'
320
+ AND "PRIVILEGES"."name" = '${privilege}'
321
321
  AND "PRIVILEGES"."id" IN (
322
322
  SELECT "RP"."privileges_id"
323
323
  FROM "users_roles" "UR"
@@ -334,7 +334,7 @@ export class User {
334
334
 
335
335
  static async getPrivilegesByDomain(user: User, domain: Domain) {
336
336
  const result = await getRepository(User).query(`
337
- SELECT name, category FROM "privileges" "PRIVILEGES"
337
+ SELECT name privilege, category FROM "privileges" "PRIVILEGES"
338
338
  WHERE "PRIVILEGES"."id" IN (
339
339
  SELECT "RP"."privileges_id"
340
340
  FROM "users_roles" "UR"
@@ -347,7 +347,7 @@ export class User {
347
347
  return result
348
348
  }
349
349
 
350
- static async getDomainsWithPrivilege(name: string, category: string, user: User) {
351
- return getDomainsWithPrivilege(user, name, category)
350
+ static async getDomainsWithPrivilege(privilege: string, category: string, user: User) {
351
+ return getDomainsWithPrivilege(user, privilege, category)
352
352
  }
353
353
  }
@@ -0,0 +1,52 @@
1
+ import { Domain } from '@things-factory/shell'
2
+ import { PrivilegeObject } from '../service/privilege/privilege'
3
+ import { User } from '../service/user/user'
4
+
5
+ export async function checkPermission(
6
+ privilegeObject: PrivilegeObject,
7
+ user: User,
8
+ domain: Domain,
9
+ unsafeIP?: boolean,
10
+ prohibitedPrivileges?: { category: string; privilege: string }[]
11
+ ): Promise<boolean> {
12
+ if (!privilegeObject) {
13
+ return true
14
+ }
15
+
16
+ const { owner: domainOwnerGranted, super: superUserGranted, category, privilege } = privilegeObject
17
+
18
+ if (unsafeIP) {
19
+ if (privilege && category) {
20
+ // unsafeIP 상황에서는 ownership granted는 적용되지 않는다.
21
+ if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
22
+ return false
23
+ }
24
+
25
+ return await User.hasPrivilege(privilege, category, domain, user)
26
+ }
27
+
28
+ // privilege, category가 설정되지 않은 경우에는 ownership granted가 설정되었다면 허가하지 않는다.
29
+ return !domainOwnerGranted && !superUserGranted
30
+ } else {
31
+ if (!privilege || !category) {
32
+ // privilege, category가 설정되지 않은 경우에는 ownership granted만을 적용한다.
33
+ return (
34
+ (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
35
+ (superUserGranted && (await process.superUserGranted(domain, user)))
36
+ )
37
+ }
38
+
39
+ if (
40
+ (domainOwnerGranted && (await process.domainOwnerGranted(domain, user))) ||
41
+ (superUserGranted && (await process.superUserGranted(domain, user)))
42
+ ) {
43
+ return true
44
+ }
45
+
46
+ if ((prohibitedPrivileges || []).find(pp => pp.category == category && pp.privilege == privilege)) {
47
+ return false
48
+ }
49
+
50
+ return await User.hasPrivilege(privilege, category, domain, user)
51
+ }
52
+ }