2024-03-15 09:13:20 +00:00
|
|
|
const crypto = require('crypto');
|
|
|
|
|
|
|
|
class LonaDB {
|
|
|
|
constructor(host, port, name, password) {
|
2024-09-25 16:39:56 +00:00
|
|
|
//Import all connection details
|
2024-03-15 09:13:20 +00:00
|
|
|
this.host = host;
|
|
|
|
this.port = port;
|
|
|
|
this.name = name;
|
|
|
|
this.password = password;
|
|
|
|
}
|
|
|
|
|
|
|
|
makeid(length) {
|
|
|
|
let result = '';
|
|
|
|
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz';
|
|
|
|
let counter = 0;
|
2024-09-25 16:39:56 +00:00
|
|
|
//Add random characters to result until it has reached the desired length
|
2024-03-15 09:13:20 +00:00
|
|
|
while (counter < length) {
|
|
|
|
result += characters[Math.floor(Math.random() * characters.length)];
|
|
|
|
counter += 1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
sendRequest = async function(action, data) {
|
|
|
|
let net = require('net');
|
2024-09-25 16:39:56 +00:00
|
|
|
//Generate ProcessID
|
2024-03-15 09:13:20 +00:00
|
|
|
let processID = this.makeid(5);
|
2024-09-25 16:39:56 +00:00
|
|
|
//Generate encryptionKey for encrypting passwords
|
2024-03-15 09:13:20 +00:00
|
|
|
let encryptionKey = crypto.createHash('sha256').update(processID).digest('base64');
|
2024-09-25 16:39:56 +00:00
|
|
|
//Check if we need to encrypt something other than our own password
|
2024-03-15 10:45:30 +00:00
|
|
|
switch(action){
|
|
|
|
case "create_user":
|
|
|
|
data.user.password = await this.encryptPassword(data.user.password, encryptionKey);
|
|
|
|
break;
|
|
|
|
case "check_password":
|
|
|
|
data.checkPass.pass = await this.encryptPassword(data.checkPass.pass, encryptionKey);
|
|
|
|
break;
|
|
|
|
}
|
2024-09-25 16:39:56 +00:00
|
|
|
//Encrypt password
|
2024-03-15 09:13:20 +00:00
|
|
|
let encryptedPassword = await this.encryptPassword(this.password, encryptionKey);
|
2024-09-25 16:39:56 +00:00
|
|
|
//Generate request
|
2024-03-15 09:13:20 +00:00
|
|
|
let request = JSON.stringify({
|
|
|
|
action,
|
|
|
|
login: {
|
|
|
|
name: this.name,
|
|
|
|
password: encryptedPassword
|
|
|
|
},
|
|
|
|
process: processID,
|
|
|
|
...data
|
|
|
|
});
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
2024-09-25 16:39:56 +00:00
|
|
|
//Create socket
|
2024-03-15 09:13:20 +00:00
|
|
|
let socket = net.createConnection({
|
|
|
|
host: this.host,
|
|
|
|
port: this.port
|
|
|
|
}, () => {
|
2024-09-25 16:39:56 +00:00
|
|
|
//Send request
|
2024-03-15 09:13:20 +00:00
|
|
|
socket.write(request);
|
|
|
|
});
|
|
|
|
|
|
|
|
let response = '';
|
2024-09-25 16:39:56 +00:00
|
|
|
//When server sends data, collect it
|
2024-03-15 09:13:20 +00:00
|
|
|
socket.on('data', (chunk) => {
|
|
|
|
response += chunk;
|
|
|
|
});
|
2024-09-25 16:39:56 +00:00
|
|
|
//Once the server closes the connection, return the data
|
2024-03-15 09:13:20 +00:00
|
|
|
socket.on('end', () => {
|
|
|
|
resolve(JSON.parse(response));
|
|
|
|
});
|
|
|
|
|
|
|
|
socket.on('error', (err) => {
|
|
|
|
reject({ err: err.message });
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
encryptPassword(password, key) {
|
2024-09-25 16:39:56 +00:00
|
|
|
//Generate IV and create cipher
|
2024-03-15 09:13:20 +00:00
|
|
|
const iv = crypto.randomBytes(16);
|
|
|
|
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key, 'base64'), iv);
|
2024-09-25 16:39:56 +00:00
|
|
|
//Encrypt
|
2024-03-15 09:13:20 +00:00
|
|
|
let encrypted = cipher.update(password);
|
|
|
|
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
2024-09-25 16:39:56 +00:00
|
|
|
//Return IV and encrypted value
|
2024-03-15 09:13:20 +00:00
|
|
|
return iv.toString('hex') + ':' + encrypted.toString('hex');
|
|
|
|
}
|
|
|
|
|
2024-09-25 16:39:56 +00:00
|
|
|
//All other functions work the same
|
2024-03-15 09:13:20 +00:00
|
|
|
createFunction(name, content) {
|
2024-09-25 16:39:56 +00:00
|
|
|
//Generate request to send
|
2024-03-15 09:13:20 +00:00
|
|
|
const data = {
|
|
|
|
"function": {
|
|
|
|
"name": name,
|
|
|
|
"content": content
|
|
|
|
}
|
|
|
|
};
|
2024-09-25 16:39:56 +00:00
|
|
|
//Send request to the database and return the response
|
2024-03-15 09:13:20 +00:00
|
|
|
return this.sendRequest("add_function", data);
|
|
|
|
}
|
|
|
|
|
|
|
|
executeFunction(name) {
|
|
|
|
const data = {
|
|
|
|
"name": name
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest("execute_function", data);
|
|
|
|
}
|
|
|
|
|
|
|
|
getTables(user) {
|
|
|
|
const data = {
|
|
|
|
user
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('get_tables', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
getTableData(table) {
|
|
|
|
const data = {
|
|
|
|
table
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('get_table_data', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
deleteTable(table) {
|
|
|
|
const data = {
|
|
|
|
table: { name: table }
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('delete_table', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
createTable(table) {
|
|
|
|
const data = {
|
|
|
|
table: { name: table }
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('create_table', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
set(table, name, value) {
|
|
|
|
const data = {
|
|
|
|
table: { name: table },
|
|
|
|
variable: {
|
|
|
|
name: name,
|
|
|
|
value: value
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('set_variable', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
delete(table, name) {
|
|
|
|
const data = {
|
|
|
|
table: { name: table },
|
|
|
|
variable: { name: name }
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('remove_variable', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
get(table, name) {
|
|
|
|
const data = {
|
|
|
|
table: { name: table },
|
|
|
|
variable: { name: name }
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('get_variable', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
getUsers() {
|
|
|
|
const data = {};
|
|
|
|
return this.sendRequest('get_users', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
createUser(name, pass) {
|
|
|
|
const data = {
|
|
|
|
user: {
|
|
|
|
name: name,
|
|
|
|
password: pass
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('create_user', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
deleteUser(name) {
|
|
|
|
const data = {
|
|
|
|
user: {
|
|
|
|
name: name
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('delete_user', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
checkPassword(name, pass) {
|
|
|
|
const data = {
|
|
|
|
checkPass: {
|
|
|
|
name: name,
|
|
|
|
pass: pass
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('check_password', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
checkPermission(name, permission) {
|
|
|
|
const data = {
|
|
|
|
permission: {
|
|
|
|
user: name,
|
|
|
|
name: permission
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('check_permission', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
removePermission(name, permission) {
|
|
|
|
const data = {
|
|
|
|
permission: {
|
|
|
|
user: name,
|
|
|
|
name: permission
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('remove_permission', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
getPermissionsRaw(name) {
|
|
|
|
const data = {
|
|
|
|
user: name
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('get_permissions_raw', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
addPermission(name, permission) {
|
|
|
|
const data = {
|
|
|
|
permission: {
|
|
|
|
user: name,
|
|
|
|
name: permission
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('add_permission', data);
|
|
|
|
}
|
|
|
|
|
|
|
|
eval(func) {
|
|
|
|
const data = {
|
|
|
|
function: func
|
|
|
|
};
|
|
|
|
|
|
|
|
return this.sendRequest('eval', data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = LonaDB;
|