@things-factory/auth-base 8.0.0 → 9.0.0-beta.3

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 (212) hide show
  1. package/dist-client/index.d.ts +1 -0
  2. package/dist-client/index.js +1 -0
  3. package/dist-client/index.js.map +1 -1
  4. package/dist-client/tsconfig.tsbuildinfo +1 -1
  5. package/dist-client/verify-webauthn.d.ts +13 -0
  6. package/dist-client/verify-webauthn.js +72 -0
  7. package/dist-client/verify-webauthn.js.map +1 -0
  8. package/dist-server/constants/error-code.d.ts +2 -0
  9. package/dist-server/constants/error-code.js +3 -1
  10. package/dist-server/constants/error-code.js.map +1 -1
  11. package/dist-server/controllers/change-pwd.js +2 -2
  12. package/dist-server/controllers/change-pwd.js.map +1 -1
  13. package/dist-server/controllers/delete-user.js +13 -12
  14. package/dist-server/controllers/delete-user.js.map +1 -1
  15. package/dist-server/controllers/invitation.d.ts +2 -1
  16. package/dist-server/controllers/invitation.js +30 -5
  17. package/dist-server/controllers/invitation.js.map +1 -1
  18. package/dist-server/controllers/profile.d.ts +4 -3
  19. package/dist-server/controllers/profile.js +20 -2
  20. package/dist-server/controllers/profile.js.map +1 -1
  21. package/dist-server/controllers/signin.d.ts +4 -1
  22. package/dist-server/controllers/signin.js +17 -1
  23. package/dist-server/controllers/signin.js.map +1 -1
  24. package/dist-server/controllers/signup.js +13 -4
  25. package/dist-server/controllers/signup.js.map +1 -1
  26. package/dist-server/controllers/unlock-user.js +1 -0
  27. package/dist-server/controllers/unlock-user.js.map +1 -1
  28. package/dist-server/controllers/verification.js +1 -0
  29. package/dist-server/controllers/verification.js.map +1 -1
  30. package/dist-server/middlewares/signin-middleware.js +5 -4
  31. package/dist-server/middlewares/signin-middleware.js.map +1 -1
  32. package/dist-server/middlewares/webauthn-middleware.js.map +1 -1
  33. package/dist-server/migrations/1548206416130-SeedUser.js +2 -1
  34. package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
  35. package/dist-server/router/auth-checkin-router.js +8 -2
  36. package/dist-server/router/auth-checkin-router.js.map +1 -1
  37. package/dist-server/router/auth-private-process-router.js +12 -7
  38. package/dist-server/router/auth-private-process-router.js.map +1 -1
  39. package/dist-server/router/auth-public-process-router.js +20 -9
  40. package/dist-server/router/auth-public-process-router.js.map +1 -1
  41. package/dist-server/router/auth-signin-router.js +10 -4
  42. package/dist-server/router/auth-signin-router.js.map +1 -1
  43. package/dist-server/router/webauthn-router.js +51 -1
  44. package/dist-server/router/webauthn-router.js.map +1 -1
  45. package/dist-server/service/invitation/invitation-mutation.d.ts +3 -2
  46. package/dist-server/service/invitation/invitation-mutation.js +20 -8
  47. package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
  48. package/dist-server/service/user/user-mutation.d.ts +10 -9
  49. package/dist-server/service/user/user-mutation.js +112 -54
  50. package/dist-server/service/user/user-mutation.js.map +1 -1
  51. package/dist-server/service/user/user-types.d.ts +1 -0
  52. package/dist-server/service/user/user-types.js +4 -0
  53. package/dist-server/service/user/user-types.js.map +1 -1
  54. package/dist-server/service/user/user.d.ts +1 -0
  55. package/dist-server/service/user/user.js +40 -14
  56. package/dist-server/service/user/user.js.map +1 -1
  57. package/dist-server/templates/account-unlock-email.d.ts +2 -1
  58. package/dist-server/templates/account-unlock-email.js +1 -1
  59. package/dist-server/templates/account-unlock-email.js.map +1 -1
  60. package/dist-server/templates/invitation-email.d.ts +2 -1
  61. package/dist-server/templates/invitation-email.js +1 -1
  62. package/dist-server/templates/invitation-email.js.map +1 -1
  63. package/dist-server/templates/verification-email.d.ts +2 -1
  64. package/dist-server/templates/verification-email.js +1 -1
  65. package/dist-server/templates/verification-email.js.map +1 -1
  66. package/dist-server/tsconfig.tsbuildinfo +1 -1
  67. package/package.json +6 -6
  68. package/translations/en.json +5 -1
  69. package/translations/ja.json +5 -1
  70. package/translations/ko.json +6 -3
  71. package/translations/ms.json +5 -1
  72. package/translations/zh.json +5 -1
  73. package/client/actions/auth.ts +0 -24
  74. package/client/auth.ts +0 -272
  75. package/client/bootstrap.ts +0 -47
  76. package/client/directive/privileged.ts +0 -28
  77. package/client/index.ts +0 -3
  78. package/client/profiled.ts +0 -83
  79. package/client/reducers/auth.ts +0 -31
  80. package/server/constants/error-code.ts +0 -20
  81. package/server/constants/error-message.ts +0 -0
  82. package/server/constants/max-age.ts +0 -1
  83. package/server/controllers/auth.ts +0 -5
  84. package/server/controllers/change-pwd.ts +0 -99
  85. package/server/controllers/checkin.ts +0 -21
  86. package/server/controllers/delete-user.ts +0 -68
  87. package/server/controllers/invitation.ts +0 -132
  88. package/server/controllers/profile.ts +0 -28
  89. package/server/controllers/reset-password.ts +0 -126
  90. package/server/controllers/signin.ts +0 -79
  91. package/server/controllers/signup.ts +0 -60
  92. package/server/controllers/unlock-user.ts +0 -61
  93. package/server/controllers/utils/make-invitation-token.ts +0 -5
  94. package/server/controllers/utils/make-verification-token.ts +0 -4
  95. package/server/controllers/utils/password-rule.ts +0 -120
  96. package/server/controllers/utils/save-invitation-token.ts +0 -10
  97. package/server/controllers/utils/save-verification-token.ts +0 -12
  98. package/server/controllers/verification.ts +0 -83
  99. package/server/errors/auth-error.ts +0 -24
  100. package/server/errors/index.ts +0 -2
  101. package/server/errors/user-domain-not-match-error.ts +0 -29
  102. package/server/index.ts +0 -37
  103. package/server/middlewares/authenticate-401-middleware.ts +0 -114
  104. package/server/middlewares/domain-authenticate-middleware.ts +0 -78
  105. package/server/middlewares/graphql-authenticate-middleware.ts +0 -13
  106. package/server/middlewares/index.ts +0 -67
  107. package/server/middlewares/jwt-authenticate-middleware.ts +0 -84
  108. package/server/middlewares/signin-middleware.ts +0 -55
  109. package/server/middlewares/webauthn-middleware.ts +0 -127
  110. package/server/migrations/1548206416130-SeedUser.ts +0 -59
  111. package/server/migrations/1566805283882-SeedPrivilege.ts +0 -28
  112. package/server/migrations/index.ts +0 -9
  113. package/server/router/auth-checkin-router.ts +0 -107
  114. package/server/router/auth-private-process-router.ts +0 -107
  115. package/server/router/auth-public-process-router.ts +0 -302
  116. package/server/router/auth-signin-router.ts +0 -55
  117. package/server/router/auth-signup-router.ts +0 -95
  118. package/server/router/index.ts +0 -9
  119. package/server/router/oauth2/index.ts +0 -2
  120. package/server/router/oauth2/oauth2-authorize-router.ts +0 -81
  121. package/server/router/oauth2/oauth2-router.ts +0 -165
  122. package/server/router/oauth2/oauth2-server.ts +0 -262
  123. package/server/router/oauth2/passport-oauth2-client-password.ts +0 -87
  124. package/server/router/oauth2/passport-refresh-token.ts +0 -87
  125. package/server/router/path-base-domain-router.ts +0 -8
  126. package/server/router/site-root-router.ts +0 -48
  127. package/server/router/webauthn-router.ts +0 -87
  128. package/server/routes.ts +0 -80
  129. package/server/service/app-binding/app-binding-mutation.ts +0 -22
  130. package/server/service/app-binding/app-binding-query.ts +0 -92
  131. package/server/service/app-binding/app-binding-types.ts +0 -11
  132. package/server/service/app-binding/app-binding.ts +0 -17
  133. package/server/service/app-binding/index.ts +0 -4
  134. package/server/service/appliance/appliance-mutation.ts +0 -113
  135. package/server/service/appliance/appliance-query.ts +0 -76
  136. package/server/service/appliance/appliance-types.ts +0 -56
  137. package/server/service/appliance/appliance.ts +0 -133
  138. package/server/service/appliance/index.ts +0 -6
  139. package/server/service/application/application-mutation.ts +0 -104
  140. package/server/service/application/application-query.ts +0 -98
  141. package/server/service/application/application-types.ts +0 -76
  142. package/server/service/application/application.ts +0 -216
  143. package/server/service/application/index.ts +0 -6
  144. package/server/service/auth-provider/auth-provider-mutation.ts +0 -159
  145. package/server/service/auth-provider/auth-provider-parameter-spec.ts +0 -24
  146. package/server/service/auth-provider/auth-provider-query.ts +0 -88
  147. package/server/service/auth-provider/auth-provider-type.ts +0 -67
  148. package/server/service/auth-provider/auth-provider.ts +0 -155
  149. package/server/service/auth-provider/index.ts +0 -7
  150. package/server/service/domain-generator/domain-generator-mutation.ts +0 -117
  151. package/server/service/domain-generator/domain-generator-types.ts +0 -46
  152. package/server/service/domain-generator/index.ts +0 -3
  153. package/server/service/granted-role/granted-role-mutation.ts +0 -156
  154. package/server/service/granted-role/granted-role-query.ts +0 -60
  155. package/server/service/granted-role/granted-role.ts +0 -27
  156. package/server/service/granted-role/index.ts +0 -6
  157. package/server/service/index.ts +0 -90
  158. package/server/service/invitation/index.ts +0 -6
  159. package/server/service/invitation/invitation-mutation.ts +0 -63
  160. package/server/service/invitation/invitation-query.ts +0 -33
  161. package/server/service/invitation/invitation-types.ts +0 -11
  162. package/server/service/invitation/invitation.ts +0 -63
  163. package/server/service/login-history/index.ts +0 -5
  164. package/server/service/login-history/login-history-query.ts +0 -51
  165. package/server/service/login-history/login-history-type.ts +0 -12
  166. package/server/service/login-history/login-history.ts +0 -45
  167. package/server/service/partner/index.ts +0 -6
  168. package/server/service/partner/partner-mutation.ts +0 -61
  169. package/server/service/partner/partner-query.ts +0 -102
  170. package/server/service/partner/partner-types.ts +0 -11
  171. package/server/service/partner/partner.ts +0 -57
  172. package/server/service/password-history/index.ts +0 -3
  173. package/server/service/password-history/password-history.ts +0 -16
  174. package/server/service/privilege/index.ts +0 -6
  175. package/server/service/privilege/privilege-directive.ts +0 -77
  176. package/server/service/privilege/privilege-mutation.ts +0 -92
  177. package/server/service/privilege/privilege-query.ts +0 -94
  178. package/server/service/privilege/privilege-types.ts +0 -60
  179. package/server/service/privilege/privilege.ts +0 -102
  180. package/server/service/role/index.ts +0 -6
  181. package/server/service/role/role-mutation.ts +0 -109
  182. package/server/service/role/role-query.ts +0 -155
  183. package/server/service/role/role-types.ts +0 -81
  184. package/server/service/role/role.ts +0 -72
  185. package/server/service/user/domain-query.ts +0 -24
  186. package/server/service/user/index.ts +0 -7
  187. package/server/service/user/user-mutation.ts +0 -413
  188. package/server/service/user/user-query.ts +0 -145
  189. package/server/service/user/user-types.ts +0 -97
  190. package/server/service/user/user.ts +0 -354
  191. package/server/service/users-auth-providers/index.ts +0 -5
  192. package/server/service/users-auth-providers/users-auth-providers.ts +0 -71
  193. package/server/service/verification-token/index.ts +0 -3
  194. package/server/service/verification-token/verification-token.ts +0 -60
  195. package/server/service/web-auth-credential/index.ts +0 -3
  196. package/server/service/web-auth-credential/web-auth-credential.ts +0 -67
  197. package/server/templates/account-unlock-email.ts +0 -65
  198. package/server/templates/invitation-email.ts +0 -66
  199. package/server/templates/reset-password-email.ts +0 -65
  200. package/server/templates/verification-email.ts +0 -66
  201. package/server/types.ts +0 -21
  202. package/server/utils/accepts.ts +0 -11
  203. package/server/utils/access-token-cookie.ts +0 -61
  204. package/server/utils/check-permission.ts +0 -52
  205. package/server/utils/check-user-belongs-domain.ts +0 -19
  206. package/server/utils/check-user-has-role.ts +0 -29
  207. package/server/utils/encrypt-state.ts +0 -22
  208. package/server/utils/get-aes-256-key.ts +0 -13
  209. package/server/utils/get-domain-from-hostname.ts +0 -7
  210. package/server/utils/get-domain-users.ts +0 -38
  211. package/server/utils/get-secret.ts +0 -13
  212. package/server/utils/get-user-domains.ts +0 -112
