Clients/Python/lonadb_client/lonadb_client.py

175 lines
5.4 KiB
Python

import json
import socket
import random
import hashlib
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
class LonaDB:
def __init__(self, host, port, name, password):
#Import all connection details
self.host = host
self.port = port
self.name = name
self.password = password
def make_id(self, length):
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz'
#Generate random string of desired lenght
return ''.join(random.choice(characters) for _ in range(length))
async def send_request(self, action, data):
#Generate ProcessID
process_id = self.make_id(5)
#Generate encryption key for passwords
encryption_key = hashlib.sha256(process_id.encode()).digest().hex()
#Check if we have to encrypt something else
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)
#Encrypt password
encrypted_password = await self.encrypt_password(self.password, encryption_key)
#Generate request
request = json.dumps({
"action": action,
"login": {
"name": self.name,
"password": encrypted_password
},
"process": process_id,
**data
})
#Send request
with socket.create_connection((self.host, self.port)) as s:
s.sendall(request.encode())
response = s.recv(1024).decode()
#Return response
return json.loads(response)
async def encrypt_password(self, password, key):
#Generate IV and cipher
iv = get_random_bytes(16)
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
#Encrypt
encrypted = cipher.encrypt(password.encode())
#Return IV and encrypted value
return iv.hex() + ':' + encrypted.hex()
#All other functions work the same
def create_function(self, name, content):
#Generate request to send to the database
data = {
'function': {
'name': name,
'content': content
}
}
#Send request to the database and return the response
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}
return self.send_request('eval', data)