@opengis/fastify-table 2.3.5 → 2.4.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.
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -9
- package/dist/server/plugins/access/funcs/getAdminAccess.d.ts +1 -4
- package/dist/server/plugins/access/funcs/getAdminAccess.d.ts.map +1 -1
- package/dist/server/plugins/access/funcs/getAdminAccess.js +3 -2
- package/dist/server/plugins/auth/funcs/getQuery.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/getQuery.js +2 -1
- package/dist/server/plugins/auth/funcs/loginFile.d.ts +1 -4
- package/dist/server/plugins/auth/funcs/loginFile.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/loginFile.js +10 -5
- package/dist/server/plugins/auth/funcs/loginUser.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/loginUser.js +25 -18
- package/dist/server/plugins/auth/index.d.ts.map +1 -1
- package/dist/server/plugins/auth/index.js +3 -4
- package/dist/server/plugins/crud/funcs/dataInsert.js +1 -1
- package/dist/server/plugins/extra/extraData.d.ts.map +1 -1
- package/dist/server/plugins/extra/extraData.js +3 -2
- package/dist/server/plugins/extra/extraDataGet.d.ts +1 -4
- package/dist/server/plugins/extra/extraDataGet.d.ts.map +1 -1
- package/dist/server/plugins/extra/extraDataGet.js +4 -6
- package/dist/server/plugins/file/uploadMultiPart.js +1 -1
- package/dist/server/plugins/grpc/utils/html2doc.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2doc.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2doc.js +3 -8
- package/dist/server/plugins/grpc/utils/html2img.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2img.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2img.js +3 -8
- package/dist/server/plugins/grpc/utils/html2pdf.d.ts +0 -6
- package/dist/server/plugins/grpc/utils/html2pdf.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/html2pdf.js +7 -12
- package/dist/server/plugins/grpc/utils/mergePdf.d.ts +0 -7
- package/dist/server/plugins/grpc/utils/mergePdf.d.ts.map +1 -1
- package/dist/server/plugins/grpc/utils/mergePdf.js +4 -9
- package/dist/server/plugins/logger/checkUserAccess.d.ts +1 -4
- package/dist/server/plugins/logger/checkUserAccess.d.ts.map +1 -1
- package/dist/server/plugins/logger/checkUserAccess.js +4 -6
- package/dist/server/plugins/logger/errorMessage.d.ts +1 -1
- package/dist/server/plugins/logger/errorMessage.d.ts.map +1 -1
- package/dist/server/plugins/logger/errorMessage.js +7 -8
- package/dist/server/plugins/logger/errorStatus.d.ts.map +1 -1
- package/dist/server/plugins/logger/errorStatus.js +6 -0
- package/dist/server/plugins/logger/index.d.ts +2 -2
- package/dist/server/plugins/logger/index.d.ts.map +1 -1
- package/dist/server/plugins/logger/index.js +16 -18
- package/dist/server/plugins/pg/funcs/getMeta.d.ts.map +1 -1
- package/dist/server/plugins/pg/funcs/getMeta.js +5 -3
- package/dist/server/plugins/policy/funcs/checkJWT.d.ts +0 -9
- package/dist/server/plugins/policy/funcs/checkJWT.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkJWT.js +6 -5
- package/dist/server/plugins/policy/funcs/checkPermissions.d.ts +1 -4
- package/dist/server/plugins/policy/funcs/checkPermissions.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPermissions.js +2 -1
- package/dist/server/plugins/policy/funcs/checkPolicy.d.ts +1 -4
- package/dist/server/plugins/policy/funcs/checkPolicy.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPolicy.js +8 -7
- package/dist/server/plugins/policy/index.d.ts.map +1 -1
- package/dist/server/plugins/policy/index.js +2 -11
- package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts +1 -15
- package/dist/server/plugins/table/funcs/getFilterSQL/index.d.ts.map +1 -1
- package/dist/server/plugins/table/funcs/getFilterSQL/index.js +6 -4
- package/dist/server/plugins/table/funcs/gisIRColumn.d.ts +0 -22
- package/dist/server/plugins/table/funcs/gisIRColumn.d.ts.map +1 -1
- package/dist/server/plugins/table/funcs/gisIRColumn.js +5 -3
- package/dist/server/plugins/upload/index.d.ts.map +1 -1
- package/dist/server/plugins/upload/index.js +7 -0
- package/dist/server/plugins/upload/s3.d.ts +7 -1
- package/dist/server/plugins/upload/s3.d.ts.map +1 -1
- package/dist/server/plugins/upload/s3.js +54 -10
- package/dist/server/plugins/upload/s3minio.d.ts +59 -0
- package/dist/server/plugins/upload/s3minio.d.ts.map +1 -0
- package/dist/server/plugins/upload/s3minio.js +199 -0
- package/dist/server/plugins/upload/startUpload.d.ts.map +1 -1
- package/dist/server/plugins/upload/startUpload.js +16 -8
- package/dist/server/plugins/upload/uploadChunk.d.ts.map +1 -1
- package/dist/server/plugins/upload/uploadChunk.js +14 -9
- package/dist/server/plugins/usercls/index.js +1 -1
- package/dist/server/routes/access/controllers/access.group.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.js +3 -5
- package/dist/server/routes/access/controllers/access.group.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.post.js +3 -5
- package/dist/server/routes/access/controllers/access.interface.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.interface.js +1 -4
- package/dist/server/routes/access/controllers/access.user.d.ts +5 -1
- package/dist/server/routes/access/controllers/access.user.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.js +4 -5
- package/dist/server/routes/access/controllers/access.user.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.post.js +4 -5
- package/dist/server/routes/access/index.d.ts.map +1 -1
- package/dist/server/routes/access/index.js +10 -6
- package/dist/server/routes/auth/controllers/2factor/providers/totp.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/providers/totp.js +4 -3
- package/dist/server/routes/auth/controllers/2factor/qrcode.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/qrcode.js +6 -10
- package/dist/server/routes/auth/controllers/2factor/recovery.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/recovery.js +14 -23
- package/dist/server/routes/auth/controllers/2factor/reset.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/reset.js +3 -5
- package/dist/server/routes/auth/controllers/2factor/verify.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/2factor/verify.js +30 -43
- package/dist/server/routes/auth/controllers/core/login.d.ts +1 -4
- package/dist/server/routes/auth/controllers/core/login.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/passwordRecovery.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/passwordRecovery.js +7 -8
- package/dist/server/routes/auth/controllers/core/registration.d.ts +1 -4
- package/dist/server/routes/auth/controllers/core/registration.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/registration.js +10 -24
- package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts +1 -2
- package/dist/server/routes/auth/controllers/core/updateUserInfo.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/core/updateUserInfo.js +3 -2
- package/dist/server/routes/auth/controllers/euSign/authByData.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/euSign/authByData.js +4 -7
- package/dist/server/routes/auth/controllers/jwt/authorize.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/jwt/authorize.js +6 -9
- package/dist/server/routes/auth/controllers/jwt/token.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/jwt/token.js +9 -12
- package/dist/server/routes/auth/controllers/page/login2faTemplate.d.ts.map +1 -1
- package/dist/server/routes/auth/controllers/page/login2faTemplate.js +3 -2
- package/dist/server/routes/auth/index.d.ts +1 -2
- package/dist/server/routes/auth/index.d.ts.map +1 -1
- package/dist/server/routes/auth/index.js +4 -3
- package/dist/server/routes/cron/controllers/cronApi.d.ts.map +1 -1
- package/dist/server/routes/cron/controllers/cronApi.js +3 -4
- package/dist/server/routes/cron/index.js +1 -1
- package/dist/server/routes/crud/controllers/deleteCrud.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/deleteCrud.js +11 -33
- package/dist/server/routes/crud/controllers/insert.d.ts +1 -1
- package/dist/server/routes/crud/controllers/insert.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/insert.js +17 -31
- package/dist/server/routes/crud/controllers/table.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/table.js +14 -18
- package/dist/server/routes/crud/controllers/update.d.ts.map +1 -1
- package/dist/server/routes/crud/controllers/update.js +16 -28
- package/dist/server/routes/crud/index.d.ts.map +1 -1
- package/dist/server/routes/crud/index.js +14 -4
- package/dist/server/routes/dblist/controllers/setItem.d.ts +0 -6
- package/dist/server/routes/dblist/controllers/setItem.d.ts.map +1 -1
- package/dist/server/routes/dblist/controllers/setItem.js +3 -2
- package/dist/server/routes/dblist/index.d.ts.map +1 -1
- package/dist/server/routes/dblist/index.js +5 -3
- package/dist/server/routes/file/controllers/delete.d.ts +4 -1
- package/dist/server/routes/file/controllers/delete.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/delete.js +8 -8
- package/dist/server/routes/file/controllers/download.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/download.js +5 -8
- package/dist/server/routes/file/controllers/export.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/export.js +8 -8
- package/dist/server/routes/file/controllers/files.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/files.js +6 -8
- package/dist/server/routes/file/controllers/resize.d.ts.map +1 -1
- package/dist/server/routes/file/controllers/resize.js +4 -12
- package/dist/server/routes/file/index.d.ts.map +1 -1
- package/dist/server/routes/file/index.js +10 -7
- package/dist/server/routes/grpc/controllers/file2geojson.d.ts.map +1 -1
- package/dist/server/routes/grpc/controllers/file2geojson.js +7 -7
- package/dist/server/routes/grpc/controllers/filePreview.d.ts.map +1 -1
- package/dist/server/routes/grpc/controllers/filePreview.js +5 -4
- package/dist/server/routes/grpc/index.d.ts.map +1 -1
- package/dist/server/routes/grpc/index.js +3 -2
- package/dist/server/routes/logger/controllers/logger.file.d.ts +1 -1
- package/dist/server/routes/logger/controllers/logger.file.d.ts.map +1 -1
- package/dist/server/routes/logger/controllers/logger.file.js +4 -5
- package/dist/server/routes/logger/controllers/logger.metrics.d.ts.map +1 -1
- package/dist/server/routes/logger/controllers/logger.metrics.js +1 -4
- package/dist/server/routes/logger/index.d.ts.map +1 -1
- package/dist/server/routes/logger/index.js +4 -2
- package/dist/server/routes/menu/controllers/getMenu.d.ts.map +1 -1
- package/dist/server/routes/menu/controllers/getMenu.js +2 -1
- package/dist/server/routes/menu/index.d.ts.map +1 -1
- package/dist/server/routes/menu/index.js +9 -2
- package/dist/server/routes/notifications/controllers/addUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/addUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/addUserNotification.js +5 -6
- package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/deleteUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/deleteUserNotification.js +5 -6
- package/dist/server/routes/notifications/controllers/editUserNotification.d.ts +1 -2
- package/dist/server/routes/notifications/controllers/editUserNotification.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/editUserNotification.js +6 -9
- package/dist/server/routes/notifications/controllers/readNotifications.d.ts +4 -2
- package/dist/server/routes/notifications/controllers/readNotifications.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/readNotifications.js +4 -3
- package/dist/server/routes/notifications/controllers/userNotifications.d.ts +5 -2
- package/dist/server/routes/notifications/controllers/userNotifications.d.ts.map +1 -1
- package/dist/server/routes/notifications/controllers/userNotifications.js +4 -5
- package/dist/server/routes/notifications/index.d.ts +1 -2
- package/dist/server/routes/notifications/index.d.ts.map +1 -1
- package/dist/server/routes/notifications/index.js +3 -1
- package/dist/server/routes/properties/controllers/properties.get.d.ts +5 -2
- package/dist/server/routes/properties/controllers/properties.get.d.ts.map +1 -1
- package/dist/server/routes/properties/controllers/properties.get.js +6 -5
- package/dist/server/routes/properties/controllers/properties.post.d.ts +1 -1
- package/dist/server/routes/properties/controllers/properties.post.d.ts.map +1 -1
- package/dist/server/routes/properties/controllers/properties.post.js +7 -6
- package/dist/server/routes/properties/index.d.ts.map +1 -1
- package/dist/server/routes/properties/index.js +4 -7
- package/dist/server/routes/table/controllers/card.d.ts +1 -1
- package/dist/server/routes/table/controllers/card.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/card.js +9 -7
- package/dist/server/routes/table/controllers/cardData.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/cardData.js +4 -6
- package/dist/server/routes/table/controllers/cardTabData.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/cardTabData.js +3 -2
- package/dist/server/routes/table/controllers/dataInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/dataInfo.js +4 -3
- package/dist/server/routes/table/controllers/filter.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/filter.js +3 -2
- package/dist/server/routes/table/controllers/form.d.ts +1 -1
- package/dist/server/routes/table/controllers/form.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/form.js +7 -5
- package/dist/server/routes/table/controllers/getFormByTable.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/getFormByTable.js +12 -12
- package/dist/server/routes/table/controllers/suggest.d.ts +1 -1
- package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/suggest.js +14 -29
- package/dist/server/routes/table/controllers/tableInfo.d.ts +1 -2
- package/dist/server/routes/table/controllers/tableInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/tableInfo.js +9 -8
- package/dist/server/routes/table/controllers/tokenInfo.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/tokenInfo.js +2 -1
- package/dist/server/routes/table/functions/getData.d.ts.map +1 -1
- package/dist/server/routes/table/functions/getData.js +19 -25
- package/dist/server/routes/table/index.d.ts.map +1 -1
- package/dist/server/routes/table/index.js +15 -13
- package/dist/server/routes/templates/controllers/getTemplate.d.ts.map +1 -1
- package/dist/server/routes/templates/controllers/getTemplate.js +9 -5
- package/dist/server/routes/templates/index.d.ts.map +1 -1
- package/dist/server/routes/templates/index.js +2 -1
- package/dist/server/routes/upload/index.d.ts.map +1 -1
- package/dist/server/routes/upload/index.js +31 -20
- package/dist/server/routes/usercls/controllers/addUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/addUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/deleteUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/editUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/editUserCls.js +2 -1
- package/dist/server/routes/usercls/controllers/getUserCls.d.ts +1 -1
- package/dist/server/routes/usercls/controllers/getUserCls.d.ts.map +1 -1
- package/dist/server/routes/usercls/controllers/getUserCls.js +4 -3
- package/dist/server/routes/usercls/index.d.ts.map +1 -1
- package/dist/server/routes/usercls/index.js +12 -5
- package/dist/server/routes/util/controllers/api.list.d.ts +19 -0
- package/dist/server/routes/util/controllers/api.list.d.ts.map +1 -0
- package/dist/server/routes/util/controllers/api.list.js +58 -0
- package/dist/server/routes/util/controllers/code.generator.d.ts.map +1 -1
- package/dist/server/routes/util/controllers/code.generator.js +7 -6
- package/dist/server/routes/util/controllers/user.tokens.d.ts +1 -2
- package/dist/server/routes/util/controllers/user.tokens.d.ts.map +1 -1
- package/dist/server/routes/util/controllers/user.tokens.js +6 -5
- package/dist/server/routes/util/index.d.ts.map +1 -1
- package/dist/server/routes/util/index.js +8 -7
- package/dist/server/routes/widget/controllers/file.edit.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/file.edit.js +5 -4
- package/dist/server/routes/widget/controllers/widget.del.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.del.js +6 -7
- package/dist/server/routes/widget/controllers/widget.get.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.get.js +4 -3
- package/dist/server/routes/widget/controllers/widget.set.d.ts.map +1 -1
- package/dist/server/routes/widget/controllers/widget.set.js +5 -4
- package/dist/server/routes/widget/index.d.ts.map +1 -1
- package/dist/server/routes/widget/index.js +3 -2
- package/package.json +3 -1
- package/dist/module/core/cls/constraint_type.json +0 -14
- package/dist/module/core/cls/constraint_type_table.json +0 -18
- package/dist/server/migrations/oauth.sql.sql +0 -77
- package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts +0 -2
- package/dist/server/plugins/auth/funcs/getUserPermissions.d.ts.map +0 -1
- package/dist/server/plugins/auth/funcs/getUserPermissions.js +0 -24
- package/dist/server/plugins/auth/onRequest.d.ts +0 -4
- package/dist/server/plugins/auth/onRequest.d.ts.map +0 -1
- package/dist/server/plugins/auth/onRequest.js +0 -104
- package/dist/server/plugins/migration/index.d.ts +0 -3
- package/dist/server/plugins/migration/index.d.ts.map +0 -1
- package/dist/server/plugins/migration/index.js +0 -5
- package/dist/server/plugins/policy/funcs/checkAuth.d.ts +0 -4
- package/dist/server/plugins/policy/funcs/checkAuth.d.ts.map +0 -1
- package/dist/server/plugins/policy/funcs/checkAuth.js +0 -104
- package/dist/server/routes/access/controllers/access.resources.d.ts +0 -6
- package/dist/server/routes/access/controllers/access.resources.d.ts.map +0 -1
- package/dist/server/routes/access/controllers/access.resources.js +0 -14
- package/dist/server/routes/access/controllers/resources.d.ts +0 -11
- package/dist/server/routes/access/controllers/resources.d.ts.map +0 -1
- package/dist/server/routes/access/controllers/resources.js +0 -14
- package/dist/server/routes/access/functions/resources.d.ts +0 -6
- package/dist/server/routes/access/functions/resources.d.ts.map +0 -1
- package/dist/server/routes/access/functions/resources.js +0 -11
- package/dist/server/types/errors.d.ts +0 -14
- package/dist/server/types/errors.d.ts.map +0 -1
- package/dist/server/types/errors.js +0 -4
|
@@ -5,14 +5,18 @@ import accessUserPost from "./controllers/access.user.post.js";
|
|
|
5
5
|
import accessInterface from "./controllers/access.interface.js";
|
|
6
6
|
import { publicResourcesList } from "../../plugins/access/funcs/getResources.js";
|
|
7
7
|
import { accessGroupPostSchema, accessGroupSchema, accessInterfaceSchema, accessUserPostSchema, accessUserSchema, } from "./schema.js";
|
|
8
|
+
const tags = ["core", "access"];
|
|
8
9
|
export default async function route(fastify, opt = {}) {
|
|
9
|
-
fastify.get("/access-group/:id", { schema: accessGroupSchema }, accessGroup);
|
|
10
|
-
fastify.post("/access-group/:id", { schema: accessGroupPostSchema }, accessGroupPost);
|
|
11
|
-
fastify.get("/access-user/:id", {
|
|
10
|
+
fastify.get("/access-group/:id", { config: { tags }, schema: accessGroupSchema }, accessGroup);
|
|
11
|
+
fastify.post("/access-group/:id", { config: { tags }, schema: accessGroupPostSchema }, accessGroupPost);
|
|
12
|
+
fastify.get("/access-user/:id", {
|
|
13
|
+
config: { tags, permission: "admin.users.read" },
|
|
14
|
+
schema: accessUserSchema,
|
|
15
|
+
}, accessUser);
|
|
12
16
|
fastify.post("/access-user/:id", {
|
|
13
|
-
config: { permission: "admin.users.update" },
|
|
17
|
+
config: { tags, permission: "admin.users.update" },
|
|
14
18
|
schema: accessUserPostSchema,
|
|
15
19
|
}, accessUserPost);
|
|
16
|
-
fastify.get("/access-interface/:name", { schema: accessInterfaceSchema }, accessInterface);
|
|
17
|
-
fastify.get("/resources", { config: { policy: "L0" } }, async () => publicResourcesList);
|
|
20
|
+
fastify.get("/access-interface/:name", { config: { tags }, schema: accessInterfaceSchema }, accessInterface);
|
|
21
|
+
fastify.get("/resources", { config: { tags, policy: "L0" } }, async () => publicResourcesList);
|
|
18
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAW1D,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,UAAU,KAAK;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuBD,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,aAAa,OAAO;;;;EAc5C,CAAC;AAuBF,QAAA,MAAM,QAAQ,GAAU,aAAa,OAAO;;;;;;;;;;;;EA0D3C,CAAC;AAEF,QAAA,MAAM,MAAM,GAAU,0BAA0B,KAAK;;;EAiBpD,CAAC;AAKF,QAAA,MAAM,MAAM,GAAU,2BAA2B,KAAK,iBAqBrD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;AAE3E,wBAAoB"}
|
|
@@ -2,6 +2,7 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import qrcode from "qrcode";
|
|
3
3
|
import * as authenticator from "otplib";
|
|
4
4
|
import config from "../../../../../../config.js";
|
|
5
|
+
import { BadRequestError, ForbiddenError } from "../../../../../../errors.js";
|
|
5
6
|
const TYPE = "TOTP";
|
|
6
7
|
// equivalent to otplib@12.0.1 authenticator.keyuri(id,prefix,secret)
|
|
7
8
|
// "otpauth://totp/SOFTPRO:777?secret=secret&period=30&digits=6&algorithm=SHA1&issuer=SOFTPRO"
|
|
@@ -87,12 +88,12 @@ const verify = async ({ uid, code: token, pg }) => {
|
|
|
87
88
|
const { secret, enabled, recoveryCodes } = await getSecret({ uid, pg });
|
|
88
89
|
// console.debug('secret', secret, 'enabled', enabled, 'verification', 'token', authenticator.generate(secret), authenticator.verify({ token: authenticator.generate(secret), secret }));
|
|
89
90
|
if (!secret) {
|
|
90
|
-
throw new
|
|
91
|
+
throw new BadRequestError("Включіть двофакторну аутентифікацію");
|
|
91
92
|
}
|
|
92
93
|
const isValid = authenticator.verify({ token, secret }) ||
|
|
93
94
|
recoveryCodes.reduce((result, recoveryCode) => result || recoveryCode === token, false);
|
|
94
95
|
if (!isValid) {
|
|
95
|
-
throw new
|
|
96
|
+
throw new ForbiddenError("Невірний код");
|
|
96
97
|
}
|
|
97
98
|
return { enabled, recoveryCodes };
|
|
98
99
|
};
|
|
@@ -106,7 +107,7 @@ const toggle = async ({ uid, code, pg, enable }) => {
|
|
|
106
107
|
pg,
|
|
107
108
|
});
|
|
108
109
|
if (enabled === enable) {
|
|
109
|
-
throw new
|
|
110
|
+
throw new BadRequestError("Вже знаходиться у даному стані");
|
|
110
111
|
}
|
|
111
112
|
if (enable) {
|
|
112
113
|
await enableSecret({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAkB5D,wBAA8B,MAAM,CAClC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAiDpB"}
|
|
@@ -2,6 +2,7 @@ import qr from "qrcode";
|
|
|
2
2
|
import config from "../../../../../config.js";
|
|
3
3
|
import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
4
4
|
import { getSecret, generate } from "./providers/totp.js";
|
|
5
|
+
import { BadRequestError, NotFoundError, UnauthorizedError, } from "../../../../../errors.js";
|
|
5
6
|
const headers = {
|
|
6
7
|
"Content-Type": "image/png",
|
|
7
8
|
};
|
|
@@ -9,19 +10,16 @@ export default async function qrCode(req, reply) {
|
|
|
9
10
|
const { pg = pgClients.client } = req;
|
|
10
11
|
const { uid } = req.user || {};
|
|
11
12
|
if (!uid) {
|
|
12
|
-
|
|
13
|
+
throw UnauthorizedError("unauthorized");
|
|
13
14
|
}
|
|
14
15
|
if (!pg || !pg?.pk?.["admin.users"] || !pg?.pk?.["admin.users_social_auth"]) {
|
|
15
|
-
|
|
16
|
-
error: "db connection / users/users_social_auth tables are required",
|
|
17
|
-
code: 400,
|
|
18
|
-
});
|
|
16
|
+
throw BadRequestError("db connection / users/users_social_auth tables are required");
|
|
19
17
|
}
|
|
20
18
|
const userExists = await pg
|
|
21
19
|
.query(`select uid from admin.users where uid=$1`, [uid])
|
|
22
20
|
.then((el) => el.rows?.[0]?.uid);
|
|
23
21
|
if (!userExists) {
|
|
24
|
-
|
|
22
|
+
throw NotFoundError("invalid user");
|
|
25
23
|
}
|
|
26
24
|
const { enabled, secret } = await getSecret({ pg, uid });
|
|
27
25
|
const { otp } = secret
|
|
@@ -32,12 +30,10 @@ export default async function qrCode(req, reply) {
|
|
|
32
30
|
: await generate({ uid, pg });
|
|
33
31
|
const base64 = otp ? await qr.toDataURL(otp) : undefined;
|
|
34
32
|
if (enabled && !config.local && !config.debug) {
|
|
35
|
-
|
|
36
|
-
.status(400)
|
|
37
|
-
.send({ error: "2factor already enabled", code: 400 });
|
|
33
|
+
throw BadRequestError("2factor already enabled");
|
|
38
34
|
}
|
|
39
35
|
if (!otp || !base64) {
|
|
40
|
-
|
|
36
|
+
throw Error("generation error");
|
|
41
37
|
}
|
|
42
38
|
// substring to exclude data:image/png;base64,
|
|
43
39
|
return reply
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAsBvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBA4EnE"}
|
|
@@ -7,6 +7,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
|
7
7
|
import { handlebars } from "../../../../helpers/index.js";
|
|
8
8
|
import { verify, deleteSecret } from "./providers/totp.js";
|
|
9
9
|
import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
|
|
10
|
+
import { BadRequestError, NotFoundError, UnauthorizedError, } from "../../../../../errors.js";
|
|
10
11
|
const template = "recovery-codes-email-template";
|
|
11
12
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
13
|
/**
|
|
@@ -29,23 +30,20 @@ const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
29
30
|
export default async function recovery(req, reply) {
|
|
30
31
|
const { pg = pgClients.client, user, body = {}, method } = req;
|
|
31
32
|
if (!user?.uid) {
|
|
32
|
-
|
|
33
|
+
throw UnauthorizedError("unauthorized");
|
|
33
34
|
}
|
|
34
35
|
if (!user.twofa) {
|
|
35
|
-
|
|
36
|
+
throw BadRequestError("2fa not enabled");
|
|
36
37
|
}
|
|
37
38
|
if (!config.pg) {
|
|
38
|
-
|
|
39
|
+
throw Error("empty pg");
|
|
39
40
|
}
|
|
40
41
|
const { code } = body;
|
|
41
42
|
const { uid, email } = user || {};
|
|
42
43
|
if (!code) {
|
|
43
44
|
if (!email) {
|
|
44
|
-
|
|
45
|
-
.status(404)
|
|
46
|
-
.send({ error: "user recovery email not set", code: 404 });
|
|
45
|
+
throw NotFoundError("user recovery email not set");
|
|
47
46
|
}
|
|
48
|
-
// return reply.status(400).send('not enough params');
|
|
49
47
|
const customPt = await getTemplate("pt", template);
|
|
50
48
|
const pt = customPt ||
|
|
51
49
|
(await readFile(path.join(dirname, `../../../../../templates/pt/${template}.html`), "utf8"));
|
|
@@ -54,9 +52,7 @@ export default async function recovery(req, reply) {
|
|
|
54
52
|
where uid = $1 and social_auth_type = $2`, [uid, "TOTP"])
|
|
55
53
|
.then((el) => el.rows?.[0]?.recoveryCodes || []);
|
|
56
54
|
if (!recoveryCodes?.length) {
|
|
57
|
-
|
|
58
|
-
.status(404)
|
|
59
|
-
.send({ error: "user recovery code not found", code: 404 });
|
|
55
|
+
throw NotFoundError("user recovery code not found");
|
|
60
56
|
}
|
|
61
57
|
const html = await handlebars.compile(pt)({
|
|
62
58
|
recoveryCodes: [recoveryCodes[0]],
|
|
@@ -74,18 +70,13 @@ export default async function recovery(req, reply) {
|
|
|
74
70
|
}
|
|
75
71
|
return reply.redirect("/2factor?recovery=1");
|
|
76
72
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return reply.status(200).send({ redirectUrl });
|
|
85
|
-
}
|
|
86
|
-
return reply.redirect(redirectUrl);
|
|
87
|
-
}
|
|
88
|
-
catch (err) {
|
|
89
|
-
return reply.status(500).send({ error: err.toString(), code: 500 });
|
|
73
|
+
// validate recovery code
|
|
74
|
+
await verify({ uid, code, pg });
|
|
75
|
+
// delete old secret
|
|
76
|
+
await deleteSecret({ pg, uid });
|
|
77
|
+
const redirectUrl = config.auth?.link?.["2fa"]?.login || "/2factor";
|
|
78
|
+
if (method === "POST") {
|
|
79
|
+
return reply.status(200).send({ redirectUrl });
|
|
90
80
|
}
|
|
81
|
+
return reply.redirect(redirectUrl);
|
|
91
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQvC,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAchE"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import config from "../../../../../config.js";
|
|
2
2
|
import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
3
3
|
import { deleteSecret } from "./providers/totp.js";
|
|
4
|
+
import { BadRequestError } from "../../../../../errors.js";
|
|
4
5
|
export default async function reset(req, reply) {
|
|
5
6
|
const { pg = pgClients.client, query } = req;
|
|
6
7
|
if (!query?.uid) {
|
|
7
|
-
|
|
8
|
-
error: "not enough query params: uid",
|
|
9
|
-
code: 400,
|
|
10
|
-
});
|
|
8
|
+
throw BadRequestError("not enough query params: uid");
|
|
11
9
|
}
|
|
12
10
|
if (!config.pg) {
|
|
13
|
-
|
|
11
|
+
throw Error("empty pg");
|
|
14
12
|
}
|
|
15
13
|
await deleteSecret({ pg, uid: query.uid });
|
|
16
14
|
return reply.status(200).send({ ok: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/2factor/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA2BvC;;;;;;;;;;;;;;;;GAgBG;AAEH,wBAA8B,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAyDzE"}
|
|
@@ -7,6 +7,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
|
7
7
|
import { handlebars } from "../../../../helpers/index.js";
|
|
8
8
|
import { verify, enableSecret } from "./providers/totp.js";
|
|
9
9
|
import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
|
|
10
|
+
import { BadRequestError } from "../../../../../errors.js";
|
|
10
11
|
const template = "recovery-codes-email-template";
|
|
11
12
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
12
13
|
const defaultPt = existsSync(path.join(dirname, `../../../../templates/pt/${template}.hbs`))
|
|
@@ -34,54 +35,40 @@ export default async function verifyFunction(req, reply) {
|
|
|
34
35
|
const { uid, twofa, email } = user || {};
|
|
35
36
|
const { code } = body;
|
|
36
37
|
if (!twofa) {
|
|
37
|
-
|
|
38
|
+
throw BadRequestError("2fa not enabled");
|
|
38
39
|
}
|
|
39
40
|
if (!config.pg) {
|
|
40
|
-
|
|
41
|
+
throw Error("empty pg");
|
|
41
42
|
}
|
|
42
43
|
if (!code) {
|
|
43
|
-
|
|
44
|
-
.status(400)
|
|
45
|
-
.send({ error: "not enough body params: code", code: 400 });
|
|
44
|
+
throw BadRequestError("not enough body params: code");
|
|
46
45
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
.query(`select social_auth_obj->'codesArray' as "recoveryCodes"
|
|
46
|
+
const { enabled } = await verify({ uid, code, pg });
|
|
47
|
+
await enableSecret({ pg, uid });
|
|
48
|
+
req.session.secondFactorPassed = true;
|
|
49
|
+
if (!enabled && email) {
|
|
50
|
+
const { recoveryCodes } = await pg
|
|
51
|
+
.query(`select social_auth_obj->'codesArray' as "recoveryCodes"
|
|
54
52
|
from admin.users_social_auth where uid=$1 and social_auth_type='TOTP'`, [uid])
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
const redirectUrl = req.headers?.referer?.match?.(/[?&]redirect=([^&]+)/)?.[1] || "/";
|
|
72
|
-
// return reply.redirect(redirectUrl.startsWith("/") ? redirectUrl : "/");
|
|
73
|
-
return reply
|
|
74
|
-
.status(200)
|
|
75
|
-
.send({ redirectUrl: redirectUrl.startsWith("/") ? redirectUrl : "/" });
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
if ([
|
|
79
|
-
"Невірний код",
|
|
80
|
-
"Вже знаходиться у даному стані",
|
|
81
|
-
"Включіть двофакторну аутентифікацію",
|
|
82
|
-
].includes(err.message)) {
|
|
83
|
-
return reply.status(400).send({ error: err.message, code: 400 });
|
|
84
|
-
}
|
|
85
|
-
return reply.status(500).send(err.toString());
|
|
53
|
+
?.then((el) => el.rows?.[0] || {});
|
|
54
|
+
const customPt = await getTemplate("pt", template);
|
|
55
|
+
const pt = customPt || defaultPt;
|
|
56
|
+
const html = await handlebars.compile(pt)({
|
|
57
|
+
recoveryCodes,
|
|
58
|
+
code: recoveryCodes,
|
|
59
|
+
domain: `${req.protocol || "https"}://${req.hostname}`,
|
|
60
|
+
});
|
|
61
|
+
await sendNotification({
|
|
62
|
+
pg,
|
|
63
|
+
to: email,
|
|
64
|
+
template: html,
|
|
65
|
+
title: `Recovery codes for ${req.hostname} 2-factor authentication`,
|
|
66
|
+
nocache: config.local || config.debug || user?.user_type?.includes?.("admin"),
|
|
67
|
+
});
|
|
86
68
|
}
|
|
69
|
+
const redirectUrl = req.headers?.referer?.match?.(/[?&]redirect=([^&]+)/)?.[1] || "/";
|
|
70
|
+
// return reply.redirect(redirectUrl.startsWith("/") ? redirectUrl : "/");
|
|
71
|
+
return reply
|
|
72
|
+
.status(200)
|
|
73
|
+
.send({ redirectUrl: redirectUrl.startsWith("/") ? redirectUrl : "/" });
|
|
87
74
|
}
|
|
@@ -6,8 +6,5 @@ import { FastifyReply } from "fastify";
|
|
|
6
6
|
* @summary Авторизація користувача за логіном і паролем
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
|
-
export default function login(req: any, reply: FastifyReply): Promise<
|
|
10
|
-
error: string;
|
|
11
|
-
status: number;
|
|
12
|
-
}>;
|
|
9
|
+
export default function login(req: any, reply: FastifyReply): Promise<never>;
|
|
13
10
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/login.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AAEH,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/login.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AAEH,wBAA8B,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAUhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passwordRecovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/passwordRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"passwordRecovery.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/passwordRecovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAqCvC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAA8B,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAiI3E"}
|
|
@@ -8,6 +8,7 @@ import logger from "../../../../plugins/logger/getLogger.js";
|
|
|
8
8
|
import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
9
9
|
import getTemplate from "../../../../plugins/table/funcs/getTemplate.js";
|
|
10
10
|
import sendNotification from "../../../../plugins/auth/funcs/sendNotification.js";
|
|
11
|
+
import { BadRequestError } from "../../../../../errors.js";
|
|
11
12
|
const rclient = getRedis();
|
|
12
13
|
const template = "recovery-password-email-template";
|
|
13
14
|
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -48,10 +49,10 @@ export default async function passwordRecovery(req, reply) {
|
|
|
48
49
|
const { pg = pgClients.client, query = {}, body = {}, hostname, unittest, } = req;
|
|
49
50
|
const { nocache = config.local } = query;
|
|
50
51
|
if (!query.code && !body.email) {
|
|
51
|
-
|
|
52
|
+
throw BadRequestError('Parameter "email" is required.');
|
|
52
53
|
}
|
|
53
54
|
if (query.code && !body.password) {
|
|
54
|
-
|
|
55
|
+
throw BadRequestError('Param "password" is required.');
|
|
55
56
|
}
|
|
56
57
|
// step 1 - send email code
|
|
57
58
|
async function sendEmailToChangePassword() {
|
|
@@ -71,9 +72,7 @@ export default async function passwordRecovery(req, reply) {
|
|
|
71
72
|
? await rclient.get(keyCacheTimeout)
|
|
72
73
|
: false;
|
|
73
74
|
if (checkCodeTimeout && !nocache) {
|
|
74
|
-
|
|
75
|
-
.status(400)
|
|
76
|
-
.send(`Код вже відправлено на пошту ${body.email}. Перевірте або спробуйте через 1 хвилину`);
|
|
75
|
+
throw BadRequestError(`Код вже відправлено на пошту ${body.email}. Перевірте або спробуйте через 1 хвилину`);
|
|
77
76
|
}
|
|
78
77
|
const q = "update admin.users set user_personal_code=$1 where $2 in (login,email)";
|
|
79
78
|
if (config.pg) {
|
|
@@ -81,11 +80,11 @@ export default async function passwordRecovery(req, reply) {
|
|
|
81
80
|
}
|
|
82
81
|
const userQuery = `select coalesce(sur_name,'')|| coalesce(' '||user_name,'')||coalesce(' '||father_name,'') as user
|
|
83
82
|
from admin.users where $1 in (login,email) limit 1`;
|
|
84
|
-
const
|
|
83
|
+
const userName = config.pg
|
|
85
84
|
? await pg
|
|
86
85
|
.query(userQuery, [body.email])
|
|
87
|
-
.then((el) => el.rows?.[0]
|
|
88
|
-
:
|
|
86
|
+
.then((el) => el.rows?.[0]?.user)
|
|
87
|
+
: null;
|
|
89
88
|
try {
|
|
90
89
|
const customPt = await getTemplate("pt", template);
|
|
91
90
|
const pt = customPt ||
|
|
@@ -17,8 +17,5 @@ import { FastifyReply } from "fastify";
|
|
|
17
17
|
* @returns {String|Object} error Опис помилки
|
|
18
18
|
* @returns {String|Object} message Повідомлення про успішну реєстрацію
|
|
19
19
|
*/
|
|
20
|
-
export default function registration(req: any, reply: FastifyReply): Promise<
|
|
21
|
-
message: string;
|
|
22
|
-
status: number;
|
|
23
|
-
}>;
|
|
20
|
+
export default function registration(req: any, reply: FastifyReply): Promise<never>;
|
|
24
21
|
//# sourceMappingURL=registration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAA8B,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBA4GvE"}
|
|
@@ -6,6 +6,7 @@ import config from "../../../../../config.js";
|
|
|
6
6
|
import dataInsert from "../../../../plugins/crud/funcs/dataInsert.js";
|
|
7
7
|
import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
8
8
|
import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
|
|
9
|
+
import { BadRequestError, ConflictError } from "../../../../../errors.js";
|
|
9
10
|
/**
|
|
10
11
|
* АПІ призначене для реєстрації нового користувача на сайті
|
|
11
12
|
*
|
|
@@ -28,38 +29,23 @@ export default async function registration(req, reply) {
|
|
|
28
29
|
const { pg = pgClients.client, body = {} } = req;
|
|
29
30
|
const { password, email } = body;
|
|
30
31
|
if (!password || (!email && !body.login)) {
|
|
31
|
-
|
|
32
|
-
error: "Недостатньо параметрів",
|
|
33
|
-
code: 400,
|
|
34
|
-
});
|
|
32
|
+
throw BadRequestError("Недостатньо параметрів");
|
|
35
33
|
}
|
|
36
34
|
const regularExp = /^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,6}$/;
|
|
37
35
|
if (email && !regularExp.test(email)) {
|
|
38
|
-
|
|
39
|
-
error: "Параметр E-mail невалідний",
|
|
40
|
-
code: 400,
|
|
41
|
-
});
|
|
36
|
+
throw BadRequestError("Параметр E-mail невалідний");
|
|
42
37
|
}
|
|
43
38
|
if (body?.first_name &&
|
|
44
39
|
!/[А-Яа-яA-Za-zёЁЇїІіЄєҐґ '-]+/.test(body?.first_name)) {
|
|
45
|
-
|
|
46
|
-
error: "Параметр Ім'я невалідний",
|
|
47
|
-
code: 400,
|
|
48
|
-
});
|
|
40
|
+
throw BadRequestError("Параметр Ім'я невалідний");
|
|
49
41
|
}
|
|
50
42
|
if (body?.last_name &&
|
|
51
43
|
!/[А-Яа-яA-Za-zёЁЇїІіЄєҐґ '-]+/.test(body?.last_name)) {
|
|
52
|
-
|
|
53
|
-
error: "Параметр Прізвище невалідний",
|
|
54
|
-
code: 400,
|
|
55
|
-
});
|
|
44
|
+
throw BadRequestError("Параметр Прізвище невалідний");
|
|
56
45
|
}
|
|
57
46
|
if (body?.phone &&
|
|
58
47
|
!/^\+\d{3}\s?\d{2}\s?\d{3}\s?\d{2}\s?\d{2}$/.test(body?.phone)) {
|
|
59
|
-
|
|
60
|
-
error: "Параметр Телефон невалідний",
|
|
61
|
-
code: 400,
|
|
62
|
-
});
|
|
48
|
+
throw BadRequestError("Параметр Телефон невалідний");
|
|
63
49
|
}
|
|
64
50
|
const login = body.login || email;
|
|
65
51
|
const data = {
|
|
@@ -76,12 +62,12 @@ export default async function registration(req, reply) {
|
|
|
76
62
|
};
|
|
77
63
|
const { userExists } = config.pg
|
|
78
64
|
? await pg.query(q1, [login]).then((el) => el.rows?.[0] || {})
|
|
79
|
-
: {};
|
|
65
|
+
: { userExists: false };
|
|
80
66
|
if (userExists) {
|
|
81
67
|
const txt = !body.login
|
|
82
68
|
? "Даний адрес електронної пошти вже прив'язаний до іншого облікового запису"
|
|
83
69
|
: "Даний логін вже використовується";
|
|
84
|
-
|
|
70
|
+
throw ConflictError(txt);
|
|
85
71
|
}
|
|
86
72
|
if (pg.pk?.["crm_acc.crm_contact"]) {
|
|
87
73
|
// insert crm contact
|
|
@@ -92,7 +78,7 @@ export default async function registration(req, reply) {
|
|
|
92
78
|
const txt = !body.login
|
|
93
79
|
? "Користувача за даною адресою вже зареєстровано"
|
|
94
80
|
: "Даний логін вже використовується";
|
|
95
|
-
|
|
81
|
+
throw ConflictError(txt);
|
|
96
82
|
}
|
|
97
83
|
await dataInsert({ pg, table: "crm_acc.crm_contact", data });
|
|
98
84
|
const { uid } = await pg
|
|
@@ -114,7 +100,7 @@ export default async function registration(req, reply) {
|
|
|
114
100
|
.query(qUser, [login])
|
|
115
101
|
.then((res) => res.rows?.[0]);
|
|
116
102
|
if (!newUser) {
|
|
117
|
-
|
|
103
|
+
throw BadRequestError("Помилка завершення реєстрації, спробуйте увійти");
|
|
118
104
|
}
|
|
119
105
|
const authType = "creds-" + (newUser.user_type === "admin" ? "admin" : "user");
|
|
120
106
|
const result = await authorizeUser(newUser, req, authType);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { FastifyReply } from "fastify";
|
|
2
1
|
import { ExtendedRequest } from "../../../../types/core.js";
|
|
3
|
-
export default function updateUserInfo(req: ExtendedRequest
|
|
2
|
+
export default function updateUserInfo(req: ExtendedRequest): Promise<any>;
|
|
4
3
|
//# sourceMappingURL=updateUserInfo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/updateUserInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"updateUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/updateUserInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM5D,wBAA8B,cAAc,CAAC,GAAG,EAAE,eAAe,gBAsBhE"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
2
2
|
import dataUpdate from "../../../../plugins/crud/funcs/dataUpdate.js";
|
|
3
|
-
|
|
3
|
+
import { UnauthorizedError } from "../../../../../errors.js";
|
|
4
|
+
export default async function updateUserInfo(req) {
|
|
4
5
|
const { body: payload, pg = pgClients.client } = req;
|
|
5
6
|
if (!req.user?.uid) {
|
|
6
|
-
|
|
7
|
+
throw UnauthorizedError("unauthorized");
|
|
7
8
|
}
|
|
8
9
|
const userInfo = Object.fromEntries(Object.entries(payload || {}).filter(([key]) => !["salt", "user_type"].includes(key)));
|
|
9
10
|
const result = await dataUpdate({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authByData.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/euSign/authByData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"authByData.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/euSign/authByData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA2B5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBA8HpB"}
|
|
@@ -7,6 +7,7 @@ import checkReferer from "../../../../plugins/auth/funcs/checkReferer.js";
|
|
|
7
7
|
import getQuery from "../../../../plugins/auth/funcs/getQuery.js";
|
|
8
8
|
import logAuth from "../../../../plugins/auth/funcs/logAuth.js";
|
|
9
9
|
import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
|
|
10
|
+
import { BadRequestError, ForbiddenError, NotImplementedError } from "../../../../../errors.js";
|
|
10
11
|
function fetchWithoutSSL(url, options) {
|
|
11
12
|
const httpsAgent = new Agent({
|
|
12
13
|
connect: {
|
|
@@ -48,7 +49,7 @@ export default async function authByData(req, reply) {
|
|
|
48
49
|
authType,
|
|
49
50
|
hostOauth,
|
|
50
51
|
});
|
|
51
|
-
|
|
52
|
+
throw BadRequestError("Невалідний парметр тип авторизації");
|
|
52
53
|
}
|
|
53
54
|
// referer + token check
|
|
54
55
|
const invalidReferer = await checkReferer({
|
|
@@ -62,9 +63,7 @@ export default async function authByData(req, reply) {
|
|
|
62
63
|
referer,
|
|
63
64
|
code,
|
|
64
65
|
});
|
|
65
|
-
|
|
66
|
-
.status(403)
|
|
67
|
-
.send("Параметри data / code / state мають невірний формат, або Ви перейшли за прямим посиланням.");
|
|
66
|
+
throw ForbiddenError("Параметри data / code / state мають невірний формат, або Ви перейшли за прямим посиланням.");
|
|
68
67
|
}
|
|
69
68
|
const url = authType === "govid"
|
|
70
69
|
? `${hostOauth}/api-user/auth_data?token=${code}`
|
|
@@ -122,8 +121,6 @@ export default async function authByData(req, reply) {
|
|
|
122
121
|
error: err.toString(),
|
|
123
122
|
stack: err.stack,
|
|
124
123
|
});
|
|
125
|
-
|
|
126
|
-
.status(500)
|
|
127
|
-
.send(`Помилка авторизації через ${authType === "govid" ? "id.gov.ua" : "google"}. Зверніться до Адміністратора!`);
|
|
124
|
+
throw NotImplementedError(`Помилка авторизації через ${authType === "govid" ? "id.gov.ua" : "google"}. Зверніться до Адміністратора!`);
|
|
128
125
|
}
|
|
129
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/authorize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA0BvC,wBAA8B,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,kBAmHpE"}
|
|
@@ -3,6 +3,7 @@ import pgClients from "../../../../plugins/pg/pgClients.js";
|
|
|
3
3
|
import dataInsert from "../../../../plugins/crud/funcs/dataInsert.js";
|
|
4
4
|
import { sign, scryptHash } from "../../../../plugins/auth/funcs/jwt.js";
|
|
5
5
|
import authorizeUser from "../../../../plugins/auth/funcs/authorizeUser.js";
|
|
6
|
+
import { BadRequestError, NotFoundError } from "../../../../../errors.js";
|
|
6
7
|
const getIp = (req) => (req.headers?.["x-real-ip"] ||
|
|
7
8
|
req.headers?.["x-forwarded-for"] ||
|
|
8
9
|
req.ip ||
|
|
@@ -18,14 +19,10 @@ export default async function authorize(req, reply) {
|
|
|
18
19
|
const payload = req.method === "POST" ? body : query;
|
|
19
20
|
const { response_type, client_id, redirect_uri, scope } = payload;
|
|
20
21
|
if (response_type !== "code") {
|
|
21
|
-
|
|
22
|
-
.code(400)
|
|
23
|
-
.send({ error: "unsupported response_type", code: 400 });
|
|
22
|
+
throw BadRequestError("unsupported response_type");
|
|
24
23
|
}
|
|
25
24
|
if (!client_id) {
|
|
26
|
-
|
|
27
|
-
.code(400)
|
|
28
|
-
.send({ error: "not enough query params: client_id", code: 400 });
|
|
25
|
+
throw BadRequestError("not enough query params: client_id");
|
|
29
26
|
}
|
|
30
27
|
const ip = getIp(req);
|
|
31
28
|
const q = `select * from oauth.clients where client_id=$1 and token_endpoint_auth_method=$2 and (allowed_ips is null or $3=any(allowed_ips)) and ${scope ? "$4=any(scopes)" : "1=1"} order by allowed_ips nulls last limit 1`;
|
|
@@ -35,12 +32,12 @@ export default async function authorize(req, reply) {
|
|
|
35
32
|
.then((el) => el.rows?.[0] || {})
|
|
36
33
|
: {};
|
|
37
34
|
if (!userId) {
|
|
38
|
-
|
|
35
|
+
throw BadRequestError("invalid client id");
|
|
39
36
|
}
|
|
40
37
|
if (redirect_uri &&
|
|
41
38
|
Array.isArray(redirect_uris) &&
|
|
42
39
|
!redirect_uris.includes(redirect_uri)) {
|
|
43
|
-
|
|
40
|
+
throw BadRequestError("invalid redirect_uri");
|
|
44
41
|
}
|
|
45
42
|
const user = pg.pk?.["admin.users"]
|
|
46
43
|
? await pg
|
|
@@ -50,7 +47,7 @@ export default async function authorize(req, reply) {
|
|
|
50
47
|
.then((el) => el.rows[0])
|
|
51
48
|
: null;
|
|
52
49
|
if (!user) {
|
|
53
|
-
|
|
50
|
+
throw NotFoundError("user not found");
|
|
54
51
|
}
|
|
55
52
|
const href1 = req.method === "POST"
|
|
56
53
|
? null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/jwt/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA2B5D,wBAA8B,UAAU,CACtC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,kBAmEpB"}
|