generator-jhipster 7.3.0 → 7.5.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 (340) hide show
  1. package/cli/import-jdl.js +3 -2
  2. package/cli/jhipster-command.js +2 -2
  3. package/cli/program.js +32 -29
  4. package/generators/app/index.js +46 -27
  5. package/generators/aws/index.js +8 -8
  6. package/generators/aws/lib/eb.js +1 -1
  7. package/generators/azure-app-service/index.js +16 -9
  8. package/generators/azure-app-service/templates/github/workflows/azure-app-service.yml.ejs +2 -2
  9. package/generators/azure-spring-cloud/index.js +16 -9
  10. package/generators/azure-spring-cloud/templates/github/workflows/azure-spring-cloud.yml.ejs +2 -2
  11. package/generators/bootstrap/index.js +57 -62
  12. package/generators/ci-cd/index.js +11 -8
  13. package/generators/ci-cd/templates/github-actions.yml.ejs +1 -1
  14. package/generators/ci-cd/templates/travis.yml.ejs +9 -4
  15. package/generators/cleanup.js +27 -171
  16. package/generators/client/files-angular.js +12 -1
  17. package/generators/client/files-common.js +6 -2
  18. package/generators/client/files-react.js +13 -2
  19. package/generators/client/files-vue.js +59 -7
  20. package/generators/client/index.js +46 -32
  21. package/generators/client/needle-api/needle-client-angular.js +1 -1
  22. package/generators/client/needle-api/needle-client-vue.js +57 -7
  23. package/generators/client/templates/angular/.eslintrc.json.ejs +1 -0
  24. package/generators/client/templates/angular/angular.json.ejs +5 -0
  25. package/generators/client/templates/angular/jest.conf.js.ejs +2 -0
  26. package/generators/client/templates/angular/package.json +29 -29
  27. package/generators/client/templates/angular/package.json.ejs +3 -1
  28. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.spec.ts.ejs +52 -54
  29. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.component.ts.ejs +4 -4
  30. package/generators/client/templates/angular/src/main/webapp/app/account/activate/activate.service.spec.ts.ejs +65 -0
  31. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.spec.ts.ejs +35 -37
  32. package/generators/client/templates/angular/src/main/webapp/app/account/password/password-strength-bar/password-strength-bar.component.ts.ejs +1 -1
  33. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.spec.ts.ejs +78 -80
  34. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.component.ts.ejs +4 -4
  35. package/generators/client/templates/angular/src/main/webapp/app/account/password/password.service.spec.ts.ejs +41 -0
  36. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.spec.ts.ejs +73 -75
  37. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.component.ts.ejs +4 -4
  38. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.spec.ts.ejs +62 -0
  39. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.component.spec.ts.ejs +44 -46
  40. package/generators/client/templates/angular/src/main/webapp/app/account/password-reset/init/password-reset-init.service.spec.ts.ejs +61 -0
  41. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.spec.ts.ejs +122 -123
  42. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.component.ts.ejs +1 -1
  43. package/generators/client/templates/angular/src/main/webapp/app/account/register/register.service.spec.ts.ejs +66 -0
  44. package/generators/client/templates/angular/src/main/webapp/app/account/sessions/sessions.component.spec.ts.ejs +75 -77
  45. package/generators/client/templates/angular/src/main/webapp/app/account/settings/settings.component.spec.ts.ejs +80 -80
  46. package/generators/client/templates/angular/src/main/webapp/app/admin/configuration/configuration.component.spec.ts.ejs +48 -50
  47. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.spec.ts.ejs +45 -47
  48. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.component.ts.ejs +4 -4
  49. package/generators/client/templates/angular/src/main/webapp/app/admin/health/health.service.spec.ts.ejs +66 -0
  50. package/generators/client/templates/angular/src/main/webapp/app/admin/health/modal/health-modal.component.spec.ts.ejs +99 -101
  51. package/generators/client/templates/angular/src/main/webapp/app/admin/logs/logs.component.spec.ts.ejs +61 -63
  52. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/blocks/jvm-memory/jvm-memory.component.html.ejs +2 -2
  53. package/generators/client/templates/angular/src/main/webapp/app/admin/metrics/metrics.component.spec.ts.ejs +28 -30
  54. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/delete/user-management-delete-dialog.component.spec.ts.ejs +35 -37
  55. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/detail/user-management-detail.component.spec.ts.ejs +40 -42
  56. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.spec.ts.ejs +89 -91
  57. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/list/user-management.component.ts.ejs +4 -4
  58. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.spec.ts.ejs +81 -83
  59. package/generators/client/templates/angular/src/main/webapp/app/admin/user-management/update/user-management-update.component.ts.ejs +8 -8
  60. package/generators/client/templates/angular/src/main/webapp/app/app-routing.module.ts.ejs +14 -3
  61. package/generators/client/templates/angular/src/main/webapp/app/app.module.ts.ejs +8 -29
  62. package/generators/client/templates/angular/src/main/webapp/app/config/datepicker-adapter.ts.ejs +1 -1
  63. package/generators/client/templates/angular/src/main/webapp/app/config/dayjs.ts.ejs +4 -4
  64. package/generators/client/templates/angular/src/main/webapp/app/core/auth/account.service.spec.ts.ejs +14 -9
  65. package/generators/client/templates/angular/src/main/webapp/app/core/tracker/tracker.service.ts.ejs +6 -6
  66. package/generators/client/templates/angular/src/main/webapp/app/core/util/parse-links.service.ts.ejs +1 -1
  67. package/generators/client/templates/angular/src/main/webapp/app/entities/entity-navbar-items.ts.ejs +29 -0
  68. package/generators/client/templates/angular/src/main/webapp/app/home/home.component.spec.ts.ejs +106 -98
  69. package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.spec.ts.ejs +166 -168
  70. package/generators/client/templates/angular/src/main/webapp/app/layouts/main/main.component.ts.ejs +1 -1
  71. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.html.ejs +20 -0
  72. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.spec.ts.ejs +74 -70
  73. package/generators/client/templates/angular/src/main/webapp/app/layouts/navbar/navbar.component.ts.ejs +41 -2
  74. package/generators/client/templates/angular/src/main/webapp/app/layouts/profiles/page-ribbon.component.spec.ts.ejs +27 -29
  75. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.spec.ts.ejs +114 -115
  76. package/generators/client/templates/angular/src/main/webapp/app/login/login.component.ts.ejs +4 -4
  77. package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert-error.component.spec.ts.ejs +132 -134
  78. package/generators/client/templates/angular/src/main/webapp/app/shared/alert/alert.component.spec.ts.ejs +29 -31
  79. package/generators/client/templates/angular/src/main/webapp/app/shared/auth/has-any-authority.directive.spec.ts.ejs +4 -4
  80. package/generators/client/templates/angular/src/main/webapp/app/shared/date/duration.pipe.ts.ejs +1 -1
  81. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.spec.ts.ejs +1 -1
  82. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-date.pipe.ts.ejs +1 -1
  83. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.spec.ts.ejs +1 -1
  84. package/generators/client/templates/angular/src/main/webapp/app/shared/date/format-medium-datetime.pipe.ts.ejs +1 -1
  85. package/generators/client/templates/angular/src/main/webapp/app/shared/language/translate.directive.ts.ejs +6 -6
  86. package/generators/client/templates/angular/src/main/webapp/app/shared/language/translation.module.ts.ejs +83 -0
  87. package/generators/client/templates/angular/src/main/webapp/declarations.d.ts.ejs +16 -2
  88. package/generators/client/templates/angular/tsconfig.json.ejs +2 -0
  89. package/generators/client/templates/angular/tsconfig.spec.json.ejs +0 -1
  90. package/generators/client/templates/angular/webpack/proxy.conf.js.ejs +0 -2
  91. package/generators/client/templates/angular/webpack/webpack.custom.js.ejs +0 -16
  92. package/generators/client/templates/angular/webpack/webpack.microfrontend.js.ejs +12 -5
  93. package/generators/client/templates/common/package.json +6 -6
  94. package/generators/client/templates/common/src/main/webapp/robots.txt.ejs +0 -1
  95. package/generators/client/templates/common/src/main/webapp/swagger-ui/index.html.ejs +86 -56
  96. package/generators/client/templates/common/webpack/webpack.microfrontend.js.jhi.ejs +56 -0
  97. package/generators/client/templates/react/.eslintrc.json.ejs +1 -0
  98. package/generators/client/templates/react/package.json +54 -53
  99. package/generators/client/templates/react/package.json.ejs +6 -1
  100. package/generators/client/templates/react/src/main/webapp/app/app.scss.ejs +0 -3
  101. package/generators/client/templates/react/src/main/webapp/app/config/axios-interceptor.spec.ts.ejs +3 -2
  102. package/generators/client/templates/react/src/main/webapp/app/modules/account/password/password.tsx.ejs +2 -2
  103. package/generators/client/templates/react/src/main/webapp/app/modules/administration/configuration/configuration.tsx.ejs +2 -2
  104. package/generators/client/templates/react/src/main/webapp/app/modules/administration/gateway/gateway.tsx.ejs +2 -2
  105. package/generators/client/templates/react/src/main/webapp/app/modules/administration/metrics/metrics.tsx.ejs +6 -6
  106. package/generators/client/templates/react/src/main/webapp/app/modules/administration/user-management/user-management.tsx.ejs +8 -8
  107. package/generators/client/templates/react/src/main/webapp/app/modules/home/home.tsx.ejs +1 -1
  108. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.scss.ejs +9 -0
  109. package/generators/client/templates/react/src/main/webapp/app/shared/layout/header/header.tsx.ejs +2 -2
  110. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/account.tsx.ejs +3 -3
  111. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/admin.tsx.ejs +7 -7
  112. package/generators/client/templates/react/src/main/webapp/app/shared/layout/menus/menu-components.tsx.ejs +1 -1
  113. package/generators/client/templates/react/src/main/webapp/app/shared/reducers/authentication.spec.ts.ejs +1 -1
  114. package/generators/client/templates/react/webpack/webpack.dev.js.ejs +17 -3
  115. package/generators/client/templates/react/webpack/webpack.prod.js.ejs +13 -1
  116. package/generators/client/templates/vue/.eslintrc.js.ejs +8 -5
  117. package/generators/client/templates/vue/package.json +40 -49
  118. package/generators/client/templates/vue/package.json.ejs +13 -17
  119. package/generators/client/templates/vue/src/main/webapp/app/account/account.service.ts.ejs +23 -12
  120. package/generators/client/templates/vue/src/main/webapp/app/account/settings/settings.vue.ejs +7 -1
  121. package/generators/client/templates/vue/src/main/webapp/app/admin/configuration/configuration.vue.ejs +1 -1
  122. package/generators/client/templates/vue/src/main/webapp/app/admin/metrics/metrics.component.ts.ejs +1 -1
  123. package/generators/client/templates/vue/src/main/webapp/app/constants.ts.ejs +16 -6
  124. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.component.ts.ejs +27 -8
  125. package/generators/client/templates/vue/src/main/webapp/app/core/jhi-navbar/jhi-navbar.vue.ejs +6 -0
  126. package/generators/client/templates/vue/src/main/webapp/app/declarations.d.ts.ejs +41 -0
  127. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.component.ts.ejs +34 -0
  128. package/generators/client/templates/vue/src/main/webapp/app/entities/entities-menu.vue.ejs +13 -0
  129. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.component.ts.ejs +20 -0
  130. package/generators/client/templates/vue/src/main/webapp/app/entities/entities.vue.ejs +5 -0
  131. package/generators/client/templates/vue/src/main/webapp/app/entities/user/{user.oauth2.service.ts.ejs → user.service.ts.ejs} +1 -1
  132. package/generators/client/templates/vue/{webpack/utils.js.ejs → src/main/webapp/app/index.ts.ejs} +1 -12
  133. package/generators/client/templates/vue/src/main/webapp/app/locale/translation.service.ts.ejs +26 -9
  134. package/generators/client/templates/vue/src/main/webapp/app/main.ts.ejs +20 -18
  135. package/generators/client/templates/vue/src/main/webapp/app/router/entities.ts.ejs +45 -3
  136. package/generators/client/templates/vue/src/main/webapp/app/router/index.ts.ejs +19 -3
  137. package/generators/client/templates/vue/src/main/webapp/app/shared/config/axios-interceptor.ts.ejs +0 -2
  138. package/generators/client/templates/vue/src/main/webapp/app/shared/data/data-utils.service.ts.ejs +3 -1
  139. package/generators/client/templates/vue/src/main/webapp/app/shims-vue.d.ts.ejs +17 -3
  140. package/generators/client/templates/vue/src/test/javascript/jest.conf.js.ejs +25 -10
  141. package/generators/client/templates/vue/src/test/javascript/spec/app/account/login-form/login-form.component.spec.ts.ejs +2 -2
  142. package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management-edit.component.spec.ts.ejs +6 -4
  143. package/generators/client/templates/vue/src/test/javascript/spec/app/admin/user-management/user-management.component.spec.ts.ejs +4 -2
  144. package/generators/client/templates/vue/src/test/javascript/spec/app/core/jhi-navbar/jhi-navbar.component.spec.ts.ejs +10 -4
  145. package/generators/client/templates/vue/src/test/javascript/spec/app/entities/entities-menu.spec.ts.ejs +52 -0
  146. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.component.ts.ejs +4 -0
  147. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-menu.vue.ejs +7 -0
  148. package/generators/client/templates/vue/src/test/javascript/spec/app/microfrontends/entities-router.ts.ejs +1 -0
  149. package/generators/client/templates/vue/src/test/javascript/spec/app/shared/config/axios-interceptor.spec.ts.ejs +0 -1
  150. package/generators/client/templates/vue/tsconfig.json.ejs +6 -10
  151. package/generators/client/templates/vue/tsconfig.spec.json.ejs +37 -0
  152. package/generators/client/templates/vue/webpack/config.js.ejs +50 -0
  153. package/generators/client/templates/vue/webpack/vue.utils.js.ejs +33 -32
  154. package/generators/client/templates/vue/webpack/webpack.common.js.ejs +150 -126
  155. package/generators/client/templates/vue/webpack/webpack.dev.js.ejs +19 -76
  156. package/generators/client/templates/vue/webpack/webpack.microfrontend.js.jhi.vue.ejs +77 -0
  157. package/generators/client/templates/vue/webpack/webpack.prod.js.ejs +5 -41
  158. package/generators/cloudfoundry/index.js +9 -9
  159. package/generators/common/index.js +12 -10
  160. package/generators/common/templates/.prettierrc.ejs +1 -1
  161. package/generators/common/templates/README.md.jhi.ejs +19 -0
  162. package/generators/common/templates/package.json +4 -4
  163. package/generators/cypress/index.js +12 -9
  164. package/generators/cypress/templates/cypress.json.ejs +16 -2
  165. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/login-page.spec.ts.ejs +3 -14
  166. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/password-page.spec.ts.ejs +33 -39
  167. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/register-page.spec.ts.ejs +52 -62
  168. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/reset-password-page.spec.ts.ejs +2 -10
  169. package/generators/cypress/templates/src/test/javascript/cypress/integration/account/settings-page.spec.ts.ejs +25 -34
  170. package/generators/cypress/templates/src/test/javascript/cypress/integration/administration/administration.spec.ts.ejs +1 -22
  171. package/generators/cypress/templates/src/test/javascript/cypress/plugins/index.ts.ejs +4 -4
  172. package/generators/cypress/templates/src/test/javascript/cypress/support/commands.ts.ejs +67 -7
  173. package/generators/cypress/templates/src/test/javascript/cypress/support/entity.ts.ejs +4 -4
  174. package/generators/cypress/templates/src/test/javascript/cypress/support/index.ts.ejs +1 -6
  175. package/generators/cypress/templates/src/test/javascript/cypress/support/management.ts.ejs +1 -1
  176. package/generators/cypress/templates/src/test/javascript/cypress/support/navbar.ts.ejs +8 -8
  177. package/generators/cypress/templates/src/test/javascript/cypress/support/oauth2.ts.ejs +0 -9
  178. package/generators/database-changelog/index.js +33 -22
  179. package/generators/database-changelog-liquibase/index.js +12 -8
  180. package/generators/database-changelog-liquibase/templates/src/main/resources/config/liquibase/changelog/updated_entity_constraints.xml.ejs +1 -1
  181. package/generators/docker-compose/index.js +11 -12
  182. package/generators/docker-compose/templates/realm-config/jhipster-realm.json.ejs +1 -1
  183. package/generators/entities/index.js +35 -26
  184. package/generators/entities-client/index.js +10 -7
  185. package/generators/entity/index.js +81 -32
  186. package/generators/entity-client/files.js +7 -16
  187. package/generators/entity-client/index.js +22 -12
  188. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/delete/entity-management-delete-dialog.component.spec.ts.ejs +42 -44
  189. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.html.ejs +1 -1
  190. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/detail/entity-management-detail.component.spec.ts.ejs +58 -60
  191. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity-management.module.ts.ejs +1 -35
  192. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/entity.model.ts.ejs +1 -1
  193. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.html.ejs +4 -4
  194. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.spec.ts.ejs +110 -112
  195. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/entity-management.component.ts.ejs +9 -2
  196. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/infinite-scroll-template.ejs +8 -8
  197. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/no-pagination-template.ejs +8 -8
  198. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/list/pagination-template.ejs +8 -8
  199. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing-resolve.service.spec.ts.ejs +15 -6
  200. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/route/entity-management-routing.module.ts.ejs +1 -1
  201. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.spec.ts.ejs +1 -1
  202. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/service/entity.service.ts.ejs +1 -1
  203. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.spec.ts.ejs +203 -198
  204. package/generators/entity-client/templates/angular/src/main/webapp/app/entities/update/entity-management-update.component.ts.ejs +5 -5
  205. package/generators/entity-client/templates/angular/src/test/javascript/e2e/entities/entity.spec.ts.ejs +1 -1
  206. package/generators/entity-client/templates/common/src/test/javascript/cypress/integration/entity/entity.spec.ts.ejs +264 -127
  207. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity-update.tsx.ejs +17 -14
  208. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.reducer.ts.ejs +5 -4
  209. package/generators/entity-client/templates/react/src/main/webapp/app/entities/entity.tsx.ejs +11 -13
  210. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.component.ts.ejs +32 -25
  211. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity-update.vue.ejs +6 -9
  212. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.component.ts.ejs +2 -1
  213. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.model.ts.ejs +1 -1
  214. package/generators/entity-client/templates/vue/src/main/webapp/app/entities/entity.service.ts.ejs +2 -6
  215. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity-update.component.spec.ts.ejs +10 -7
  216. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.component.spec.ts.ejs +5 -1
  217. package/generators/entity-client/templates/vue/src/test/javascript/spec/app/entities/entity.service.spec.ts.ejs +1 -1
  218. package/generators/entity-i18n/index.js +7 -4
  219. package/generators/entity-server/files.js +14 -0
  220. package/generators/entity-server/index.js +12 -8
  221. package/generators/entity-server/templates/src/main/java/package/common/get_all_template.ejs +2 -2
  222. package/generators/entity-server/templates/src/main/java/package/common/search_template.ejs +1 -1
  223. package/generators/entity-server/templates/src/main/java/package/domain/Entity.java.jhi.ejs +9 -8
  224. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepositoryInternalImpl_reactive.java.ejs +16 -29
  225. package/generators/entity-server/templates/src/main/java/package/repository/EntityRepository_reactive.java.ejs +3 -3
  226. package/generators/entity-server/templates/src/main/java/package/repository/EntitySqlHelper_reactive.java.ejs +46 -0
  227. package/generators/entity-server/templates/src/main/java/package/repository/rowmapper/EntityRowMapper.java.ejs +1 -1
  228. package/generators/entity-server/templates/src/main/java/package/repository/search/EntitySearchRepository.java.ejs +18 -2
  229. package/generators/entity-server/templates/src/main/java/package/repository/search/SortToFieldSortBuilderConverter.java.ejs +24 -0
  230. package/generators/entity-server/templates/src/main/java/package/service/dto/EntityDTO.java.ejs +8 -6
  231. package/generators/entity-server/templates/src/main/java/package/service/mapper/EntityMapper.java.ejs +5 -1
  232. package/generators/entity-server/templates/src/main/java/package/web/rest/EntityResource.java.ejs +41 -43
  233. package/generators/entity-server/templates/src/test/java/package/web/rest/EntityResourceIT.java.ejs +3 -3
  234. package/generators/gae/index.js +10 -10
  235. package/generators/generator-base-blueprint.js +14 -46
  236. package/generators/generator-base-private.js +44 -23
  237. package/generators/generator-base.js +58 -18
  238. package/generators/generator-constants.js +30 -23
  239. package/generators/generator-transforms.js +39 -27
  240. package/generators/heroku/index.js +14 -33
  241. package/generators/init/constants.cjs +1 -1
  242. package/generators/java/constants.cjs +1 -1
  243. package/generators/kubernetes/files.js +3 -0
  244. package/generators/kubernetes/index.js +10 -10
  245. package/generators/kubernetes/templates/db/couchbase.yml.ejs +1 -1
  246. package/generators/kubernetes/templates/deployment.yml.ejs +8 -3
  247. package/generators/kubernetes/templates/istio/destination-rule.yml.ejs +1 -1
  248. package/generators/kubernetes/templates/istio/gateway/grafana-gateway.yml.ejs +5 -2
  249. package/generators/kubernetes/templates/istio/gateway/jhipster-grafana-gateway.yml.ejs +5 -2
  250. package/generators/kubernetes/templates/istio/gateway/kiali-gateway.yml.ejs +10 -8
  251. package/generators/kubernetes/templates/istio/gateway/zipkin-gateway.yml.ejs +5 -2
  252. package/generators/kubernetes/templates/istio/gateway.yml.ejs +7 -5
  253. package/generators/kubernetes/templates/secret/couchbase-secret.yml.ejs +9 -0
  254. package/generators/kubernetes-base.js +1 -0
  255. package/generators/kubernetes-helm/files.js +3 -8
  256. package/generators/kubernetes-helm/index.js +10 -10
  257. package/generators/kubernetes-helm/templates/README-KUBERNETES-HELM.md.ejs +0 -1
  258. package/generators/kubernetes-helm/templates/app/Chart.yml.ejs +5 -0
  259. package/generators/kubernetes-helm/templates/app/helpers.tpl.ejs +0 -11
  260. package/generators/kubernetes-helm/templates/app/requirements.yml.ejs +5 -0
  261. package/generators/kubernetes-helm/templates/app/values.yml.ejs +68 -5
  262. package/generators/kubernetes-helm/templates/csvc/Chart.yml.ejs +1 -1
  263. package/generators/kubernetes-helm/templates/csvc/requirements.yml.ejs +1 -1
  264. package/generators/kubernetes-knative/index.js +10 -10
  265. package/generators/kubernetes-knative/templates/istio/gateway.yml.ejs +6 -4
  266. package/generators/kubernetes-knative/templates/service.yml.ejs +1 -1
  267. package/generators/languages/index.js +13 -13
  268. package/generators/languages/templates/src/main/webapp/i18n/vi/login.json +1 -1
  269. package/generators/openapi-client/index.js +13 -10
  270. package/generators/openshift/index.js +10 -11
  271. package/generators/openshift/templates/deployment.yml.ejs +1 -1
  272. package/generators/page/index.js +12 -10
  273. package/generators/server/__snapshots__/generator.spec.mjs.snap +28 -15
  274. package/generators/server/cleanup.js +151 -0
  275. package/generators/server/files-sql.js +52 -0
  276. package/generators/server/files.js +31 -14
  277. package/generators/server/index.js +86 -33
  278. package/generators/server/templates/build.gradle.ejs +231 -189
  279. package/generators/server/templates/gradle.properties.ejs +12 -12
  280. package/generators/server/templates/npmw +8 -6
  281. package/generators/server/templates/npmw.cmd +13 -8
  282. package/generators/server/templates/pom.xml.ejs +425 -217
  283. package/generators/server/templates/sql/reactive/src/main/java/package/repository/UserSqlHelper.java.ejs +48 -0
  284. package/generators/server/templates/src/main/docker/app.yml.ejs +1 -1
  285. package/generators/server/templates/src/main/docker/config/realm-config/jhipster-realm.json.ejs +2 -2
  286. package/generators/server/templates/src/main/java/package/config/LocaleConfiguration.java.ejs +3 -2
  287. package/generators/server/templates/src/main/java/package/config/OpenApiConfiguration.java.ejs +17 -54
  288. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration.java.ejs +5 -5
  289. package/generators/server/templates/src/main/java/package/config/SecurityConfiguration_reactive.java.ejs +4 -6
  290. package/generators/server/templates/src/main/java/package/config/WebConfigurer.java.ejs +0 -3
  291. package/generators/server/templates/src/main/java/package/config/neo4j/Neo4jMigrations.java.ejs +19 -9
  292. package/generators/server/templates/src/main/java/package/management/SecurityMetersService.java.ejs +68 -0
  293. package/generators/server/templates/src/main/java/package/repository/AuthorityRepository.java.ejs +2 -2
  294. package/generators/server/templates/src/main/java/package/repository/UserRepository.java.ejs +0 -25
  295. package/generators/server/templates/src/main/java/package/security/jwt/TokenProvider.java.ejs +31 -4
  296. package/generators/server/templates/src/main/java/package/security/oauth2/CustomClaimConverter.java.ejs +23 -11
  297. package/generators/server/templates/src/main/java/package/service/UserService.java.ejs +16 -8
  298. package/generators/server/templates/src/main/java/package/service/dto/UserDTO.java.ejs +6 -6
  299. package/generators/server/templates/src/main/java/package/web/filter/ModifyServersOpenApiFilter.java.ejs +3 -2
  300. package/generators/server/templates/src/main/java/package/web/filter/SpaWebFilter.java.ejs +1 -1
  301. package/generators/server/templates/src/main/java/package/web/rest/PublicUserResource.java.ejs +2 -2
  302. package/generators/server/templates/src/main/java/package/web/rest/UserResource.java.ejs +2 -2
  303. package/generators/server/templates/src/main/resources/config/application.yml.ejs +22 -8
  304. package/generators/server/templates/src/main/resources/logback-spring.xml.ejs +1 -2
  305. package/generators/server/templates/src/main/resources/static/microservices_index.html.ejs +1 -1
  306. package/generators/server/templates/src/test/java/package/cucumber/CucumberIT.java.ejs +2 -6
  307. package/generators/server/templates/src/test/java/package/cucumber/CucumberTestContextConfiguration.java.ejs +2 -3
  308. package/generators/server/templates/src/test/java/package/cucumber/stepdefs/UserStepDefs.java.ejs +41 -6
  309. package/generators/server/templates/src/test/java/package/management/SecurityMetersServiceTests.java.ejs +113 -0
  310. package/generators/server/templates/src/test/java/package/security/jwt/JWTFilterTest.java.ejs +6 -1
  311. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderSecurityMetersTests.java.ejs +198 -0
  312. package/generators/server/templates/src/test/java/package/security/jwt/TokenProviderTest.java.ejs +13 -3
  313. package/generators/server/templates/src/test/java/package/security/oauth2/AuthorizationHeaderUtilTest.java.ejs +17 -3
  314. package/generators/server/templates/src/test/java/package/security/oauth2/CustomClaimConverterIT.java.ejs +63 -0
  315. package/generators/server/templates/src/test/java/package/service/MailServiceIT.java.ejs +1 -1
  316. package/generators/server/templates/src/test/java/package/web/rest/AccountResourceIT.java.ejs +2 -3
  317. package/generators/server/templates/src/test/java/package/web/rest/ClientForwardControllerTest.java.ejs +9 -0
  318. package/generators/server/templates/src/test/resources/junit-platform.properties.ejs +2 -0
  319. package/generators/server/templates/src/test/resources/logback.xml.ejs +1 -1
  320. package/generators/server/templates/src/test/{features → resources/package/features}/gitkeep +0 -0
  321. package/generators/server/templates/src/test/{features → resources/package/features}/user/user.feature.ejs +0 -0
  322. package/generators/spring-controller/index.js +9 -7
  323. package/generators/spring-controller/templates/src/test/java/package/web/rest/ResourceIT.java.ejs +1 -1
  324. package/generators/spring-service/index.js +10 -7
  325. package/generators/upgrade/index.js +4 -5
  326. package/generators/utils.js +2 -2
  327. package/generators/workspaces/index.js +16 -7
  328. package/jdl/jhipster/default-application-options.js +9 -7
  329. package/package.json +22 -22
  330. package/utils/entity.js +17 -4
  331. package/utils/field.js +11 -1
  332. package/utils/multi-step-transform/index.js +8 -8
  333. package/generators/client/templates/react/.npmrc.ejs +0 -1
  334. package/generators/client/templates/vue/webpack/dev.env.js.ejs +0 -17
  335. package/generators/client/templates/vue/webpack/env.js.ejs +0 -67
  336. package/generators/client/templates/vue/webpack/loader.conf.js.ejs +0 -20
  337. package/generators/client/templates/vue/webpack/prod.env.js.ejs +0 -15
  338. package/generators/server/templates/src/main/java/package/config/apidocs/GatewaySwaggerResourcesProvider.java.ejs +0 -91
  339. package/generators/server/templates/src/test/java/package/config/apidocs/GatewaySwaggerResourcesProviderTest.java.ejs +0 -79
  340. package/generators/server/templates/src/test/resources/cucumber.properties.ejs +0 -1
