Clients/Python/lonadb_client/lonadb_client.py

220 lines
6.5 KiB
Python
Raw Normal View History

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)