@@ -1,354 +0,0 @@
1
- import crypto from 'crypto'
2
- import jwt from 'jsonwebtoken'
3
- import { Directive, Field, ID, ObjectType } from 'type-graphql'
4
- import { GraphQLEmailAddress } from 'graphql-scalars'
5
- import {
6
- Column,
7
- CreateDateColumn,
8
- Entity,
9
- Index,
10
- JoinTable,
11
- ManyToMany,
12
- ManyToOne,
13
- OneToMany,
14
- PrimaryGeneratedColumn,
15
- RelationId,
16
- UpdateDateColumn
17
- } from 'typeorm'
18
-
19
- import { config } from '@things-factory/env'
20
- import { Domain, getRepository } from '@things-factory/shell'
21
-
22
- import { validatePasswordByRule } from '../../controllers/utils/password-rule'
23
- import { AuthError } from '../../errors/auth-error'
24
- import { SECRET } from '../../utils/get-secret'
25
- import { Role } from '../role/role'
26
- import { Privilege } from '../privilege/privilege'
27
- import { WebAuthCredential } from '../web-auth-credential/web-auth-credential'
28
- import { UsersAuthProviders } from '../users-auth-providers/users-auth-providers'
29
- import { getDomainsWithPrivilege } from '../../utils/get-user-domains'
30
-
31
- const ORMCONFIG = config.get('ormconfig', {})
32
- const DATABASE_TYPE = ORMCONFIG.type
33
-
34
- const sessionExpirySeconds = Number(config.get('session/expirySeconds')) || '7d'
35
-
36
- export enum UserStatus {
37
- INACTIVE = 'inactive',
38
- ACTIVATED = 'activated',
39
- DELETED = 'deleted',
40
- LOCKED = 'locked',
41
- BANNED = 'banned',
42
- PWD_RESET_REQUIRED = 'password_reset_required'
43
- }
44
-
45
- @Entity()
46
- @Index('ix_user_0', (user: User) => [user.email], { unique: true })
47
- @ObjectType()
48
- export class User {
49
- @PrimaryGeneratedColumn('uuid')
50
- @Field(type => ID)
51
- readonly id: string
52
-
53
- @Column()
54
- @Field({ nullable: true })
55
- name: string
56
-
57
- @Column({ nullable: true })
58
- @Field({ nullable: true })
59
- description: string
60
-
61
- @ManyToMany(type => Domain)
62
- @JoinTable({ name: 'users_domains' })
63
- @Field(type => [Domain])
64
- domains?: Domain[]
65
-
66
- @Column()
67
- @Field(type => GraphQLEmailAddress)
68
- email: string
69
-
70
- @Directive('@privilege(category: "security", privilege: "query", domainOwnerGranted: true)')
71
- @Column({
72
- nullable: true,
73
- type:
74
- DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
75
- ? 'longtext'
76
- : DATABASE_TYPE == 'oracle'
77
- ? 'clob'
78
- : DATABASE_TYPE == 'mssql'
79
- ? 'nvarchar'
80
- : 'varchar',
81
- length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined
82
- })
83
- password: string
84
-
85
- @ManyToMany(type => Role, role => role.users)
86
- @JoinTable({ name: 'users_roles' })
87
- @Field(type => [Role])
88
- roles?: Role[]
89
-
90
- @Column({ nullable: true })
91
- @Field({ nullable: true })
92
- userType: string // default: 'user', enum: 'user', 'application', 'appliance'
93
-
94
- @Column({ nullable: true })
95
- @Field({ nullable: true })
96
- reference: string
97
-
98
- @Directive('@privilege(category: "security", privilege: "query", domainOwnerGranted: true)')
99
- @Column({ nullable: true })
100
- salt: string
101
-
102
- @Column({ nullable: true })
103
- @Field({ nullable: true })
104
- locale: string
105
-
106
- @Directive('@privilege(category: "security", privilege: "query", domainOwnerGranted: true)')
107
- @Column({ nullable: true })
108
- @Field({ nullable: true })
109
- ssoId: string
110
-
111
- @Column({
112
- type:
113
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
114
- ? 'enum'
115
- : DATABASE_TYPE == 'oracle'
116
- ? 'varchar2'
117
- : DATABASE_TYPE == 'mssql'
118
- ? 'nvarchar'
119
- : 'varchar',
120
- enum:
121
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? UserStatus : undefined,
122
- length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 32,
123
- default: UserStatus.INACTIVE
124
- })
125
- @Field(type => String)
126
- status: UserStatus
127
-
128
- @Column({ type: 'smallint', default: 0 })
129
- failCount: number
130
-
131
- @Column({ nullable: true })
132
- passwordUpdatedAt: Date
133
-
134
- @Field({ nullable: true })
135
- owner: boolean /* should not be a column */
136
-
137
- @OneToMany(() => WebAuthCredential, credential => credential.user)
138
- credentials: WebAuthCredential[]
139
-
140
- @OneToMany(() => UsersAuthProviders, usersAuthProviders => usersAuthProviders.user)
141
- @Field(type => [UsersAuthProviders], { nullable: true })
142
- usersAuthProviders: UsersAuthProviders[]
143
-
144
- @ManyToOne(type => User, { nullable: true })
145
- @Field({ nullable: true })
146
- creator: User
147
-
148
- @RelationId((user: User) => user.creator)
149
- creatorId: string
150
-
151
- @ManyToOne(type => User, { nullable: true })
152
- @Field({ nullable: true })
153
- updater: User
154
-
155
- @RelationId((user: User) => user.updater)
156
- updaterId: string
157
-
158
- @CreateDateColumn()
159
- @Field({ nullable: true })
160
- createdAt: Date
161
-
162
- @UpdateDateColumn()
163
- @Field({ nullable: true })
164
- updatedAt: Date
165
-
166
- /* signing for jsonwebtoken */
167
- async sign(options?) {
168
- var { expiresIn = sessionExpirySeconds, subdomain } = options || {}
169
-
170
- var user = {
171
- id: this.id,
172
- userType: this.userType,
173
- status: this.status,
174
- domain: {
175
- subdomain
176
- }
177
- }
178
-
179
- return await jwt.sign(user, SECRET, {
180
- expiresIn,
181
- issuer: 'hatiolab.com',
182
- subject: 'user'
183
- })
184
- }
185
-
186
- /* validate password through password rule */
187
- static validatePasswordByRule(password, lng) {
188
- validatePasswordByRule(password, lng)
189
- }
190
-
191
- /* generate salt */
192
- static generateSalt() {
193
- return crypto.randomBytes(16).toString('hex')
194
- }
195
-
196
- /* encode password */
197
- static encode(password: string, salt) {
198
- return crypto
199
- .createHmac('sha256', salt || SECRET)
200
- .update(password)
201
- .digest('base64')
202
- }
203
-
204
- /* verify password */
205
- static verify(hashed, password, salt) {
206
- return (
207
- hashed ==
208
- crypto
209
- .createHmac('sha256', salt || SECRET)
210
- .update(password)
211
- .digest('base64') ||
212
- hashed ==
213
- crypto
214
- .createHmac('sha1', salt || SECRET)
215
- .update(password)
216
- .digest('base64')
217
- )
218
- }
219
-
220
- static async checkAuthWithEmail(decoded) {
221
- if (!decoded?.email) {
222
- throw new AuthError({
223
- errorCode: AuthError.ERROR_CODES.USER_NOT_FOUND
224
- })
225
- }
226
-
227
- const repository = getRepository(User)
228
- var user = await repository.findOne({
229
- where: { email: decoded.email },
230
- relations: ['domains'],
231
- cache: true
232
- })
233
-
234
- if (!user)
235
- throw new AuthError({
236
- errorCode: AuthError.ERROR_CODES.USER_NOT_FOUND
237
- })
238
- else {
239
- switch (user.status) {
240
- case UserStatus.INACTIVE:
241
- throw new AuthError({
242
- errorCode: AuthError.ERROR_CODES.USER_NOT_ACTIVATED,
243
- detail: {
244
- email: user.email
245
- }
246
- })
247
- case UserStatus.LOCKED:
248
- throw new AuthError({
249
- errorCode: AuthError.ERROR_CODES.USER_LOCKED,
250
- detail: {
251
- email: user.email
252
- }
253
- })
254
- case UserStatus.DELETED:
255
- throw new AuthError({
256
- errorCode: AuthError.ERROR_CODES.USER_DELETED
257
- })
258
- }
259
-
260
- return user
261
- }
262
- }
263
-
264
- static async checkAuth(decoded) {
265
- if (decoded?.id === undefined) {
266
- throw new AuthError({
267
- errorCode: AuthError.ERROR_CODES.USER_NOT_FOUND
268
- })
269
- }
270
-
271
- const repository = getRepository(User)
272
- var user = await repository.findOne({
273
- where: { id: decoded.id },
274
- relations: ['domains', 'credentials'],
275
- cache: true
276
- })
277
-
278
- if (!user)
279
- throw new AuthError({
280
- errorCode: AuthError.ERROR_CODES.USER_NOT_FOUND
281
- })
282
- else {
283
- switch (user.status) {
284
- case UserStatus.INACTIVE:
285
- throw new AuthError({
286
- errorCode: AuthError.ERROR_CODES.USER_NOT_ACTIVATED,
287
- detail: {
288
- email: user.email
289
- }
290
- })
291
- case UserStatus.LOCKED:
292
- throw new AuthError({
293
- errorCode: AuthError.ERROR_CODES.USER_LOCKED,
294
- detail: {
295
- email: user.email
296
- }
297
- })
298
- case UserStatus.DELETED:
299
- throw new AuthError({
300
- errorCode: AuthError.ERROR_CODES.USER_DELETED
301
- })
302
- }
303
-
304
- const { defaultPassword } = config.get('password')
305
-
306
- if (defaultPassword && user.password === this.encode(defaultPassword, user.salt)) {
307
- user.status = UserStatus.PWD_RESET_REQUIRED
308
- }
309
-
310
- return user
311
- }
312
- }
313
-
314
- static async hasPrivilege(privilege: string, category: string, domain: Domain, user: User): Promise<boolean> {
315
- const result = await getRepository(Privilege)
316
- .createQueryBuilder('privilege')
317
- .innerJoin('privilege.roles', 'role')
318
- .innerJoin('role.users', 'user')
319
- .where('privilege.category = :category', { category })
320
- .andWhere('privilege.name = :privilege', { privilege })
321
- .andWhere('user.id = :userId', { userId: user.id })
322
- .andWhere('role.domain.id = :domainId', { domainId: domain.id })
323
- .getCount()
324
-
325
- return result > 0
326
- }
327
-
328
- static async getPrivilegesByDomain(user: User, domain: Domain): Promise<{ category: string; privilege: string }[]> {
329
- const result = await getRepository(User)
330
- .createQueryBuilder('user')
331
- .leftJoinAndSelect('user.roles', 'role')
332
- .leftJoinAndSelect('role.privileges', 'privilege')
333
- .select(['privilege.name AS privilege', 'privilege.category AS category'])
334
- .where('user.id = :userId', { userId: user.id })
335
- .andWhere('role.domain.id = :domainId', { domainId: domain.id })
336
- .orderBy('privilege.category')
337
- .addOrderBy('privilege.name')
338
- .getRawMany()
339
-
340
- const distinct = result.reduce((acc, current) => {
341
- const last = acc[acc.length - 1]
342
- if (!last || last.privilege !== current.privilege || last.category !== current.category) {
343
- acc.push(current)
344
- }
345
- return acc
346
- }, [])
347
-
348
- return distinct
349
- }
350
-
351
- static async getDomainsWithPrivilege(privilege: string, category: string, user: User) {
352
- return getDomainsWithPrivilege(user, privilege, category)
353
- }
354
- }
@@ -1,5 +0,0 @@
1
- import { UsersAuthProviders } from './users-auth-providers'
2
-
3
- export const entities = [UsersAuthProviders]
4
- export const resolvers = []
5
- export const subscribers = []
@@ -1,71 +0,0 @@
1
- import {
2
- CreateDateColumn,
3
- UpdateDateColumn,
4
- DeleteDateColumn,
5
- Entity,
6
- Index,
7
- Column,
8
- RelationId,
9
- ManyToOne,
10
- PrimaryGeneratedColumn,
11
- VersionColumn
12
- } from 'typeorm'
13
- import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
14
-
15
- import { Domain } from '@things-factory/shell'
16
- import { User } from '../user/user'
17
- import { AuthProvider } from '../auth-provider/auth-provider'
18
-
19
- @Entity()
20
- @Index(
21
- 'ix_users_auth_providers_0',
22
- (usersAuthProviders: UsersAuthProviders) => [
23
- usersAuthProviders.domain,
24
- usersAuthProviders.user,
25
- usersAuthProviders.authProvider
26
- ],
27
- { unique: true }
28
- )
29
- @ObjectType({ description: 'Entity for UsersAuthProviders' })
30
- export class UsersAuthProviders {
31
- @PrimaryGeneratedColumn('uuid')
32
- @Field(type => ID)
33
- readonly id: string
34
-
35
- @ManyToOne(type => Domain)
36
- @Field(type => Domain)
37
- domain?: Domain
38
-
39
- @RelationId((usersAuthProviders: UsersAuthProviders) => usersAuthProviders.domain)
40
- domainId?: string
41
-
42
- @ManyToOne(() => User, user => user.usersAuthProviders, {
43
- onDelete: 'CASCADE'
44
- })
45
- @Field(type => User, { nullable: true })
46
- user: User
47
-
48
- @RelationId((usersAuthProviders: UsersAuthProviders) => usersAuthProviders.user)
49
- userId?: string
50
-
51
- @ManyToOne(() => AuthProvider, authProvider => authProvider.usersAuthProviders, {
52
- onDelete: 'CASCADE'
53
- })
54
- @Field(type => AuthProvider, { nullable: true })
55
- authProvider: AuthProvider
56
-
57
- @RelationId((usersAuthProviders: UsersAuthProviders) => usersAuthProviders.authProvider)
58
- authProviderId?: string
59
-
60
- @Column()
61
- @Field({ nullable: true })
62
- ssoId: string
63
-
64
- @CreateDateColumn()
65
- @Field({ nullable: true })
66
- createdAt?: Date
67
-
68
- @UpdateDateColumn()
69
- @Field({ nullable: true })
70
- updatedAt: Date
71
- }
@@ -1,3 +0,0 @@
1
- import { VerificationToken, VerificationTokenType } from './verification-token'
2
-
3
- export const entities = [VerificationToken, VerificationTokenType]
@@ -1,60 +0,0 @@
1
- import { Column, CreateDateColumn, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm'
2
- import { config } from '@things-factory/env'
3
- import { ObjectType, Field, ID } from 'type-graphql'
4
- const ORMCONFIG = config.get('ormconfig', {})
5
- const DATABASE_TYPE = ORMCONFIG.type
6
-
7
- export enum VerificationTokenType {
8
- ACTIVATION = 'activation',
9
- PASSWORD_RESET = 'password-reset',
10
- UNLOCK = 'unlock',
11
- REQUEST_ACCESS_TOKEN = 'access-token'
12
- }
13
-
14
- @Entity()
15
- @ObjectType()
16
- export class VerificationToken {
17
- @PrimaryColumn()
18
- @Field(type => ID)
19
- userId: string
20
-
21
- @Column({
22
- nullable: false
23
- })
24
- @Field()
25
- token: string
26
-
27
- @Column({
28
- nullable: false,
29
- type:
30
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
31
- ? 'enum'
32
- : DATABASE_TYPE == 'oracle'
33
- ? 'varchar2'
34
- : DATABASE_TYPE == 'mssql'
35
- ? 'nvarchar'
36
- : 'varchar',
37
- enum:
38
- DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
39
- ? VerificationTokenType
40
- : undefined,
41
- length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 32,
42
- default: VerificationTokenType.ACTIVATION
43
- })
44
- @Field()
45
- type: VerificationTokenType
46
-
47
- @Column({
48
- nullable: true
49
- })
50
- @Field({ nullable: true })
51
- suppliment: string
52
-
53
- @CreateDateColumn()
54
- @Field()
55
- createdAt: Date
56
-
57
- @UpdateDateColumn()
58
- @Field()
59
- updatedAt: Date
60
- }
@@ -1,3 +0,0 @@
1
- import { WebAuthCredential } from './web-auth-credential'
2
-
3
- export const entities = [WebAuthCredential]
@@ -1,67 +0,0 @@
1
- import { Field, ID } from 'type-graphql'
2
- import {
3
- CreateDateColumn,
4
- UpdateDateColumn,
5
- Entity,
6
- Index,
7
- Column,
8
- RelationId,
9
- ManyToOne,
10
- PrimaryGeneratedColumn
11
- } from 'typeorm'
12
-
13
- import { User } from '../user/user'
14
- import { AuthenticatorTransportFuture } from '@simplewebauthn/server/script/deps'
15
-
16
- @Entity()
17
- @Index(
18
- 'ix_web_auth_credential_0',
19
- (webAuthCredential: WebAuthCredential) => [webAuthCredential.user, webAuthCredential.credentialId],
20
- { unique: true }
21
- )
22
- export class WebAuthCredential {
23
- @PrimaryGeneratedColumn('uuid')
24
- @Field(type => ID)
25
- readonly id: string
26
-
27
- @ManyToOne(type => User, { nullable: true })
28
- @Field(type => User, { nullable: true })
29
- user?: User
30
-
31
- @RelationId((webAuthCredential: WebAuthCredential) => webAuthCredential.user)
32
- userId?: string
33
-
34
- @Column()
35
- @Field({ nullable: true })
36
- credentialId: string
37
-
38
- @Column()
39
- @Field({ nullable: true })
40
- publicKey: string
41
-
42
- @Column()
43
- @Field({ nullable: true })
44
- counter: number
45
-
46
- @CreateDateColumn()
47
- @Field({ nullable: true })
48
- createdAt?: Date
49
-
50
- @UpdateDateColumn()
51
- @Field({ nullable: true })
52
- updatedAt?: Date
53
-
54
- @ManyToOne(type => User, { nullable: true })
55
- @Field(type => User, { nullable: true })
56
- creator?: User
57
-
58
- @RelationId((webAuthCredential: WebAuthCredential) => webAuthCredential.creator)
59
- creatorId?: string
60
-
61
- @ManyToOne(type => User, { nullable: true })
62
- @Field(type => User, { nullable: true })
63
- updater?: User
64
-
65
- @RelationId((webAuthCredential: WebAuthCredential) => webAuthCredential.updater)
66
- updaterId?: string
67
- }
@@ -1,65 +0,0 @@
1
- export function getUnlockUserEmailForm({ 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({ 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
- }