@things-factory/auth-base 8.0.38 → 9.0.0-9.0.0-beta.59.0

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 (489) hide show
  1. package/config/config.development.js +46 -0
  2. package/config/config.production.js +45 -0
  3. package/dist-client/bootstrap.d.ts +1 -1
  4. package/dist-client/bootstrap.js +4 -4
  5. package/dist-client/bootstrap.js.map +1 -1
  6. package/dist-client/directive/privileged.d.ts +1 -1
  7. package/dist-client/directive/privileged.js +1 -1
  8. package/dist-client/directive/privileged.js.map +1 -1
  9. package/dist-client/index.d.ts +4 -3
  10. package/dist-client/index.js +4 -3
  11. package/dist-client/index.js.map +1 -1
  12. package/dist-client/profiled.js +1 -1
  13. package/dist-client/profiled.js.map +1 -1
  14. package/dist-client/reducers/auth.js +1 -1
  15. package/dist-client/reducers/auth.js.map +1 -1
  16. package/dist-client/tsconfig.tsbuildinfo +1 -1
  17. package/dist-client/verify-webauthn.d.ts +13 -0
  18. package/dist-client/verify-webauthn.js +72 -0
  19. package/dist-client/verify-webauthn.js.map +1 -0
  20. package/dist-server/controllers/auth.d.ts +5 -5
  21. package/dist-server/controllers/auth.js +5 -5
  22. package/dist-server/controllers/auth.js.map +1 -1
  23. package/dist-server/controllers/change-pwd.js +19 -19
  24. package/dist-server/controllers/change-pwd.js.map +1 -1
  25. package/dist-server/controllers/checkin.js +4 -4
  26. package/dist-server/controllers/checkin.js.map +1 -1
  27. package/dist-server/controllers/delete-user.js +10 -15
  28. package/dist-server/controllers/delete-user.js.map +1 -1
  29. package/dist-server/controllers/invitation.js +20 -25
  30. package/dist-server/controllers/invitation.js.map +1 -1
  31. package/dist-server/controllers/profile.d.ts +5 -5
  32. package/dist-server/controllers/profile.js +10 -10
  33. package/dist-server/controllers/profile.js.map +1 -1
  34. package/dist-server/controllers/reset-password.js +24 -24
  35. package/dist-server/controllers/reset-password.js.map +1 -1
  36. package/dist-server/controllers/signin.d.ts +1 -1
  37. package/dist-server/controllers/signin.js +25 -30
  38. package/dist-server/controllers/signin.js.map +1 -1
  39. package/dist-server/controllers/signup.d.ts +1 -1
  40. package/dist-server/controllers/signup.js +14 -19
  41. package/dist-server/controllers/signup.js.map +1 -1
  42. package/dist-server/controllers/unlock-user.js +17 -17
  43. package/dist-server/controllers/unlock-user.js.map +1 -1
  44. package/dist-server/controllers/utils/password-rule.js +4 -4
  45. package/dist-server/controllers/utils/password-rule.js.map +1 -1
  46. package/dist-server/controllers/utils/save-invitation-token.d.ts +1 -1
  47. package/dist-server/controllers/utils/save-invitation-token.js +2 -2
  48. package/dist-server/controllers/utils/save-invitation-token.js.map +1 -1
  49. package/dist-server/controllers/utils/save-verification-token.d.ts +1 -1
  50. package/dist-server/controllers/utils/save-verification-token.js +3 -3
  51. package/dist-server/controllers/utils/save-verification-token.js.map +1 -1
  52. package/dist-server/controllers/verification.js +23 -23
  53. package/dist-server/controllers/verification.js.map +1 -1
  54. package/dist-server/errors/auth-error.js +1 -1
  55. package/dist-server/errors/auth-error.js.map +1 -1
  56. package/dist-server/errors/index.d.ts +2 -2
  57. package/dist-server/errors/index.js +2 -2
  58. package/dist-server/errors/index.js.map +1 -1
  59. package/dist-server/errors/user-domain-not-match-error.d.ts +1 -1
  60. package/dist-server/errors/user-domain-not-match-error.js +8 -8
  61. package/dist-server/errors/user-domain-not-match-error.js.map +1 -1
  62. package/dist-server/index.d.ts +16 -16
  63. package/dist-server/index.js +18 -18
  64. package/dist-server/index.js.map +1 -1
  65. package/dist-server/middlewares/authenticate-401-middleware.js +11 -11
  66. package/dist-server/middlewares/authenticate-401-middleware.js.map +1 -1
  67. package/dist-server/middlewares/bypass-signin-middleware.d.ts +1 -0
  68. package/dist-server/middlewares/bypass-signin-middleware.js +20 -0
  69. package/dist-server/middlewares/bypass-signin-middleware.js.map +1 -0
  70. package/dist-server/middlewares/domain-authenticate-middleware.d.ts +1 -1
  71. package/dist-server/middlewares/domain-authenticate-middleware.js +9 -9
  72. package/dist-server/middlewares/domain-authenticate-middleware.js.map +1 -1
  73. package/dist-server/middlewares/graphql-authenticate-middleware.js +4 -4
  74. package/dist-server/middlewares/graphql-authenticate-middleware.js.map +1 -1
  75. package/dist-server/middlewares/index.d.ts +5 -5
  76. package/dist-server/middlewares/index.js +24 -19
  77. package/dist-server/middlewares/index.js.map +1 -1
  78. package/dist-server/middlewares/jwt-authenticate-middleware.js +15 -15
  79. package/dist-server/middlewares/jwt-authenticate-middleware.js.map +1 -1
  80. package/dist-server/middlewares/signin-middleware.js +2 -2
  81. package/dist-server/middlewares/signin-middleware.js.map +1 -1
  82. package/dist-server/middlewares/verify-recaptcha-middleware.d.ts +3 -0
  83. package/dist-server/middlewares/verify-recaptcha-middleware.js +95 -0
  84. package/dist-server/middlewares/verify-recaptcha-middleware.js.map +1 -0
  85. package/dist-server/middlewares/webauthn-middleware.js +7 -7
  86. package/dist-server/middlewares/webauthn-middleware.js.map +1 -1
  87. package/dist-server/migrations/1548206416130-SeedUser.js +6 -6
  88. package/dist-server/migrations/1548206416130-SeedUser.js.map +1 -1
  89. package/dist-server/migrations/1566805283882-SeedPrivilege.js +2 -2
  90. package/dist-server/migrations/1566805283882-SeedPrivilege.js.map +1 -1
  91. package/dist-server/migrations/index.js.map +1 -1
  92. package/dist-server/router/auth-checkin-router.js +17 -20
  93. package/dist-server/router/auth-checkin-router.js.map +1 -1
  94. package/dist-server/router/auth-private-process-router.js +16 -23
  95. package/dist-server/router/auth-private-process-router.js.map +1 -1
  96. package/dist-server/router/auth-public-process-router.js +30 -35
  97. package/dist-server/router/auth-public-process-router.js.map +1 -1
  98. package/dist-server/router/auth-signin-router.js +7 -13
  99. package/dist-server/router/auth-signin-router.js.map +1 -1
  100. package/dist-server/router/auth-signup-router.js +13 -9
  101. package/dist-server/router/auth-signup-router.js.map +1 -1
  102. package/dist-server/router/index.d.ts +9 -9
  103. package/dist-server/router/index.js +9 -9
  104. package/dist-server/router/index.js.map +1 -1
  105. package/dist-server/router/oauth2/index.d.ts +2 -2
  106. package/dist-server/router/oauth2/index.js +2 -2
  107. package/dist-server/router/oauth2/index.js.map +1 -1
  108. package/dist-server/router/oauth2/oauth2-authorize-router.js +6 -6
  109. package/dist-server/router/oauth2/oauth2-authorize-router.js.map +1 -1
  110. package/dist-server/router/oauth2/oauth2-router.d.ts +1 -1
  111. package/dist-server/router/oauth2/oauth2-router.js +21 -21
  112. package/dist-server/router/oauth2/oauth2-router.js.map +1 -1
  113. package/dist-server/router/oauth2/oauth2-server.js +21 -21
  114. package/dist-server/router/oauth2/oauth2-server.js.map +1 -1
  115. package/dist-server/router/site-root-router.js +4 -4
  116. package/dist-server/router/site-root-router.js.map +1 -1
  117. package/dist-server/router/webauthn-router.js +58 -8
  118. package/dist-server/router/webauthn-router.js.map +1 -1
  119. package/dist-server/routes.js +75 -50
  120. package/dist-server/routes.js.map +1 -1
  121. package/dist-server/service/app-binding/app-binding-mutation.js +4 -4
  122. package/dist-server/service/app-binding/app-binding-mutation.js.map +1 -1
  123. package/dist-server/service/app-binding/app-binding-query.d.ts +4 -4
  124. package/dist-server/service/app-binding/app-binding-query.js +22 -22
  125. package/dist-server/service/app-binding/app-binding-query.js.map +1 -1
  126. package/dist-server/service/app-binding/app-binding-types.d.ts +1 -1
  127. package/dist-server/service/app-binding/app-binding-types.js +2 -2
  128. package/dist-server/service/app-binding/app-binding-types.js.map +1 -1
  129. package/dist-server/service/app-binding/app-binding.d.ts +2 -2
  130. package/dist-server/service/app-binding/app-binding.js +4 -4
  131. package/dist-server/service/app-binding/app-binding.js.map +1 -1
  132. package/dist-server/service/app-binding/index.d.ts +2 -2
  133. package/dist-server/service/app-binding/index.js +3 -3
  134. package/dist-server/service/app-binding/index.js.map +1 -1
  135. package/dist-server/service/appliance/appliance-mutation.d.ts +2 -2
  136. package/dist-server/service/appliance/appliance-mutation.js +32 -45
  137. package/dist-server/service/appliance/appliance-mutation.js.map +1 -1
  138. package/dist-server/service/appliance/appliance-query.d.ts +3 -3
  139. package/dist-server/service/appliance/appliance-query.js +17 -17
  140. package/dist-server/service/appliance/appliance-query.js.map +1 -1
  141. package/dist-server/service/appliance/appliance-types.d.ts +1 -1
  142. package/dist-server/service/appliance/appliance-types.js +2 -2
  143. package/dist-server/service/appliance/appliance-types.js.map +1 -1
  144. package/dist-server/service/appliance/appliance.d.ts +3 -1
  145. package/dist-server/service/appliance/appliance.js +51 -8
  146. package/dist-server/service/appliance/appliance.js.map +1 -1
  147. package/dist-server/service/appliance/index.d.ts +3 -3
  148. package/dist-server/service/appliance/index.js +5 -5
  149. package/dist-server/service/appliance/index.js.map +1 -1
  150. package/dist-server/service/application/application-mutation.d.ts +8 -8
  151. package/dist-server/service/application/application-mutation.js +20 -20
  152. package/dist-server/service/application/application-mutation.js.map +1 -1
  153. package/dist-server/service/application/application-query.d.ts +2 -2
  154. package/dist-server/service/application/application-query.js +16 -16
  155. package/dist-server/service/application/application-query.js.map +1 -1
  156. package/dist-server/service/application/application-types.d.ts +1 -1
  157. package/dist-server/service/application/application-types.js +4 -4
  158. package/dist-server/service/application/application-types.js.map +1 -1
  159. package/dist-server/service/application/application.d.ts +1 -1
  160. package/dist-server/service/application/application.js +12 -12
  161. package/dist-server/service/application/application.js.map +1 -1
  162. package/dist-server/service/application/index.d.ts +3 -3
  163. package/dist-server/service/application/index.js +5 -5
  164. package/dist-server/service/application/index.js.map +1 -1
  165. package/dist-server/service/auth-provider/auth-provider-mutation.d.ts +2 -2
  166. package/dist-server/service/auth-provider/auth-provider-mutation.js +20 -20
  167. package/dist-server/service/auth-provider/auth-provider-mutation.js.map +1 -1
  168. package/dist-server/service/auth-provider/auth-provider-query.d.ts +3 -3
  169. package/dist-server/service/auth-provider/auth-provider-query.js +20 -20
  170. package/dist-server/service/auth-provider/auth-provider-query.js.map +1 -1
  171. package/dist-server/service/auth-provider/auth-provider-type.d.ts +1 -1
  172. package/dist-server/service/auth-provider/auth-provider-type.js +2 -2
  173. package/dist-server/service/auth-provider/auth-provider-type.js.map +1 -1
  174. package/dist-server/service/auth-provider/auth-provider.d.ts +3 -3
  175. package/dist-server/service/auth-provider/auth-provider.js +12 -12
  176. package/dist-server/service/auth-provider/auth-provider.js.map +1 -1
  177. package/dist-server/service/auth-provider/index.d.ts +3 -3
  178. package/dist-server/service/auth-provider/index.js +5 -5
  179. package/dist-server/service/auth-provider/index.js.map +1 -1
  180. package/dist-server/service/domain-generator/domain-generator-mutation.d.ts +1 -1
  181. package/dist-server/service/domain-generator/domain-generator-mutation.js +11 -11
  182. package/dist-server/service/domain-generator/domain-generator-mutation.js.map +1 -1
  183. package/dist-server/service/domain-generator/domain-generator-types.d.ts +1 -1
  184. package/dist-server/service/domain-generator/domain-generator-types.js +3 -3
  185. package/dist-server/service/domain-generator/domain-generator-types.js.map +1 -1
  186. package/dist-server/service/domain-generator/index.d.ts +1 -1
  187. package/dist-server/service/domain-generator/index.js +2 -2
  188. package/dist-server/service/domain-generator/index.js.map +1 -1
  189. package/dist-server/service/domain-link/domain-link-mutation.d.ts +9 -0
  190. package/dist-server/service/domain-link/domain-link-mutation.js +116 -0
  191. package/dist-server/service/domain-link/domain-link-mutation.js.map +1 -0
  192. package/dist-server/service/domain-link/domain-link-query.d.ts +11 -0
  193. package/dist-server/service/domain-link/domain-link-query.js +75 -0
  194. package/dist-server/service/domain-link/domain-link-query.js.map +1 -0
  195. package/dist-server/service/domain-link/domain-link-types.d.ts +18 -0
  196. package/dist-server/service/domain-link/domain-link-types.js +66 -0
  197. package/dist-server/service/domain-link/domain-link-types.js.map +1 -0
  198. package/dist-server/service/domain-link/domain-link.d.ts +28 -0
  199. package/dist-server/service/domain-link/domain-link.js +105 -0
  200. package/dist-server/service/domain-link/domain-link.js.map +1 -0
  201. package/dist-server/service/domain-link/index.d.ts +6 -0
  202. package/dist-server/service/domain-link/index.js +10 -0
  203. package/dist-server/service/domain-link/index.js.map +1 -0
  204. package/dist-server/service/granted-role/granted-role-mutation.d.ts +3 -3
  205. package/dist-server/service/granted-role/granted-role-mutation.js +17 -17
  206. package/dist-server/service/granted-role/granted-role-mutation.js.map +1 -1
  207. package/dist-server/service/granted-role/granted-role-query.d.ts +2 -2
  208. package/dist-server/service/granted-role/granted-role-query.js +13 -13
  209. package/dist-server/service/granted-role/granted-role-query.js.map +1 -1
  210. package/dist-server/service/granted-role/granted-role.d.ts +1 -1
  211. package/dist-server/service/granted-role/granted-role.js +3 -3
  212. package/dist-server/service/granted-role/granted-role.js.map +1 -1
  213. package/dist-server/service/granted-role/index.d.ts +3 -3
  214. package/dist-server/service/granted-role/index.js +5 -5
  215. package/dist-server/service/granted-role/index.js.map +1 -1
  216. package/dist-server/service/index.d.ts +27 -25
  217. package/dist-server/service/index.js +75 -70
  218. package/dist-server/service/index.js.map +1 -1
  219. package/dist-server/service/invitation/index.d.ts +3 -3
  220. package/dist-server/service/invitation/index.js +5 -5
  221. package/dist-server/service/invitation/index.js.map +1 -1
  222. package/dist-server/service/invitation/invitation-mutation.d.ts +2 -2
  223. package/dist-server/service/invitation/invitation-mutation.js +10 -10
  224. package/dist-server/service/invitation/invitation-mutation.js.map +1 -1
  225. package/dist-server/service/invitation/invitation-query.d.ts +1 -1
  226. package/dist-server/service/invitation/invitation-query.js +7 -7
  227. package/dist-server/service/invitation/invitation-query.js.map +1 -1
  228. package/dist-server/service/invitation/invitation-types.d.ts +1 -1
  229. package/dist-server/service/invitation/invitation-types.js +2 -2
  230. package/dist-server/service/invitation/invitation-types.js.map +1 -1
  231. package/dist-server/service/invitation/invitation.d.ts +1 -1
  232. package/dist-server/service/invitation/invitation.js +5 -5
  233. package/dist-server/service/invitation/invitation.js.map +1 -1
  234. package/dist-server/service/login-history/index.d.ts +2 -2
  235. package/dist-server/service/login-history/index.js +4 -4
  236. package/dist-server/service/login-history/index.js.map +1 -1
  237. package/dist-server/service/login-history/login-history-query.d.ts +3 -3
  238. package/dist-server/service/login-history/login-history-query.js +11 -11
  239. package/dist-server/service/login-history/login-history-query.js.map +1 -1
  240. package/dist-server/service/login-history/login-history-type.d.ts +1 -1
  241. package/dist-server/service/login-history/login-history-type.js +2 -2
  242. package/dist-server/service/login-history/login-history-type.js.map +1 -1
  243. package/dist-server/service/login-history/login-history.d.ts +1 -1
  244. package/dist-server/service/login-history/login-history.js +4 -4
  245. package/dist-server/service/login-history/login-history.js.map +1 -1
  246. package/dist-server/service/partner/index.d.ts +3 -3
  247. package/dist-server/service/partner/index.js +5 -5
  248. package/dist-server/service/partner/index.js.map +1 -1
  249. package/dist-server/service/partner/partner-mutation.js +8 -8
  250. package/dist-server/service/partner/partner-mutation.js.map +1 -1
  251. package/dist-server/service/partner/partner-query.d.ts +3 -3
  252. package/dist-server/service/partner/partner-query.js +17 -17
  253. package/dist-server/service/partner/partner-query.js.map +1 -1
  254. package/dist-server/service/partner/partner-types.d.ts +1 -1
  255. package/dist-server/service/partner/partner-types.js +2 -2
  256. package/dist-server/service/partner/partner-types.js.map +1 -1
  257. package/dist-server/service/partner/partner.d.ts +1 -1
  258. package/dist-server/service/partner/partner.js +5 -5
  259. package/dist-server/service/partner/partner.js.map +1 -1
  260. package/dist-server/service/password-history/index.d.ts +1 -1
  261. package/dist-server/service/password-history/index.js +2 -2
  262. package/dist-server/service/password-history/index.js.map +1 -1
  263. package/dist-server/service/privilege/index.d.ts +3 -3
  264. package/dist-server/service/privilege/index.js +5 -5
  265. package/dist-server/service/privilege/index.js.map +1 -1
  266. package/dist-server/service/privilege/privilege-directive.js +2 -2
  267. package/dist-server/service/privilege/privilege-directive.js.map +1 -1
  268. package/dist-server/service/privilege/privilege-mutation.d.ts +2 -2
  269. package/dist-server/service/privilege/privilege-mutation.js +15 -15
  270. package/dist-server/service/privilege/privilege-mutation.js.map +1 -1
  271. package/dist-server/service/privilege/privilege-query.d.ts +4 -4
  272. package/dist-server/service/privilege/privilege-query.js +20 -20
  273. package/dist-server/service/privilege/privilege-query.js.map +1 -1
  274. package/dist-server/service/privilege/privilege-types.d.ts +1 -1
  275. package/dist-server/service/privilege/privilege-types.js +2 -2
  276. package/dist-server/service/privilege/privilege-types.js.map +1 -1
  277. package/dist-server/service/privilege/privilege.d.ts +2 -2
  278. package/dist-server/service/privilege/privilege.js +10 -10
  279. package/dist-server/service/privilege/privilege.js.map +1 -1
  280. package/dist-server/service/role/index.d.ts +3 -3
  281. package/dist-server/service/role/index.js +5 -5
  282. package/dist-server/service/role/index.js.map +1 -1
  283. package/dist-server/service/role/role-mutation.d.ts +2 -2
  284. package/dist-server/service/role/role-mutation.js +19 -19
  285. package/dist-server/service/role/role-mutation.js.map +1 -1
  286. package/dist-server/service/role/role-query.d.ts +9 -5
  287. package/dist-server/service/role/role-query.js +38 -31
  288. package/dist-server/service/role/role-query.js.map +1 -1
  289. package/dist-server/service/role/role-types.d.ts +1 -1
  290. package/dist-server/service/role/role-types.js +2 -2
  291. package/dist-server/service/role/role-types.js.map +1 -1
  292. package/dist-server/service/role/role.d.ts +2 -2
  293. package/dist-server/service/role/role.js +12 -12
  294. package/dist-server/service/role/role.js.map +1 -1
  295. package/dist-server/service/user/domain-query.d.ts +1 -1
  296. package/dist-server/service/user/domain-query.js +3 -3
  297. package/dist-server/service/user/domain-query.js.map +1 -1
  298. package/dist-server/service/user/index.d.ts +4 -4
  299. package/dist-server/service/user/index.js +6 -6
  300. package/dist-server/service/user/index.js.map +1 -1
  301. package/dist-server/service/user/user-mutation.d.ts +3 -3
  302. package/dist-server/service/user/user-mutation.js +49 -84
  303. package/dist-server/service/user/user-mutation.js.map +1 -1
  304. package/dist-server/service/user/user-query.d.ts +4 -3
  305. package/dist-server/service/user/user-query.js +31 -21
  306. package/dist-server/service/user/user-query.js.map +1 -1
  307. package/dist-server/service/user/user-types.d.ts +1 -1
  308. package/dist-server/service/user/user-types.js +2 -2
  309. package/dist-server/service/user/user-types.js.map +1 -1
  310. package/dist-server/service/user/user.d.ts +3 -3
  311. package/dist-server/service/user/user.js +41 -46
  312. package/dist-server/service/user/user.js.map +1 -1
  313. package/dist-server/service/users-auth-providers/index.d.ts +1 -1
  314. package/dist-server/service/users-auth-providers/index.js +2 -2
  315. package/dist-server/service/users-auth-providers/index.js.map +1 -1
  316. package/dist-server/service/users-auth-providers/users-auth-providers.d.ts +2 -2
  317. package/dist-server/service/users-auth-providers/users-auth-providers.js +8 -8
  318. package/dist-server/service/users-auth-providers/users-auth-providers.js.map +1 -1
  319. package/dist-server/service/verification-token/index.d.ts +1 -1
  320. package/dist-server/service/verification-token/index.js +2 -2
  321. package/dist-server/service/verification-token/index.js.map +1 -1
  322. package/dist-server/service/web-auth-credential/index.d.ts +1 -1
  323. package/dist-server/service/web-auth-credential/index.js +2 -2
  324. package/dist-server/service/web-auth-credential/index.js.map +1 -1
  325. package/dist-server/service/web-auth-credential/web-auth-credential.d.ts +1 -1
  326. package/dist-server/service/web-auth-credential/web-auth-credential.js +10 -10
  327. package/dist-server/service/web-auth-credential/web-auth-credential.js.map +1 -1
  328. package/dist-server/tsconfig.tsbuildinfo +1 -1
  329. package/dist-server/types.d.ts +1 -1
  330. package/dist-server/types.js.map +1 -1
  331. package/dist-server/utils/access-token-cookie.js +2 -2
  332. package/dist-server/utils/access-token-cookie.js.map +1 -1
  333. package/dist-server/utils/check-permission.d.ts +2 -2
  334. package/dist-server/utils/check-permission.js +3 -3
  335. package/dist-server/utils/check-permission.js.map +1 -1
  336. package/dist-server/utils/check-user-belongs-domain.d.ts +1 -1
  337. package/dist-server/utils/check-user-belongs-domain.js +2 -2
  338. package/dist-server/utils/check-user-belongs-domain.js.map +1 -1
  339. package/dist-server/utils/get-domain-users.d.ts +1 -1
  340. package/dist-server/utils/get-domain-users.js +2 -2
  341. package/dist-server/utils/get-domain-users.js.map +1 -1
  342. package/dist-server/utils/get-user-domains.d.ts +2 -2
  343. package/dist-server/utils/get-user-domains.js +7 -5
  344. package/dist-server/utils/get-user-domains.js.map +1 -1
  345. package/helps/config/recaptcha.ja.md +49 -0
  346. package/helps/config/recaptcha.ko.md +49 -0
  347. package/helps/config/recaptcha.md +49 -0
  348. package/helps/config/recaptcha.ms.md +49 -0
  349. package/helps/config/recaptcha.zh.md +49 -0
  350. package/package.json +7 -6
  351. package/client/actions/auth.ts +0 -24
  352. package/client/auth.ts +0 -268
  353. package/client/bootstrap.ts +0 -47
  354. package/client/directive/privileged.ts +0 -28
  355. package/client/index.ts +0 -3
  356. package/client/profiled.ts +0 -83
  357. package/client/reducers/auth.ts +0 -31
  358. package/server/constants/error-code.ts +0 -22
  359. package/server/constants/error-message.ts +0 -0
  360. package/server/constants/max-age.ts +0 -1
  361. package/server/controllers/auth.ts +0 -5
  362. package/server/controllers/change-pwd.ts +0 -100
  363. package/server/controllers/checkin.ts +0 -21
  364. package/server/controllers/delete-user.ts +0 -76
  365. package/server/controllers/invitation.ts +0 -168
  366. package/server/controllers/profile.ts +0 -55
  367. package/server/controllers/reset-password.ts +0 -126
  368. package/server/controllers/signin.ts +0 -103
  369. package/server/controllers/signup.ts +0 -77
  370. package/server/controllers/unlock-user.ts +0 -62
  371. package/server/controllers/utils/make-invitation-token.ts +0 -5
  372. package/server/controllers/utils/make-verification-token.ts +0 -4
  373. package/server/controllers/utils/password-rule.ts +0 -120
  374. package/server/controllers/utils/save-invitation-token.ts +0 -10
  375. package/server/controllers/utils/save-verification-token.ts +0 -12
  376. package/server/controllers/verification.ts +0 -84
  377. package/server/errors/auth-error.ts +0 -24
  378. package/server/errors/index.ts +0 -2
  379. package/server/errors/user-domain-not-match-error.ts +0 -29
  380. package/server/index.ts +0 -37
  381. package/server/middlewares/authenticate-401-middleware.ts +0 -114
  382. package/server/middlewares/domain-authenticate-middleware.ts +0 -73
  383. package/server/middlewares/graphql-authenticate-middleware.ts +0 -13
  384. package/server/middlewares/index.ts +0 -67
  385. package/server/middlewares/jwt-authenticate-middleware.ts +0 -84
  386. package/server/middlewares/signin-middleware.ts +0 -56
  387. package/server/middlewares/webauthn-middleware.ts +0 -131
  388. package/server/migrations/1548206416130-SeedUser.ts +0 -60
  389. package/server/migrations/1566805283882-SeedPrivilege.ts +0 -28
  390. package/server/migrations/index.ts +0 -9
  391. package/server/router/auth-checkin-router.ts +0 -115
  392. package/server/router/auth-private-process-router.ts +0 -127
  393. package/server/router/auth-public-process-router.ts +0 -319
  394. package/server/router/auth-signin-router.ts +0 -76
  395. package/server/router/auth-signup-router.ts +0 -95
  396. package/server/router/index.ts +0 -9
  397. package/server/router/oauth2/index.ts +0 -2
  398. package/server/router/oauth2/oauth2-authorize-router.ts +0 -81
  399. package/server/router/oauth2/oauth2-router.ts +0 -165
  400. package/server/router/oauth2/oauth2-server.ts +0 -262
  401. package/server/router/oauth2/passport-oauth2-client-password.ts +0 -87
  402. package/server/router/oauth2/passport-refresh-token.ts +0 -87
  403. package/server/router/path-base-domain-router.ts +0 -8
  404. package/server/router/site-root-router.ts +0 -48
  405. package/server/router/webauthn-router.ts +0 -85
  406. package/server/routes.ts +0 -89
  407. package/server/service/app-binding/app-binding-mutation.ts +0 -22
  408. package/server/service/app-binding/app-binding-query.ts +0 -92
  409. package/server/service/app-binding/app-binding-types.ts +0 -11
  410. package/server/service/app-binding/app-binding.ts +0 -17
  411. package/server/service/app-binding/index.ts +0 -4
  412. package/server/service/appliance/appliance-mutation.ts +0 -113
  413. package/server/service/appliance/appliance-query.ts +0 -76
  414. package/server/service/appliance/appliance-types.ts +0 -56
  415. package/server/service/appliance/appliance.ts +0 -133
  416. package/server/service/appliance/index.ts +0 -6
  417. package/server/service/application/application-mutation.ts +0 -104
  418. package/server/service/application/application-query.ts +0 -98
  419. package/server/service/application/application-types.ts +0 -76
  420. package/server/service/application/application.ts +0 -216
  421. package/server/service/application/index.ts +0 -6
  422. package/server/service/auth-provider/auth-provider-mutation.ts +0 -159
  423. package/server/service/auth-provider/auth-provider-parameter-spec.ts +0 -24
  424. package/server/service/auth-provider/auth-provider-query.ts +0 -88
  425. package/server/service/auth-provider/auth-provider-type.ts +0 -67
  426. package/server/service/auth-provider/auth-provider.ts +0 -155
  427. package/server/service/auth-provider/index.ts +0 -7
  428. package/server/service/domain-generator/domain-generator-mutation.ts +0 -117
  429. package/server/service/domain-generator/domain-generator-types.ts +0 -46
  430. package/server/service/domain-generator/index.ts +0 -3
  431. package/server/service/granted-role/granted-role-mutation.ts +0 -156
  432. package/server/service/granted-role/granted-role-query.ts +0 -60
  433. package/server/service/granted-role/granted-role.ts +0 -27
  434. package/server/service/granted-role/index.ts +0 -6
  435. package/server/service/index.ts +0 -90
  436. package/server/service/invitation/index.ts +0 -6
  437. package/server/service/invitation/invitation-mutation.ts +0 -78
  438. package/server/service/invitation/invitation-query.ts +0 -33
  439. package/server/service/invitation/invitation-types.ts +0 -11
  440. package/server/service/invitation/invitation.ts +0 -63
  441. package/server/service/login-history/index.ts +0 -5
  442. package/server/service/login-history/login-history-query.ts +0 -51
  443. package/server/service/login-history/login-history-type.ts +0 -12
  444. package/server/service/login-history/login-history.ts +0 -45
  445. package/server/service/partner/index.ts +0 -6
  446. package/server/service/partner/partner-mutation.ts +0 -61
  447. package/server/service/partner/partner-query.ts +0 -102
  448. package/server/service/partner/partner-types.ts +0 -11
  449. package/server/service/partner/partner.ts +0 -57
  450. package/server/service/password-history/index.ts +0 -3
  451. package/server/service/password-history/password-history.ts +0 -16
  452. package/server/service/privilege/index.ts +0 -6
  453. package/server/service/privilege/privilege-directive.ts +0 -77
  454. package/server/service/privilege/privilege-mutation.ts +0 -92
  455. package/server/service/privilege/privilege-query.ts +0 -94
  456. package/server/service/privilege/privilege-types.ts +0 -60
  457. package/server/service/privilege/privilege.ts +0 -102
  458. package/server/service/role/index.ts +0 -6
  459. package/server/service/role/role-mutation.ts +0 -109
  460. package/server/service/role/role-query.ts +0 -155
  461. package/server/service/role/role-types.ts +0 -81
  462. package/server/service/role/role.ts +0 -72
  463. package/server/service/user/domain-query.ts +0 -24
  464. package/server/service/user/index.ts +0 -7
  465. package/server/service/user/user-mutation.ts +0 -517
  466. package/server/service/user/user-query.ts +0 -145
  467. package/server/service/user/user-types.ts +0 -100
  468. package/server/service/user/user.ts +0 -386
  469. package/server/service/users-auth-providers/index.ts +0 -5
  470. package/server/service/users-auth-providers/users-auth-providers.ts +0 -71
  471. package/server/service/verification-token/index.ts +0 -3
  472. package/server/service/verification-token/verification-token.ts +0 -60
  473. package/server/service/web-auth-credential/index.ts +0 -3
  474. package/server/service/web-auth-credential/web-auth-credential.ts +0 -66
  475. package/server/templates/account-unlock-email.ts +0 -65
  476. package/server/templates/invitation-email.ts +0 -66
  477. package/server/templates/reset-password-email.ts +0 -65
  478. package/server/templates/verification-email.ts +0 -66
  479. package/server/types.ts +0 -21
  480. package/server/utils/accepts.ts +0 -11
  481. package/server/utils/access-token-cookie.ts +0 -50
  482. package/server/utils/check-permission.ts +0 -52
  483. package/server/utils/check-user-belongs-domain.ts +0 -19
  484. package/server/utils/check-user-has-role.ts +0 -29
  485. package/server/utils/encrypt-state.ts +0 -22
  486. package/server/utils/get-aes-256-key.ts +0 -13
  487. package/server/utils/get-domain-users.ts +0 -38
  488. package/server/utils/get-secret.ts +0 -13
  489. package/server/utils/get-user-domains.ts +0 -115
