dsql-admin/dsql-app/.local_dist/server/pages/admin/[user_id]/connect.js
2024-11-06 13:57:20 +01:00

1552 lines
70 KiB
JavaScript

"use strict";
(() => {
var exports = {};
exports.id = 3095;
exports.ids = [3095];
exports.modules = {
/***/ 5782:
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
"ConnectContext": () => (/* binding */ ConnectContext),
"default": () => (/* binding */ DatabaseSchema),
"getServerSideProps": () => (/* binding */ getServerSideProps)
});
// EXTERNAL MODULE: external "react/jsx-runtime"
var jsx_runtime_ = __webpack_require__(997);
// EXTERNAL MODULE: external "react"
var external_react_ = __webpack_require__(6689);
var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_);
// EXTERNAL MODULE: ./layouts/AdminLayout.jsx + 2 modules
var AdminLayout = __webpack_require__(4858);
// EXTERNAL MODULE: ./functions/backend/userAuth.js
var userAuth = __webpack_require__(370);
var userAuth_default = /*#__PURE__*/__webpack_require__.n(userAuth);
// EXTERNAL MODULE: ./package-shared/utils/backend/global-db/DB_HANDLER.js
var DB_HANDLER = __webpack_require__(9395);
var DB_HANDLER_default = /*#__PURE__*/__webpack_require__.n(DB_HANDLER);
// EXTERNAL MODULE: ./components/general/Breadcrumbs.jsx
var Breadcrumbs = __webpack_require__(424);
;// CONCATENATED MODULE: external "@mui/icons-material/ContentCopyOutlined"
const ContentCopyOutlined_namespaceObject = require("@mui/icons-material/ContentCopyOutlined");
var ContentCopyOutlined_default = /*#__PURE__*/__webpack_require__.n(ContentCopyOutlined_namespaceObject);
;// CONCATENATED MODULE: external "@mui/icons-material/SystemUpdateAltOutlined"
const SystemUpdateAltOutlined_namespaceObject = require("@mui/icons-material/SystemUpdateAltOutlined");
var SystemUpdateAltOutlined_default = /*#__PURE__*/__webpack_require__.n(SystemUpdateAltOutlined_namespaceObject);
;// CONCATENATED MODULE: ./components/admin/connect/ConnectionInfo.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
*/ function ConnectionInfo(props) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { user , query , mariadbUserCred } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ jsx_runtime_.jsx("section", {
className: "paper",
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "You can connect to your database remotely using any MySQL/Mariadb client. Use these credentials to connect:"
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("ul", {
className: "m-0",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Server:",
" ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: "172.72.0.32" || 0
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Username: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: mariadbUserCred.mariadb_user
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Host: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: mariadbUserCred.mariadb_host
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Password: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: "*****************"
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
className: "ghost inline-block -my-4",
onClick: (e)=>{
navigator.clipboard.writeText(mariadbUserCred.mariadb_pass || "").then(()=>{
window.alert("Copied Password!");
});
},
children: /*#__PURE__*/ jsx_runtime_.jsx((ContentCopyOutlined_default()), {})
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("li", {
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex",
children: [
"SSL Certificate:",
" ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "flex items-center gap-2",
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("a", {
href: "https://datasquirel.com/documents/ssl/ca-cert.pem",
className: "flex items-center gap-2 border-none hover:opacity-60",
target: "_blank",
children: [
/*#__PURE__*/ jsx_runtime_.jsx((SystemUpdateAltOutlined_default()), {
className: "-mt-[3px]"
}),
"Download"
]
})
})
})
]
})
})
]
})
]
})
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: external "@mui/icons-material/EditNoteOutlined"
const EditNoteOutlined_namespaceObject = require("@mui/icons-material/EditNoteOutlined");
var EditNoteOutlined_default = /*#__PURE__*/__webpack_require__.n(EditNoteOutlined_namespaceObject);
// EXTERNAL MODULE: ./components/general/GeneralPopup.jsx
var GeneralPopup = __webpack_require__(5472);
// EXTERNAL MODULE: ./components/general/LoadingBlock.jsx
var LoadingBlock = __webpack_require__(5264);
// EXTERNAL MODULE: external "@mui/icons-material/DeleteOutlineOutlined"
var DeleteOutlineOutlined_ = __webpack_require__(8757);
var DeleteOutlineOutlined_default = /*#__PURE__*/__webpack_require__.n(DeleteOutlineOutlined_);
// EXTERNAL MODULE: ./functions/frontend/fetchApi.js
var fetchApi = __webpack_require__(6729);
;// CONCATENATED MODULE: ./components/admin/connect/MariaDBUserCard.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
* @param {import("@/package-shared/types").MYSQL_mariadb_users_table_def} props.mariadbUser
*/ function MariaDBUserCard({ mariadbUser }) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { setTargetMariadbUser } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ const isPrimary = String(mariadbUser.primary)?.match(/1/) ? true : false;
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ const [loading, setLoading] = external_react_default().useState(false);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "card w-full col" + (isPrimary ? " green" : ""),
children: [
loading && /*#__PURE__*/ jsx_runtime_.jsx(LoadingBlock/* default */.Z, {
width: "25px"
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "w-full justify-between h-auto md:h-8 flex-wrap",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "title",
children: [
mariadbUser.username,
"@",
mariadbUser.host
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
children: [
isPrimary && /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "info small w-auto",
children: "Primary User"
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
className: "ghost",
title: "Edit User",
onClick: (e)=>{
setTargetMariadbUser(mariadbUser);
(0,GeneralPopup/* openPopup */.Mw)("edit-mariadb-user-popup");
},
children: /*#__PURE__*/ jsx_runtime_.jsx((EditNoteOutlined_default()), {})
}),
!isPrimary && /*#__PURE__*/ jsx_runtime_.jsx("button", {
className: "ghost -ml-6",
title: "Edit User",
onClick: (e)=>{
if (window.confirm("Are you sure you want to delete this User?")) {
setLoading(true);
(0,fetchApi/* default */.Z)("/api/sql-users/delete", {
method: "POST",
body: {
id: mariadbUser.id
}
}, true).then((res)=>{
if (res.success) {
window.location.reload();
} else if (res.msg) {
window.alert(res.msg);
}
}).finally(()=>{
setTimeout(()=>{
setLoading(false);
}, 1000);
});
}
},
children: /*#__PURE__*/ jsx_runtime_.jsx((DeleteOutlineOutlined_default()), {})
})
]
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("ul", {
className: "m-0",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Username: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: mariadbUser.username
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Host: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: mariadbUser.host
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "info gray font-normal",
children: "% is a wildcard. Example: 192.168.1.%"
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("li", {
children: [
"Password: ",
/*#__PURE__*/ jsx_runtime_.jsx("b", {
children: "*****************"
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
className: "ghost inline-block -my-4",
onClick: (e)=>{
navigator.clipboard.writeText(mariadbUser.password || "").then(()=>{
window.alert("Copied Password!");
});
},
children: /*#__PURE__*/ jsx_runtime_.jsx((ContentCopyOutlined_default()), {
className: "text-[15px] -ml-2"
})
})
]
})
]
})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/MariaDBUsers.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
*/ function MariaDBUsers(props) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { mariadbUsers } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("section", {
className: "paper",
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "w-full justify-between",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("h2", {
className: "text-xl m-0",
children: "SQL Users"
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
children: /*#__PURE__*/ jsx_runtime_.jsx("button", {
onClick: (e)=>{
(0,GeneralPopup/* openPopup */.Mw)("new-mariadb-user-popup");
},
children: "Add SQL User"
})
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "You can customize your SQL users and permissions here. You can add up to 10 hosts/IP addresses (including your primary host)"
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "grid w-full grid-cols-1 xl:grid-cols-2 gap-6",
children: mariadbUsers.map((mdbUser, index)=>{
return /*#__PURE__*/ jsx_runtime_.jsx(MariaDBUserCard, {
mariadbUser: mdbUser
}, index + 1);
})
})
]
})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/ConnectContent.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
*/ function ConnectContent(props) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { user , query , mariadbUserCred } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)((external_react_default()).Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start gap-0 w-full",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "",
children: /*#__PURE__*/ jsx_runtime_.jsx("h1", {
className: "text-3xl m-0",
children: "Connect"
})
}),
/*#__PURE__*/ jsx_runtime_.jsx(Breadcrumbs/* default */.Z, {
user: user
})
]
}),
/*#__PURE__*/ jsx_runtime_.jsx(ConnectionInfo, {}),
/*#__PURE__*/ jsx_runtime_.jsx(MariaDBUsers, {})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/MariDBUserFormGrantsSection.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* @typedef {Object} APIDatabase
* @property {string | number} id
* @property {string} db_full_name
* @property {string} db_name
* @property {string} db_slug
*/ /**
* @typedef {Object} APITable
* @property {string | number} id
* @property {string} table_name
* @property {string} table_slug
*/ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props
* @param {import("@/shell/mariadb-users/handleGrants").GrantType[]} props.grants
* @param {React.Dispatch<React.SetStateAction<import("@/shell/mariadb-users/handleGrants").GrantType[]>> } props.setGrants
* @param {boolean} [props.edit]
*/ function MariDBUserFormGrantsSection({ grants , setGrants , edit , }) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { user , targetMariadbUser } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ /** @type {import("@/shell/mariadb-users/handleGrants").GrantType[]} */ const grantsArray = [];
/** @type {string[]} */ const permissionsArray = [
"ALL PRIVILEGES",
"ALTER",
"ALTER ROUTINE",
"CREATE",
"CREATE ROUTINE",
"CREATE TEMPORARY TABLES",
"CREATE VIEW",
"DELETE",
"DROP",
"EVENT",
"EXECUTE",
"FILE",
"INDEX",
"INSERT",
"LOCK TABLES",
"PROCESS",
"REFERENCES",
"RELOAD",
"REPLICATION CLIENT",
"REPLICATION SLAVE",
"SELECT",
"SHOW VIEW",
"SUPER",
"TRIGGER",
"UPDATE",
"USAGE",
];
const isPrimary = Boolean(String(targetMariadbUser?.primary).match(/1/)) && edit;
const isAllDatabasesGranted = Boolean(grants.find((grant)=>grant.database == "*"));
const isAllTablesGranted = Boolean(grants.find((grant)=>grant.table == "*"));
const isPrivilegesGranted = Boolean(grants.find((grant)=>grant.privileges.includes("ALL PRIVILEGES")));
const isAllGranted = isAllDatabasesGranted && isAllTablesGranted && isPrivilegesGranted;
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ /** @type {[ state: APIDatabase[], dispatch: React.Dispatch<React.SetStateAction<APIDatabase[]>> ]} */ // @ts-ignore
const [databases, setDatabases] = external_react_default().useState([]);
/** @type {[ state: APIDatabase, dispatch: React.Dispatch<React.SetStateAction<APIDatabase>> ]} */ // @ts-ignore
const [targetDatabase, setTargetDatabase] = external_react_default().useState({});
/** @type {[ state: APITable[], dispatch: React.Dispatch<React.SetStateAction<APITable[]>> ]} */ // @ts-ignore
const [tables, setTables] = external_react_default().useState([]);
/** @type {[ state: APITable, dispatch: React.Dispatch<React.SetStateAction<APITable>> ]} */ // @ts-ignore
const [targetTable, setTargetTable] = external_react_default().useState({});
const [permissions, setPermissions] = external_react_default().useState([
"ALL PRIVILEGES"
]);
/** @type {[ state: string, dispatch: React.Dispatch<React.SetStateAction<string>> ]} */ // @ts-ignore
const [targetPermission, setTargetPermission] = external_react_default().useState("ALL PRIVILEGES");
const [newGrant, setNewGrant] = external_react_default().useState(false);
external_react_default().useEffect(()=>{
(0,fetchApi/* default */.Z)("/api/getUserDatabases").then((res)=>{
if (res.databases) {
setDatabases(res.databases);
}
});
}, []);
external_react_default().useEffect(()=>{
if (!targetDatabase?.id) return;
(0,fetchApi/* default */.Z)(`/api/getUserDatabaseTables?dbId=${targetDatabase.id}`).then((res)=>{
if (res.tables) {
setTables(res.tables);
}
});
}, [
targetDatabase
]);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
id: "grant-select-block",
className: "flex flex-col items-stretch w-full p-6 border border-slate-200 border-solid rounded",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("h4", {
className: "m-0 text-lg",
children: "Grants"
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "This section determines fine grained access of this user to databases and tables"
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "flex-wrap",
children: grants?.[0] ? grants.map((grant, index)=>{
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "text-sm pr-10 bg-secondary text-white px-3 py-2 rounded flex-wrap relative",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: grant.privileges
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "="
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
children: [
" ",
grant.database.replace(/datasquirel_user_\d+_/, "")
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "."
}),
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: grant.table
}),
!isPrimary && /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "button white absolute top-1.5 right-1.5 p-2 w-6 h-6",
onClick: (e)=>{
const newGrants = [
...grants
];
newGrants.splice(index, 1);
setGrants(newGrants);
},
children: "x"
})
]
});
}) : /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-slate-400 px-4 py-2 bg-slate-100 w-full flex items-center justify-center",
children: "No Grants"
})
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
isAllGranted ? /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-sm text-slate-500",
children: 'All Privileges have been granted! Delete "ALL PRIVILEGES on *.*" to add fine-grained privileges'
}) : newGrant ? /*#__PURE__*/ jsx_runtime_.jsx(jsx_runtime_.Fragment, {
children: isPrimary ? /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-slate-400",
children: "Primary users have full control over all databases."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full gap-1",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "grants-database",
children: "Database"
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("select", {
name: "grants-database",
id: "grants-database",
className: "text-sm",
onChange: (e)=>{
const selectedDatabase = e.target.value;
if (selectedDatabase == "NULL") {
return;
}
const selectedDatabaseObject = databases.find((db)=>db.db_full_name == selectedDatabase);
if (selectedDatabaseObject) {
setTargetDatabase(selectedDatabaseObject);
}
},
children: [
/*#__PURE__*/ jsx_runtime_.jsx("option", {
value: "*",
children: "--ALL-DATABASES--"
}),
databases.map((database, index)=>{
return /*#__PURE__*/ jsx_runtime_.jsx("option", {
value: database.db_full_name,
children: database.db_name
}, index + 1);
})
]
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full gap-1",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "grants-table",
children: "Table"
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("select", {
name: "grants-table",
id: "grants-table",
className: "text-sm",
onChange: (e)=>{
const selectedTable = e.target.value;
if (selectedTable == "NULL") {
return;
}
const selectedTableObject = tables.find((table)=>table.table_slug == selectedTable);
if (selectedTableObject) {
setTargetTable(selectedTableObject);
}
},
children: [
/*#__PURE__*/ jsx_runtime_.jsx("option", {
value: "*",
children: "--ALL-TABLES--"
}),
tables?.[0] && tables.map((table, index)=>{
return /*#__PURE__*/ jsx_runtime_.jsx("option", {
value: table.table_slug,
children: table.table_name
}, index + 1);
})
]
})
]
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full gap-1",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: "grants-databases",
children: "Permissions"
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "flex-wrap gap-y-2 mb-1",
children: permissions?.[0] ? permissions.map((permission, index)=>{
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "text-xs px-2 py-1 border border-solid border-slate-200 rounded",
children: [
permission,
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "cursor-pointer p-2 hover:opacity-50",
onClick: (e)=>{
const newPermissions = [
...permissions,
];
newPermissions.splice(index, 1);
setPermissions(newPermissions);
},
children: "x"
})
]
});
}) : /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-xs px-3 py-1 bg-slate-100 text-slate-400",
children: "No Permissions Selected"
})
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "w-full items-stretch",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("select", {
name: "grants-databases",
id: "grants-databases",
className: "text-sm",
onChange: (e)=>{
const selectedPermission = e.target.value;
setTargetPermission(selectedPermission);
},
children: permissionsArray.map((permission, index)=>{
return /*#__PURE__*/ jsx_runtime_.jsx("option", {
value: permission,
children: permission
}, index);
})
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "button outlined gray text-2xl",
onClick: (e)=>{
if (permissions.includes(targetPermission)) return;
if (permissions.includes("ALL PRIVILEGES")) {
alert("ALL PRIVILEGES already covers for the rest. Remove ALL PRIVILEGES permission to add others");
return;
}
setPermissions([
...permissions,
targetPermission,
]);
},
children: "+"
})
]
})
]
}),
!isPrimary && /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "button outlined secondary",
onClick: (e)=>{
if (!permissions?.[0]) {
alert("Please select atleast 1 permission. *REMEMBER to click the + button to add the permission to the list");
return;
}
/**
* @type {import("@/shell/mariadb-users/handleGrants").GrantType}
*/ const newGrant = {
database: targetDatabase.db_full_name || "*",
privileges: permissions,
table: targetTable.table_slug || "*"
};
const newGrants = [
...grants,
newGrant
];
setGrants(newGrants);
setNewGrant(false);
},
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-2xl h-6 flex items-center justify-center",
children: "+"
}),
"\xa0Add Grant"
]
}),
/*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "button outlined gray",
onClick: ()=>{
setNewGrant(false);
},
children: "Cancel"
})
]
})
}) : isPrimary ? /*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-slate-400",
children: "Primary users have full control over all databases."
}) : /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "button outlined gray",
onClick: (e)=>{
setNewGrant(true);
},
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
className: "text-2xl h-6 flex items-center justify-center",
children: "+"
}),
"\xa0Add Grant"
]
})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/MariDBUserForm.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props
* @param {import("@/package-shared/types").MYSQL_mariadb_users_table_def} [props.mariaDBUser]
* @param {boolean} [props.edit]
* @param {string} [props.username]
*/ function MariDBUserForm({ mariaDBUser , edit , username }) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { user } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ const formFields = mariaDBUser ? Object.keys(mariaDBUser) : [
"username",
"host",
"password"
];
const KEYS_REGEXP = /username|host|password/;
const UNEDITABLE_REGEXP = edit ? /username/ : /username/;
const REQUIRED_REGEXP = /host/;
const existingGrants = (()=>{
try {
if (edit && mariaDBUser?.grants) return JSON.parse(mariaDBUser.grants);
return null;
} catch (error) {
return null;
}
})();
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ /** @type {[ state: import("@/shell/mariadb-users/handleGrants").GrantType[], dispatch: React.Dispatch<React.SetStateAction<import("@/shell/mariadb-users/handleGrants").GrantType[]>> ]} */ // @ts-ignore
const [grants, setGrants] = external_react_default().useState(existingGrants ? existingGrants : [
{
database: "*",
table: "*",
privileges: [
"ALL PRIVILEGES"
]
},
]);
const [loading, setLoading] = external_react_default().useState(false);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("form", {
onSubmit: (e)=>{
e.preventDefault();
console.log("form clicked");
/**
* @type {HTMLFormElement}
*/ // @ts-ignore
const formEl = e.target;
const formFields = Array.from(formEl);
/**
* @type any
*/ const formData = {};
formFields.forEach((el)=>{
if (el.nodeName != "INPUT") return;
/**
* @type {HTMLInputElement}
*/ // @ts-ignore
const inputEl = el;
formData[inputEl.name] = inputEl.value;
});
if (edit) {
delete formData.username;
}
if (!grants?.[0]) {
alert("Please add at least one grant");
return;
}
setLoading(true);
const fetchUrl = edit ? "/api/sql-users/update" : "/api/sql-users/create";
(0,fetchApi/* default */.Z)(fetchUrl, {
method: "POST",
body: {
data: formData,
edit: Boolean(edit),
prev: mariaDBUser,
grants
}
}, true).then((res)=>{
if (res.success) {
window.location.reload();
} else if (res.msg) {
window.alert(res.msg);
setLoading(false);
}
});
},
className: "w-full gap-4 flex flex-col",
children: [
loading && /*#__PURE__*/ jsx_runtime_.jsx(LoadingBlock/* default */.Z, {
width: "25px"
}),
formFields.map((key, index)=>{
/** @type {string | null} */ const existingValue = mariaDBUser ? mariaDBUser[key] : key == "username" ? `dsql_user_${user.id}` : null;
const isReadOnly = UNEDITABLE_REGEXP.test(key);
const isRequired = REQUIRED_REGEXP.test(key);
if (!key.match(KEYS_REGEXP)) return null;
return /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex-col items-start w-full gap-1",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("label", {
htmlFor: key,
children: key
}),
/*#__PURE__*/ jsx_runtime_.jsx("input", {
type: key.match("password") ? "password" : "text",
name: key,
id: key,
defaultValue: existingValue || undefined,
readOnly: isReadOnly,
className: "" + (isReadOnly ? "bg-slate-100 opacity-50 pointer-events-none" : ""),
placeholder: key,
required: isRequired
})
]
}, index + 1);
}),
/*#__PURE__*/ jsx_runtime_.jsx(MariDBUserFormGrantsSection, {
grants: grants,
setGrants: setGrants,
edit: edit
}),
/*#__PURE__*/ jsx_runtime_.jsx("button", {
type: "submit",
children: edit ? "Update User" : "Create SQL User"
})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/EditMariadbUserPopup.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
*/ function EditMariadbUserPopup(props) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ const { targetMariadbUser } = external_react_default().useContext(ConnectContext);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ const [ready, setReady] = external_react_default().useState(false);
external_react_default().useEffect(()=>{
setReady(false);
setTimeout(()=>{
setReady(true);
}, 200);
}, [
targetMariadbUser
]);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ jsx_runtime_.jsx(GeneralPopup/* default */.ZP, {
title: "edit-mariadb-user-popup",
children: ready && targetMariadbUser ? /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("h3", {
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)("div", {
className: "flex",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("span", {
children: "Edit"
}),
/*#__PURE__*/ (0,jsx_runtime_.jsxs)("span", {
className: "info inline w-auto text-xl green",
children: [
targetMariadbUser.username,
"@",
targetMariadbUser.host
]
})
]
})
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ jsx_runtime_.jsx(MariDBUserForm, {
mariaDBUser: targetMariadbUser,
edit: true
})
]
}) : /*#__PURE__*/ jsx_runtime_.jsx("div", {
className: "p-20",
children: /*#__PURE__*/ jsx_runtime_.jsx(LoadingBlock/* default */.Z, {
width: "25px"
})
})
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
;// CONCATENATED MODULE: ./components/admin/connect/NewMariadbUserPopup.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
*/ function NewMariadbUserPopup(props) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ (0,jsx_runtime_.jsxs)(GeneralPopup/* default */.ZP, {
title: "new-mariadb-user-popup",
children: [
/*#__PURE__*/ jsx_runtime_.jsx("h3", {
children: "New MariaDB User"
}),
/*#__PURE__*/ jsx_runtime_.jsx("hr", {}),
/*#__PURE__*/ jsx_runtime_.jsx(MariDBUserForm, {})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
} /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */
// EXTERNAL MODULE: ./package-shared/functions/backend/decrypt.js
var decrypt = __webpack_require__(5304);
var decrypt_default = /*#__PURE__*/__webpack_require__.n(decrypt);
;// CONCATENATED MODULE: ./pages/admin/[user_id]/connect/index.jsx
// @ts-check
/**
* ==============================================================================
* Imports
* ==============================================================================
*/
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/** ****************************************************************************** */ /** @type {import("@/package-shared/types").ConnectContextType} */ // @ts-ignore
const init = {};
const ConnectContext = /*#__PURE__*/ external_react_default().createContext(init);
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Main Component { Functional }
* ==============================================================================
* @param {Object} props - Server props
* @param {import("@/package-shared/types").UserType} props.user
* @param {any} props.query
* @param {import("@/package-shared/types").MariaDBUserCredType} props.mariadbUserCred
* @param {import("@/package-shared/types").MYSQL_mariadb_users_table_def[]} props.mariadbUsers
*/ function DatabaseSchema({ user , query , mariadbUserCred , mariadbUsers , }) {
/**
* Get Contexts
*
* @abstract { React.useContext }
*/ ////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Javascript Variables
*
* @abstract Non hook variables and functions
*/ const pageTitle = "SQL Connect | Datasquirel";
const pageDescription = "Connect to your database remotely";
let head = /*#__PURE__*/ (0,jsx_runtime_.jsxs)(jsx_runtime_.Fragment, {
children: [
/*#__PURE__*/ jsx_runtime_.jsx("title", {
children: pageTitle
}),
/*#__PURE__*/ jsx_runtime_.jsx("meta", {
name: "description",
content: pageDescription
})
]
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* React Hooks
*
* @abstract { useState, useEffect, useRef, etc ... }
*/ /** @type {[ state: import("@/package-shared/types").MYSQL_mariadb_users_table_def | null, dispatch: React.Dispatch<React.SetStateAction<import("@/package-shared/types").MYSQL_mariadb_users_table_def | null>> ]} */ // @ts-ignore
const [targetMariadbUser, setTargetMariadbUser] = external_react_default().useState(null);
/** @type {[ state: number, dispatch: React.Dispatch<React.SetStateAction<number>> ]} */ // @ts-ignore
const [refresh, setRefresh] = external_react_default().useState(null);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Function Return
*
* @abstract Main Function Return
*/ return /*#__PURE__*/ jsx_runtime_.jsx(AdminLayout/* default */.Z, {
head: head,
user: user,
aceEditor: true,
children: /*#__PURE__*/ (0,jsx_runtime_.jsxs)(ConnectContext.Provider, {
value: {
user,
query,
mariadbUserCred,
mariadbUsers,
targetMariadbUser,
setTargetMariadbUser,
refresh,
setRefresh
},
children: [
/*#__PURE__*/ jsx_runtime_.jsx(ConnectContent, {}),
/*#__PURE__*/ jsx_runtime_.jsx(EditMariadbUserPopup, {}),
/*#__PURE__*/ jsx_runtime_.jsx(NewMariadbUserPopup, {})
]
})
});
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
}
/** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /** ****************************************************************************** */ /**
* ==============================================================================
* Server Side Props or Static Props
* ==============================================================================
* @type {import("next").GetServerSideProps}
*/ async function getServerSideProps({ req , res , query }) {
/**
* User Auth
*
* @description User Auth
*/ const user = await userAuth_default()(req, res);
if (!user?.logged_in_status) {
return {
redirect: {
destination: "/login",
permanent: false
}
};
}
/**
* Page/Site Data Data Fetching
*
* @description Fetch data on the server before returning
*/ const mariadbUserCredArray = await DB_HANDLER_default()(`SELECT mariadb_user, mariadb_host, mariadb_pass FROM users WHERE id = ?`, [
user.id
]);
const mariadbUserCred = mariadbUserCredArray?.[0] || {};
if (mariadbUserCred?.mariadb_pass) {
mariadbUserCred.mariadb_pass = decrypt_default()(mariadbUserCred.mariadb_pass);
}
////////////////////////////////////////
const mariadbUsers = await DB_HANDLER_default()(`SELECT * FROM mariadb_users WHERE user_id = ?`, [
user.id
]);
if (mariadbUsers?.[0]) {
for(let i = 0; i < mariadbUsers.length; i++){
const mariaDBUser = mariadbUsers[i];
mariaDBUser.password = decrypt_default()(mariaDBUser.password);
}
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
/**
* Server props return
*
* @description Return data fetched on the server side
*/ return {
props: {
user: user,
query,
mariadbUserCred,
mariadbUsers
}
};
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
}
/***/ }),
/***/ 4003:
/***/ ((module) => {
module.exports = require("@mui/icons-material/AdminPanelSettingsTwoTone");
/***/ }),
/***/ 69:
/***/ ((module) => {
module.exports = require("@mui/icons-material/CloudOffTwoTone");
/***/ }),
/***/ 4008:
/***/ ((module) => {
module.exports = require("@mui/icons-material/CloudQueueRounded");
/***/ }),
/***/ 7306:
/***/ ((module) => {
module.exports = require("@mui/icons-material/CollectionsTwoTone");
/***/ }),
/***/ 386:
/***/ ((module) => {
module.exports = require("@mui/icons-material/CottageTwoTone");
/***/ }),
/***/ 8757:
/***/ ((module) => {
module.exports = require("@mui/icons-material/DeleteOutlineOutlined");
/***/ }),
/***/ 8979:
/***/ ((module) => {
module.exports = require("@mui/icons-material/DynamicFormTwoTone");
/***/ }),
/***/ 300:
/***/ ((module) => {
module.exports = require("@mui/icons-material/LanguageOutlined");
/***/ }),
/***/ 2814:
/***/ ((module) => {
module.exports = require("@mui/icons-material/LockTwoTone");
/***/ }),
/***/ 5557:
/***/ ((module) => {
module.exports = require("@mui/icons-material/MenuBookTwoTone");
/***/ }),
/***/ 9806:
/***/ ((module) => {
module.exports = require("@mui/icons-material/PeopleOutlineTwoTone");
/***/ }),
/***/ 36:
/***/ ((module) => {
module.exports = require("@mui/icons-material/RefreshRounded");
/***/ }),
/***/ 1799:
/***/ ((module) => {
module.exports = require("@mui/icons-material/SchemaTwoTone");
/***/ }),
/***/ 2423:
/***/ ((module) => {
module.exports = require("lucide-react");
/***/ }),
/***/ 968:
/***/ ((module) => {
module.exports = require("next/head");
/***/ }),
/***/ 6689:
/***/ ((module) => {
module.exports = require("react");
/***/ }),
/***/ 997:
/***/ ((module) => {
module.exports = require("react/jsx-runtime");
/***/ }),
/***/ 2261:
/***/ ((module) => {
module.exports = require("serverless-mysql");
/***/ }),
/***/ 4300:
/***/ ((module) => {
module.exports = require("buffer");
/***/ }),
/***/ 6113:
/***/ ((module) => {
module.exports = require("crypto");
/***/ }),
/***/ 7147:
/***/ ((module) => {
module.exports = require("fs");
/***/ }),
/***/ 3685:
/***/ ((module) => {
module.exports = require("http");
/***/ })
};
;
// load runtime
var __webpack_require__ = require("../../../webpack-runtime.js");
__webpack_require__.C(exports);
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
var __webpack_exports__ = __webpack_require__.X(0, [4017,8313,5264,6729,5449,913,4480,370,424,4858,5472], () => (__webpack_exec__(5782)));
module.exports = __webpack_exports__;
})();