underpost 2.7.1 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/.dockerignore +13 -13
  2. package/.env.development +7 -7
  3. package/.env.production +7 -7
  4. package/.env.test +7 -7
  5. package/.github/workflows/publish.yml +26 -0
  6. package/.nycrc +9 -9
  7. package/.prettierignore +12 -12
  8. package/.prettierrc +9 -9
  9. package/.vscode/extensions.json +72 -72
  10. package/.vscode/settings.json +100 -99
  11. package/Dockerfile +89 -89
  12. package/LICENSE +21 -21
  13. package/README.md +96 -96
  14. package/bin/db.js +172 -119
  15. package/bin/deploy.js +582 -661
  16. package/bin/dns.js +1 -1
  17. package/bin/file.js +92 -92
  18. package/bin/index.js +53 -53
  19. package/bin/install.js +398 -357
  20. package/bin/shortcut.js +44 -44
  21. package/bin/ssl.js +65 -64
  22. package/bin/util.js +182 -182
  23. package/bin/vs.js +35 -35
  24. package/conf.js +251 -249
  25. package/docker-compose.yml +67 -67
  26. package/jsconfig.json +7 -7
  27. package/jsdoc.json +32 -32
  28. package/nodemon.json +6 -6
  29. package/package.json +137 -132
  30. package/prometheus.yml +36 -36
  31. package/setup.sh +24 -24
  32. package/src/api/core/core.controller.js +69 -69
  33. package/src/api/core/core.model.js +11 -11
  34. package/src/api/core/core.router.js +23 -23
  35. package/src/api/core/core.service.js +29 -29
  36. package/src/api/crypto/crypto.controller.js +51 -51
  37. package/src/api/crypto/crypto.model.js +23 -23
  38. package/src/api/crypto/crypto.router.js +20 -20
  39. package/src/api/crypto/crypto.service.js +64 -64
  40. package/src/api/default/default.controller.js +69 -69
  41. package/src/api/default/default.model.js +20 -20
  42. package/src/api/default/default.router.js +23 -23
  43. package/src/api/default/default.service.js +31 -31
  44. package/src/api/file/file.controller.js +53 -51
  45. package/src/api/file/file.model.js +19 -19
  46. package/src/api/file/file.router.js +21 -20
  47. package/src/api/file/file.service.js +76 -70
  48. package/src/api/instance/instance.controller.js +69 -69
  49. package/src/api/instance/instance.model.js +36 -36
  50. package/src/api/instance/instance.router.js +33 -33
  51. package/src/api/instance/instance.service.js +48 -48
  52. package/src/api/test/test.controller.js +59 -59
  53. package/src/api/test/test.model.js +14 -14
  54. package/src/api/test/test.router.js +21 -21
  55. package/src/api/test/test.service.js +35 -35
  56. package/src/api/user/user.build.js +16 -0
  57. package/src/api/user/user.controller.js +70 -70
  58. package/src/api/user/user.model.js +65 -65
  59. package/src/api/user/user.router.js +345 -345
  60. package/src/api/user/user.service.js +479 -479
  61. package/src/api.js +23 -23
  62. package/src/client/Default.index.js +40 -40
  63. package/src/client/components/core/Account.js +290 -290
  64. package/src/client/components/core/AgGrid.js +160 -160
  65. package/src/client/components/core/Auth.js +19 -19
  66. package/src/client/components/core/Badge.js +32 -32
  67. package/src/client/components/core/BlockChain.js +41 -41
  68. package/src/client/components/core/Blog.js +9 -9
  69. package/src/client/components/core/BtnIcon.js +101 -94
  70. package/src/client/components/core/CalendarCore.js +458 -319
  71. package/src/client/components/core/Chat.js +64 -64
  72. package/src/client/components/core/ColorPalette.js +5267 -5267
  73. package/src/client/components/core/CommonJs.js +735 -732
  74. package/src/client/components/core/Content.js +193 -49
  75. package/src/client/components/core/Css.js +1064 -1027
  76. package/src/client/components/core/CssCore.js +817 -796
  77. package/src/client/components/core/D3Chart.js +44 -44
  78. package/src/client/components/core/Docs.js +229 -229
  79. package/src/client/components/core/DropDown.js +164 -164
  80. package/src/client/components/core/EventsUI.js +46 -54
  81. package/src/client/components/core/FileExplorer.js +699 -624
  82. package/src/client/components/core/FullScreen.js +45 -45
  83. package/src/client/components/core/Input.js +346 -259
  84. package/src/client/components/core/JoyStick.js +77 -77
  85. package/src/client/components/core/Keyboard.js +73 -73
  86. package/src/client/components/core/LoadingAnimation.js +179 -157
  87. package/src/client/components/core/LogIn.js +187 -181
  88. package/src/client/components/core/LogOut.js +58 -52
  89. package/src/client/components/core/Logger.js +26 -26
  90. package/src/client/components/core/Modal.js +1612 -1596
  91. package/src/client/components/core/NotificationManager.js +84 -84
  92. package/src/client/components/core/Panel.js +613 -413
  93. package/src/client/components/core/PanelForm.js +468 -0
  94. package/src/client/components/core/Polyhedron.js +162 -162
  95. package/src/client/components/core/Recover.js +204 -204
  96. package/src/client/components/core/Responsive.js +53 -53
  97. package/src/client/components/core/RichText.js +51 -27
  98. package/src/client/components/core/Router.js +76 -77
  99. package/src/client/components/core/Scroll.js +34 -0
  100. package/src/client/components/core/SignUp.js +125 -125
  101. package/src/client/components/core/SocketIo.js +72 -72
  102. package/src/client/components/core/Stream.js +113 -113
  103. package/src/client/components/core/ToggleSwitch.js +87 -87
  104. package/src/client/components/core/ToolTip.js +26 -26
  105. package/src/client/components/core/Translate.js +437 -408
  106. package/src/client/components/core/Validator.js +100 -100
  107. package/src/client/components/core/VanillaJs.js +460 -457
  108. package/src/client/components/core/Wallet.js +106 -106
  109. package/src/client/components/core/Webhook.js +25 -25
  110. package/src/client/components/core/Worker.js +272 -272
  111. package/src/client/components/default/CommonDefault.js +29 -29
  112. package/src/client/components/default/CssDefault.js +13 -13
  113. package/src/client/components/default/ElementsDefault.js +38 -38
  114. package/src/client/components/default/LogInDefault.js +41 -41
  115. package/src/client/components/default/LogOutDefault.js +28 -28
  116. package/src/client/components/default/MenuDefault.js +389 -389
  117. package/src/client/components/default/RoutesDefault.js +48 -48
  118. package/src/client/components/default/SettingsDefault.js +16 -16
  119. package/src/client/components/default/SignUpDefault.js +9 -9
  120. package/src/client/components/default/SocketIoDefault.js +54 -54
  121. package/src/client/components/default/TranslateDefault.js +7 -7
  122. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  123. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  124. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  125. package/src/client/public/default/browserconfig.xml +11 -11
  126. package/src/client/public/default/manifest.webmanifest +68 -68
  127. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  128. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  129. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  130. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  131. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  132. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  133. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  134. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  135. package/src/client/public/default/sitemap +147 -147
  136. package/src/client/public/default/yandex-browser-manifest.json +8 -8
  137. package/src/client/public/doc/sitemap +147 -147
  138. package/src/client/public/test/sitemap +147 -147
  139. package/src/client/services/core/core.service.js +170 -152
  140. package/src/client/services/crypto/crypto.service.js +70 -70
  141. package/src/client/services/default/default.management.js +345 -345
  142. package/src/client/services/default/default.service.js +89 -89
  143. package/src/client/services/file/file.service.js +70 -70
  144. package/src/client/services/instance/instance.management.js +74 -74
  145. package/src/client/services/instance/instance.service.js +89 -89
  146. package/src/client/services/test/test.service.js +70 -70
  147. package/src/client/services/user/user.management.js +50 -50
  148. package/src/client/services/user/user.service.js +89 -89
  149. package/src/client/ssr/Render.js +16 -16
  150. package/src/client/ssr/body-components/CacheControl.js +114 -113
  151. package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -79
  152. package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -21
  153. package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -17
  154. package/src/client/ssr/head-components/Css.js +241 -241
  155. package/src/client/ssr/head-components/DefaultScripts.js +3 -3
  156. package/src/client/ssr/head-components/Microdata.js +11 -11
  157. package/src/client/ssr/head-components/Production.js +1 -1
  158. package/src/client/ssr/head-components/PwaDefault.js +59 -59
  159. package/src/client/ssr/head-components/Seo.js +14 -14
  160. package/src/client/sw/default.sw.js +201 -201
  161. package/src/client/sw/template.sw.js +84 -84
  162. package/src/client.build.js +22 -22
  163. package/src/client.dev.js +21 -21
  164. package/src/cron.js +25 -25
  165. package/src/db/DataBaseProvider.js +34 -34
  166. package/src/db/mariadb/MariaDB.js +33 -33
  167. package/src/db/mongo/MongooseDB.js +46 -46
  168. package/src/dns.js +22 -22
  169. package/src/index.js +42 -29
  170. package/src/mailer/EmailRender.js +69 -69
  171. package/src/mailer/MailerProvider.js +96 -96
  172. package/src/proxy.js +22 -22
  173. package/src/runtime/lampp/Lampp.js +69 -44
  174. package/src/runtime/nginx/Nginx.js +3 -3
  175. package/src/runtime/xampp/Xampp.js +49 -49
  176. package/src/server/auth.js +235 -204
  177. package/src/server/backup.js +101 -94
  178. package/src/server/client-build-live.js +72 -72
  179. package/src/server/client-build.js +705 -699
  180. package/src/server/client-dev-server.js +60 -58
  181. package/src/server/client-formatted.js +48 -48
  182. package/src/server/client-icons.js +149 -150
  183. package/src/server/conf.js +860 -611
  184. package/src/server/dns.js +98 -98
  185. package/src/server/downloader.js +42 -42
  186. package/src/server/logger.js +180 -180
  187. package/src/server/network.js +122 -122
  188. package/src/server/peer.js +33 -33
  189. package/src/server/process.js +66 -66
  190. package/src/server/prompt-optimizer.js +28 -28
  191. package/src/server/proxy.js +118 -118
  192. package/src/server/runtime.js +444 -393
  193. package/src/server/ssl.js +109 -107
  194. package/src/server.js +25 -25
  195. package/src/ws/IoInterface.js +45 -45
  196. package/src/ws/IoServer.js +39 -39
  197. package/src/ws/core/channels/core.ws.chat.js +23 -23
  198. package/src/ws/core/channels/core.ws.mailer.js +35 -35
  199. package/src/ws/core/channels/core.ws.stream.js +31 -31
  200. package/src/ws/core/core.ws.connection.js +28 -28
  201. package/src/ws/core/core.ws.emit.js +14 -14
  202. package/src/ws/core/core.ws.server.js +24 -24
  203. package/src/ws/core/management/core.ws.chat.js +8 -8
  204. package/src/ws/core/management/core.ws.mailer.js +16 -16
  205. package/src/ws/core/management/core.ws.stream.js +8 -8
  206. package/src/ws/default/channels/default.ws.main.js +16 -16
  207. package/src/ws/default/default.ws.connection.js +22 -22
  208. package/src/ws/default/default.ws.emit.js +14 -14
  209. package/src/ws/default/default.ws.server.js +20 -20
  210. package/src/ws/default/management/default.ws.main.js +8 -8
  211. package/startup.js +11 -11
  212. package/supervisord-openssh-server.conf +4 -4
  213. package/test/api.test.js +60 -60