@@ -1,517 +0,0 @@
1
- import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
- import { GraphQLEmailAddress } from 'graphql-scalars'
3
- import { ILike, In, SelectQueryBuilder, EntityManager } from 'typeorm'
4
-
5
- import { config } from '@things-factory/env'
6
- import { Domain, getRepository, ObjectRef } from '@things-factory/shell'
7
-
8
- import { deleteUser as commonDeleteUser, deleteUsers as commonDeleteUsers } from '../../controllers/delete-user'
9
- import { buildDomainUsersQueryBuilder } from '../../utils/get-domain-users'
10
- import { Role } from '../role/role'
11
- import { User, UserStatus } from './user'
12
- import { NewUser, UserPatch } from './user-types'
13
- import { USERNAME_ALREADY_EXISTS, EMAIL_ALREADY_EXISTS } from '../../constants/error-code'
14
-
15
- @Resolver(User)
16
- export class UserMutation {
17
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
18
- @Directive('@transaction')
19
- @Mutation(returns => User, { description: 'To create new user' })
20
- async createUser(@Arg('user') user: NewUser, @Ctx() context: ResolverContext) {
21
- const { domain, tx } = context.state
22
- const { defaultPassword } = config.get('password')
23
- const { username, email } = user
24
- const userRepository = getRepository(User, tx)
25
-
26
- user.username = username.trim()
27
- user.email = email.trim()
28
-
29
- if (await userRepository.findOne({ where: { username: user.username } })) {
30
- throw new Error(context.t(USERNAME_ALREADY_EXISTS))
31
- }
32
-
33
- if (await userRepository.findOne({ where: { email: ILike(user.email) } })) {
34
- throw new Error(context.t(EMAIL_ALREADY_EXISTS))
35
- }
36
-
37
- if (!user.password && !defaultPassword) {
38
- throw new Error('initial password or default password should be supported.')
39
- }
40
-
41
- // TODO username은 다음 패턴을 따라야 한다. pattern="^[A-Za-z0-9]*$"
42
- if (!/^[A-Za-z0-9]*$/.test(user.username)) {
43
- throw new Error(context.t('error.invalid x', { x: context.t('field.username') }))
44
- }
45
-
46
- // consider if validation password rule is required
47
- /* check if password is following the rule */
48
- // User.validatePasswordByRule(user.password, context.lng)
49
-
50
- const salt = User.generateSalt()
51
-
52
- return await userRepository.save({
53
- creator: context.state.user,
54
- updater: context.state.user,
55
- ...user,
56
- domains: [domain],
57
- roles:
58
- user.roles && user.roles.length
59
- ? await getRepository(Role, tx).findBy({
60
- id: In(user.roles.map(role => role.id)),
61
- domain: { id: domain.id }
62
- })
63
- : [],
64
- salt,
65
- passwordUpdatedAt: new Date(),
66
- password: user.password ? User.encode(user.password, salt) : User.encode(defaultPassword, salt)
67
- })
68
- }
69
-
70
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
71
- @Directive('@transaction')
72
- @Mutation(returns => User, { description: 'To modify user information' })
73
- async updateUser(
74
- @Arg('email', type => GraphQLEmailAddress) email: string,
75
- @Arg('patch') patch: UserPatch,
76
- @Ctx() context: ResolverContext
77
- ) {
78
- const { domain, user: updater, tx }: { domain: Domain; user: User; tx?: EntityManager } = context.state
79
- const qb: SelectQueryBuilder<User> = buildDomainUsersQueryBuilder(domain.id, 'USER')
80
- const user: User = await qb
81
- .andWhere('LOWER(USER.email) = :email', { email: email?.toLowerCase().trim() || '' })
82
- .leftJoinAndSelect('USER.roles', 'ROLES')
83
- .leftJoinAndSelect('ROLES.domain', 'R_DOMAIN')
84
- .getOne()
85
-
86
- if (patch.roles) {
87
- patch.roles = await getRepository(Role, tx).find({
88
- where: { id: In(patch.roles.map((r: Partial<Role>) => r.id)) }
89
- })
90
- }
91
-
92
- if (patch.status && patch.status === 'activated') {
93
- user.status = UserStatus.ACTIVATED
94
- }
95
-
96
- return await getRepository(User, tx).save({
97
- ...user,
98
- ...patch,
99
- updater
100
- } as any)
101
- }
102
-
103
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
104
- @Directive('@transaction')
105
- @Mutation(returns => [User], { description: 'To modify multiple users information' })
106
- async updateMultipleUser(@Arg('patches', type => [UserPatch]) patches: UserPatch[], @Ctx() context: ResolverContext) {
107
- const { domain, user, tx } = context.state
108
- const userRepo = getRepository(User, tx)
109
-
110
- let results = []
111
- const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
112
- const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
113
-
114
- if (_createRecords.length > 0) {
115
- for (let i = 0; i < _createRecords.length; i++) {
116
- const newRecord = _createRecords[i]
117
-
118
- // consider if validation password rule is required
119
- /* check if password is following the rule */
120
- // User.validatePasswordByRule(newRecord.password, context.lng)
121
-
122
- const salt = User.generateSalt()
123
- const result = await userRepo.save({
124
- ...(newRecord as any),
125
- domains: [domain],
126
- salt,
127
- password: User.encode(newRecord.password, salt),
128
- passwordUpdatedAt: new Date(),
129
- creator: user,
130
- updater: user
131
- })
132
-
133
- // repository api는 작동하지 않음.
134
- // await tx
135
- // .createQueryBuilder()
136
- // .insert()
137
- // .into('users_domains')
138
- // .values({
139
- // usersId: result.id,
140
- // domainsId: domain.id
141
- // })
142
- // .execute()
143
-
144
- results.push({ ...result, cuFlag: '+' })
145
- }
146
- }
147
-
148
- if (_updateRecords.length > 0) {
149
- for (let i = 0; i < _updateRecords.length; i++) {
150
- const updateRecord = _updateRecords[i]
151
- // consider if validation password rule is required
152
- /* check if password is following the rule */
153
- // User.validatePasswordByRule(updateRecord.password, context.lng)
154
-
155
- const user = await userRepo.findOne({ where: { id: updateRecord.id }, relations: ['domains'] })
156
- var domains = user.domains.find(d => d.id === domain.id) ? user.domains : [...user.domains, domain]
157
-
158
- const result = await userRepo.save({
159
- ...user,
160
- ...(updateRecord as any),
161
- domains,
162
- password: updateRecord.password ? User.encode(updateRecord.password, user.salt) : user.password,
163
- updater: user
164
- })
165
-
166
- if (!updateRecord.status) {
167
- continue
168
- }
169
-
170
- // const domain = await user.domain
171
- // if (!domain) {
172
- // continue
173
- // }
174
-
175
- // const domainId = domain.id
176
- // const domains = await user.domains
177
- // if (!domains.find(domain => domain.id == domainId)) {
178
- // await tx
179
- // .createQueryBuilder()
180
- // .insert()
181
- // .into('users_domains')
182
- // .values({
183
- // usersId: user.id,
184
- // domainsId: domain.id
185
- // })
186
- // .execute()
187
- // }
188
-
189
- results.push({ ...result, cuFlag: 'M' })
190
- }
191
- }
192
-
193
- return results
194
- }
195
-
196
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
197
- @Directive('@transaction')
198
- @Mutation(returns => Boolean, { description: 'To delete a user' })
199
- async deleteUser(@Arg('username') username: string, @Ctx() context: ResolverContext) {
200
- const { tx } = context.state
201
-
202
- await commonDeleteUser({ username }, tx)
203
-
204
- return true
205
- }
206
-
207
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
208
- @Directive('@transaction')
209
- @Mutation(returns => Boolean, { description: 'To delete some users' })
210
- async deleteUsers(@Arg('usernames', type => [String]) usernames: string[], @Ctx() context: ResolverContext) {
211
- const { tx } = context.state
212
- await commonDeleteUsers({ usernames }, tx)
213
-
214
- return true
215
- }
216
-
217
- @Directive('@transaction')
218
- @Mutation(returns => Boolean, { description: 'To invite new user' })
219
- async inviteUser(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
220
- const { domain, tx } = context.state
221
- const userRepository = getRepository(User, tx)
222
-
223
- var invitee: User = await userRepository.findOne({
224
- where: { username },
225
- relations: ['domains']
226
- })
227
-
228
- /*
229
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
230
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
231
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
232
- */
233
- if (!invitee && /^[^\s@]+@[^\s@]+$/.test(username)) {
234
- invitee = await userRepository.findOne({
235
- where: { email: ILike(username) },
236
- relations: ['domains']
237
- })
238
- }
239
-
240
- if (!invitee) {
241
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
242
- }
243
-
244
- const existingDomains: Domain[] = invitee.domains
245
- if (existingDomains.find((d: Domain) => d.id === domain.id)) {
246
- throw new Error(context.t('error.x already exists in y', { x: context.t('field.user'), y: domain.name }))
247
- }
248
-
249
- invitee.domains = [...existingDomains, domain]
250
- await userRepository.save(invitee)
251
-
252
- return true
253
- }
254
-
255
- @Directive('@transaction')
256
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
257
- @Mutation(returns => Boolean, { description: 'To delete domain user' })
258
- async deleteDomainUser(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
259
- const { tx, domain } = context.state
260
- const userRepository = getRepository(User, tx)
261
-
262
- var user: User = await userRepository.findOne({
263
- where: { username },
264
- relations: ['domains', 'roles']
265
- })
266
-
267
- /*
268
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
269
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
270
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
271
- */
272
- if (!user && /^[^\s@]+@[^\s@]+$/.test(username)) {
273
- user = await userRepository.findOne({
274
- where: { email: ILike(username) },
275
- relations: ['domains', 'roles']
276
- })
277
- }
278
-
279
- if (!user) {
280
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
281
- }
282
-
283
- const targetDomainIdx: number = user.domains.findIndex((userDomain: Domain) => userDomain.id === domain.id)
284
- if (targetDomainIdx < 0) {
285
- throw new Error(context.t('error.x is not a member of y', { x: user.name, y: domain.name }))
286
- }
287
-
288
- // Remove domain relation with user
289
- user.domains.splice(targetDomainIdx, 1)
290
-
291
- // Remove domain's roles that user has
292
- user.roles = user.roles.filter((role: Role) => role.domainId !== domain.id)
293
-
294
- await userRepository.save(user)
295
-
296
- return true
297
- }
298
-
299
- @Directive('@privilege(domainOwnerGranted: true, superUserGranted: true)')
300
- @Directive('@transaction')
301
- @Mutation(returns => Boolean, { description: 'To transfer owner of domain' })
302
- async transferOwner(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
303
- const { domain, tx } = context.state
304
- const userRepository = getRepository(User, tx)
305
-
306
- var user: User = await userRepository.findOne({
307
- where: { username },
308
- relations: ['domains']
309
- })
310
-
311
- /*
312
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
313
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
314
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
315
- */
316
- if (!user && /^[^\s@]+@[^\s@]+$/.test(username)) {
317
- user = await userRepository.findOne({
318
- where: { email: ILike(username) },
319
- relations: ['domains']
320
- })
321
- }
322
-
323
- if (!user) {
324
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
325
- }
326
-
327
- if (user.status !== UserStatus.ACTIVATED) {
328
- throw new Error('Only activated users are eligible to receive admin privileges.')
329
- }
330
-
331
- if (user.domains.map((d: Domain) => d.id).indexOf(domain.id) < 0) {
332
- throw new Error(`User is not belongs to current domain`)
333
- }
334
-
335
- if (user.roles.filter((r: Role) => r.domainId == domain.id).length == 0) {
336
- throw new Error(`Only users with at least one role in this domain are eligible to receive admin privileges.`)
337
- }
338
-
339
- domain.owner = user.id
340
- await getRepository(Domain, tx).save(domain)
341
-
342
- return true
343
- }
344
-
345
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
346
- @Directive('@transaction')
347
- @Mutation(returns => Boolean, { description: 'To activate user' })
348
- async activateUser(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
349
- const { tx, domain } = context.state
350
- const userRepository = getRepository(User, tx)
351
-
352
- var targetUser: User = await userRepository.findOne({
353
- where: { username },
354
- relations: ['domains']
355
- })
356
-
357
- /*
358
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
359
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
360
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
361
- */
362
- if (!targetUser && /^[^\s@]+@[^\s@]+$/.test(username)) {
363
- targetUser = await userRepository.findOne({
364
- where: { email: ILike(username) },
365
- relations: ['domains']
366
- })
367
- }
368
-
369
- if (!targetUser) {
370
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
371
- }
372
-
373
- if (!targetUser?.domains?.find((userDomain: Domain) => userDomain.id === domain.id)) {
374
- throw new Error('User is not belong to domain')
375
- }
376
-
377
- targetUser.failCount = 0
378
- targetUser.status = UserStatus.ACTIVATED
379
-
380
- await userRepository.save(targetUser)
381
-
382
- return true
383
- }
384
-
385
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
386
- @Directive('@transaction')
387
- @Mutation(returns => Boolean, { description: 'To inactivate user' })
388
- async inactivateUser(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
389
- const { tx, domain } = context.state
390
- const userRepository = getRepository(User, tx)
391
-
392
- var targetUser: User = await userRepository.findOne({
393
- where: { username },
394
- relations: ['domains']
395
- })
396
-
397
- /*
398
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
399
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
400
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
401
- */
402
- if (!targetUser && /^[^\s@]+@[^\s@]+$/.test(username)) {
403
- targetUser = await userRepository.findOne({
404
- where: { email: ILike(username) },
405
- relations: ['domains']
406
- })
407
- }
408
-
409
- if (!targetUser) {
410
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
411
- }
412
-
413
- if (!targetUser?.domains?.find((userDomain: Domain) => userDomain.id === domain.id)) {
414
- throw new Error('User is not belong to domain')
415
- }
416
-
417
- if (targetUser.userType == 'admin' || targetUser.id === domain.owner) {
418
- throw new Error('Admin deactivation not allowed')
419
- }
420
-
421
- targetUser.status = UserStatus.INACTIVE
422
-
423
- await userRepository.save(targetUser)
424
-
425
- return true
426
- }
427
-
428
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
429
- @Directive('@transaction')
430
- @Mutation(returns => Boolean, { description: 'To reset password to default' })
431
- async resetPasswordToDefault(@Arg('username') username: string, @Ctx() context: ResolverContext): Promise<boolean> {
432
- const { tx, domain } = context.state
433
-
434
- const { defaultPassword } = config.get('password')
435
- if (!defaultPassword) {
436
- throw new Error('No default password found')
437
- }
438
-
439
- const userRepository = getRepository(User, tx)
440
-
441
- var targetUser: User = await userRepository.findOne({
442
- where: { username },
443
- relations: ['domains']
444
- })
445
-
446
- /*
447
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
448
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
449
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
450
- */
451
- if (!targetUser && /^[^\s@]+@[^\s@]+$/.test(username)) {
452
- targetUser = await userRepository.findOne({
453
- where: { email: ILike(username) },
454
- relations: ['domains']
455
- })
456
- }
457
-
458
- if (!targetUser) {
459
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
460
- }
461
-
462
- if (!targetUser?.domains?.find((userDomain: Domain) => userDomain.id === domain.id)) {
463
- throw new Error('User is not belong to domain')
464
- }
465
-
466
- targetUser.salt = User.generateSalt()
467
- targetUser.password = User.encode(defaultPassword, targetUser.salt)
468
-
469
- await userRepository.save(targetUser)
470
-
471
- return true
472
- }
473
-
474
- @Directive('@privilege(category: "user", privilege: "mutation", domainOwnerGranted: true)')
475
- @Directive('@transaction')
476
- @Mutation(returns => User, { description: 'To update roles for a user' })
477
- async updateUserRoles(
478
- @Arg('username') username: string,
479
- @Arg('availableRoles', type => [ObjectRef]) availableRoles: ObjectRef[],
480
- @Arg('selectedRoles', type => [ObjectRef]) selectedRoles: ObjectRef[],
481
- @Ctx() context: ResolverContext
482
- ) {
483
- const { domain, tx } = context.state
484
- const userRepository = getRepository(User, tx)
485
-
486
- var user: User = await userRepository.findOne({
487
- where: { username },
488
- relations: ['domains', 'roles']
489
- })
490
-
491
- /*
492
- 정확한 이메일 정규표현식은 /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(username) 이지만,
493
- appliance 용으로 사용된 이메일로 {{uuid}}@{{domain slugger}} 식으로 사용했으므로
494
- email 유효성 판단에 /^[^\s@]+@[^\s@]+$/.test(username) 를 사용함.
495
- */
496
- if (!user && /^[^\s@]+@[^\s@]+$/.test(username)) {
497
- user = await userRepository.findOne({
498
- where: { email: ILike(username) },
499
- relations: ['domains', 'roles']
500
- })
501
- }
502
-
503
- if (!user) {
504
- throw new Error(context.t('error.failed to find x', { x: context.t('field.user') }))
505
- }
506
-
507
- if (user.domains.map((d: Domain) => d.id).indexOf(domain.id) < 0) {
508
- throw new Error(`User is not belongs to current domain`)
509
- }
510
-
511
- const availableRoleIds: string[] = availableRoles.map((r: Role) => r.id)
512
- user.roles = user.roles.filter((r: Role) => availableRoleIds.indexOf(r.id) < 0)
513
- user.roles = user.roles.concat(selectedRoles as Role[])
514
-
515
- return await userRepository.save(user)
516
- }
517
- }
@@ -1,145 +0,0 @@
1
- import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { GraphQLEmailAddress } from 'graphql-scalars'
3
- import { ILike, SelectQueryBuilder } from 'typeorm'
4
-
5
- import { config } from '@things-factory/env'
6
- import { getRepository, ListParam, getQueryBuilderFromListParams } from '@things-factory/shell'
7
-
8
- import { checkUserBelongsDomain } from '../../utils/check-user-belongs-domain'
9
- import { buildDomainUsersQueryBuilder } from '../../utils/get-domain-users'
10
- import { User } from './user'
11
- import { PasswordRule, UserList } from './user-types'
12
-
13
- const passwordRule = config.get('password') || {
14
- lowerCase: true,
15
- upperCase: true,
16
- digit: true,
17
- specialCharacter: true,
18
- allowRepeat: false,
19
- useTightPattern: true,
20
- useLoosePattern: false,
21
- tightCharacterLength: 8,
22
- looseCharacterLength: 15
23
- }
24
-
25
- @Resolver(User)
26
- export class UserQuery {
27
- @Query(returns => PasswordRule, {
28
- description:
29
- 'Retrieves the current password rule configuration for the system, such as required character types and minimum length.'
30
- })
31
- passwordRule(@Ctx() context: ResolverContext): PasswordRule {
32
- return passwordRule
33
- }
34
-
35
- @Directive('@privilege(category: "user", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
36
- @Query(returns => User, { description: 'Fetches a user by their email address within the current domain.' })
37
- async user(@Arg('email', type => GraphQLEmailAddress) email: string, @Ctx() context: ResolverContext): Promise<User> {
38
- const { domain } = context.state
39
-
40
- const qb: SelectQueryBuilder<User> = buildDomainUsersQueryBuilder(domain.id, 'USER')
41
- qb.andWhere(`LOWER(USER.email) = :email`, { email: email.toLowerCase().trim() })
42
-
43
- return qb.getOne()
44
- }
45
-
46
- @Directive('@privilege(category: "user", privilege: "query", domainOwnerGranted: true, superUserGranted: true)')
47
- @Query(returns => UserList, {
48
- description: 'Fetches a list of users based on provided search parameters within the current domain.'
49
- })
50
- async users(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<UserList> {
51
- const { domain } = context.state
52
-
53
- const qb = getQueryBuilderFromListParams({
54
- repository: getRepository(User),
55
- params,
56
- alias: 'USER',
57
- searchables: ['name', 'email', 'description']
58
- })
59
-
60
- qb.select().andWhere(qb => {
61
- const subQuery = qb
62
- .subQuery()
63
- .select('USERS_DOMAINS.users_id')
64
- .from('users_domains', 'USERS_DOMAINS')
65
- .where('USERS_DOMAINS.domains_id = :domainId', { domainId: domain.id })
66
- .getQuery()
67
-
68
- return 'USER.id IN ' + subQuery
69
- })
70
-
71
- const [items, total] = await qb.getManyAndCount()
72
-
73
- const foundUsers: User[] = items.map((item: User) => {
74
- item.owner = item.id === domain.owner
75
- return item
76
- })
77
-
78
- return { items: foundUsers, total }
79
- }
80
-
81
- @Query(returns => Boolean, { description: 'Checks if the current authenticated user belongs to the current domain.' })
82
- async checkUserBelongsDomain(@Ctx() context: ResolverContext): Promise<Boolean> {
83
- const { user, domain } = context.state
84
-
85
- if (user) {
86
- return await checkUserBelongsDomain(domain, user)
87
- } else {
88
- throw new Error(`Failed to get current user information.`)
89
- }
90
- }
91
-
92
- @Query(returns => Boolean, {
93
- description: 'Determines whether the system provides a default password when creating a new user.'
94
- })
95
- async checkResettablePasswordToDefault(@Ctx() context: ResolverContext): Promise<Boolean> {
96
- const { defaultPassword } = config.get('password')
97
-
98
- return Boolean(defaultPassword)
99
- }
100
-
101
- @Query(returns => Boolean, {
102
- description: 'Checks if the system is configured to provide a default password for new users.'
103
- })
104
- async checkDefaultPassword(@Ctx() context: ResolverContext): Promise<Boolean> {
105
- const { defaultPassword } = config.get('password')
106
-
107
- return Boolean(defaultPassword)
108
- }
109
-
110
- @Directive('@privilege(category: "user", privilege: "query")')
111
- @Query(returns => Boolean, { description: 'Checks if a user with the given email address exists in the system.' })
112
- async checkUserExistence(@Arg('email', type => GraphQLEmailAddress) email: string): Promise<Boolean> {
113
- return Boolean(await getRepository(User).count({ where: { email: ILike(email) } }))
114
- }
115
-
116
- @FieldResolver()
117
- async domains(@Root() user: User) {
118
- return (
119
- await getRepository(User).findOne({
120
- where: { id: user.id },
121
- relations: ['domains']
122
- })
123
- ).domains
124
- }
125
-
126
- @FieldResolver()
127
- async roles(@Root() user: User) {
128
- return (
129
- await getRepository(User).findOne({
130
- where: { id: user.id },
131
- relations: ['roles']
132
- })
133
- ).roles
134
- }
135
-
136
- @FieldResolver()
137
- async updater(@Root() user: User): Promise<User> {
138
- return await getRepository(User).findOneBy({ id: user.updaterId })
139
- }
140
-
141
- @FieldResolver()
142
- async creator(@Root() user: User): Promise<User> {
143
- return await getRepository(User).findOneBy({ id: user.creatorId })
144
- }
145
- }