@things-factory/auth-base 8.0.0-beta.0 → 8.0.0-beta.2
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 +6 -6
- package/client/actions/auth.ts +0 -24
- package/client/auth.ts +0 -272
- package/client/bootstrap.ts +0 -47
- package/client/directive/privileged.ts +0 -28
- package/client/index.ts +0 -4
- package/client/profiled.ts +0 -83
- package/client/reducers/auth.ts +0 -31
- package/client/verify-webauthn.ts +0 -86
- package/server/constants/error-code.ts +0 -22
- package/server/constants/error-message.ts +0 -0
- package/server/constants/max-age.ts +0 -1
- package/server/controllers/auth.ts +0 -5
- package/server/controllers/change-pwd.ts +0 -100
- package/server/controllers/checkin.ts +0 -21
- package/server/controllers/delete-user.ts +0 -71
- package/server/controllers/invitation.ts +0 -163
- package/server/controllers/profile.ts +0 -55
- package/server/controllers/reset-password.ts +0 -126
- package/server/controllers/signin.ts +0 -98
- package/server/controllers/signup.ts +0 -72
- package/server/controllers/unlock-user.ts +0 -62
- package/server/controllers/utils/make-invitation-token.ts +0 -5
- package/server/controllers/utils/make-verification-token.ts +0 -4
- package/server/controllers/utils/password-rule.ts +0 -120
- package/server/controllers/utils/save-invitation-token.ts +0 -10
- package/server/controllers/utils/save-verification-token.ts +0 -12
- package/server/controllers/verification.ts +0 -84
- package/server/errors/auth-error.ts +0 -24
- package/server/errors/index.ts +0 -2
- package/server/errors/user-domain-not-match-error.ts +0 -29
- package/server/index.ts +0 -37
- package/server/middlewares/authenticate-401-middleware.ts +0 -114
- package/server/middlewares/domain-authenticate-middleware.ts +0 -78
- package/server/middlewares/graphql-authenticate-middleware.ts +0 -13
- package/server/middlewares/index.ts +0 -67
- package/server/middlewares/jwt-authenticate-middleware.ts +0 -84
- package/server/middlewares/signin-middleware.ts +0 -55
- package/server/middlewares/webauthn-middleware.ts +0 -126
- package/server/migrations/1548206416130-SeedUser.ts +0 -60
- package/server/migrations/1566805283882-SeedPrivilege.ts +0 -28
- package/server/migrations/index.ts +0 -9
- package/server/router/auth-checkin-router.ts +0 -113
- package/server/router/auth-private-process-router.ts +0 -114
- package/server/router/auth-public-process-router.ts +0 -314
- package/server/router/auth-signin-router.ts +0 -55
- package/server/router/auth-signup-router.ts +0 -95
- package/server/router/index.ts +0 -9
- package/server/router/oauth2/index.ts +0 -2
- package/server/router/oauth2/oauth2-authorize-router.ts +0 -81
- package/server/router/oauth2/oauth2-router.ts +0 -165
- package/server/router/oauth2/oauth2-server.ts +0 -262
- package/server/router/oauth2/passport-oauth2-client-password.ts +0 -87
- package/server/router/oauth2/passport-refresh-token.ts +0 -87
- package/server/router/path-base-domain-router.ts +0 -8
- package/server/router/site-root-router.ts +0 -48
- package/server/router/webauthn-router.ts +0 -149
- package/server/routes.ts +0 -80
- package/server/service/app-binding/app-binding-mutation.ts +0 -22
- package/server/service/app-binding/app-binding-query.ts +0 -92
- package/server/service/app-binding/app-binding-types.ts +0 -11
- package/server/service/app-binding/app-binding.ts +0 -17
- package/server/service/app-binding/index.ts +0 -4
- package/server/service/appliance/appliance-mutation.ts +0 -113
- package/server/service/appliance/appliance-query.ts +0 -76
- package/server/service/appliance/appliance-types.ts +0 -56
- package/server/service/appliance/appliance.ts +0 -133
- package/server/service/appliance/index.ts +0 -6
- package/server/service/application/application-mutation.ts +0 -104
- package/server/service/application/application-query.ts +0 -98
- package/server/service/application/application-types.ts +0 -76
- package/server/service/application/application.ts +0 -216
- package/server/service/application/index.ts +0 -6
- package/server/service/auth-provider/auth-provider-mutation.ts +0 -159
- package/server/service/auth-provider/auth-provider-parameter-spec.ts +0 -24
- package/server/service/auth-provider/auth-provider-query.ts +0 -88
- package/server/service/auth-provider/auth-provider-type.ts +0 -67
- package/server/service/auth-provider/auth-provider.ts +0 -155
- package/server/service/auth-provider/index.ts +0 -7
- package/server/service/domain-generator/domain-generator-mutation.ts +0 -117
- package/server/service/domain-generator/domain-generator-types.ts +0 -46
- package/server/service/domain-generator/index.ts +0 -3
- package/server/service/granted-role/granted-role-mutation.ts +0 -156
- package/server/service/granted-role/granted-role-query.ts +0 -60
- package/server/service/granted-role/granted-role.ts +0 -27
- package/server/service/granted-role/index.ts +0 -6
- package/server/service/index.ts +0 -90
- package/server/service/invitation/index.ts +0 -6
- package/server/service/invitation/invitation-mutation.ts +0 -78
- package/server/service/invitation/invitation-query.ts +0 -33
- package/server/service/invitation/invitation-types.ts +0 -11
- package/server/service/invitation/invitation.ts +0 -63
- package/server/service/login-history/index.ts +0 -5
- package/server/service/login-history/login-history-query.ts +0 -51
- package/server/service/login-history/login-history-type.ts +0 -12
- package/server/service/login-history/login-history.ts +0 -45
- package/server/service/partner/index.ts +0 -6
- package/server/service/partner/partner-mutation.ts +0 -61
- package/server/service/partner/partner-query.ts +0 -102
- package/server/service/partner/partner-types.ts +0 -11
- package/server/service/partner/partner.ts +0 -57
- package/server/service/password-history/index.ts +0 -3
- package/server/service/password-history/password-history.ts +0 -16
- package/server/service/privilege/index.ts +0 -6
- package/server/service/privilege/privilege-directive.ts +0 -77
- package/server/service/privilege/privilege-mutation.ts +0 -92
- package/server/service/privilege/privilege-query.ts +0 -94
- package/server/service/privilege/privilege-types.ts +0 -60
- package/server/service/privilege/privilege.ts +0 -102
- package/server/service/role/index.ts +0 -6
- package/server/service/role/role-mutation.ts +0 -109
- package/server/service/role/role-query.ts +0 -155
- package/server/service/role/role-types.ts +0 -81
- package/server/service/role/role.ts +0 -72
- package/server/service/user/domain-query.ts +0 -24
- package/server/service/user/index.ts +0 -7
- package/server/service/user/user-mutation.ts +0 -482
- package/server/service/user/user-query.ts +0 -145
- package/server/service/user/user-types.ts +0 -100
- package/server/service/user/user.ts +0 -381
- package/server/service/users-auth-providers/index.ts +0 -5
- package/server/service/users-auth-providers/users-auth-providers.ts +0 -71
- package/server/service/verification-token/index.ts +0 -3
- package/server/service/verification-token/verification-token.ts +0 -60
- package/server/service/web-auth-credential/index.ts +0 -3
- package/server/service/web-auth-credential/web-auth-credential.ts +0 -67
- package/server/templates/account-unlock-email.ts +0 -65
- package/server/templates/invitation-email.ts +0 -66
- package/server/templates/reset-password-email.ts +0 -65
- package/server/templates/verification-email.ts +0 -66
- package/server/types.ts +0 -21
- package/server/utils/accepts.ts +0 -11
- package/server/utils/access-token-cookie.ts +0 -61
- package/server/utils/check-permission.ts +0 -52
- package/server/utils/check-user-belongs-domain.ts +0 -19
- package/server/utils/check-user-has-role.ts +0 -29
- package/server/utils/encrypt-state.ts +0 -22
- package/server/utils/get-aes-256-key.ts +0 -13
- package/server/utils/get-domain-from-hostname.ts +0 -7
- package/server/utils/get-domain-users.ts +0 -38
- package/server/utils/get-secret.ts +0 -13
- package/server/utils/get-user-domains.ts +0 -112
@@ -1,65 +0,0 @@
|
|
1
|
-
export function getUnlockUserEmailForm({ username, name, resetUrl }) {
|
2
|
-
return `
|
3
|
-
<html lang="en">
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8" />
|
6
|
-
|
7
|
-
<title>reset password</title>
|
8
|
-
<meta name="description" content="Password Reset" />
|
9
|
-
<meta name="author" content="hatiolab" />
|
10
|
-
<meta name="google" content="notranslate"/>
|
11
|
-
</head>
|
12
|
-
|
13
|
-
<body>
|
14
|
-
<div style="background-color:#f6f6f6">
|
15
|
-
<!--header begin-->
|
16
|
-
<div style="background-color:#fff;padding:0 10px;border-top: 2px solid #394e64;">
|
17
|
-
<a href="#" target="_blank"
|
18
|
-
><img
|
19
|
-
src="http://www.hatiolab.com/assets/img/logo-operato.png"
|
20
|
-
style="max-height:50px"
|
21
|
-
/></a>
|
22
|
-
</div>
|
23
|
-
<!--header end-->
|
24
|
-
|
25
|
-
<!--title begin-->
|
26
|
-
<div
|
27
|
-
style="background-color:#22a6a7;padding:12px 10px 10px 10px;min-height:50px;"
|
28
|
-
>
|
29
|
-
<img
|
30
|
-
src="http://www.hatiolab.com/assets/img/icon-mail.png"
|
31
|
-
style="float:left;margin:0 10px 0 40px"
|
32
|
-
/>
|
33
|
-
<span style="display:block;color:#fff;font-size:20px"
|
34
|
-
>Hi ${name}!</span
|
35
|
-
>
|
36
|
-
<span style="display:block;color:#fff;font-size:34px;font-weight:bold"
|
37
|
-
>Unlock Account</span
|
38
|
-
>
|
39
|
-
</div>
|
40
|
-
<!--title end-->
|
41
|
-
|
42
|
-
<!--body begin-->
|
43
|
-
<p style="padding:10px 20px;line-height:1.5;font-size:16px">
|
44
|
-
Click the button below to unlock account and reset password.
|
45
|
-
<br />
|
46
|
-
<a
|
47
|
-
href="${resetUrl}"
|
48
|
-
style="display:inline-block;margin:10px 5px 5px 0;border-radius:7px;background-color:#22a6a7;padding:7px 15px;color:#fff;font-size:18px;text-decoration:none;text-transform:capitalize;"
|
49
|
-
>unlock account</a
|
50
|
-
>
|
51
|
-
</p>
|
52
|
-
<!--body end-->
|
53
|
-
|
54
|
-
<!--footer begin-->
|
55
|
-
<div
|
56
|
-
style="background-color:#3d5874;padding:7px 20px 5px 20px;font-size:12px;color:#efefef"
|
57
|
-
>
|
58
|
-
© Hatio, Lab. Inc. All rights reserved.
|
59
|
-
</div>
|
60
|
-
<!--footer end-->
|
61
|
-
</div>
|
62
|
-
</body>
|
63
|
-
</html>
|
64
|
-
`
|
65
|
-
}
|
@@ -1,66 +0,0 @@
|
|
1
|
-
export function getInvitationEmailForm({ username, email, acceptUrl }) {
|
2
|
-
return `
|
3
|
-
<html lang="en">
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8" />
|
6
|
-
|
7
|
-
<title>Invitation from Operato</title>
|
8
|
-
<meta name="description" content="Invitation" />
|
9
|
-
<meta name="author" content="hatiolab" />
|
10
|
-
<meta name="google" content="notranslate"/>
|
11
|
-
</head>
|
12
|
-
|
13
|
-
<body>
|
14
|
-
<div style="background-color:#f6f6f6">
|
15
|
-
<!--header begin-->
|
16
|
-
<div style="background-color:#fff;padding:0 10px;border-top: 2px solid #394e64;">
|
17
|
-
<a href="#" target="_blank"
|
18
|
-
><img
|
19
|
-
src="http://www.hatiolab.com/assets/img/logo-operato.png"
|
20
|
-
style="max-height:50px"
|
21
|
-
/></a>
|
22
|
-
</div>
|
23
|
-
<!--header end-->
|
24
|
-
|
25
|
-
<!--title begin-->
|
26
|
-
<div
|
27
|
-
style="background-color:#22a6a7;padding:12px 10px 10px 10px;min-height:50px;"
|
28
|
-
>
|
29
|
-
<img
|
30
|
-
src="http://www.hatiolab.com/assets/img/icon-mail.png"
|
31
|
-
style="float:left;margin:0 10px 0 40px"
|
32
|
-
/>
|
33
|
-
<span style="display:block;color:#fff;font-size:20px"
|
34
|
-
>Hi ${email}!</span
|
35
|
-
>
|
36
|
-
<span style="display:block;color:#fff;font-size:34px;font-weight:bold"
|
37
|
-
>Verify your email</span
|
38
|
-
>
|
39
|
-
</div>
|
40
|
-
<!--title end-->
|
41
|
-
|
42
|
-
<!--body begin-->
|
43
|
-
<p style="padding:10px 20px;line-height:1.5;font-size:16px">
|
44
|
-
You're invited from Operato.
|
45
|
-
Simply click the button below to verify your email address.
|
46
|
-
<br />
|
47
|
-
<a
|
48
|
-
href="${acceptUrl}"
|
49
|
-
style="display:inline-block;margin:10px 5px 5px 0;border-radius:7px;background-color:#22a6a7;padding:7px 15px;color:#fff;font-size:18px;text-decoration:none;text-transform:capitalize;"
|
50
|
-
>Verify</a
|
51
|
-
>
|
52
|
-
</p>
|
53
|
-
<!--body end-->
|
54
|
-
|
55
|
-
<!--footer begin-->
|
56
|
-
<div
|
57
|
-
style="background-color:#3d5874;padding:7px 20px 5px 20px;font-size:12px;color:#efefef"
|
58
|
-
>
|
59
|
-
© Hatio, Lab. Inc. All rights reserved.
|
60
|
-
</div>
|
61
|
-
<!--footer end-->
|
62
|
-
</div>
|
63
|
-
</body>
|
64
|
-
</html>
|
65
|
-
`
|
66
|
-
}
|
@@ -1,65 +0,0 @@
|
|
1
|
-
export function getResetPasswordEmailForm({ name, resetUrl }) {
|
2
|
-
return `
|
3
|
-
<html lang="en">
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8" />
|
6
|
-
|
7
|
-
<title>reset password</title>
|
8
|
-
<meta name="description" content="Password Reset" />
|
9
|
-
<meta name="author" content="hatiolab" />
|
10
|
-
<meta name="google" content="notranslate"/>
|
11
|
-
</head>
|
12
|
-
|
13
|
-
<body>
|
14
|
-
<div style="background-color:#f6f6f6">
|
15
|
-
<!--header begin-->
|
16
|
-
<div style="background-color:#fff;padding:0 10px;border-top: 2px solid #394e64;">
|
17
|
-
<a href="#" target="_blank"
|
18
|
-
><img
|
19
|
-
src="http://www.hatiolab.com/assets/img/logo-operato.png"
|
20
|
-
style="max-height:50px"
|
21
|
-
/></a>
|
22
|
-
</div>
|
23
|
-
<!--header end-->
|
24
|
-
|
25
|
-
<!--title begin-->
|
26
|
-
<div
|
27
|
-
style="background-color:#22a6a7;padding:12px 10px 10px 10px;min-height:50px;"
|
28
|
-
>
|
29
|
-
<img
|
30
|
-
src="http://www.hatiolab.com/assets/img/icon-mail.png"
|
31
|
-
style="float:left;margin:0 10px 0 40px"
|
32
|
-
/>
|
33
|
-
<span style="display:block;color:#fff;font-size:20px"
|
34
|
-
>Hi ${name}!</span
|
35
|
-
>
|
36
|
-
<span style="display:block;color:#fff;font-size:34px;font-weight:bold"
|
37
|
-
>Reset password</span
|
38
|
-
>
|
39
|
-
</div>
|
40
|
-
<!--title end-->
|
41
|
-
|
42
|
-
<!--body begin-->
|
43
|
-
<p style="padding:10px 20px;line-height:1.5;font-size:16px">
|
44
|
-
Click the button below to reset password.
|
45
|
-
<br />
|
46
|
-
<a
|
47
|
-
href="${resetUrl}"
|
48
|
-
style="display:inline-block;margin:10px 5px 5px 0;border-radius:7px;background-color:#22a6a7;padding:7px 15px;color:#fff;font-size:18px;text-decoration:none;text-transform:capitalize;"
|
49
|
-
>reset password</a
|
50
|
-
>
|
51
|
-
</p>
|
52
|
-
<!--body end-->
|
53
|
-
|
54
|
-
<!--footer begin-->
|
55
|
-
<div
|
56
|
-
style="background-color:#3d5874;padding:7px 20px 5px 20px;font-size:12px;color:#efefef"
|
57
|
-
>
|
58
|
-
© Hatio, Lab. Inc. All rights reserved.
|
59
|
-
</div>
|
60
|
-
<!--footer end-->
|
61
|
-
</div>
|
62
|
-
</body>
|
63
|
-
</html>
|
64
|
-
`
|
65
|
-
}
|
@@ -1,66 +0,0 @@
|
|
1
|
-
export function getVerificationEmailForm({ username, name, verifyUrl }) {
|
2
|
-
return `
|
3
|
-
<html lang="en">
|
4
|
-
<head>
|
5
|
-
<meta charset="utf-8" />
|
6
|
-
|
7
|
-
<title>Verify your email</title>
|
8
|
-
<meta name="description" content="Email Verification" />
|
9
|
-
<meta name="author" content="hatiolab" />
|
10
|
-
<meta name="google" content="notranslate"/>
|
11
|
-
</head>
|
12
|
-
|
13
|
-
<body>
|
14
|
-
<div style="background-color:#f6f6f6">
|
15
|
-
<!--header begin-->
|
16
|
-
<div style="background-color:#fff;padding:0 10px;border-top: 2px solid #394e64;">
|
17
|
-
<a href="#" target="_blank"
|
18
|
-
><img
|
19
|
-
src="http://www.hatiolab.com/assets/img/logo-operato.png"
|
20
|
-
style="max-height:50px"
|
21
|
-
/></a>
|
22
|
-
</div>
|
23
|
-
<!--header end-->
|
24
|
-
|
25
|
-
<!--title begin-->
|
26
|
-
<div
|
27
|
-
style="background-color:#22a6a7;padding:12px 10px 10px 10px;min-height:50px;"
|
28
|
-
>
|
29
|
-
<img
|
30
|
-
src="http://www.hatiolab.com/assets/img/icon-mail.png"
|
31
|
-
style="float:left;margin:0 10px 0 40px"
|
32
|
-
/>
|
33
|
-
<span style="display:block;color:#fff;font-size:20px"
|
34
|
-
>Hi ${name}!</span
|
35
|
-
>
|
36
|
-
<span style="display:block;color:#fff;font-size:34px;font-weight:bold"
|
37
|
-
>Verify your email</span
|
38
|
-
>
|
39
|
-
</div>
|
40
|
-
<!--title end-->
|
41
|
-
|
42
|
-
<!--body begin-->
|
43
|
-
<p style="padding:10px 20px;line-height:1.5;font-size:16px">
|
44
|
-
You're almost ready to start enjoying Operato.
|
45
|
-
Simply click the button below to verify your email address.
|
46
|
-
<br />
|
47
|
-
<a
|
48
|
-
href="${verifyUrl}"
|
49
|
-
style="display:inline-block;margin:10px 5px 5px 0;border-radius:7px;background-color:#22a6a7;padding:7px 15px;color:#fff;font-size:18px;text-decoration:none;text-transform:capitalize;"
|
50
|
-
>Verify</a
|
51
|
-
>
|
52
|
-
</p>
|
53
|
-
<!--body end-->
|
54
|
-
|
55
|
-
<!--footer begin-->
|
56
|
-
<div
|
57
|
-
style="background-color:#3d5874;padding:7px 20px 5px 20px;font-size:12px;color:#efefef"
|
58
|
-
>
|
59
|
-
© Hatio, Lab. Inc. All rights reserved.
|
60
|
-
</div>
|
61
|
-
<!--footer end-->
|
62
|
-
</div>
|
63
|
-
</body>
|
64
|
-
</html>
|
65
|
-
`
|
66
|
-
}
|
package/server/types.ts
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
import { TFunction } from 'i18next'
|
2
|
-
import { EntityManager } from 'typeorm'
|
3
|
-
|
4
|
-
import { Domain } from '@things-factory/shell'
|
5
|
-
|
6
|
-
import { User } from './service/user/user'
|
7
|
-
|
8
|
-
declare global {
|
9
|
-
export type ResolverContext = {
|
10
|
-
state: IContextState
|
11
|
-
t?: TFunction
|
12
|
-
[key: string]: any
|
13
|
-
}
|
14
|
-
|
15
|
-
interface IContextState {
|
16
|
-
domain: Domain
|
17
|
-
user: User
|
18
|
-
tx?: EntityManager
|
19
|
-
[key: string]: any
|
20
|
-
}
|
21
|
-
}
|
package/server/utils/accepts.ts
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
import { getCookieDomainFromHostname } from '@things-factory/shell'
|
2
|
-
import { config } from '@things-factory/env'
|
3
|
-
import { MAX_AGE } from '../constants/max-age'
|
4
|
-
|
5
|
-
const accessTokenCookieKey = config.get('accessTokenCookieKey', 'access_token')
|
6
|
-
|
7
|
-
export function getAccessTokenCookie(context) {
|
8
|
-
return context?.cookies?.get(accessTokenCookieKey)
|
9
|
-
}
|
10
|
-
|
11
|
-
export function setAccessTokenCookie(context, token) {
|
12
|
-
const { secure } = context
|
13
|
-
|
14
|
-
var cookie = {
|
15
|
-
secure,
|
16
|
-
httpOnly: true,
|
17
|
-
maxAge: MAX_AGE,
|
18
|
-
sameSite: 'Lax'
|
19
|
-
}
|
20
|
-
|
21
|
-
const cookieDomain = getCookieDomainFromHostname(context.hostname)
|
22
|
-
if (cookieDomain) {
|
23
|
-
cookie['domain'] = cookieDomain
|
24
|
-
}
|
25
|
-
|
26
|
-
context.cookies.set(accessTokenCookieKey, token, cookie)
|
27
|
-
}
|
28
|
-
|
29
|
-
export function setSessionAccessToken(context) {
|
30
|
-
/* koa-session 을 사용하는 경우에는, cookie 직접 설정이 작동되지 않는다. 그런 경우에는 session에 설정해서 cookie를 변경한다. */
|
31
|
-
const { user } = context.state
|
32
|
-
|
33
|
-
context.session = {
|
34
|
-
id: user.id,
|
35
|
-
userType: user.type,
|
36
|
-
status: user.state
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
export function clearAccessTokenCookie(context) {
|
41
|
-
const { secure } = context
|
42
|
-
|
43
|
-
var cookie = {
|
44
|
-
secure,
|
45
|
-
httpOnly: true,
|
46
|
-
sameSite: 'Lax'
|
47
|
-
}
|
48
|
-
|
49
|
-
const cookieDomain = getCookieDomainFromHostname(context.hostname)
|
50
|
-
if (cookieDomain) {
|
51
|
-
cookie['domain'] = cookieDomain
|
52
|
-
}
|
53
|
-
|
54
|
-
context.cookies.set(accessTokenCookieKey, '', cookie)
|
55
|
-
/*
|
56
|
-
* TODO clear i18next cookie as well - need to support domain
|
57
|
-
* https://github.com/hatiolab/things-factory/issues/70
|
58
|
-
*/
|
59
|
-
context.cookies.set('i18next', '', cookie)
|
60
|
-
context.session = null
|
61
|
-
}
|
@@ -1,52 +0,0 @@
|
|
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
|
-
}
|
@@ -1,19 +0,0 @@
|
|
1
|
-
import { Domain, getRepository } from '@things-factory/shell'
|
2
|
-
|
3
|
-
import { User } from '../service/user/user'
|
4
|
-
|
5
|
-
/**
|
6
|
-
* @description Based on domain and user information,
|
7
|
-
* Find out whether the user belongs domain or user has partnership with domain
|
8
|
-
*
|
9
|
-
* @param domain
|
10
|
-
* @param user
|
11
|
-
*/
|
12
|
-
export async function checkUserBelongsDomain(domain: Domain, user: User): Promise<Boolean> {
|
13
|
-
if (!user.domains?.length) {
|
14
|
-
user = await getRepository(User).findOne({ where: { id: user.id }, relations: ['domains'] })
|
15
|
-
}
|
16
|
-
|
17
|
-
const { domains: userDomains }: User = user
|
18
|
-
return Boolean(userDomains.find((userDomain: Domain) => userDomain.id === domain.id))
|
19
|
-
}
|
@@ -1,29 +0,0 @@
|
|
1
|
-
import { Domain, getRepository } from '@things-factory/shell'
|
2
|
-
|
3
|
-
import { User } from '../service/user/user'
|
4
|
-
import { Role } from 'service'
|
5
|
-
|
6
|
-
/**
|
7
|
-
* @description 사용자가 특정 도메인 또는 상위 도메인에서 특정 역할을 가지고 있는지 확인합니다.
|
8
|
-
*
|
9
|
-
* @param roleId 확인할 역할의 ID
|
10
|
-
* @param domain 역할을 확인할 도메인
|
11
|
-
* @param user 역할을 확인할 사용자
|
12
|
-
*
|
13
|
-
* @returns 사용자가 도메인 또는 상위 도메인에서 역할을 가지고 있는지 여부를 나타내는 boolean을 반환하는 Promise
|
14
|
-
*/
|
15
|
-
export async function checkUserHasRole(roleId: string, domain: Domain, user: User): Promise<Boolean> {
|
16
|
-
if (!roleId) {
|
17
|
-
return true
|
18
|
-
}
|
19
|
-
|
20
|
-
const me = await getRepository(User).findOne({
|
21
|
-
where: { id: user.id },
|
22
|
-
relations: ['roles']
|
23
|
-
})
|
24
|
-
|
25
|
-
return me.roles
|
26
|
-
.filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
|
27
|
-
.map(role => role.id)
|
28
|
-
.includes(roleId)
|
29
|
-
}
|
@@ -1,22 +0,0 @@
|
|
1
|
-
import crypto from 'crypto'
|
2
|
-
|
3
|
-
/* only for short-term life state encryption */
|
4
|
-
const KEY = crypto.randomBytes(32)
|
5
|
-
|
6
|
-
export function encryptState(text: string) {
|
7
|
-
const iv = crypto.randomBytes(16)
|
8
|
-
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(KEY), iv)
|
9
|
-
const encrypted = cipher.update(text)
|
10
|
-
|
11
|
-
return iv.toString('hex') + ':' + Buffer.concat([encrypted, cipher.final()]).toString('hex')
|
12
|
-
}
|
13
|
-
|
14
|
-
export function decryptState(text: string) {
|
15
|
-
const textParts = text.split(':')
|
16
|
-
const iv = Buffer.from(textParts.shift(), 'hex')
|
17
|
-
const encryptedText = Buffer.from(textParts.join(':'), 'hex')
|
18
|
-
const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(KEY), iv)
|
19
|
-
const decrypted = decipher.update(encryptedText)
|
20
|
-
|
21
|
-
return Buffer.concat([decrypted, decipher.final()]).toString()
|
22
|
-
}
|
@@ -1,13 +0,0 @@
|
|
1
|
-
import { config } from '@things-factory/env'
|
2
|
-
|
3
|
-
var _AES_256_KEY = config.get('AES_256_KEY')
|
4
|
-
|
5
|
-
if (!_AES_256_KEY) {
|
6
|
-
if (process.env.NODE_ENV == 'production') {
|
7
|
-
throw new TypeError('AES_256_KEY not configured.')
|
8
|
-
} else {
|
9
|
-
_AES_256_KEY = 'V6g5oHJZb7KcYzIyL6cM95XvIDouon5b'
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
export const AES_256_KEY = _AES_256_KEY
|
@@ -1,38 +0,0 @@
|
|
1
|
-
import { EntityManager, Repository, SelectQueryBuilder } from 'typeorm'
|
2
|
-
|
3
|
-
import { Domain, getRepository } from '@things-factory/shell'
|
4
|
-
|
5
|
-
import { User } from '../service/user/user'
|
6
|
-
|
7
|
-
export async function getDomainUsers(domain: Partial<Domain>, trxMgr?: EntityManager): Promise<User[]> {
|
8
|
-
const domainRepo: Repository<Domain> = trxMgr?.getRepository(Domain) || getRepository(Domain)
|
9
|
-
|
10
|
-
if (!domain.id) {
|
11
|
-
const foundDomain: Domain = await domainRepo.findOne({ where: { id: domain.id } })
|
12
|
-
if (!foundDomain) throw new Error(`Failed to find domain by passed condition, ${domain}`)
|
13
|
-
|
14
|
-
domain = foundDomain
|
15
|
-
}
|
16
|
-
|
17
|
-
const qb: SelectQueryBuilder<User> = buildDomainUsersQueryBuilder(domain.id)
|
18
|
-
return await qb.getMany()
|
19
|
-
}
|
20
|
-
|
21
|
-
export function buildDomainUsersQueryBuilder(
|
22
|
-
domainId: string,
|
23
|
-
alias: string = 'USER',
|
24
|
-
trxMgr?: EntityManager
|
25
|
-
): SelectQueryBuilder<User> {
|
26
|
-
const userRepo: Repository<User> = trxMgr?.getRepository(User) || getRepository(User)
|
27
|
-
const qb: SelectQueryBuilder<User> = userRepo.createQueryBuilder(alias)
|
28
|
-
qb.select().andWhere(
|
29
|
-
`${alias}.id IN ${qb
|
30
|
-
.subQuery()
|
31
|
-
.select('USERS_DOMAINS.users_id')
|
32
|
-
.from('users_domains', 'USERS_DOMAINS')
|
33
|
-
.where('USERS_DOMAINS.domains_id = :domainId', { domainId })
|
34
|
-
.getQuery()}`
|
35
|
-
)
|
36
|
-
|
37
|
-
return qb
|
38
|
-
}
|
@@ -1,13 +0,0 @@
|
|
1
|
-
import { config } from '@things-factory/env'
|
2
|
-
|
3
|
-
var _SECRET = config.get('SECRET')
|
4
|
-
|
5
|
-
if (!_SECRET) {
|
6
|
-
if (process.env.NODE_ENV == 'production') {
|
7
|
-
throw new TypeError('SECRET key not configured.')
|
8
|
-
} else {
|
9
|
-
_SECRET = '0xD58F835B69D207A76CC5F84a70a1D0d4C79dAC95'
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
export const SECRET = _SECRET
|
@@ -1,112 +0,0 @@
|
|
1
|
-
import { In } from 'typeorm'
|
2
|
-
|
3
|
-
import { Domain, getRepository } from '@things-factory/shell'
|
4
|
-
|
5
|
-
import { User } from '../service/user/user'
|
6
|
-
|
7
|
-
export async function getUserDomains(user: User): Promise<Partial<Domain>[]> {
|
8
|
-
return (
|
9
|
-
await getRepository(Domain)
|
10
|
-
.createQueryBuilder('DOMAIN')
|
11
|
-
.where(qb => {
|
12
|
-
const subQuery = qb
|
13
|
-
.subQuery()
|
14
|
-
.distinct(true)
|
15
|
-
.select('DOMAIN.id')
|
16
|
-
.from(User, 'USER')
|
17
|
-
.leftJoin('USER.roles', 'ROLE')
|
18
|
-
.leftJoin('ROLE.domain', 'DOMAIN')
|
19
|
-
.where('USER.id = :userId', { userId: user.id })
|
20
|
-
.getQuery()
|
21
|
-
return 'DOMAIN.id IN ' + subQuery
|
22
|
-
})
|
23
|
-
.orWhere(qb => {
|
24
|
-
const subQuery = qb
|
25
|
-
.subQuery()
|
26
|
-
.select('DOMAIN.id')
|
27
|
-
.from(Domain, 'DOMAIN')
|
28
|
-
.where('DOMAIN.owner = :owner', { owner: user.id })
|
29
|
-
.getQuery()
|
30
|
-
return 'DOMAIN.id IN ' + subQuery
|
31
|
-
})
|
32
|
-
.orderBy('DOMAIN.name', 'ASC')
|
33
|
-
.getMany()
|
34
|
-
).map(domain => {
|
35
|
-
const { id, name, description, subdomain, extType, brandName, brandImage } = domain
|
36
|
-
return { id, name, description, subdomain, extType, brandName, brandImage }
|
37
|
-
})
|
38
|
-
}
|
39
|
-
|
40
|
-
export async function getRoleBasedDomains(user: User): Promise<Partial<Domain>[]> {
|
41
|
-
return (
|
42
|
-
await getRepository(Domain)
|
43
|
-
.createQueryBuilder('DOMAIN')
|
44
|
-
.where(qb => {
|
45
|
-
const subQuery = qb
|
46
|
-
.subQuery()
|
47
|
-
.distinct(true)
|
48
|
-
.select('DOMAIN.id')
|
49
|
-
.from(User, 'USER')
|
50
|
-
.leftJoin('USER.roles', 'ROLE')
|
51
|
-
.leftJoin('ROLE.domain', 'DOMAIN')
|
52
|
-
.where('USER.id = :userId', { userId: user.id })
|
53
|
-
.getQuery()
|
54
|
-
return 'DOMAIN.id IN ' + subQuery
|
55
|
-
})
|
56
|
-
.getMany()
|
57
|
-
).map(domain => {
|
58
|
-
const { id, name, description, subdomain, extType, brandName, brandImage } = domain
|
59
|
-
return { id, name, description, subdomain, extType, brandName, brandImage }
|
60
|
-
})
|
61
|
-
}
|
62
|
-
|
63
|
-
export async function getDomainsWithPrivilege(
|
64
|
-
user: User,
|
65
|
-
privilege: string,
|
66
|
-
category: string
|
67
|
-
): Promise<Partial<Domain>[]> {
|
68
|
-
return (
|
69
|
-
await getRepository(Domain)
|
70
|
-
.createQueryBuilder('DOMAIN')
|
71
|
-
.where(qb => {
|
72
|
-
const subQuery = qb
|
73
|
-
.subQuery()
|
74
|
-
.distinct(true)
|
75
|
-
.select('DOMAIN.id')
|
76
|
-
.from(User, 'USER')
|
77
|
-
.leftJoin('USER.roles', 'ROLE')
|
78
|
-
.leftJoin('ROLE.domain', 'DOMAIN')
|
79
|
-
.leftJoin('ROLE.privileges', 'PRIVILEGE')
|
80
|
-
.where('USER.id = :userId', { userId: user.id })
|
81
|
-
.andWhere('PRIVILEGE.name = :privilege', { privilege })
|
82
|
-
.andWhere('PRIVILEGE.category = :category', { category })
|
83
|
-
.getQuery()
|
84
|
-
return 'DOMAIN.id IN ' + subQuery
|
85
|
-
})
|
86
|
-
.orWhere(qb => {
|
87
|
-
const subQuery = qb
|
88
|
-
.subQuery()
|
89
|
-
.select('DOMAIN.id')
|
90
|
-
.from(Domain, 'DOMAIN')
|
91
|
-
.where('DOMAIN.owner = :owner', { owner: user.id })
|
92
|
-
.getQuery()
|
93
|
-
return 'DOMAIN.id IN ' + subQuery
|
94
|
-
})
|
95
|
-
.orderBy('DOMAIN.name', 'ASC')
|
96
|
-
.getMany()
|
97
|
-
).map(domain => {
|
98
|
-
const { id, name, description, subdomain, extType, brandName, brandImage } = domain
|
99
|
-
return { id, name, description, subdomain, extType, brandName, brandImage }
|
100
|
-
})
|
101
|
-
}
|
102
|
-
|
103
|
-
export async function getDomainsAsOwner(user: User): Promise<Partial<Domain>[]> {
|
104
|
-
return (
|
105
|
-
await getRepository(Domain).find({
|
106
|
-
where: { owner: user.id }
|
107
|
-
})
|
108
|
-
).map(domain => {
|
109
|
-
const { id, name, description, subdomain, extType, brandName, brandImage } = domain
|
110
|
-
return { id, name, description, subdomain, extType, brandName, brandImage }
|
111
|
-
})
|
112
|
-
}
|