2024-03-15 09:13:20 +00:00
|
|
|
import json
|
|
|
|
import socket
|
2024-03-15 10:45:30 +00:00
|
|
|
import random
|
|
|
|
import hashlib
|
|
|
|
from Crypto.Cipher import AES
|
|
|
|
from Crypto.Random import get_random_bytes
|
2024-03-15 09:13:20 +00:00
|
|
|
|
|
|
|
class LonaDB:
|
|
|
|
def __init__(self, host, port, name, password):
|
2024-09-25 16:39:56 +00:00
|
|
|
#Import all connection details
|
2024-03-15 09:13:20 +00:00
|
|
|
self.host = host
|
|
|
|
self.port = port
|
|
|
|
self.name = name
|
|
|
|
self.password = password
|
|
|
|
|
|
|
|
def make_id(self, length):
|
2024-03-15 10:45:30 +00:00
|
|
|
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz'
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate random string of desired lenght
|
2024-03-15 10:45:30 +00:00
|
|
|
return ''.join(random.choice(characters) for _ in range(length))
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-03-15 10:45:30 +00:00
|
|
|
async def send_request(self, action, data):
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate ProcessID
|
2024-03-15 09:13:20 +00:00
|
|
|
process_id = self.make_id(5)
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate encryption key for passwords
|
2024-03-15 10:45:30 +00:00
|
|
|
encryption_key = hashlib.sha256(process_id.encode()).digest().hex()
|
2024-09-25 16:39:56 +00:00
|
|
|
#Check if we have to encrypt something else
|
2024-03-15 10:45:30 +00:00
|
|
|
if action == "create_user":
|
|
|
|
data["user"]["password"] = await self.encrypt_password(data["user"]["password"], encryption_key)
|
|
|
|
elif action == "check_password":
|
|
|
|
data["checkPass"]["pass"] = await self.encrypt_password(data["checkPass"]["pass"], encryption_key)
|
2024-09-25 16:39:56 +00:00
|
|
|
#Encrypt password
|
2024-03-15 10:45:30 +00:00
|
|
|
encrypted_password = await self.encrypt_password(self.password, encryption_key)
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate request
|
2024-03-15 09:13:20 +00:00
|
|
|
request = json.dumps({
|
2024-03-15 10:45:30 +00:00
|
|
|
"action": action,
|
|
|
|
"login": {
|
|
|
|
"name": self.name,
|
|
|
|
"password": encrypted_password
|
2024-03-15 09:13:20 +00:00
|
|
|
},
|
2024-03-15 10:45:30 +00:00
|
|
|
"process": process_id,
|
2024-03-15 09:13:20 +00:00
|
|
|
**data
|
|
|
|
})
|
2024-09-25 16:39:56 +00:00
|
|
|
#Send request
|
2024-03-15 10:45:30 +00:00
|
|
|
with socket.create_connection((self.host, self.port)) as s:
|
2024-03-15 09:13:20 +00:00
|
|
|
s.sendall(request.encode())
|
2024-03-15 10:45:30 +00:00
|
|
|
response = s.recv(1024).decode()
|
2024-09-25 16:39:56 +00:00
|
|
|
#Return response
|
2024-03-15 09:13:20 +00:00
|
|
|
return json.loads(response)
|
|
|
|
|
2024-03-15 10:45:30 +00:00
|
|
|
async def encrypt_password(self, password, key):
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate IV and cipher
|
2024-03-15 10:45:30 +00:00
|
|
|
iv = get_random_bytes(16)
|
|
|
|
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
|
2024-09-25 16:39:56 +00:00
|
|
|
#Encrypt
|
2024-03-15 10:45:30 +00:00
|
|
|
encrypted = cipher.encrypt(password.encode())
|
2024-09-25 16:39:56 +00:00
|
|
|
#Return IV and encrypted value
|
2024-03-15 10:45:30 +00:00
|
|
|
return iv.hex() + ':' + encrypted.hex()
|
|
|
|
|
2024-09-25 16:39:56 +00:00
|
|
|
#All other functions work the same
|
2024-03-15 09:13:20 +00:00
|
|
|
def create_function(self, name, content):
|
2024-09-25 16:39:56 +00:00
|
|
|
#Generate request to send to the database
|
2024-03-15 09:13:20 +00:00
|
|
|
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 self.send_request('add_function', data)
|
|
|
|
|
|
|
|
def execute_function(self, name):
|
|
|
|
data = {'name': name}
|
|
|
|
return self.send_request('execute_function', data)
|
|
|
|
|
|
|
|
def get_tables(self, user):
|
|
|
|
data = {'user': user}
|
|
|
|
return self.send_request('get_tables', data)
|
|
|
|
|
|
|
|
def get_table_data(self, table):
|
|
|
|
data = {'table': table}
|
|
|
|
return self.send_request('get_table_data', data)
|
|
|
|
|
|
|
|
def delete_table(self, table):
|
|
|
|
data = {'table': {'name': table}}
|
|
|
|
return self.send_request('delete_table', data)
|
|
|
|
|
|
|
|
def create_table(self, table):
|
|
|
|
data = {'table': {'name': table}}
|
|
|
|
return self.send_request('create_table', data)
|
|
|
|
|
|
|
|
def set_variable(self, table, name, value):
|
|
|
|
data = {
|
|
|
|
'table': {'name': table},
|
|
|
|
'variable': {
|
|
|
|
'name': name,
|
|
|
|
'value': value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('set_variable', data)
|
|
|
|
|
|
|
|
def remove_variable(self, table, name):
|
|
|
|
data = {
|
|
|
|
'table': {'name': table},
|
|
|
|
'variable': {'name': name}
|
|
|
|
}
|
|
|
|
return self.send_request('remove_variable', data)
|
|
|
|
|
|
|
|
def get_variable(self, table, name):
|
|
|
|
data = {
|
|
|
|
'table': {'name': table},
|
|
|
|
'variable': {'name': name}
|
|
|
|
}
|
|
|
|
return self.send_request('get_variable', data)
|
|
|
|
|
|
|
|
def get_users(self):
|
|
|
|
data = {}
|
|
|
|
return self.send_request('get_users', data)
|
|
|
|
|
|
|
|
def create_user(self, name, password):
|
|
|
|
data = {
|
|
|
|
'user': {
|
|
|
|
'name': name,
|
|
|
|
'password': password
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('create_user', data)
|
|
|
|
|
|
|
|
def delete_user(self, name):
|
|
|
|
data = {'user': {'name': name}}
|
|
|
|
return self.send_request('delete_user', data)
|
|
|
|
|
|
|
|
def check_password(self, name, password):
|
|
|
|
data = {
|
|
|
|
'checkPass': {
|
|
|
|
'name': name,
|
|
|
|
'pass': password
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('check_password', data)
|
|
|
|
|
|
|
|
def check_permission(self, name, permission):
|
|
|
|
data = {
|
|
|
|
'permission': {
|
|
|
|
'user': name,
|
|
|
|
'name': permission
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('check_permission', data)
|
|
|
|
|
|
|
|
def remove_permission(self, name, permission):
|
|
|
|
data = {
|
|
|
|
'permission': {
|
|
|
|
'user': name,
|
|
|
|
'name': permission
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('remove_permission', data)
|
|
|
|
|
|
|
|
def get_permissions_raw(self, name):
|
|
|
|
data = {'user': name}
|
|
|
|
return self.send_request('get_permissions_raw', data)
|
|
|
|
|
|
|
|
def add_permission(self, name, permission):
|
|
|
|
data = {
|
|
|
|
'permission': {
|
|
|
|
'user': name,
|
|
|
|
'name': permission
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return self.send_request('add_permission', data)
|
|
|
|
|
|
|
|
def eval(self, func):
|
|
|
|
data = {'function': func}
|
2024-03-15 10:45:30 +00:00
|
|
|
return self.send_request('eval', data)
|