From d884f18908cf417f6f812f1d6630927bc3eb51d9 Mon Sep 17 00:00:00 2001 From: SavaletDev Date: Sat, 3 Sep 2022 20:13:59 +0200 Subject: [PATCH] Update --- api/package-lock.json | 220 +-- api/package.json | 2 +- api/routes/index.js | 116 +- api/routes/products/edit-product.js | 116 +- api/routes/products/proxmox-nodes-list.js | 76 +- api/routes/products/ptero-create-product.js | 28 +- api/routes/services/delete-service.js | 34 +- api/routes/services/order-form.js | 140 +- api/routes/services/service-edit.js | 54 + api/routes/services/service-info.js | 160 ++ api/routes/services/services.js | 96 +- api/server.js | 186 +- assets/js/charts/dashboard.js | 560 +++--- assets/js/pages/services/service-edit.js | 196 ++ assets/js/pages/services/service-game.js | 302 +++ assets/js/pages/services/services.js | 69 +- dashboard/index.html | 1208 ++++++------ .../products/create-proxmox-product.html | 1080 ++++++----- dashboard/products/create-ptero-product.html | 1124 ++++++----- dashboard/products/game-pricings.html | 976 +++++----- dashboard/products/order-form.html | 1640 +++++++++-------- dashboard/products/proxmox-product-edit.html | 1080 ++++++----- dashboard/products/proxmox-products-list.html | 966 +++++----- dashboard/products/ptero-product-edit.html | 1118 ++++++----- dashboard/products/ptero-products-list.html | 922 ++++----- dashboard/products/vps-pricings.html | 976 +++++----- dashboard/roles/create-role.html | 1175 ++++++------ dashboard/roles/role-edit.html | 1223 ++++++------ dashboard/roles/roles-list.html | 964 +++++----- dashboard/services/service-edit.html | 609 ++++++ dashboard/services/service-game.html | 655 +++++++ dashboard/services/services-list.html | 950 +++++----- dashboard/services/services.html | 545 ++++++ dashboard/users/create-user.html | 1542 ++++++++-------- dashboard/users/user-edit.html | 1541 ++++++++-------- dashboard/users/users-list.html | 970 +++++----- mysql_dump.sql | 2 +- 37 files changed, 13874 insertions(+), 9747 deletions(-) create mode 100644 api/routes/services/service-edit.js create mode 100644 api/routes/services/service-info.js create mode 100644 assets/js/pages/services/service-edit.js create mode 100644 assets/js/pages/services/service-game.js create mode 100644 dashboard/services/service-edit.html create mode 100644 dashboard/services/service-game.html create mode 100644 dashboard/services/services.html diff --git a/api/package-lock.json b/api/package-lock.json index 815d490..85a91cb 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -21,7 +21,7 @@ "ipware": "^2.0.0", "jsonwebtoken": "^8.5.1", "mysql": "^2.18.1", - "node-fetch": "^3.2.6", + "node-fetch": "^2.6.7", "nodemailer": "^6.7.7", "raw-body": "^2.5.1", "readline": "^1.3.0", @@ -38,25 +38,6 @@ "ws": "^8.5.0" } }, - "node_modules/@devnote-dev/pterojs/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", @@ -76,25 +57,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -414,25 +376,6 @@ "node-fetch": "2.6.7" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/crypto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", @@ -450,14 +393,6 @@ "node": ">=0.10" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "engines": { - "node": ">= 12" - } - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -627,28 +562,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -687,17 +600,6 @@ "node": ">= 0.12" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1263,39 +1165,23 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/nodemailer": { @@ -1869,14 +1755,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "engines": { - "node": ">= 8" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1938,16 +1816,6 @@ "requires": { "node-fetch": "^2.6.7", "ws": "^8.5.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } } }, "@mapbox/node-pre-gyp": { @@ -1964,16 +1832,6 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } } }, "abbrev": { @@ -2229,16 +2087,6 @@ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { "node-fetch": "2.6.7" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - } } }, "crypto": { @@ -2254,11 +2102,6 @@ "assert-plus": "^1.0.0" } }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2398,15 +2241,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -2436,14 +2270,6 @@ "mime-types": "^2.1.12" } }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "fetch-blob": "^3.1.2" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2892,19 +2718,12 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - }, "node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" } }, "nodemailer": { @@ -3347,11 +3166,6 @@ } } }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/api/package.json b/api/package.json index a88be62..915bc88 100644 --- a/api/package.json +++ b/api/package.json @@ -21,7 +21,7 @@ "ipware": "^2.0.0", "jsonwebtoken": "^8.5.1", "mysql": "^2.18.1", - "node-fetch": "^3.2.6", + "node-fetch": "^2.6.7", "nodemailer": "^6.7.7", "raw-body": "^2.5.1", "readline": "^1.3.0", diff --git a/api/routes/index.js b/api/routes/index.js index e9cf85d..e59058e 100644 --- a/api/routes/index.js +++ b/api/routes/index.js @@ -2,89 +2,99 @@ var router = require('express').Router(); const server = require('../server.js') const route_name = "/" server.logger(" [INFO] /api" + route_name + " route loaded !") - +function getRandomInt(max, min) { + return Math.floor(Math.random() * (max - min)) + min; +} router.get('', (req, res) => { var forwardedIpsStr = req.header('x-forwarded-for'); var IP = ''; if (forwardedIpsStr) { - IP = forwardedIps = forwardedIpsStr.split(',')[0]; + IP = forwardedIps = forwardedIpsStr.split(',')[0]; } server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`) var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; server.con.query(sql, function (err, result) { - if (err) {logger(" [ERROR] Database error\n " + err)}; + if (err) { logger(" [ERROR] Database error\n " + err) }; if (result.length == 0) { - return res.json({'error': true, 'code': 404}) + return res.json({ 'error': true, 'code': 404 }) } else { if (result[0].token === req.query.token) { var sql = `SELECT * FROM users WHERE uuid = '${req.query.uuid}'`; server.con.query(sql, function (err, result1) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; var sql = `SELECT * FROM roles WHERE id = '${result1[0].role}'`; server.con.query(sql, function (err, result2) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; var activity = [] activity.push({ - "name": "Maintenance Serveur Epsilon", - "date": "17 FEV 15:59" + "name": "Maintenance Serveur PVE-1", + "date": "17 FEV 15:59" }) activity.push({ - "name": "Maintenance réseau", - "date": "11 JUL 8:10" + "name": "Maintenance réseau", + "date": "11 JUL 8:10" }) activity.push({ - "name": "Maintenance DNS", - "date": "15 JUN 11:00" + "name": "Maintenance DNS", + "date": "15 JUN 11:00" }) + var cpu = [] + var ram = [] + for (let i = 0; i < 24; i++) { + cpu.push(getRandomInt(80, 10)) + } + for (let i = 0; i < 24; i++) { + ram.push(getRandomInt(60, 30)) + } return res.json( - { - "error": false, - "username": "Savalet", - "role": result1[0].role, - "role_name": result2[0].name, - "permissions": result2[0].permissions, - "stats_array": { - "CPU": [15, 5, 25, 86, 45, 66, 15], - "RAM": [72, 96, 56, 60, 74, 60, 78] - }, - "counters": [58.6 + '€', 68.5 + '€', 16, 3, 0, 0], - "activity": activity, - "invoices_table": [ - { - "name": "Paiement par mois VPS5", - "date": "18/03/2022", - "price": 185.25, - "status": "Terminé" + { + "error": false, + "username": result1[0].username, + "role": result1[0].role, + "role_name": result2[0].name, + "permissions": result2[0].permissions, + "stats_array": { + "CPU": cpu, + "RAM": ram }, - { - "name": "Developpement site web", - "date": "22/02/2022", - "price": 18.80, - "status": "En Attente" - }, { - "name": "Paiement par mois DEDI1", - "date": "22/02/2022", - "price": 485.25, - "status": "Remboursé" - }, - { - "name": "Paiement par mois VPS5", - "date": "18/02/2022", - "price": 185.25, - "status": "Terminé" - } - ], + "counters": [58.6 + '€', 68.5 + '€', 16, 3, 0, 0], + "activity": activity, + "invoices_table": [ + { + "name": "Paiement par mois VPS5", + "date": "18/03/2022", + "price": 185.25, + "status": "Terminé" + }, + { + "name": "Developpement site web", + "date": "22/02/2022", + "price": 18.80, + "status": "En Attente" + }, { + "name": "Paiement par mois DEDI1", + "date": "22/02/2022", + "price": 485.25, + "status": "Remboursé" + }, + { + "name": "Paiement par mois VPS5", + "date": "18/02/2022", + "price": 185.25, + "status": "Terminé" + } + ], "get_ip": IP }); - + }) }) - } else { - return res.json({'error': true, 'code': 403}) - } + } else { + return res.json({ 'error': true, 'code': 403 }) } - }); + } + }); }); module.exports = router; \ No newline at end of file diff --git a/api/routes/products/edit-product.js b/api/routes/products/edit-product.js index 9767a7c..4ccf435 100644 --- a/api/routes/products/edit-product.js +++ b/api/routes/products/edit-product.js @@ -6,67 +6,67 @@ const permissions_manager = require("../../utils/permissions-manager.js") server.logger(" [INFO] /api" + route_name + " route loaded !") router.post('', jsonParser, function (req, res) { - ipInfo = server.ip(req); - var response = "OK" - var error = false - var forwardedIpsStr = req.header('x-forwarded-for'); - var IP = ''; - - if (forwardedIpsStr) { - IP = forwardedIps = forwardedIpsStr.split(',')[0]; - } - var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; - server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; - if (result.length == 0) { - return res.json({'error': true, 'code': 404}) - } else { - if (result[0].token === req.query.token) { - permissions_manager.has_permission(req.query.uuid, "EDITPRODUCT").then(function(result) { - if (result) { - var configuration = {} - if (req.body.category == "pterodactyl") { - configuration = { - 'cpu': req.body.cpu, - 'cpu_pinning': req.body.cpu_pinning, - 'ram': req.body.ram, - 'disk': req.body.disk, - 'swap': req.body.swap, - 'io': req.body.io, - 'egg': req.body.egg, - 'startup_command': req.body.startup_command, - 'env': JSON.parse(req.body.env) - } + ipInfo = server.ip(req); + var response = "OK" + var error = false + var forwardedIpsStr = req.header('x-forwarded-for'); + var IP = ''; + + if (forwardedIpsStr) { + IP = forwardedIps = forwardedIpsStr.split(',')[0]; + } + var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; + server.con.query(sql, function (err, result) { + if (err) { server.logger(" [ERROR] Database error\n " + err) }; + if (result.length == 0) { + return res.json({ 'error': true, 'code': 404 }) + } else { + if (result[0].token === req.query.token) { + permissions_manager.has_permission(req.query.uuid, "EDITPRODUCT").then(function (result) { + if (result) { + var configuration = {} + if (req.body.category == "pterodactyl") { + configuration = { + 'cpu': req.body.cpu, + 'cpu_pinning': req.body.cpu_pinning, + 'ram': req.body.ram, + 'disk': req.body.disk, + 'swap': req.body.swap, + 'io': req.body.io, + 'egg': req.body.egg, + 'startup_command': req.body.startup_command, + 'env': JSON.parse(req.body.env) } - if (req.body.category == "proxmox") { - configuration = { - 'node': req.body.node, - 'template_vmid': req.body.template_vm, - 'cores': req.body.cores, - 'ram': req.body.ram, - 'storage': req.body.storage, - 'disk_size': req.body.disk_size, - 'add_conf': req.body.add_conf - } - } - var sql = `UPDATE products SET name = '${req.body.name}', description = '${req.body.description}', price = '${req.body.price}', configuration = '${JSON.stringify(configuration)}' WHERE id = '${req.body.id}';`; - server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err); return res.json({"error": true, "msg": "Database error : " + err})}; - }); - server.logger(" [DEBUG] Product " + req.body.name + " updated from " + IP + " !") - return res.json({"error": false, "response": "OK"}); - } else { - return res.json({ - "error": true, - "code": 403 - }) } - }) + if (req.body.category == "proxmox") { + configuration = { + 'node': req.body.node, + 'template_vmid': req.body.template_vm, + 'cores': req.body.cores, + 'ram': req.body.ram, + 'storage': req.body.storage, + 'disk_size': req.body.disk_size, + 'add_conf': req.body.add_conf + } + } + var sql = `UPDATE products SET name = '${req.body.name}', description = '${req.body.description}', price = '${req.body.price}', configuration = '${JSON.stringify(configuration)}' WHERE id = '${req.body.id}';`; + server.con.query(sql, function (err, result) { + if (err) { server.logger(" [ERROR] Database error\n " + err); return res.json({ "error": true, "msg": "Database error : " + err }) }; + }); + server.logger(" [DEBUG] Product " + req.body.name + " updated from " + IP + " !") + return res.json({ "error": false, "response": "OK" }); } else { - return res.json({'error': true, 'code': 403}) + return res.json({ + "error": true, + "code": 403 + }) } - } - }); - }) + }) + } else { + return res.json({ 'error': true, 'code': 403 }) + } + } + }); +}) module.exports = router; \ No newline at end of file diff --git a/api/routes/products/proxmox-nodes-list.js b/api/routes/products/proxmox-nodes-list.js index c0b228a..fd37ed4 100644 --- a/api/routes/products/proxmox-nodes-list.js +++ b/api/routes/products/proxmox-nodes-list.js @@ -7,52 +7,52 @@ const route_name = "/products/proxmox-nodes-list" server.logger(" [INFO] /api" + route_name + " route loaded !") router.get('', function (req, res) { - ipInfo = server.ip(req); - var forwardedIpsStr = req.header('x-forwarded-for'); + ipInfo = server.ip(req); + var forwardedIpsStr = req.header('x-forwarded-for'); var IP = ''; if (forwardedIpsStr) { - IP = forwardedIps = forwardedIpsStr.split(',')[0]; + IP = forwardedIps = forwardedIpsStr.split(',')[0]; } server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`) - var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; - server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; - if (result.length == 0) { - return res.json({'error': true, 'code': 404}) - } else { - if (result[0].token === req.query.token) { - permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function(result) { - if (result) { - server.fetch(`${config.proxmox_url}/api2/json/nodes`, { - "method": "GET", - "headers": { - "CSRFPreventionToken": server.proxmox_CSRFPreventionToken, - "Cookie": "PVEAuthCookie=" + server.proxmox_ticket - }, - "agent": server.httpsAgent + var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; + server.con.query(sql, function (err, result) { + if (err) { server.logger(" [ERROR] Database error\n " + err) }; + if (result.length == 0) { + return res.json({ 'error': true, 'code': 404 }) + } else { + if (result[0].token === req.query.token) { + permissions_manager.has_permission(req.query.uuid, "LISTPRODUCTS").then(function (result) { + if (result) { + server.fetch(`${config.proxmox_url}/api2/json/nodes`, { + "method": "GET", + "headers": { + "CSRFPreventionToken": server.proxmox_CSRFPreventionToken, + "Cookie": "PVEAuthCookie=" + server.proxmox_ticket + }, + "agent": server.httpsAgent }).then(response => { - return response.json() + return response.json() }) - .then(data => { - return res.json({'error': false, 'nodes': data.data}) - }) - .catch(err => { - server.logger(" [ERROR] Proxmox API Error " + err) - return res.json({"error": true, "code": 1000, "msg": err}) - }); - } else { - return res.json({ - "error": true, - "code": 403 + .then(data => { + return res.json({ 'error': false, 'nodes': data.data }) }) - } - }) - } else { - return res.json({'error': true, 'code': 403}) - } + .catch(err => { + server.logger(" [ERROR] Proxmox API Error " + err) + return res.json({ "error": true, "code": 1000, "msg": err }) + }); + } else { + return res.json({ + "error": true, + "code": 403 + }) + } + }) + } else { + return res.json({ 'error': true, 'code': 403 }) } - }); + } + }); }) - + module.exports = router; \ No newline at end of file diff --git a/api/routes/products/ptero-create-product.js b/api/routes/products/ptero-create-product.js index fab91c8..20c64f9 100644 --- a/api/routes/products/ptero-create-product.js +++ b/api/routes/products/ptero-create-product.js @@ -7,21 +7,21 @@ server.logger(" [INFO] /api" + route_name + " route loaded !") router.post('', jsonParser, function (req, res) { ipInfo = server.ip(req); - var forwardedIpsStr = req.header('x-forwarded-for'); + var forwardedIpsStr = req.header('x-forwarded-for'); var IP = ''; if (forwardedIpsStr) { - IP = forwardedIps = forwardedIpsStr.split(',')[0]; + IP = forwardedIps = forwardedIpsStr.split(',')[0]; } server.logger(' [DEBUG] GET /api' + route_name + ' from ' + IP + ` with uuid ${req.query.uuid}`) var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; if (result.length == 0) { - return res.json({'error': true, 'code': 404}) + return res.json({ 'error': true, 'code': 404 }) } else { if (result[0].token === req.query.token) { - permissions_manager.has_permission(req.query.uuid, "CREATEPRODUCT").then(function(result) { + permissions_manager.has_permission(req.query.uuid, "CREATEPRODUCT").then(function (result) { if (result) { configuration = { 'cpu': req.body.cpu, @@ -33,13 +33,13 @@ router.post('', jsonParser, function (req, res) { 'egg': req.body.egg, 'startup_command': req.body.startup_command, 'env': JSON.parse(req.body.env) - } + } var sql = `INSERT INTO products (id, category, name, description, price, configuration) VALUES('${server.crypto.randomBytes(3).toString('hex')}', 'pterodactyl', '${req.body.name}', '${req.body.description}', '${req.body.price}', '${JSON.stringify(configuration)}')`; server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; }); - server.logger(" [DEBUG] Product " + req.body.name + " created from " + IP + " !") - return res.json({"error": false, "response": "OK"}); + server.logger(" [DEBUG] Product " + req.body.name + " created from " + IP + " !") + return res.json({ "error": false, "response": "OK" }); } else { return res.json({ "error": true, @@ -47,11 +47,11 @@ router.post('', jsonParser, function (req, res) { }) } }) - } else { - return res.json({'error': true, 'code': 403}) - } + } else { + return res.json({ 'error': true, 'code': 403 }) } - }); - }) + } + }); +}) module.exports = router; \ No newline at end of file diff --git a/api/routes/services/delete-service.js b/api/routes/services/delete-service.js index f7ae600..c7b4b72 100644 --- a/api/routes/services/delete-service.js +++ b/api/routes/services/delete-service.js @@ -2,6 +2,7 @@ var router = require('express').Router(); const server = require('../../server.js') var jsonParser = server.parser.json() const route_name = "/services/delete-service" +const config = require('../../config.json') const permissions_manager = require("../../utils/permissions-manager.js") server.logger(" [INFO] /api" + route_name + " route loaded !") @@ -13,23 +14,38 @@ router.delete('', jsonParser, function (req, res) { var IP = ''; if (forwardedIpsStr) { - IP = forwardedIps = forwardedIpsStr.split(',')[0]; + IP = forwardedIps = forwardedIpsStr.split(',')[0]; } var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; if (result.length == 0) { - return res.json({'error': true, 'code': 404}) + return res.json({ 'error': true, 'code': 404 }) } else { if (result[0].token === req.query.token) { - permissions_manager.has_permission(req.query.uuid, "DELETESERVICE").then(function(result) { + permissions_manager.has_permission(req.query.uuid, "DELETESERVICE").then(function (result) { if (result) { - var sql = `DELETE FROM services WHERE id='${req.body.id}'`; + var sql = `SELECT * FROM services WHERE id = '${req.body.id}'`; server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error"}; + if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" }; + if (result[0].category == 'pterodactyl') { + service_config = JSON.parse(result[0].configuration) + server.fetch(config.pterodactyl_url + "/api/application/servers/" + service_config.id, { + "method": "DELETE", + "headers": { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": `Bearer ${config.pterodactyl_api_key}`, + } + }).catch(err => { server.logger(" [ERROR] Pterodactyl API error : " + err); return res.json({ "error": true, "code": 503, "msg": "Pterodactyl API error : " + err }) }) + } + var sql = `DELETE FROM services WHERE id='${req.body.id}'`; + server.con.query(sql, function (err) { + if (err) { server.logger(" [ERROR] Database error\n " + err), error = true, response = "Database error" }; + }); + server.logger(" [DEBUG] Service " + req.body.id + " deleted from " + IP + " !") + return res.json({ "error": error, "response": response }); }); - server.logger(" [DEBUG] Service " + req.body.id + " deleted from " + IP + " !") - return res.json({"error": error, "response": response}); } else { return res.json({ "error": true, @@ -38,7 +54,7 @@ router.delete('', jsonParser, function (req, res) { } }) } else { - return res.json({'error': true, 'code': 403}) + return res.json({ 'error': true, 'code': 403 }) } } }); diff --git a/api/routes/services/order-form.js b/api/routes/services/order-form.js index 067e0c8..c27da75 100644 --- a/api/routes/services/order-form.js +++ b/api/routes/services/order-form.js @@ -7,83 +7,99 @@ const route_name = "/services/order-form" server.logger(" [INFO] /api" + route_name + " route loaded !") router.post('', jsonParser, function (req, res) { + ipInfo = server.ip(req); + var forwardedIpsStr = req.header('x-forwarded-for'); + var IP = ''; + + if (forwardedIpsStr) { + IP = forwardedIps = forwardedIpsStr.split(',')[0]; + } var sql = `SELECT token FROM users WHERE uuid = '${req.query.uuid}'`; server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; + if (err) { server.logger(" [ERROR] Database error\n " + err) }; if (result.length == 0) { - return res.json({'error': true, 'code': 404}) + return res.json({ 'error': true, 'code': 404 }) } else { if (result[0].token === req.query.token) { var sql = `SELECT * FROM products WHERE id = '${req.body.product_id}'`; - server.con.query(sql, function (err, result) { - if (err) {server.logger(" [ERROR] Database error\n " + err)}; - if (result[0].category == "pterodactyl") { - var docker_img = "ghcr.io/pterodactyl/yolks:java_17" - configuration = JSON.parse(result[0].configuration) - let data = { - 'name': result[0].name + " " + req.body.srv_info.srv_name + " (" + req.body.user_info.first_name + " " + req.body.user_info.last_name + ")", + server.con.query(sql, async function (err, result) { + if (err) { server.logger(" [ERROR] Database error\n " + err) }; + if (result[0].category == "pterodactyl") { + var docker_img = "ghcr.io/pterodactyl/yolks:java_17" + configuration = JSON.parse(result[0].configuration) + let body = { + 'name': result[0].name + " " + req.body.srv_info.srv_name, "user": 1, "egg": parseInt(configuration.egg), 'docker_image': docker_img, 'startup': configuration.startup_command, "limits": { - "memory": parseInt(configuration.ram), - "swap": parseInt(configuration.swap), - "disk": parseInt(configuration.disk), - "io": parseInt(configuration.io), - "cpu": parseInt(configuration.cpu) - }, - "feature_limits": { - 'databases': parseInt(req.body.srv_info.db_sup), - 'allocations': 0, - 'backups': parseInt(req.body.srv_info.bkp_sup), - }, - "environment": configuration.env, - "allocation": { - "default": 1, - "addtional": [] - }, - "deploy": { - "locations": [2], - "dedicated_ip": false, - "port_range": [] - }, - "start_on_completion": false, - "skip_scripts": false, - "oom_disabled": true - } - server.fetch(config.pterodactyl_url + "/api/application/servers", { - "method": "POST", - "headers": { - "Accept": "application/json", - "Content-Type": "application/json", - "Authorization": `Bearer ${config.pterodactyl_api_key}`, - }, - "body": JSON.stringify(data) - }).catch(err => {server.logger(" [ERROR] Pterodactyl API error : " + err); return req.json({"error": true, "code": 503, "msg": "Pterodactyl API error : " + err})}).then(() => { - server.mail_transporter.sendMail({ - from: config.smtp_username, - to: req.body.user_info.mail, - subject: "Service " + req.body.srv_info.srv_name + " créé avec succès !", - html: "