diff --git a/src/config.py b/src/config.py index a60838b..a68feb8 100644 --- a/src/config.py +++ b/src/config.py @@ -3,6 +3,7 @@ from os import mkdir from utils.font import init as init_font from utils.libjs import init as init_libjs from utils.misc import exist +from utils.sqlite import FilesDB class Config: @@ -15,11 +16,14 @@ class Config: # Desc of the index page desc = "Sand permet le partage de fichiers. Attention, je n'accepte que \ les petits fichiers de quelques ko car je chiffre ton \ - fichier via RSA 🙂." + fichier via RSA 🙂.

Les fichiers sont herbergés 24 heures." # Directory name where the uploads are stored uploads_dir = "uploads" + # Database + database = FilesDB(uploads_dir, "db.sqlite3") + def init() -> None: # Download dependencies @@ -29,3 +33,5 @@ def init() -> None: # Create upload folder if doesn't exists if not exist(Config.uploads_dir): mkdir(Config.uploads_dir) + +# TODO: Clear every t mins the uploads directory and database diff --git a/src/routes/api/upload.py b/src/routes/api/upload.py index 67af9d9..472f063 100644 --- a/src/routes/api/upload.py +++ b/src/routes/api/upload.py @@ -1,3 +1,5 @@ +from time import time + from config import Config from flask import Blueprint, redirect, request from utils.misc import h @@ -13,7 +15,9 @@ def upload() -> Response: if json: data = "".join(json["file"]) data_hash = h(data) - with open(f"{Config.uploads_dir}/{data_hash}", "w") as f: + with open(f"{Config.uploads_dir}/{data_hash}", 'w') as f: f.write(data) + Config.database.add_file(data_hash, int(time())) + return redirect("/index") diff --git a/src/utils/sqlite.py b/src/utils/sqlite.py new file mode 100644 index 0000000..7707999 --- /dev/null +++ b/src/utils/sqlite.py @@ -0,0 +1,73 @@ +from os import mkdir +from sqlite3 import connect + +from utils.misc import exist + + +class Database: + """Handle SQLite3 database""" + + def __init__(self, path: str, filename: str): + if not exist(path): + mkdir(path) + + fullpath = f"{path}/{filename}" + if not exist(fullpath): + open(fullpath, 'x') + + self.fullpath = fullpath + + def request(self, request: str, valeurs=None): + """Send a request to the database""" + connection = connect(self.fullpath) + cursor = connection.cursor() + if valeurs: + if type(valeurs) not in [list, tuple]: + valeurs = [valeurs] + cursor.execute(request, valeurs) + else: + cursor.execute(request) + + connection.commit() + + return cursor, cursor.lastrowid + + def format(self, keys, cursor: tuple) -> dict: + """Format sqlite request's result as dict""" + values = [] + if cursor != None: + datas = cursor[0].fetchall() + for data in datas[0]: + values.append(data) + + if type(keys) not in [list, tuple]: + keys = [keys] + + if len(keys) != len(values): + print(keys, values) + raise IndexError + + return dict(zip(keys, values)) + + +class FilesDB(Database): + """Handle files in sqlite3 database""" + + def __init__(self, path: str, filename: str): + super().__init__(path, filename) + self.table_name = "files" + + self.request( + f"CREATE TABLE IF NOT EXISTS {self.table_name} \ + (filename TEXT, date INTEGER);") + + def add_file(self, filename: str, date: int): + """Add a file""" + self.request( + f"INSERT INTO {self.table_name} (filename, date) VALUES (?, ?);", + [filename, date]) + + def remove_file(self, filename: str) -> None: + """Remove a file""" + self.request( + f"DELETE FROM {self.table_name} WHERE filename = ?", filename)