@@ -0,0 +1,48 @@
1
+ <%#
2
+ Copyright 2013-2021 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ package <%= packageName %>.repository;
20
+
21
+ import java.util.ArrayList;
22
+ import java.util.List;
23
+ import org.springframework.data.relational.core.sql.Column;
24
+ import org.springframework.data.relational.core.sql.Expression;
25
+ import org.springframework.data.relational.core.sql.Table;
26
+
27
+ public class UserSqlHelper {
28
+ public static List<Expression> getColumns(Table table, String columnPrefix) {
29
+ List<Expression> columns = new ArrayList<>();
30
+ columns.add(Column.aliased("id", table, columnPrefix + "_id"));
31
+ columns.add(Column.aliased("login", table, columnPrefix + "_login"));
32
+ <%_ if (!authenticationTypeOauth2) { _%>
33
+ columns.add(Column.aliased("password_hash", table, columnPrefix + "_password"));
34
+ <%_ } _%>
35
+ columns.add(Column.aliased("first_name", table, columnPrefix + "_first_name"));
36
+ columns.add(Column.aliased("last_name", table, columnPrefix + "_last_name"));
37
+ columns.add(Column.aliased("email", table, columnPrefix + "_email"));
38
+ columns.add(Column.aliased("activated", table, columnPrefix + "_activated"));
39
+ columns.add(Column.aliased("lang_key", table, columnPrefix + "_lang_key"));
40
+ columns.add(Column.aliased("image_url", table, columnPrefix + "_image_url"));
41
+ <%_ if (!authenticationTypeOauth2) { _%>
42
+ columns.add(Column.aliased("activation_key", table, columnPrefix + "_activation_key"));
43
+ columns.add(Column.aliased("reset_key", table, columnPrefix + "_reset_key"));
44
+ columns.add(Column.aliased("reset_date", table, columnPrefix + "_reset_date"));
45
+ <%_ } _%>
46
+ return columns;
47
+ }
48
+ }
@@ -52,7 +52,7 @@ _%>
52
52
  <%_ } _%>