@@ -1,204 +1,235 @@
1
- /**
2
- * Module for managing identity and authorization
3
- * @module src/server/auth.js
4
- * @namespace Auth
5
- */
6
-
7
- import dotenv from 'dotenv';
8
- import jwt from 'jsonwebtoken';
9
- import { loggerFactory } from './logger.js';
10
- import crypto from 'crypto';
11
- import { userRoleEnum } from '../api/user/user.model.js';
12
- import { validatePassword } from '../client/components/core/CommonJs.js';
13
-
14
- dotenv.config();
15
-
16
- const logger = loggerFactory(import.meta);
17
-
18
- /* The `const config` object is defining parameters related to the hashing process used for password
19
- security. Here's a breakdown of each property in the `config` object: */
20
- const config = {
21
- hashBytes: 32,
22
- saltBytes: 16,
23
- iterations: 872791,
24
- digest: 'sha512',
25
- };
26
-
27
- /**
28
- * @param {String} password - given password to hash
29
- * @returns {String} the hash corresponding to the password
30
- * @memberof Auth
31
- */
32
- function hashPassword(password) {
33
- const { iterations, hashBytes, digest, saltBytes } = config;
34
- const salt = crypto.randomBytes(saltBytes).toString('hex');
35
- const hash = crypto.pbkdf2Sync(password, salt, iterations, hashBytes, digest).toString('hex');
36
- return [salt, hash].join('$');
37
- }
38
-
39
- /**
40
- * @param {String} password - password to verify
41
- * @param {String} combined - a combined salt + hash returned by hashPassword function
42
- * @returns {Boolean} true if password correspond to the hash. False otherwise
43
- * @memberof Auth
44
- */
45
- function verifyPassword(password, combined) {
46
- const { iterations, hashBytes, digest } = config;
47
- const [salt, originalHash] = combined.split('$');
48
- const hash = crypto.pbkdf2Sync(password, salt, iterations, hashBytes, digest).toString('hex');
49
- return hash === originalHash;
50
- }
51
-
52
- // jwt middleware
53
-
54
- /**
55
- * The hashJWT function generates a JSON Web Token (JWT) with a specified payload and expiration time.
56
- * @param payload - The `payload` parameter in the `hashJWT` function is the data that you want to
57
- * encode into the JSON Web Token (JWT). It typically contains information about the user or any other
58
- * relevant data that you want to securely transmit.
59
- * @param expire - The `expire` parameter in the `hashJWT` function is used to specify the expiration
60
- * time for the JSON Web Token (JWT) being generated. If a value is provided for `expire`, it will be
61
- * used as the expiration time. If `expire` is not provided (i.e., it
62
- * @memberof Auth
63
- */
64
- const hashJWT = (payload, expire) =>
65
- jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: expire !== undefined ? expire : `${process.env.EXPIRE}h` });
66
-
67
- /**
68
- * The function `verifyJWT` is used to verify a JSON Web Token (JWT) using a secret key stored in the
69
- * environment variables.
70
- * @param token - The `token` parameter is a JSON Web Token (JWT) that is passed to the `verifyJWT`
71
- * function for verification.
72
- * @memberof Auth
73
- */
74
- const verifyJWT = (token = '') => jwt.verify(token, process.env.JWT_SECRET);
75
-
76
- /**
77
- * The authMiddleware function checks and verifies the authorization token in the request headers
78
- * before allowing access to protected routes.
79
- * @param req - The `req` parameter in the `authMiddleware` function stands for the request object. It
80
- * contains information about the HTTP request made to the server, including headers, body, parameters,
81
- * and more. In this context, the function is extracting the authorization token from the request
82
- * headers to authenticate the user.
83
- * @param res - The `res` parameter in the `authMiddleware` function is the response object that
84
- * represents the HTTP response that an Express.js server sends when it receives an HTTP request. It is
85
- * used to send a response back to the client with status codes, headers, and data.
86
- * @param next - The `next` parameter in the `authMiddleware` function is a callback function that is
87
- * used to pass control to the next middleware function in the stack. When called, it invokes the next
88
- * middleware function in the chain. This is a common pattern in Express.js middleware functions to
89
- * move to the next middleware
90
- * @returns {Object} The `req.auth` included JWT payload in request authorization
91
- * @memberof Auth
92
- */
93
- const authMiddleware = (req, res, next) => {
94
- try {
95
- const authHeader = String(req.headers['authorization'] || req.headers['Authorization'] || '');
96
- if (authHeader.startsWith('Bearer ')) {
97
- const token = authHeader.substring(7, authHeader.length);
98
- const payload = verifyJWT(token);
99
- req.auth = payload;
100
- return next();
101
- }
102
- return res.status(401).json({
103
- status: 'error',
104
- message: 'unauthorized: invalid token',
105
- });
106
- } catch (error) {
107
- logger.error(error, error.stack);
108
- return res.status(400).json({
109
- status: 'error',
110
- message: error.message,
111
- });
112
- }
113
- };
114
-
115
- /**
116
- * The `adminGuard` function checks if the user has admin role permission and returns an error message
117
- * if not.
118
- * @param req - The `req` parameter typically represents the HTTP request object in Node.js. It
119
- * contains information about the incoming request such as the request headers, parameters, body, and
120
- * more. In the context of your `adminGuard` function, `req` is the request object that is being passed
121
- * to the middleware
122
- * @param res - The `res` parameter in the `adminGuard` function is the response object in Express.js.
123
- * It is used to send a response back to the client making the HTTP request.
124
- * @param next - The `next` parameter in the `adminGuard` function is a callback function that is used
125
- * to pass control to the next middleware function in the stack. When called, it executes the next
126
- * middleware function. If there are no more middleware functions in the stack, it will proceed to the
127
- * route handler.
128
- * @returns The `adminGuard` function is returning either a 403 status with an error message if the
129
- * user role is not 'admin', or it is calling the `next()` function to proceed to the next middleware
130
- * if the user role is 'admin'. If an error occurs during the process, it will log the error and return
131
- * a 400 status with the error message.
132
- * @memberof Auth
133
- */
134
- const adminGuard = (req, res, next) => {
135
- try {
136
- if (!(userRoleEnum.indexOf(req.auth.user.role) === userRoleEnum.indexOf('admin')))
137
- return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
138
- return next();
139
- } catch (error) {
140
- logger.error(error, error.stack);
141
- return res.status(400).json({
142
- status: 'error',
143
- message: error.message,
144
- });
145
- }
146
- };
147
-
148
- /**
149
- * The function `moderatorGuard` checks if the user's role is at least a moderator and handles errors
150
- * accordingly.
151
- * @param req - The `req` parameter in the `moderatorGuard` function typically represents the HTTP
152
- * request object, which contains information about the incoming request such as headers, parameters,
153
- * body, etc. It is commonly used to access data sent from the client to the server.
154
- * @param res - The `res` parameter in the `moderatorGuard` function is the response object in
155
- * Express.js. It is used to send a response back to the client making the HTTP request.
156
- * @param next - The `next` parameter in the `moderatorGuard` function is a callback function that is
157
- * used to pass control to the next middleware function in the stack. When called, it will execute the
158
- * next middleware function. In the context of Express.js middleware, `next` is typically called to
159
- * move to
160
- * @returns In the `moderatorGuard` function, if the user's role is not a moderator or higher, a 403
161
- * status with an error message "Insufficient permission" is returned. If there is an error during the
162
- * process, a 400 status with the error message is returned. If everything is successful, the `next()`
163
- * function is called to proceed to the next middleware in the chain.
164
- * @memberof Auth
165
- */
166
- const moderatorGuard = (req, res, next) => {
167
- try {
168
- if (!(userRoleEnum.indexOf(req.auth.user.role) <= userRoleEnum.indexOf('moderator')))
169
- return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
170
- return next();
171
- } catch (error) {
172
- logger.error(error, error.stack);
173
- return res.status(400).json({
174
- status: 'error',
175
- message: error.message,
176
- });
177
- }
178
- };
179
-
180
- const validatePasswordMiddleware = (req, password) => {
181
- let errors = [];
182
- if (req.body && 'password' in req.body) errors = validatePassword(req.body.password);
183
- if (errors.length > 0)
184
- return {
185
- status: 'error',
186
- message:
187
- 'Password, ' + errors.map((e, i) => (i > 0 ? ', ' : '') + (e[req.lang] ? e[req.lang] : e['en'])).join(''),
188
- };
189
- else
190
- return {
191
- status: 'success',
192
- };
193
- };
194
-
195
- export {
196
- authMiddleware,
197
- hashPassword,
198
- verifyPassword,
199
- hashJWT,
200
- adminGuard,
201
- moderatorGuard,
202
- verifyJWT,
203
- validatePasswordMiddleware,
204
- };
1
+ /**
2
+ * Module for managing identity and authorization
3
+ * @module src/server/auth.js
4
+ * @namespace Auth
5
+ */
6
+
7
+ import dotenv from 'dotenv';
8
+ import jwt from 'jsonwebtoken';
9
+ import { loggerFactory } from './logger.js';
10
+ import crypto from 'crypto';
11
+ import { userRoleEnum } from '../api/user/user.model.js';
12
+ import { validatePassword } from '../client/components/core/CommonJs.js';
13
+
14
+ dotenv.config();
15
+
16
+ const logger = loggerFactory(import.meta);
17
+
18
+ /* The `const config` object is defining parameters related to the hashing process used for password
19
+ security. Here's a breakdown of each property in the `config` object: */
20
+ const config = {
21
+ hashBytes: 32,
22
+ saltBytes: 16,
23
+ iterations: 872791,
24
+ digest: 'sha512',
25
+ };
26
+
27
+ /**
28
+ * @param {String} password - given password to hash
29
+ * @returns {String} the hash corresponding to the password
30
+ * @memberof Auth
31
+ */
32
+ function hashPassword(password) {
33
+ const { iterations, hashBytes, digest, saltBytes } = config;
34
+ const salt = crypto.randomBytes(saltBytes).toString('hex');
35
+ const hash = crypto.pbkdf2Sync(password, salt, iterations, hashBytes, digest).toString('hex');
36
+ return [salt, hash].join('$');
37
+ }
38
+
39
+ /**
40
+ * @param {String} password - password to verify
41
+ * @param {String} combined - a combined salt + hash returned by hashPassword function
42
+ * @returns {Boolean} true if password correspond to the hash. False otherwise
43
+ * @memberof Auth
44
+ */
45
+ function verifyPassword(password, combined) {
46
+ const { iterations, hashBytes, digest } = config;
47
+ const [salt, originalHash] = combined.split('$');
48
+ const hash = crypto.pbkdf2Sync(password, salt, iterations, hashBytes, digest).toString('hex');
49
+ return hash === originalHash;
50
+ }
51
+
52
+ // jwt middleware
53
+
54
+ /**
55
+ * The hashJWT function generates a JSON Web Token (JWT) with a specified payload and expiration time.
56
+ * @param payload - The `payload` parameter in the `hashJWT` function is the data that you want to
57
+ * encode into the JSON Web Token (JWT). It typically contains information about the user or any other
58
+ * relevant data that you want to securely transmit.
59
+ * @param expire - The `expire` parameter in the `hashJWT` function is used to specify the expiration
60
+ * time for the JSON Web Token (JWT) being generated. If a value is provided for `expire`, it will be
61
+ * used as the expiration time. If `expire` is not provided (i.e., it
62
+ * @memberof Auth
63
+ */
64
+ const hashJWT = (payload, expire) =>
65
+ jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: expire !== undefined ? expire : `${process.env.EXPIRE}h` });
66
+
67
+ /**
68
+ * The function `verifyJWT` is used to verify a JSON Web Token (JWT) using a secret key stored in the
69
+ * environment variables.
70
+ * @param token - The `token` parameter is a JSON Web Token (JWT) that is passed to the `verifyJWT`
71
+ * function for verification.
72
+ * @memberof Auth
73
+ */
74
+ const verifyJWT = (token = '') => jwt.verify(token, process.env.JWT_SECRET);
75
+
76
+ /**
77
+ * The function `getBearerToken` extracts and returns the Bearer token from the Authorization header in
78
+ * a request object.
79
+ * @param req - The `req` parameter in the `getBearerToken` function is typically an object
80
+ * representing the HTTP request. It is commonly used in Node.js applications with frameworks like
81
+ * Express.js. The `req` object contains information about the incoming HTTP request, including
82
+ * headers, body, parameters, and more. In
83
+ * @returns {String} The function `getBearerToken` is returning the Bearer token extracted from the
84
+ * Authorization header in the request object. If the Authorization header starts with 'Bearer ', it
85
+ * will return the token portion of the header (excluding 'Bearer ').
86
+ * @memberof Auth
87
+ */
88
+ const getBearerToken = (req) => {
89
+ const authHeader = String(req.headers['authorization'] || req.headers['Authorization'] || '');
90
+ if (authHeader.startsWith('Bearer ')) return authHeader.substring(7, authHeader.length);
91
+ return '';
92
+ };
93
+
94
+ /**
95
+ * The function `getPayloadJWT` extracts and verifies a JWT payload from a request using a bearer
96
+ * token.
97
+ * @param req - The `req` parameter is typically used in web development to represent the HTTP request
98
+ * object. It contains information about the incoming request, such as headers, parameters, and body
99
+ * data. In this context, it seems like the `getPayloadJWT` function is designed to extract and verify
100
+ * a JWT token from
101
+ * @returns {Object} The JWT payload from a request using a bearer
102
+ * @memberof Auth
103
+ */
104
+ const getPayloadJWT = (req) => verifyJWT(getBearerToken(req));
105
+
106
+ /**
107
+ * The authMiddleware function checks and verifies the authorization token in the request headers
108
+ * before allowing access to protected routes.
109
+ * @param req - The `req` parameter in the `authMiddleware` function stands for the request object. It
110
+ * contains information about the HTTP request made to the server, including headers, body, parameters,
111
+ * and more. In this context, the function is extracting the authorization token from the request
112
+ * headers to authenticate the user.
113
+ * @param res - The `res` parameter in the `authMiddleware` function is the response object that
114
+ * represents the HTTP response that an Express.js server sends when it receives an HTTP request. It is
115
+ * used to send a response back to the client with status codes, headers, and data.
116
+ * @param next - The `next` parameter in the `authMiddleware` function is a callback function that is
117
+ * used to pass control to the next middleware function in the stack. When called, it invokes the next
118
+ * middleware function in the chain. This is a common pattern in Express.js middleware functions to
119
+ * move to the next middleware
120
+ * @returns {Object} The `req.auth` included JWT payload in request authorization
121
+ * @memberof Auth
122
+ */
123
+ const authMiddleware = (req, res, next) => {
124
+ try {
125
+ const token = getBearerToken(req);
126
+ if (token) {
127
+ const payload = verifyJWT(token);
128
+ req.auth = payload;
129
+ return next();
130
+ } else
131
+ return res.status(401).json({
132
+ status: 'error',
133
+ message: 'unauthorized: invalid token',
134
+ });
135
+ } catch (error) {
136
+ logger.error(error, error.stack);
137
+ return res.status(400).json({
138
+ status: 'error',
139
+ message: error.message,
140
+ });
141
+ }
142
+ };
143
+
144
+ /**
145
+ * The `adminGuard` function checks if the user has admin role permission and returns an error message
146
+ * if not.
147
+ * @param req - The `req` parameter typically represents the HTTP request object in Node.js. It
148
+ * contains information about the incoming request such as the request headers, parameters, body, and
149
+ * more. In the context of your `adminGuard` function, `req` is the request object that is being passed
150
+ * to the middleware
151
+ * @param res - The `res` parameter in the `adminGuard` function is the response object in Express.js.
152
+ * It is used to send a response back to the client making the HTTP request.
153
+ * @param next - The `next` parameter in the `adminGuard` function is a callback function that is used
154
+ * to pass control to the next middleware function in the stack. When called, it executes the next
155
+ * middleware function. If there are no more middleware functions in the stack, it will proceed to the
156
+ * route handler.
157
+ * @returns The `adminGuard` function is returning either a 403 status with an error message if the
158
+ * user role is not 'admin', or it is calling the `next()` function to proceed to the next middleware
159
+ * if the user role is 'admin'. If an error occurs during the process, it will log the error and return
160
+ * a 400 status with the error message.
161
+ * @memberof Auth
162
+ */
163
+ const adminGuard = (req, res, next) => {
164
+ try {
165
+ if (!(userRoleEnum.indexOf(req.auth.user.role) === userRoleEnum.indexOf('admin')))
166
+ return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
167
+ return next();
168
+ } catch (error) {
169
+ logger.error(error, error.stack);
170
+ return res.status(400).json({
171
+ status: 'error',
172
+ message: error.message,
173
+ });
174
+ }
175
+ };
176
+
177
+ /**
178
+ * The function `moderatorGuard` checks if the user's role is at least a moderator and handles errors
179
+ * accordingly.
180
+ * @param req - The `req` parameter in the `moderatorGuard` function typically represents the HTTP
181
+ * request object, which contains information about the incoming request such as headers, parameters,
182
+ * body, etc. It is commonly used to access data sent from the client to the server.
183
+ * @param res - The `res` parameter in the `moderatorGuard` function is the response object in
184
+ * Express.js. It is used to send a response back to the client making the HTTP request.
185
+ * @param next - The `next` parameter in the `moderatorGuard` function is a callback function that is
186
+ * used to pass control to the next middleware function in the stack. When called, it will execute the
187
+ * next middleware function. In the context of Express.js middleware, `next` is typically called to
188
+ * move to
189
+ * @returns In the `moderatorGuard` function, if the user's role is not a moderator or higher, a 403
190
+ * status with an error message "Insufficient permission" is returned. If there is an error during the
191
+ * process, a 400 status with the error message is returned. If everything is successful, the `next()`
192
+ * function is called to proceed to the next middleware in the chain.
193
+ * @memberof Auth
194
+ */
195
+ const moderatorGuard = (req, res, next) => {
196
+ try {
197
+ if (!(userRoleEnum.indexOf(req.auth.user.role) <= userRoleEnum.indexOf('moderator')))
198
+ return res.status(403).json({ status: 'error', message: 'Insufficient permission' });
199
+ return next();
200
+ } catch (error) {
201
+ logger.error(error, error.stack);
202
+ return res.status(400).json({
203
+ status: 'error',
204
+ message: error.message,
205
+ });
206
+ }
207
+ };
208
+
209
+ const validatePasswordMiddleware = (req, password) => {
210
+ let errors = [];
211
+ if (req.body && 'password' in req.body) errors = validatePassword(req.body.password);
212
+ if (errors.length > 0)
213
+ return {
214
+ status: 'error',
215
+ message:
216
+ 'Password, ' + errors.map((e, i) => (i > 0 ? ', ' : '') + (e[req.lang] ? e[req.lang] : e['en'])).join(''),
217
+ };
218
+ else
219
+ return {
220
+ status: 'success',
221
+ };
222
+ };
223
+
224
+ export {
225
+ authMiddleware,
226
+ hashPassword,
227
+ verifyPassword,
228
+ hashJWT,
229
+ adminGuard,
230
+ moderatorGuard,
231
+ verifyJWT,
232
+ validatePasswordMiddleware,
233
+ getBearerToken,
234
+ getPayloadJWT,
235
+ };