adminizer 4.1.0-commit.3bf605e → 4.1.0-commit.d8a06d3
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/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-D-Lx670g.js} +1 -1
- package/assets/add-BP_u3Tjl.js +1 -0
- package/assets/add-form-nffmiYTh.js +1 -0
- package/assets/add-group-D4vcHlm-.js +1 -0
- package/assets/{add-group-form-dzadPSfL.js → add-group-form-gNJW11-q.js} +1 -1
- package/assets/add-user-DWh3Nas0.js +1 -0
- package/assets/add-user-form-BJ0FsZYJ.js +1 -0
- package/assets/{app-DMmad2-f.css → app-WTooYWC3.css} +1 -1
- package/assets/{app-layout-D1m9Kvxq.js → app-layout-DYsRFUuP.js} +1 -1
- package/assets/{app-shell-BWMRMkHM.js → app-shell-Dd9Eknik.js} +1 -1
- package/assets/app-sidebar-BOmu6-Sl.js +1 -0
- package/assets/{app-sidebar-header-DLAFi13E.js → app-sidebar-header-CoXSzWxk.js} +1 -1
- package/assets/app.js +2 -2
- package/assets/{breadcrumbs-CQNon4Vl.js → breadcrumbs-BmAq4fHT.js} +1 -1
- package/assets/{button-CQ9t1kLz.js → button-C9B_5Jf_.js} +1 -1
- package/assets/{checkbox-W0nGAXIj.js → checkbox-Fg27sL_1.js} +1 -1
- package/assets/{compiler-runtime-tM4jBQ-T.js → compiler-runtime-hB6dAw2d.js} +1 -1
- package/assets/dashboard-BACj996r.js +3 -0
- package/assets/dashboard-BOltB2Hq.css +1 -0
- package/assets/{date-picker-B__dVVqj.js → date-picker-DI1cCO7K.js} +1 -1
- package/assets/{dropdown-menu-SEBnEIiL.js → dropdown-menu-Bhj17ENm.js} +1 -1
- package/assets/{field-renderer-CapylJU9.js → field-renderer-DVHZF6HS.js} +3 -3
- package/assets/form-BgWdwvz1.js +1 -0
- package/assets/form-DgtErfln.js +1 -0
- package/assets/{geo-json-CwteYDGB.js → geo-json-BjiyTtMu.js} +1 -1
- package/assets/{handsontable-BCnjOpBr.js → handsontable-4mjU_b0n.js} +1 -1
- package/assets/home-CHntBHJa.js +2 -0
- package/assets/{icon-Bz9BMaD0.js → icon-Dt0vBgDO.js} +1 -1
- package/assets/index-B8BS9wMC.js +1 -0
- package/assets/{index-DEk3sC8d.js → index-BKCgnGj_.js} +1 -1
- package/assets/{index-C0SL3SHw.js → index-BykbU6Ee.js} +1 -1
- package/assets/index-CaJgc5EZ.js +1 -0
- package/assets/{index-BcE9FUM6.js → index-Cgp8OfuI.js} +1 -1
- package/assets/{index-DTRTjOmh.js → index-Cw5o84pO.js} +1 -1
- package/assets/{init-user-D9mW-g14.js → init-user-JfCKJ5Ce.js} +1 -1
- package/assets/{input-DF7Ue23C.js → input-CvRbIbk4.js} +1 -1
- package/assets/{input-error-BBygona6.js → input-error-DMK7cAt7.js} +1 -1
- package/assets/{label-Z506NKsW.js → label-CSLFe9Bz.js} +1 -1
- package/assets/list-B2Oa5O_Q.js +1 -0
- package/assets/{list-table-DB1sEQLF.js → list-table-DA9MhywL.js} +5 -5
- package/assets/{login-DrGaTWhY.js → login-DQwGtdis.js} +1 -1
- package/assets/manifest.json +491 -470
- package/assets/{material-icon-CItZiB53.js → material-icon-BJg8o_fs.js} +1 -1
- package/assets/module-DWXp59Vg.js +1 -0
- package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-CJs0_GlD.js} +1 -1
- package/assets/{multi-select-oabtVhUP.js → multi-select-BvRpAW8r.js} +1 -1
- package/assets/{nav-footer-CM-yHiRs.js → nav-footer-Bs4dmN1d.js} +1 -1
- package/assets/{nav-main-Q3xofGRT.js → nav-main-Bq3IMk4C.js} +1 -1
- package/assets/{nav-user-Ds8i0Pa2.js → nav-user-CbB22J5O.js} +1 -1
- package/assets/{pagination-render-B57pOpFy.js → pagination-render-DuXDDbC_.js} +1 -1
- package/assets/{popover-I249Gg2O.js → popover-DtoGI2b1.js} +1 -1
- package/assets/{register-C9FQIDtS.js → register-BSogVF0h.js} +1 -1
- package/assets/{select-D1N8zRPY.js → select-BWepUw-9.js} +1 -1
- package/assets/{sidebar-4D-sX2l4.js → sidebar-CAHsHdjM.js} +2 -2
- package/assets/skeleton-COOcAA8f.js +1 -0
- package/assets/{sonner-Dzckw3U3.js → sonner-BI0IFOQN.js} +1 -1
- package/assets/{toast-editor-FbrFd1ft.js → toast-editor-CMK7QtF1.js} +1 -1
- package/assets/{tooltip-D2ehgLlB.js → tooltip-DHwpLKOI.js} +1 -1
- package/assets/{use-appearance-Co6mO0dV.js → use-appearance-DRfIqTgw.js} +1 -1
- package/assets/{use-window-size-B8l6Bpkf.js → use-window-size-h0Sh_NvX.js} +1 -1
- package/assets/{user-info-DBYoAJYJ.js → user-info-DFrmpJ4y.js} +1 -1
- package/assets/{user-menu-content-qkvdkUVd.js → user-menu-content-DPXQdERj.js} +1 -1
- package/assets/welcome-B4WCIXKf.js +1 -0
- package/controllers/add.js +2 -2
- package/controllers/addGroup.js +2 -4
- package/controllers/addUser.js +4 -6
- package/controllers/catalog/Catalog.js +2 -2
- package/controllers/catalog/FrontentCatalogAdapter.js +1 -2
- package/controllers/ckeditorUpload.js +2 -3
- package/controllers/dashboard.js +16 -2
- package/controllers/edit.js +2 -3
- package/controllers/editGroup.js +2 -4
- package/controllers/editUser.js +3 -5
- package/controllers/form.js +2 -3
- package/controllers/getAllWidgets.js +3 -3
- package/controllers/initUser.js +1 -2
- package/controllers/list.js +4 -4
- package/controllers/login.js +31 -15
- package/controllers/media-manager/mediaManagerAdapter.js +1 -2
- package/controllers/media-manager/mediaManagerApi.js +2 -2
- package/controllers/navigation/edit.js +1 -1
- package/controllers/processInstallFinalize.js +2 -2
- package/controllers/processInstallStep.d.ts +0 -1
- package/controllers/processInstallStep.js +122 -132
- package/controllers/register.js +1 -4
- package/controllers/remove.js +2 -2
- package/controllers/timezones.js +1 -1
- package/controllers/view.js +2 -2
- package/controllers/welcome.js +1 -1
- package/controllers/widgets/Action.js +2 -2
- package/controllers/widgets/Custom.js +2 -2
- package/controllers/widgets/Info.js +2 -2
- package/controllers/widgets/switch.js +2 -2
- package/controllers/widgetsDB.js +5 -5
- package/helpers/accessRightsHelper.d.ts +3 -2
- package/helpers/accessRightsHelper.js +1 -1
- package/helpers/configHelper.js +2 -1
- package/helpers/fieldsHelper.d.ts +1 -1
- package/helpers/inertiaActionsHelper.js +1 -1
- package/helpers/inertiaAddHelper.d.ts +1 -1
- package/helpers/inertiaAddHelper.js +2 -0
- package/helpers/inertiaFromHelper.js +2 -0
- package/helpers/inertiaGroupHelper.d.ts +4 -2
- package/helpers/inertiaGroupHelper.js +1 -1
- package/helpers/inertiaListHelper.js +5 -5
- package/helpers/inertiaMenuHelper.js +1 -1
- package/helpers/inertiaUserHelper.d.ts +7 -1
- package/helpers/inertiaUserHelper.js +5 -1
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/interfaces/adminpanelConfig.d.ts +6 -2
- package/interfaces/global.d.ts +5 -26
- package/lib/Adminizer.d.ts +2 -0
- package/lib/Adminizer.js +17 -1
- package/lib/catalog/AbstractCatalog.js +0 -1
- package/lib/catalog/Navigation.js +6 -6
- package/lib/datatable/NodeTable.js +0 -3
- package/lib/inertia/inertiaAdapter.js +0 -1
- package/lib/installStepper/installStepper.js +5 -5
- package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
- package/lib/media-manager/AbstractMediaManager.js +1 -1
- package/lib/v4/DataAccessor.d.ts +2 -1
- package/lib/v4/DataAccessor.js +2 -2
- package/lib/v4/POWCaptcha.js +0 -1
- package/lib/v4/PolicyManager.js +0 -1
- package/lib/v4/helper/jwt.d.ts +10 -0
- package/lib/v4/helper/jwt.js +18 -0
- package/lib/v4/model/AbstractModel.js +0 -2
- package/lib/v4/model/ModelHandler.js +0 -1
- package/lib/v4/model/adapter/sequelize.d.ts +3 -2
- package/lib/v4/model/adapter/sequelize.js +250 -58
- package/lib/v4/model/adapter/waterline.js +0 -1
- package/lib/widgets/abstractAction.d.ts +1 -1
- package/lib/widgets/abstractCustom.d.ts +27 -12
- package/lib/widgets/abstractCustom.js +8 -2
- package/lib/widgets/abstractInfo.d.ts +1 -1
- package/lib/widgets/abstractInfo.js +1 -1
- package/lib/widgets/abstractLink.d.ts +1 -0
- package/lib/widgets/abstractSwitch.d.ts +1 -1
- package/lib/widgets/abstractWidgetBase.d.ts +1 -1
- package/lib/widgets/widgetHandler.d.ts +20 -3
- package/lib/widgets/widgetHandler.js +25 -25
- package/models/GroupAP.d.ts +8 -0
- package/models/MediaManagerAP.d.ts +16 -0
- package/models/MediaManagerAssociationsAP.d.ts +10 -0
- package/models/MediaManagerMetaAP.d.ts +8 -0
- package/models/NavigationAP.d.ts +5 -0
- package/models/UserAP.d.ts +25 -2
- package/models/UserAP.js +2 -2
- package/package.json +17 -10
- package/policies/checkAuth.js +4 -3
- package/policies/setLocale.js +2 -2
- package/system/Router.js +14 -14
- package/system/bindAuthorization.js +4 -5
- package/system/bindInertia.js +9 -9
- package/system/bindInstallStepper.js +1 -1
- package/system/bindReqFunctions.js +16 -0
- package/translations/ru.json +17 -8
- package/assets/add-ZITr43GJ.js +0 -1
- package/assets/add-form-CYOfr0Ef.js +0 -1
- package/assets/add-group-B332wN8K.js +0 -1
- package/assets/add-user-TC-mYdsB.js +0 -1
- package/assets/add-user-form-y2f_1_lM.js +0 -1
- package/assets/app-sidebar-BCtaEFGb.js +0 -1
- package/assets/dashboard-BR602KhL.js +0 -1
- package/assets/form-DOUNk3o2.js +0 -1
- package/assets/form-lOKv4Qbw.js +0 -1
- package/assets/home-Ch6QfTIt.js +0 -2
- package/assets/index-Cdb9ACvz.js +0 -1
- package/assets/index-K81GbF6O.js +0 -1
- package/assets/list-Qyd7ecQH.js +0 -1
- package/assets/module-DBaykv8l.js +0 -1
- package/assets/welcome-D2adQ8EU.js +0 -1
package/controllers/initUser.js
CHANGED
|
@@ -29,12 +29,11 @@ export default async function initUser(req, res) {
|
|
|
29
29
|
}
|
|
30
30
|
try {
|
|
31
31
|
Adminizer.log.debug(`Created admin`);
|
|
32
|
-
let passwordHashed = generate(login + password);
|
|
32
|
+
let passwordHashed = generate(login + password + process.env.AP_PASSWORD_SALT);
|
|
33
33
|
password = 'masked';
|
|
34
34
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
35
35
|
await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
|
|
36
36
|
login: login,
|
|
37
|
-
password: password,
|
|
38
37
|
passwordHashed: passwordHashed,
|
|
39
38
|
fullName: "Administrator",
|
|
40
39
|
isActive: true,
|
package/controllers/list.js
CHANGED
|
@@ -9,10 +9,10 @@ export default async function list(req, res) {
|
|
|
9
9
|
return res.status(404).send({ error: 'Not Found' });
|
|
10
10
|
}
|
|
11
11
|
if (req.adminizer.config.auth.enable) {
|
|
12
|
-
if (!req.
|
|
12
|
+
if (!req.user) {
|
|
13
13
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
14
14
|
}
|
|
15
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.
|
|
15
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
|
|
16
16
|
return res.sendStatus(403);
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -46,8 +46,8 @@ export default async function list(req, res) {
|
|
|
46
46
|
const searchMap = new Map();
|
|
47
47
|
for (let i = 0; i < searchColumns.length; i++) {
|
|
48
48
|
const column = searchColumns[i];
|
|
49
|
-
const value = searchColumnValues[i] || "";
|
|
50
|
-
searchMap.set(column, value);
|
|
49
|
+
const value = searchColumnValues[i] || "";
|
|
50
|
+
searchMap.set(column, value);
|
|
51
51
|
}
|
|
52
52
|
const searchPairs = Array.from(searchMap.entries()).map(([column, value]) => ({
|
|
53
53
|
column,
|
package/controllers/login.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { POWCaptcha } from "../lib/v4/POWCaptcha";
|
|
2
2
|
import passwordHash from "password-hash";
|
|
3
3
|
import { inertiaLoginHelper } from "../helpers/inertiaAutHelper";
|
|
4
|
+
import { Adminizer } from "../lib/Adminizer";
|
|
5
|
+
import { signUser } from "../lib/v4/helper/jwt";
|
|
6
|
+
import { serialize } from "cookie";
|
|
4
7
|
export default async function login(req, res) {
|
|
5
8
|
const powCaptcha = new POWCaptcha();
|
|
6
9
|
if (req.originalUrl.indexOf("login") >= 0) {
|
|
@@ -11,11 +14,6 @@ export default async function login(req, res) {
|
|
|
11
14
|
let login = req.body.login;
|
|
12
15
|
let password = req.body.password;
|
|
13
16
|
let captchaSolution = req.body.captchaSolution;
|
|
14
|
-
// Verify CAPTCHA solution
|
|
15
|
-
const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
|
|
16
|
-
if (!isCaptchaValid) {
|
|
17
|
-
return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
|
|
18
|
-
}
|
|
19
17
|
let user;
|
|
20
18
|
try {
|
|
21
19
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
@@ -28,11 +26,17 @@ export default async function login(req, res) {
|
|
|
28
26
|
if (!user) {
|
|
29
27
|
return res.sendStatus(404);
|
|
30
28
|
}
|
|
31
|
-
if (req.
|
|
32
|
-
req.session.
|
|
33
|
-
|
|
34
|
-
return
|
|
29
|
+
if (req.user.isAdministrator) {
|
|
30
|
+
req.session.userPretended = user;
|
|
31
|
+
// return res.sendStatus(200);
|
|
32
|
+
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
|
35
33
|
}
|
|
34
|
+
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
35
|
+
}
|
|
36
|
+
// Verify CAPTCHA solution
|
|
37
|
+
const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
|
|
38
|
+
if (!isCaptchaValid) {
|
|
39
|
+
return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
|
|
36
40
|
}
|
|
37
41
|
if (!user) {
|
|
38
42
|
return inertiaAdminMessage(req, "Wrong username", 'login');
|
|
@@ -42,12 +46,18 @@ export default async function login(req, res) {
|
|
|
42
46
|
//Here we use the captchaSolution key to output messages unrelated to the form fields.
|
|
43
47
|
return inertiaAdminMessage(req, "Profile is not confirmed, please contact to administrator", 'captchaSolution');
|
|
44
48
|
}
|
|
45
|
-
if (passwordHash.verify(login + password, user.passwordHashed)) {
|
|
49
|
+
if (passwordHash.verify(login + password + process.env.AP_PASSWORD_SALT, user.passwordHashed)) {
|
|
46
50
|
if (user.expires && Date.now() > Date.parse(user.expires)) {
|
|
47
51
|
//Here we use the captchaSolution key to output messages unrelated to the form fields.
|
|
48
52
|
return inertiaAdminMessage(req, "Profile expired, contact the administrator", 'captchaSolution');
|
|
49
53
|
}
|
|
50
|
-
|
|
54
|
+
const token = signUser(user, req.adminizer.jwtSecret);
|
|
55
|
+
res.setHeader('Set-Cookie', serialize('adminizer_jwt', token, {
|
|
56
|
+
httpOnly: true,
|
|
57
|
+
sameSite: 'lax',
|
|
58
|
+
path: '/',
|
|
59
|
+
maxAge: 60 * 60 * 24 * 7 * 2,
|
|
60
|
+
}));
|
|
51
61
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
|
52
62
|
}
|
|
53
63
|
else {
|
|
@@ -69,17 +79,23 @@ export default async function login(req, res) {
|
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
else if (req.originalUrl.indexOf("logout") >= 0) {
|
|
72
|
-
if (req.session.
|
|
73
|
-
|
|
74
|
-
req.session.adminPretender = {};
|
|
82
|
+
if (req.session.userPretended && req.session.userPretended.id && req.user && req.user.id) {
|
|
83
|
+
delete (req.session.userPretended);
|
|
75
84
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
76
85
|
}
|
|
77
|
-
req.
|
|
86
|
+
req.user = undefined;
|
|
87
|
+
res.setHeader('Set-Cookie', serialize('adminizer_jwt', '', {
|
|
88
|
+
httpOnly: true,
|
|
89
|
+
sameSite: 'lax',
|
|
90
|
+
path: '/',
|
|
91
|
+
expires: new Date(0),
|
|
92
|
+
}));
|
|
78
93
|
req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
79
94
|
}
|
|
80
95
|
return res.status(404);
|
|
81
96
|
}
|
|
82
97
|
async function inertiaAdminMessage(req, message, messageType) {
|
|
98
|
+
Adminizer.log.warn(message);
|
|
83
99
|
const powCaptcha = new POWCaptcha();
|
|
84
100
|
const captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
|
|
85
101
|
let errors = {};
|
|
@@ -123,7 +123,6 @@ export class MediaManagerAdapter {
|
|
|
123
123
|
}
|
|
124
124
|
try {
|
|
125
125
|
const item = await this.manager.upload(req.file, filename, origFileName, group);
|
|
126
|
-
console.log(item);
|
|
127
126
|
if (item) {
|
|
128
127
|
return res.send({
|
|
129
128
|
msg: "success",
|
|
@@ -150,7 +149,7 @@ export class MediaManagerAdapter {
|
|
|
150
149
|
return;
|
|
151
150
|
}
|
|
152
151
|
catch (e) {
|
|
153
|
-
console.
|
|
152
|
+
console.error(e);
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
}
|
|
@@ -4,10 +4,10 @@ export async function mediaManagerController(req, res) {
|
|
|
4
4
|
const method = req.method.toUpperCase();
|
|
5
5
|
let id = req.params.id ? req.params.id : '';
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -2,7 +2,7 @@ import { ControllerHelper } from "../../helpers/controllerHelper";
|
|
|
2
2
|
import { DataAccessor } from "../../lib/v4/DataAccessor";
|
|
3
3
|
export default async function edit(req, res) {
|
|
4
4
|
if (req.adminizer.config.auth.enable) {
|
|
5
|
-
if (!req.
|
|
5
|
+
if (!req.user) {
|
|
6
6
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
7
7
|
}
|
|
8
8
|
}
|
|
@@ -3,10 +3,10 @@ import { Adminizer } from "../lib/Adminizer";
|
|
|
3
3
|
let installStepper = InstallStepper.getInstance();
|
|
4
4
|
export default async function processInstallFinalize(req, res) {
|
|
5
5
|
if (req.adminizer.config.auth.enable) {
|
|
6
|
-
if (!req.
|
|
6
|
+
if (!req.user) {
|
|
7
7
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
8
8
|
}
|
|
9
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`process-install-step`, req.
|
|
9
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`process-install-step`, req.user)) {
|
|
10
10
|
return res.sendStatus(403);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function processInstallStep(req: ReqType, res: ResType): Promise<void>;
|
|
@@ -1,132 +1,122 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
Adminizer.logger.error(`Failed to upload file: ${fieldName}`, err);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return uploadedFiles;
|
|
132
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
// import {InstallStepper} from "../lib/installStepper/installStepper";
|
|
3
|
+
// import * as path from "path";
|
|
4
|
+
// import {Adminizer} from "../lib/Adminizer";
|
|
5
|
+
// export default async function processInstallStep(req: ReqType, res: ResType): Promise<void> {
|
|
6
|
+
// if (req.adminizer.config.auth.enable) {
|
|
7
|
+
// if (!req.user) {
|
|
8
|
+
// res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
|
+
// return
|
|
10
|
+
// } else if (!req.adminizer.accessRightsHelper.hasPermission(`process-install-step`, req.user)) {
|
|
11
|
+
// res.sendStatus(403);
|
|
12
|
+
// return
|
|
13
|
+
// }
|
|
14
|
+
// }
|
|
15
|
+
// if (req.method.toUpperCase() === 'GET') {
|
|
16
|
+
// Adminizer.log.debug("GET REQUEST TO PROCESS INSTALL STEP")
|
|
17
|
+
// let installStepper = InstallStepper.getStepper(req.params.id);
|
|
18
|
+
// if (!installStepper) {
|
|
19
|
+
// res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
20
|
+
// return
|
|
21
|
+
// }
|
|
22
|
+
// if (installStepper.hasUnprocessedSteps() || installStepper.hasUnfinalizedSteps()) {
|
|
23
|
+
// let renderData = installStepper.render(req);
|
|
24
|
+
// let renderer = renderData.currentStep.renderer;
|
|
25
|
+
// // run onInit method before showing step to user
|
|
26
|
+
// try {
|
|
27
|
+
// await renderData.currentStep.onInit();
|
|
28
|
+
// } catch (e) {
|
|
29
|
+
// console.log("ERROR IN PROCESS INSTALL STEP", e)
|
|
30
|
+
// res.viewAdmin(`installer/error`, {error: e, stepperId: installStepper.id});
|
|
31
|
+
// return
|
|
32
|
+
// }
|
|
33
|
+
// res.viewAdmin(`installer/${renderer}`, {...renderData, stepperId: installStepper.id});
|
|
34
|
+
// return
|
|
35
|
+
// } else {
|
|
36
|
+
// res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
37
|
+
// return
|
|
38
|
+
// }
|
|
39
|
+
// }
|
|
40
|
+
// if (req.method.toUpperCase() === 'POST') {
|
|
41
|
+
// try {
|
|
42
|
+
// Adminizer.log.debug("POST REQUEST TO PROCESS INSTALL STEP", JSON.stringify(req.body, null, 2))
|
|
43
|
+
// let installStepper = InstallStepper.getStepper(req.params.id);
|
|
44
|
+
// const currentStepId = req.body.currentStepId;
|
|
45
|
+
// const filesCounter = req.body.filesCounter;
|
|
46
|
+
// // upload files before processing other fields (filesCounter > 0 means that req contains files)
|
|
47
|
+
// const uploadedFiles = await handleFileUploads(req, currentStepId, filesCounter);
|
|
48
|
+
// if (req.body.action === 'next') {
|
|
49
|
+
// const inputData = JSON.parse(req.body.inputData);
|
|
50
|
+
// if (uploadedFiles.length) {
|
|
51
|
+
// inputData.uploadedFiles = uploadedFiles;
|
|
52
|
+
// }
|
|
53
|
+
// // trying to process step
|
|
54
|
+
// await installStepper.processStep(currentStepId, inputData);
|
|
55
|
+
// } else if (req.body.action === 'skip') {
|
|
56
|
+
// // trying to skip step
|
|
57
|
+
// await installStepper.skipStep(currentStepId);
|
|
58
|
+
// } else {
|
|
59
|
+
// res.status(400).send("Invalid action parameter");
|
|
60
|
+
// return
|
|
61
|
+
// }
|
|
62
|
+
// // go back to stepper if there are more unprocessed steps, otherwise go back to /admin
|
|
63
|
+
// if (installStepper.hasUnprocessedSteps()) {
|
|
64
|
+
// res.redirect(`${req.adminizer.config.routePrefix}/install/${installStepper.id}`);
|
|
65
|
+
// return
|
|
66
|
+
// } else {
|
|
67
|
+
// res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
68
|
+
// return
|
|
69
|
+
// }
|
|
70
|
+
// } catch (error) {
|
|
71
|
+
// Adminizer.log.error("Error processing step:", error);
|
|
72
|
+
// res.status(500).send("Error processing step");
|
|
73
|
+
// return
|
|
74
|
+
// }
|
|
75
|
+
// }
|
|
76
|
+
// if (req.method.toUpperCase() === 'DELETE') {
|
|
77
|
+
// Adminizer.log.debug("DELETE REQUEST TO PROCESS INSTALL STEP", req.body)
|
|
78
|
+
// try {
|
|
79
|
+
// InstallStepper.deleteStepper(req.params.id);
|
|
80
|
+
// res.status(200).send("OK")
|
|
81
|
+
// return
|
|
82
|
+
// } catch (e) {
|
|
83
|
+
// res.status(403).send(e);
|
|
84
|
+
// return
|
|
85
|
+
// }
|
|
86
|
+
// }
|
|
87
|
+
// res.status(500).send("Invalid request method")
|
|
88
|
+
// return
|
|
89
|
+
// };
|
|
90
|
+
// async function handleFileUploads(req: ReqType, currentStepId: string | number, filesCounter: number): Promise<string[]> {
|
|
91
|
+
// const uploadedFiles: string[] = [];
|
|
92
|
+
// for (let i = 0; i < filesCounter; i++) {
|
|
93
|
+
// const fieldName = `files_${i}`;
|
|
94
|
+
// const uploadMiddleware = req.upload({
|
|
95
|
+
// destination: "installStepper/uploadedImages",
|
|
96
|
+
// filename: (file) => {
|
|
97
|
+
// const extension = path.extname(file.originalname);
|
|
98
|
+
// const baseName = path.basename(file.originalname, extension);
|
|
99
|
+
// return `${currentStepId}_${baseName}_${Date.now()}${extension}`;
|
|
100
|
+
// },
|
|
101
|
+
// }).single(fieldName);
|
|
102
|
+
// try {
|
|
103
|
+
// await new Promise<void>((resolve, reject) => {
|
|
104
|
+
// uploadMiddleware(req, null, (err) => {
|
|
105
|
+
// if (err) {
|
|
106
|
+
// Adminizer.logger.error(`Error uploading file: ${fieldName}`, err);
|
|
107
|
+
// reject(err);
|
|
108
|
+
// } else {
|
|
109
|
+
// const uploadedFile = (req.file as Express.Multer.File)?.path;
|
|
110
|
+
// if (uploadedFile) {
|
|
111
|
+
// uploadedFiles.push(uploadedFile);
|
|
112
|
+
// }
|
|
113
|
+
// resolve();
|
|
114
|
+
// }
|
|
115
|
+
// });
|
|
116
|
+
// });
|
|
117
|
+
// } catch (err) {
|
|
118
|
+
// Adminizer.logger.error(`Failed to upload file: ${fieldName}`, err);
|
|
119
|
+
// }
|
|
120
|
+
// }
|
|
121
|
+
// return uploadedFiles;
|
|
122
|
+
// }
|
package/controllers/register.js
CHANGED
|
@@ -5,7 +5,6 @@ export default async function register(req, res) {
|
|
|
5
5
|
return res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
6
6
|
}
|
|
7
7
|
if (req.method.toUpperCase() === "POST") {
|
|
8
|
-
// console.log("req.body", req.body);
|
|
9
8
|
for (const key of ["login", "fullName", "password"]) {
|
|
10
9
|
if (!req.body[key]) {
|
|
11
10
|
let errors = {};
|
|
@@ -40,12 +39,11 @@ export default async function register(req, res) {
|
|
|
40
39
|
}
|
|
41
40
|
else {
|
|
42
41
|
try {
|
|
43
|
-
let passwordHashed = generate(req.body.login + req.body.password);
|
|
42
|
+
let passwordHashed = generate(req.body.login + req.body.password + process.env.AP_PASSWORD_SALT);
|
|
44
43
|
let password = 'masked';
|
|
45
44
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
46
45
|
let userap = await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
|
|
47
46
|
login: req.body.login,
|
|
48
|
-
password: password,
|
|
49
47
|
passwordHashed: passwordHashed,
|
|
50
48
|
fullName: req.body.fullName,
|
|
51
49
|
email: req.body.email,
|
|
@@ -53,7 +51,6 @@ export default async function register(req, res) {
|
|
|
53
51
|
});
|
|
54
52
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
55
53
|
let defaultUserGroup = await req.adminizer.modelHandler.model.get("GroupAP")["_findOne"]({ name: req.adminizer.config.registration.defaultUserGroup });
|
|
56
|
-
console.log(userap);
|
|
57
54
|
// TODO refactor CRUD functions for DataAccessor usage
|
|
58
55
|
await req.adminizer.modelHandler.model.get("UserAP")["_updateOne"]({ id: userap.id }, {
|
|
59
56
|
groups: [defaultUserGroup.id]
|
package/controllers/remove.js
CHANGED
|
@@ -18,10 +18,10 @@ export default async function remove(req, res) {
|
|
|
18
18
|
return res.redirect(`${req.adminizer.config.routePrefix}/${entity.uri}`);
|
|
19
19
|
}
|
|
20
20
|
if (req.adminizer.config.auth.enable) {
|
|
21
|
-
if (!req.
|
|
21
|
+
if (!req.user) {
|
|
22
22
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
23
23
|
}
|
|
24
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.
|
|
24
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
|
|
25
25
|
return res.sendStatus(403);
|
|
26
26
|
}
|
|
27
27
|
}
|
package/controllers/timezones.js
CHANGED
package/controllers/view.js
CHANGED
|
@@ -18,10 +18,10 @@ export default async function view(req, res) {
|
|
|
18
18
|
return res.status(404).send({ error: 'Not Found' });
|
|
19
19
|
}
|
|
20
20
|
if (req.adminizer.config.auth.enable) {
|
|
21
|
-
if (!req.
|
|
21
|
+
if (!req.user) {
|
|
22
22
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
23
23
|
}
|
|
24
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.
|
|
24
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
|
|
25
25
|
return res.sendStatus(403);
|
|
26
26
|
}
|
|
27
27
|
}
|
package/controllers/welcome.js
CHANGED
|
@@ -4,10 +4,10 @@ export async function widgetActionController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetCustomController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetInfoController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -4,10 +4,10 @@ export async function widgetSwitchController(req, res) {
|
|
|
4
4
|
return res.status(404).send({ error: 'Not Found' });
|
|
5
5
|
}
|
|
6
6
|
if (req.adminizer.config.auth.enable) {
|
|
7
|
-
if (!req.
|
|
7
|
+
if (!req.user) {
|
|
8
8
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
9
9
|
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.
|
|
10
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
|
|
11
11
|
return res.sendStatus(403);
|
|
12
12
|
}
|
|
13
13
|
}
|
package/controllers/widgetsDB.js
CHANGED
|
@@ -2,17 +2,17 @@ export default async function widgetsDB(req, res) {
|
|
|
2
2
|
let id = 0;
|
|
3
3
|
let auth = req.adminizer.config.auth.enable;
|
|
4
4
|
if (auth) {
|
|
5
|
-
if (!req.
|
|
5
|
+
if (!req.user) {
|
|
6
6
|
return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
7
7
|
}
|
|
8
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.
|
|
8
|
+
else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
|
|
9
9
|
return res.sendStatus(403);
|
|
10
10
|
}
|
|
11
|
-
id = req.
|
|
11
|
+
id = req.user.id;
|
|
12
12
|
}
|
|
13
13
|
if (req.method.toUpperCase() === 'GET') {
|
|
14
14
|
try {
|
|
15
|
-
let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth);
|
|
15
|
+
let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth, req.i18n);
|
|
16
16
|
return res.json({ widgetsDB: widgets });
|
|
17
17
|
}
|
|
18
18
|
catch (e) {
|
|
@@ -25,7 +25,7 @@ export default async function widgetsDB(req, res) {
|
|
|
25
25
|
}
|
|
26
26
|
try {
|
|
27
27
|
return res.json({
|
|
28
|
-
userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body
|
|
28
|
+
userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body, auth),
|
|
29
29
|
status: 'ok'
|
|
30
30
|
});
|
|
31
31
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UserAP } from "models/UserAP";
|
|
1
2
|
import { AccessRightsToken } from "../interfaces/types";
|
|
2
3
|
import { Adminizer } from "../lib/Adminizer";
|
|
3
4
|
export declare class AccessRightsHelper {
|
|
@@ -9,6 +10,6 @@ export declare class AccessRightsHelper {
|
|
|
9
10
|
getTokens(): AccessRightsToken[];
|
|
10
11
|
getTokensByDepartment(department: string): AccessRightsToken[];
|
|
11
12
|
getAllDepartments(): string[];
|
|
12
|
-
enoughPermissions(tokens: string[], user:
|
|
13
|
-
hasPermission(tokenId: string, user:
|
|
13
|
+
enoughPermissions(tokens: string[], user: UserAP): boolean;
|
|
14
|
+
hasPermission(tokenId: string, user: UserAP): boolean;
|
|
14
15
|
}
|