Clients/JavaScript/Client.js

270 lines
6.6 KiB
JavaScript
Raw Normal View History

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);
}
2024-10-08 08:07:17 +00:00
deleteFunction(name) {
const data = {
"function": {
"name": name
}
};
return this.sendRequest("delete_function", data);
}
2024-03-15 09:13:20 +00:00
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;