2024-03-15 09:13:20 +00:00
|
|
|
import socket
|
2024-10-08 08:07:17 +00:00
|
|
|
import json
|
2024-03-15 10:45:30 +00:00
|
|
|
import hashlib
|
2024-10-08 08:07:17 +00:00
|
|
|
import os
|
|
|
|
import asyncio
|
|
|
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
|
|
from cryptography.hazmat.backends import default_backend
|
2024-03-15 09:13:20 +00:00
|
|
|
|
|
|
|
class LonaDB:
|
|
|
|
def __init__(self, host, port, name, password):
|
2024-10-08 08:07:17 +00:00
|
|
|
# Import connection details
|
2024-03-15 09:13:20 +00:00
|
|
|
self.host = host
|
|
|
|
self.port = port
|
|
|
|
self.name = name
|
|
|
|
self.password = password
|
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
def makeid(self, length):
|
|
|
|
# Generate a random string of specified length
|
2024-03-15 10:45:30 +00:00
|
|
|
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz'
|
2024-10-08 08:07:17 +00:00
|
|
|
return ''.join(os.urandom(1).decode(errors='ignore') 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-10-08 08:07:17 +00:00
|
|
|
# Generate ProcessID
|
|
|
|
process_id = self.makeid(5)
|
|
|
|
# Generate encryptionKey for encrypting passwords
|
|
|
|
encryption_key = hashlib.sha256(process_id.encode()).digest()
|
|
|
|
|
|
|
|
# Encrypt password if needed
|
2024-03-15 10:45:30 +00:00
|
|
|
if action == "create_user":
|
2024-10-08 08:07:17 +00:00
|
|
|
data['user']['password'] = self.encrypt_password(data['user']['password'], encryption_key)
|
2024-03-15 10:45:30 +00:00
|
|
|
elif action == "check_password":
|
2024-10-08 08:07:17 +00:00
|
|
|
data['checkPass']['pass'] = self.encrypt_password(data['checkPass']['pass'], encryption_key)
|
|
|
|
|
|
|
|
# Encrypt the login password
|
|
|
|
encrypted_password = self.encrypt_password(self.password, encryption_key)
|
|
|
|
|
|
|
|
# Create the request data
|
|
|
|
request_data = {
|
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-10-08 08:07:17 +00:00
|
|
|
"process": process_id
|
|
|
|
}
|
|
|
|
request_data.update(data)
|
|
|
|
|
|
|
|
# Convert request data to JSON
|
|
|
|
request_json = json.dumps(request_data)
|
|
|
|
|
|
|
|
# Send request via socket
|
|
|
|
reader, writer = await asyncio.open_connection(self.host, self.port)
|
|
|
|
|
|
|
|
writer.write(request_json.encode())
|
|
|
|
await writer.drain()
|
|
|
|
|
|
|
|
# Read the response from the server
|
|
|
|
response_data = await reader.read(2048)
|
|
|
|
writer.close()
|
|
|
|
await writer.wait_closed()
|
|
|
|
|
|
|
|
# Parse the response and return it
|
|
|
|
return json.loads(response_data.decode())
|
|
|
|
|
|
|
|
def encrypt_password(self, password, key):
|
|
|
|
# Generate IV and create cipher
|
|
|
|
iv = os.urandom(16)
|
|
|
|
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
|
|
|
|
encryptor = cipher.encryptor()
|
|
|
|
|
|
|
|
# Pad password to block size (16 bytes)
|
|
|
|
padding_length = 16 - len(password) % 16
|
|
|
|
password_padded = password + chr(padding_length) * padding_length
|
|
|
|
|
|
|
|
# Encrypt the password
|
|
|
|
encrypted = encryptor.update(password_padded.encode()) + encryptor.finalize()
|
|
|
|
|
|
|
|
# Return IV and encrypted password
|
2024-03-15 10:45:30 +00:00
|
|
|
return iv.hex() + ':' + encrypted.hex()
|
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
# All other functions work similarly
|
|
|
|
async def create_function(self, name, content):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"function": {
|
|
|
|
"name": name,
|
|
|
|
"content": content
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("add_function", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def execute_function(self, name):
|
|
|
|
data = {
|
|
|
|
"name": name
|
|
|
|
}
|
|
|
|
return await self.send_request("execute_function", data)
|
|
|
|
|
|
|
|
async def delete_function(self, name):
|
|
|
|
data = {
|
|
|
|
"function": {
|
|
|
|
"name": name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return await self.send_request("delete_function", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def get_tables(self, user):
|
|
|
|
data = {
|
|
|
|
"user": user
|
|
|
|
}
|
|
|
|
return await self.send_request("get_tables", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def get_table_data(self, table):
|
|
|
|
data = {
|
|
|
|
"table": table
|
|
|
|
}
|
|
|
|
return await self.send_request("get_table_data", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def delete_table(self, table):
|
|
|
|
data = {
|
|
|
|
"table": {"name": table}
|
|
|
|
}
|
|
|
|
return await self.send_request("delete_table", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def create_table(self, table):
|
|
|
|
data = {
|
|
|
|
"table": {"name": table}
|
|
|
|
}
|
|
|
|
return await self.send_request("create_table", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def set(self, table, name, value):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"table": {"name": table},
|
|
|
|
"variable": {
|
|
|
|
"name": name,
|
|
|
|
"value": value
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("set_variable", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def delete(self, table, name):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"table": {"name": table},
|
|
|
|
"variable": {"name": name}
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("remove_variable", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def get(self, table, name):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"table": {"name": table},
|
|
|
|
"variable": {"name": name}
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("get_variable", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def get_users(self):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("get_users", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def create_user(self, name, passw):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"user": {
|
|
|
|
"name": name,
|
|
|
|
"password": passw
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("create_user", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def delete_user(self, name):
|
|
|
|
data = {
|
|
|
|
"user": {
|
|
|
|
"name": name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return await self.send_request("delete_user", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def check_password(self, name, passw):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"checkPass": {
|
|
|
|
"name": name,
|
|
|
|
"pass": passw
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("check_password", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def check_permission(self, name, permission):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"permission": {
|
|
|
|
"user": name,
|
|
|
|
"name": permission
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("check_permission", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def remove_permission(self, name, permission):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"permission": {
|
|
|
|
"user": name,
|
|
|
|
"name": permission
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("remove_permission", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def get_permissions_raw(self, name):
|
|
|
|
data = {
|
|
|
|
"user": name
|
|
|
|
}
|
|
|
|
return await self.send_request("get_permissions_raw", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def add_permission(self, name, permission):
|
2024-03-15 09:13:20 +00:00
|
|
|
data = {
|
2024-10-08 08:07:17 +00:00
|
|
|
"permission": {
|
|
|
|
"user": name,
|
|
|
|
"name": permission
|
2024-03-15 09:13:20 +00:00
|
|
|
}
|
|
|
|
}
|
2024-10-08 08:07:17 +00:00
|
|
|
return await self.send_request("add_permission", data)
|
2024-03-15 09:13:20 +00:00
|
|
|
|
2024-10-08 08:07:17 +00:00
|
|
|
async def eval(self, func):
|
|
|
|
data = {
|
|
|
|
"function": func
|
|
|
|
}
|
|
|
|
return await self.send_request("eval", data)
|