"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = refreshUsersAndGrants; const generate_password_1 = __importDefault(require("generate-password")); const noDatabaseDbHandler_1 = __importDefault(require("../utils/noDatabaseDbHandler")); const dbHandler_1 = __importDefault(require("../utils/dbHandler")); const handleGrants_1 = __importDefault(require("./handleGrants")); const encrypt_1 = __importDefault(require("../../functions/dsql/encrypt")); const decrypt_1 = __importDefault(require("../../functions/dsql/decrypt")); /** * # Refresh Mariadb User Grants */ function refreshUsersAndGrants(_a) { return __awaiter(this, arguments, void 0, function* ({ userId, mariadbUserHost, mariadbUsername, sqlUserID, }) { var _b, _c, _d; const mariadbUsers = (yield (0, dbHandler_1.default)({ query: `SELECT * FROM mariadb_users`, })); if (!(mariadbUsers === null || mariadbUsers === void 0 ? void 0 : mariadbUsers[0])) { return; } const isRootUser = userId ? userId == Number(process.env.DSQL_SU_USER_ID) : false; const isWildcardHost = mariadbUserHost == "%"; if (isWildcardHost && !isRootUser) { return; } for (let i = 0; i < mariadbUsers.length; i++) { const mariadbUser = mariadbUsers[i]; if (!mariadbUser) continue; if (userId && mariadbUser.user_id != userId) continue; if (sqlUserID && mariadbUser.id != sqlUserID) continue; try { const { username, password, host, user_id } = mariadbUser; const existingUser = yield (0, noDatabaseDbHandler_1.default)(`SELECT * FROM mysql.user WHERE User = '${username}' AND Host = '${host}'`); const isUserExisting = Boolean((_b = existingUser === null || existingUser === void 0 ? void 0 : existingUser[0]) === null || _b === void 0 ? void 0 : _b.User); const isPrimary = ((_c = String(mariadbUser.primary)) === null || _c === void 0 ? void 0 : _c.match(/1/)) ? true : false; const dsqlPassword = (mariadbUser === null || mariadbUser === void 0 ? void 0 : mariadbUser.password) ? (0, decrypt_1.default)({ encryptedString: mariadbUser.password }) : isUserExisting && password ? (0, decrypt_1.default)({ encryptedString: password }) : generate_password_1.default.generate({ length: 16, numbers: true, symbols: true, uppercase: true, exclude: "*#.'`\"", }); const encryptedPassword = (mariadbUser === null || mariadbUser === void 0 ? void 0 : mariadbUser.password) ? mariadbUser.password : isUserExisting ? password : (0, encrypt_1.default)({ data: dsqlPassword }); if (!isUserExisting) { if (isWildcardHost) { const _existingUsers = (yield (0, noDatabaseDbHandler_1.default)(`SELECT * FROM mysql.user WHERE user='${mariadbUsername}'`)); for (let i = 0; i < _existingUsers.length; i++) { const exUsr = _existingUsers[i]; yield (0, noDatabaseDbHandler_1.default)(`DROP USER '${exUsr.User}'@'${exUsr.Host}'`); } } const createNewUser = yield (0, noDatabaseDbHandler_1.default)(`CREATE USER IF NOT EXISTS '${mariadbUsername}'@'${mariadbUserHost}' IDENTIFIED BY '${dsqlPassword}'`); } if (isPrimary) { const updateUser = yield (0, dbHandler_1.default)({ query: `UPDATE users SET mariadb_user = ?, mariadb_host = ?, mariadb_pass = ? WHERE id = ?`, values: [ mariadbUsername, mariadbUserHost, encryptedPassword, user_id, ], }); } const isGrantHandled = yield (0, handleGrants_1.default)({ username: mariadbUser.username, host: mariadbUser.host, grants: mariadbUser.grants && typeof mariadbUser.grants == "string" ? JSON.parse(mariadbUser.grants) : [], userId: String(user_id), }); if (!isGrantHandled) { console.log(`Error in handling grants for user ${mariadbUser.username}@${mariadbUser.host}`); } } catch (error) { (_d = global.ERROR_CALLBACK) === null || _d === void 0 ? void 0 : _d.call(global, `Error Refreshing MariaDB Users and Grants`, error); } } }); }