53
53
  <%_ if (databaseTypeCouchbase) { _%>
54
54
  - SPRING_COUCHBASE_CONNECTION_STRING=<%= baseName.toLowerCase() %>-couchbase
55
- - JHIPSTER_COUCHBASE_BUCKET_NAME=<%= baseName %>
55
+ - JHIPSTER_DATABASE_COUCHBASE_BUCKET_NAME=<%= baseName %>
56
56
  <%_ } _%>
57
57
  <%_ if (cacheProviderMemcached) { _%>
58
58
  - JHIPSTER_CACHE_MEMCACHED_SERVERS=<%= baseName.toLowerCase() %>-memcached:11211
@@ -321,7 +321,7 @@
321
321
  "security-admin-console": [],
322
322
  "web_app": [],
323
323
  "admin-cli": [],
324
- "account-console": [],<% if (serviceDiscoveryType === 'eureka') { %>
324
+ "account-console": [],<% if (serviceDiscoveryEureka) { %>
325
325
  "jhipster-registry": [],<% } %>
326
326
  "broker": [
327
327
  {
@@ -2491,7 +2491,7 @@
2491
2491
  "clientOfflineSessionIdleTimeout": "0",
2492
2492
  "cibaInterval": "5"
2493
2493
  },
2494
- "keycloakVersion": "15.0.2",
2494
+ "keycloakVersion": "16.1.0",
2495
2495
  "userManagedAccessAllowed": false,
2496
2496
  "clientProfiles": {
2497
2497
  "profiles": []
@@ -198,8 +198,9 @@ public class LocaleConfiguration {
198
198
  "'" + (timeZone != null ? " and time zone '" + timeZone.getID() + "'" : ""));
199
199
  }
200
200
  }
201
- exchange.getAttributes().put(LOCALE_REQUEST_ATTRIBUTE_NAME,
202
- locale != null ? locale : exchange.getLocaleContext().getLocale());
201
+ if (locale != null) {
202
+ exchange.getAttributes().put(LOCALE_REQUEST_ATTRIBUTE_NAME, locale);
203
+ }
203
204
  if (timeZone != null) {
204
205
  exchange.getAttributes().put(TIME_ZONE_REQUEST_ATTRIBUTE_NAME, timeZone);
205
206
  } else {
@@ -18,72 +18,35 @@
18
18
  -%>
19
19
  package <%= packageName %>.config;
20
20
 
21
- import tech.jhipster.config.JHipsterConstants;
22
- import tech.jhipster.config.JHipsterProperties;
23
- import tech.jhipster.config.apidoc.customizer.SpringfoxCustomizer;
21
+ import org.springdoc.core.GroupedOpenApi;
22
+ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
23
+
24
24
  import org.springframework.context.annotation.Bean;
25
25
  import org.springframework.context.annotation.Configuration;
26
26
  import org.springframework.context.annotation.Profile;
27
- import org.springframework.data.domain.Pageable;
28
- import org.springframework.http.ResponseEntity;
29
- import springfox.documentation.builders.RequestHandlerSelectors;
30
- import springfox.documentation.service.ApiInfo;
31
- import springfox.documentation.service.Contact;
32
- import springfox.documentation.spi.DocumentationType;
33
- import springfox.documentation.spring.web.plugins.Docket;
34
27
 
35
- import java.nio.ByteBuffer;
36
- import java.util.ArrayList;
37
- import java.util.Arrays;
38
- import java.util.HashSet;
39
-
40
- import static springfox.documentation.builders.PathSelectors.regex;
28
+ import tech.jhipster.config.JHipsterConstants;
29
+ import tech.jhipster.config.JHipsterProperties;
30
+ import tech.jhipster.config.apidoc.customizer.JHipsterOpenApiCustomizer;
41
31
 
42
32
  @Configuration
43
33
  @Profile(JHipsterConstants.SPRING_PROFILE_API_DOCS)
44
34
  public class OpenApiConfiguration {
45
35
 
46
- @Bean
47
- public SpringfoxCustomizer noApiFirstCustomizer() {
48
- return docket -> docket.select()
49
- .apis(RequestHandlerSelectors.basePackage("<%= packageName %>.web.api").negate());
50
- }
36
+ public static final String API_FIRST_PACKAGE = "<%= packageName %>.web.api";
51
37
 
52
38
  @Bean
53
- public Docket apiFirstDocket(JHipsterProperties jHipsterProperties) {
39
+ @ConditionalOnMissingBean(name = "apiFirstGroupedOpenAPI")
40
+ public GroupedOpenApi apiFirstGroupedOpenAPI(
41
+ JHipsterOpenApiCustomizer jhipsterOpenApiCustomizer,
42
+ JHipsterProperties jHipsterProperties
43
+ ) {
54
44
  JHipsterProperties.ApiDocs properties = jHipsterProperties.getApiDocs();
55
- Contact contact = new Contact(
56
- properties.getContactName(),
57
- properties.getContactUrl(),
58
- properties.getContactEmail()
59
- );
60
-
61
- ApiInfo apiInfo = new ApiInfo(
62
- "API First " + properties.getTitle(),
63
- properties.getDescription(),
64
- properties.getVersion(),
65
- properties.getTermsOfServiceUrl(),
66
- contact,
67
- properties.getLicense(),
68
- properties.getLicenseUrl(),
69
- new ArrayList<>()
70
- );
71
-
72
- return new Docket(DocumentationType.OAS_30)
73
- .groupName("openapi")
74
- .host(properties.getHost())
75
- .protocols(new HashSet<>(Arrays.asList(properties.getProtocols())))
76
- .apiInfo(apiInfo)
77
- .useDefaultResponseMessages(properties.isUseDefaultResponseMessages())
78
- .forCodeGeneration(true)
79
- .directModelSubstitute(ByteBuffer.class, String.class)
80
- .genericModelSubstitutes(ResponseEntity.class)
81
- .ignoredParameterTypes(Pageable.class)
82
- .select()
83
- .apis(RequestHandlerSelectors.basePackage("<%= packageName %>.web.api"))
84
- .paths(regex(properties.getDefaultIncludePattern()))
45
+ return GroupedOpenApi.builder()
46
+ .group("openapi")
47
+ .addOpenApiCustomiser(jhipsterOpenApiCustomizer)
48
+ .packagesToScan(API_FIRST_PACKAGE)
49
+ .pathsToMatch(properties.getDefaultIncludePattern())
85
50
  .build();
86
51
  }
87
-
88
-
89
52
  }
@@ -268,14 +268,14 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
268
268
  <%_ if (applicationTypeMonolith) { _%>
269
269
  .and()
270
270
  .httpBasic()
271
- <%_ } _%>
271
+ <%_ } _%>
272
272
  .and()
273
273
  .apply(securityConfigurerAdapter());
274
- <%_ } else if (authenticationTypeOauth2) { _%>
275
- <%_ if (applicationTypeMonolith) { _%>
274
+ <%_ } else if (authenticationTypeOauth2) { _%>
275
+ <%_ if (applicationTypeMonolith) { _%>
276
276
  .and()
277
277
  .oauth2Login()
278
- <%_ } _%>
278
+ <%_ } _%>
279
279
  .and()
280
280
  .oauth2ResourceServer()
281
281
  .jwt()
@@ -283,7 +283,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
283
283
  .and()
284
284
  .and()
285
285
  .oauth2Client();
286
- <%_ } _%>
286
+ <%_ } _%>
287
287
  // @formatter:on
288
288
  }
289
289
  <%_ if (authenticationTypeJwt) { _%>
@@ -211,7 +211,7 @@ public class SecurityConfiguration {
211
211
  // @formatter:off
212
212
  http
213
213
  .securityMatcher(new NegatedServerWebExchangeMatcher(new OrServerWebExchangeMatcher(
214
- pathMatchers("/app/**", "/i18n/**", "/content/**", "/swagger-ui/**", "/swagger-resources/**", "/v2/api-docs", "/v3/api-docs", "/test/**"),
214
+ pathMatchers("/app/**", "/i18n/**", "/content/**", "/swagger-ui/**", "/v3/api-docs/**", "/test/**"),
215
215
  pathMatchers(HttpMethod.OPTIONS, "/**")
216
216
  )))
217
217
  .csrf()
@@ -278,11 +278,9 @@ public class SecurityConfiguration {
278
278
  .pathMatchers("/api/admin/**").hasAuthority(AuthoritiesConstants.ADMIN)
279
279
  .pathMatchers("/api/**").authenticated()
280
280
  <%_ if (applicationTypeGateway) { _%>
281
- <%_ if (microfrontend && authenticationTypeJwt) { _%>
282
- // microfrontend resources are loaded by webpack without a bearer-token, they need to be public
281
+ // microfrontend resources are loaded by webpack without authentication, they need to be public
283
282
  .pathMatchers("/services/*/*.js").permitAll()
284
283
  .pathMatchers("/services/*/*.js.map").permitAll()
285
- <%_ } _%>
286
284
  .pathMatchers("/services/*/v3/api-docs").hasAuthority(AuthoritiesConstants.ADMIN)
287
285
  <%_ } _%>
288
286
  <%_ if (applicationTypeMonolith || applicationTypeGateway) { _%>
@@ -308,7 +306,7 @@ public class SecurityConfiguration {
308
306
  }
309
307
  <%_ if (authenticationTypeOauth2) { _%>
310
308
 
311
- <%_ if (applicationType === 'gateway') { _%>
309
+ <%_ if (applicationTypeGateway) { _%>
312
310
  private ServerOAuth2AuthorizationRequestResolver authorizationRequestResolver(
313
311
  ReactiveClientRegistrationRepository clientRegistrationRepository) {
314
312
  DefaultServerOAuth2AuthorizationRequestResolver authorizationRequestResolver =
@@ -325,7 +323,7 @@ public class SecurityConfiguration {
325
323
  uriBuilder.queryParam("audience", jHipsterProperties.getSecurity().getOauth2().getAudience())
326
324
  .build());
327
325
  }
328
- <%_ } _%>
326
+ <%_ } _%>
329
327
 
330
328
  Converter<Jwt, Mono<AbstractAuthenticationToken>> jwtAuthenticationConverter() {
331
329
  JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
@@ -79,7 +79,6 @@ import javax.servlet.*;
79
79
  import java.io.File;
80
80
  import java.nio.charset.StandardCharsets;
81
81
  import java.nio.file.Paths;
82
- import java.util.*;
83
82
 
84
83
  import static java.net.URLDecoder.decode;
85
84
  <%_ } _%>
@@ -184,9 +183,7 @@ public class WebConfigurer implements <% if (!reactive) { %>ServletContextInitia
184
183
  log.debug("Registering CORS filter");
185
184
  source.registerCorsConfiguration("/api/**", config);
186
185
  source.registerCorsConfiguration("/management/**", config);
187
- source.registerCorsConfiguration("/v2/api-docs", config);
188
186
  source.registerCorsConfiguration("/v3/api-docs", config);
189
- source.registerCorsConfiguration("/swagger-resources", config);
190
187
  source.registerCorsConfiguration("/swagger-ui/**", config);
191
188
  <%_ if (applicationTypeGateway) { _%>
192
189
  source.registerCorsConfiguration("/*/api/**", config);
@@ -20,6 +20,7 @@ package <%= packageName %>.config.neo4j;
20
20
 
21
21
  import ac.simons.neo4j.migrations.core.JavaBasedMigration;
22
22
  import ac.simons.neo4j.migrations.core.MigrationContext;
23
+ import ac.simons.neo4j.migrations.core.MigrationsException;
23
24
 
24
25
  import java.io.IOException;
25
26
  import java.util.List;
@@ -46,11 +47,16 @@ final class Neo4jMigrations {
46
47
  static class V0001__CreateUsers implements JavaBasedMigration {
47
48
 
48
49
  @Override
49
- public void apply(MigrationContext context) throws IOException {
50
+ public void apply(MigrationContext context) {
50
51
 
51
52
  ObjectMapper om = new ObjectMapper();
52
53
  ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
53
- Resource[] resources = resourcePatternResolver.getResources("classpath:config/neo4j/migrations/user__*.json");
54
+ Resource[] resources;
55
+ try {
56
+ resources = resourcePatternResolver.getResources("classpath:config/neo4j/migrations/user__*.json");
57
+ } catch (IOException e) {
58
+ throw new MigrationsException("Could not load user definition resources.", e);
59
+ }
54
60
 
55
61
  JavaType type = om.getTypeFactory().
56
62
  constructMapType(Map.class, String.class, Object.class);
@@ -69,13 +75,17 @@ final class Neo4jMigrations {
69
75
  try (Session session = context.getSession()) {
70
76
 
71
77
  for (Resource resource : resources) {
72
- Map<String, Object> user = om.readValue(resource.getInputStream(), type);
73
- user.put("user_id", UUID.randomUUID().toString());
74
- List<String> authorities = (List<String>) user.remove("authorities");
75
- user.remove("_class");
76
-
77
- session.writeTransaction(
78
- t -> t.run(query, Values.parameters("user", user, "authorities", authorities)).consume());
78
+ try {
79
+ Map<String, Object> user = om.readValue(resource.getInputStream(), type);
80
+ user.put("user_id", UUID.randomUUID().toString());
81
+ List<String> authorities = (List<String>) user.remove("authorities");
82
+ user.remove("_class");
83
+
84
+ session.writeTransaction(
85
+ t -> t.run(query, Values.parameters("user", user, "authorities", authorities)).consume());
86
+ } catch (IOException e) {
87
+ throw new MigrationsException("Could not load resource " + resource.getDescription() + ".", e);
88
+ }
79
89
  }
80
90
  }
81
91
  }
@@ -0,0 +1,68 @@
1
+ <%#
2
+ Copyright 2013-2021 the original author or authors from the JHipster project.
3
+
4
+ This file is part of the JHipster project, see https://www.jhipster.tech/
5
+ for more information.
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ https://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ -%>
19
+ package <%= packageName %>.management;
20
+
21
+ import org.springframework.stereotype.Service;
22
+
23
+ import io.micrometer.core.instrument.Counter;
24
+ import io.micrometer.core.instrument.MeterRegistry;
25
+
26
+ @Service
27
+ public class SecurityMetersService {
28
+
29
+ public static final String INVALID_TOKENS_METER_NAME = "security.authentication.invalid-tokens";
30
+ public static final String INVALID_TOKENS_METER_DESCRIPTION = "Indicates validation error count of the tokens presented by the clients.";
31
+ public static final String INVALID_TOKENS_METER_BASE_UNIT = "errors";
32
+ public static final String INVALID_TOKENS_METER_CAUSE_DIMENSION = "cause";
33
+
34
+ private final Counter tokenInvalidSignatureCounter;
35
+ private final Counter tokenExpiredCounter;
36
+ private final Counter tokenUnsupportedCounter;
37
+ private final Counter tokenMalformedCounter;
38
+
39
+ public SecurityMetersService(MeterRegistry registry) {
40
+ this.tokenInvalidSignatureCounter = invalidTokensCounterForCauseBuilder("invalid-signature").register(registry);
41
+ this.tokenExpiredCounter = invalidTokensCounterForCauseBuilder("expired").register(registry);
42
+ this.tokenUnsupportedCounter = invalidTokensCounterForCauseBuilder("unsupported").register(registry);
43
+ this.tokenMalformedCounter = invalidTokensCounterForCauseBuilder("malformed").register(registry);
44
+ }
45
+
46
+ private Counter.Builder invalidTokensCounterForCauseBuilder(String cause) {
47
+ return Counter.builder(INVALID_TOKENS_METER_NAME)
48
+ .baseUnit(INVALID_TOKENS_METER_BASE_UNIT)
49
+ .description(INVALID_TOKENS_METER_DESCRIPTION)
50
+ .tag(INVALID_TOKENS_METER_CAUSE_DIMENSION, cause);
51
+ }
52
+
53
+ public void trackTokenInvalidSignature() {
54
+ this.tokenInvalidSignatureCounter.increment();
55
+ }
56
+
57
+ public void trackTokenExpired() {
58
+ this.tokenExpiredCounter.increment();
59
+ }
60
+
61
+ public void trackTokenUnsupported() {
62
+ this.tokenUnsupportedCounter.increment();
63
+ }
64
+
65
+ public void trackTokenMalformed() {
66
+ this.tokenMalformedCounter.increment();
67
+ }
68
+ }
@@ -77,12 +77,12 @@ _%>
77
77
  public interface AuthorityRepository extends <% if (databaseTypeSql) { %><% if (reactive) { %>R2dbc<% } else { %>Jpa<% } %>Repository<% } else { %><% if (reactive && !databaseTypeCouchbase) { %>Reactive<% } %><% if (databaseTypeMongodb) { %>MongoRepository<% } %><% if (databaseTypeNeo4j) { %>Neo4jRepository<% } %><% if (databaseTypeCouchbase) { %>JHipsterCouchbaseRepository<% } %><% } %><Authority, String> {
78
78
  <%_ if (databaseTypeNeo4j) { _%>
79
79
  <% if (!reactive) { %>// See https://github.com/neo4j/sdn-rx/issues/51<%_ } _%>
80
- <% if (reactive) { %>Flux<% } else { %>List<% } %><<%= asEntity('Authority') %>> findAll();
80
+ <% if (reactive) { %>Flux<% } else { %>List<% } %><Authority> findAll();
81
81
  <%_ } _%>
82
82
  <%_ if (databaseTypeCouchbase) { _%>
83
83
  @Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}")
84
84
  @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
85
- <%= listOrFlux %><<%= asEntity('Authority') %>> findAll();
85
+ <%= listOrFlux %><Authority> findAll();
86
86
  <%_ } _%>
87
87
 
88
88
  }
@@ -224,9 +224,7 @@ public interface UserRepository extends <% if (databaseTypeSql) { %>JpaRepositor
224
224
  <%_ if (cacheManagerIsAvailable) { _%>
225
225
  @Cacheable(cacheNames = USERS_BY_LOGIN_CACHE)
226
226
  <%_ } _%>
227
- <%_ if (databaseTypeCouchbase) { _%>
228
227
  @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
229
- <%_ } _%>
230
228
  default <%= optionalOrMono %><<%= asEntity('User') %>> findOneByLogin(String login) {
231
229
  return findById(<%= asEntity('User') %>.PREFIX + ID_DELIMITER + login);
232
230
  }
@@ -464,29 +462,6 @@ class UserRepositoryInternalImpl implements UserRepositoryInternal {
464
462
  }
465
463
  }
466
464
 
467
- class UserSqlHelper {
468
- static List<Expression> getColumns(Table table, String columnPrefix) {
469
- List<Expression> columns = new ArrayList<>();
470
- columns.add(Column.aliased("id", table, columnPrefix + "_id"));
471
- columns.add(Column.aliased("login", table, columnPrefix + "_login"));
472
- <%_ if (!authenticationTypeOauth2) { _%>
473
- columns.add(Column.aliased("password_hash", table, columnPrefix + "_password"));
474
- <%_ } _%>
475
- columns.add(Column.aliased("first_name", table, columnPrefix + "_first_name"));
476
- columns.add(Column.aliased("last_name", table, columnPrefix + "_last_name"));
477
- columns.add(Column.aliased("email", table, columnPrefix + "_email"));
478
- columns.add(Column.aliased("activated", table, columnPrefix + "_activated"));
479
- columns.add(Column.aliased("lang_key", table, columnPrefix + "_lang_key"));
480
- columns.add(Column.aliased("image_url", table, columnPrefix + "_image_url"));
481
- <%_ if (!authenticationTypeOauth2) { _%>
482
- columns.add(Column.aliased("activation_key", table, columnPrefix + "_activation_key"));
483
- columns.add(Column.aliased("reset_key", table, columnPrefix + "_reset_key"));
484
- columns.add(Column.aliased("reset_date", table, columnPrefix + "_reset_date"));
485
- <%_ } _%>
486
- return columns;
487
- }
488
- }
489
-
490
465
  <%_ } else if (databaseTypeCassandra) { _%>
491
466
  @Repository
492
467
  public class UserRepository {
@@ -34,13 +34,17 @@ import org.springframework.stereotype.Component;
34
34
  import org.springframework.util.ObjectUtils;
35
35
 
36
36
  import tech.jhipster.config.JHipsterProperties;
37
+
37
38
  import io.jsonwebtoken.*;
38
39
  import io.jsonwebtoken.io.Decoders;
40
+ import io.jsonwebtoken.security.SignatureException;
39
41
  <%_ if (reactive) { _%>
40
42
  import io.jsonwebtoken.jackson.io.JacksonSerializer;
41
43
  <%_ } _%>
42
44
  import io.jsonwebtoken.security.Keys;
43
45
 
46
+ import <%= packageName %>.management.SecurityMetersService;
47
+
44
48
  @Component
45
49
  public class TokenProvider {
46
50
 
@@ -48,6 +52,8 @@ public class TokenProvider {
48
52
 
49
53
  private static final String AUTHORITIES_KEY = "auth";
50
54
 
55
+ private static final String INVALID_JWT_TOKEN = "Invalid JWT token.";
56
+
51
57
  private final Key key;
52
58
 
53
59
  private final JwtParser jwtParser;
@@ -56,7 +62,9 @@ public class TokenProvider {
56
62
 
57
63
  private final long tokenValidityInMillisecondsForRememberMe;
58
64
 
59
- public TokenProvider(JHipsterProperties jHipsterProperties) {
65
+ private final SecurityMetersService securityMetersService;
66
+
67
+ public TokenProvider(JHipsterProperties jHipsterProperties, SecurityMetersService securityMetersService) {
60
68
  byte[] keyBytes;
61
69
  String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret();
62
70
  if (!ObjectUtils.isEmpty(secret)) {
@@ -75,6 +83,8 @@ public class TokenProvider {
75
83
  this.tokenValidityInMillisecondsForRememberMe =
76
84
  1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
77
85
  .getTokenValidityInSecondsForRememberMe();
86
+
87
+ this.securityMetersService = securityMetersService;
78
88
  }
79
89
 
80
90
  public String createToken(Authentication authentication, boolean rememberMe) {
@@ -118,11 +128,28 @@ public class TokenProvider {
118
128
  public boolean validateToken(String authToken) {
119
129
  try {
120
130
  jwtParser.parseClaimsJws(authToken);
131
+
121
132
  return true;
122
- } catch (JwtException | IllegalArgumentException e) {
123
- log.info("Invalid JWT token.");
124
- log.trace("Invalid JWT token trace.", e);
133
+ } catch (ExpiredJwtException e) {
134
+ this.securityMetersService.trackTokenExpired();
135
+
136
+ log.trace(INVALID_JWT_TOKEN, e);
137
+ } catch (UnsupportedJwtException e) {
138
+ this.securityMetersService.trackTokenUnsupported();
139
+
140
+ log.trace(INVALID_JWT_TOKEN, e);
141
+ } catch (MalformedJwtException e) {
142
+ this.securityMetersService.trackTokenMalformed();
143
+
144
+ log.trace(INVALID_JWT_TOKEN, e);
145
+ } catch (SignatureException e) {
146
+ this.securityMetersService.trackTokenInvalidSignature();
147
+
148
+ log.trace(INVALID_JWT_TOKEN, e);
149
+ } catch (IllegalArgumentException e) { // TODO: should we let it bubble (no catch), to avoid defensive programming and follow the fail-fast principle?
150
+ log.error("Token validation error {}", e.getMessage());
125
151
  }
152
+
126
153
  return false;
127
154
  }
128
155
  }
@@ -34,10 +34,11 @@ import org.springframework.web.client.RestTemplate;
34
34
  import org.springframework.web.context.request.RequestContextHolder;
35
35
  import org.springframework.web.context.request.ServletRequestAttributes;
36
36
 
37
+ import java.util.Arrays;
37
38
  import java.util.Collections;
38
- import java.util.HashMap;
39
39
  import java.util.List;
40
40
  import java.util.Map;
41
+ import java.util.concurrent.ConcurrentHashMap;
41
42
  import java.util.stream.Collectors;
42
43
  import java.util.stream.StreamSupport;
43
44
 
@@ -53,7 +54,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
53
54
 
54
55
  private final ClientRegistration registration;
55
56
 
56
- private final Map<String, ObjectNode> users = new HashMap<>();
57
+ private final Map<String, ObjectNode> users = new ConcurrentHashMap<>();
57
58
 
58
59
  public CustomClaimConverter(ClientRegistration registration, RestTemplate restTemplate) {
59
60
  this.registration = registration;
@@ -62,7 +63,7 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
62
63
 
63
64
  public Map<String, Object> convert(Map<String, Object> claims) {
64
65
  Map<String, Object> convertedClaims = this.delegate.convert(claims);
65
- if (RequestContextHolder.getRequestAttributes() != null) {
66
+ if (RequestContextHolder.getRequestAttributes() != null && ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) != null) {
66
67
  // Retrieve and set the token
67
68
  String token = bearerTokenResolver.resolve(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest());
68
69
  HttpHeaders headers = new HttpHeaders();
@@ -83,20 +84,31 @@ public class CustomClaimConverter implements Converter<Map<String, Object>, Map<
83
84
  if (user.has("family_name")) {
84
85
  convertedClaims.put("family_name", user.get("family_name").asText());
85
86
  }
87
+ if (user.has("email")) {
88
+ convertedClaims.put("email", user.get("email").asText());
89
+ }
90
+ // Allow full name in a name claim - happens with Auth0
91
+ if (user.has("name")) {
92
+ String[] name = user.get("name").asText().split("\\s+");
93
+ if (name.length > 0) {
94
+ convertedClaims.put("given_name", name[0]);
95
+ convertedClaims.put("family_name",
96
+ String.join(" ", Arrays.copyOfRange(name, 1, name.length)));
97
+ }
98
+ }
86
99
  if (user.has("groups")) {
87
100
  List<String> groups = StreamSupport.stream(user.get("groups").spliterator(), false)
88
101
  .map(JsonNode::asText)
89
102
  .collect(Collectors.toList());
90
103
  convertedClaims.put("groups", groups);
91
104
  }
92
- }
93
-
94
- if (user.has(SecurityUtils.CLAIMS_NAMESPACE + "roles")) {
95
- List<String> roles = StreamSupport
96
- .stream(user.get(SecurityUtils.CLAIMS_NAMESPACE + "roles").spliterator(), false)
97
- .map(JsonNode::asText)
98
- .collect(Collectors.toList());
99
- convertedClaims.put("roles", roles);
105
+ if (user.has(SecurityUtils.CLAIMS_NAMESPACE + "roles")) {
106
+ List<String> roles = StreamSupport
107
+ .stream(user.get(SecurityUtils.CLAIMS_NAMESPACE + "roles").spliterator(), false)
108
+ .map(JsonNode::asText)
109
+ .collect(Collectors.toList());
110
+ convertedClaims.put("roles", roles);
111
+ }
100
112
  }
101
113
  }
102
114
  return convertedClaims;