From 2c0a51efb354c23ee07ab90af47838eb15fbb133 Mon Sep 17 00:00:00 2001 From: KafetzisThomas Date: Sun, 22 Sep 2024 18:23:28 +0300 Subject: [PATCH] Improve FileShare Documentation [README] --- .github/FUNDING.yml | 1 + README.md | 117 ++++++++++++++++++++++- fileshare/static/favicon.png | Bin 0 -> 32781 bytes fileshare/templates/fileshare/index.html | 3 + 4 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 fileshare/static/favicon.png diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..65ec2bb --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ["https://www.paypal.me/kafetzisthomas"] diff --git a/README.md b/README.md index 93689d7..38680a9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,115 @@ -# FileShare - +
+

+ Logo Icon +

+

+ A P2P file transfer tool using Django Channels.
+ Written in Python/Django +

+ + Run Tests + +
+ +--- + +## Overview + +`FileShare` is a Django-based tool for **securely transferring files between devices**, similar to [ShareDrop](https://github.com/szimek/sharedrop). It allows users to send and receive files directly over the network with **built-in encryption** for enhanced privacy. + +## How It Works + +Your data is protected using **AES 256-bit encryption**, making the file transfer process secure and reliable. + +### Sender Process: +1. The file is first `byte-encoded` (client-side). +2. The encoded file is then `encrypted` using AES 256-bit encryption (server-side). +3. The encrypted file is `transferred` to the recipient (still encrypted). + +### Receiver Process: +1. The received file is `decrypted` using the same encryption key (server-side). +2. The decrypted data is `byte-decoded` (client-side). +3. The original file is `reconstructed` and made available for download. + +This way, only the intended recipient can access the file throughout the transfer. + +## Purpose + +The primary goal of this project is to **provide an open-source application that anyone can use and learn from**. + +If you find this project interesting, helpful, or inspiring, please consider giving a `star`, `following`, or even `donating`. + +## Setup for Local Development + +### Set up Virtual Environment + +```bash +➜ cd path/to/root/directory +$ python3 -m venv env/ +$ source env/bin/activate +``` + +### Install Dependencies + +```bash +$ pip3 install -r requirements.txt +``` + +### Create Enviroment Variable file + +```bash +$ touch .env +$ nano .env +``` + +Add the following environment variables (modify as needed): +```bash +➜ SECRET_KEY="example_secret_key" # https://stackoverflow.com/a/57678930 +➜ ENCRYPTION_KEY="example_encryption_key" # https://cryptography.io/en/latest/fernet/#cryptography.fernet.Fernet +➜ DEBUG=True # For development +``` + +Save changes and close the file. + +### Migrate Database (Optional) + +```bash +$ python3 manage.py migrate +``` + +### Run Django Server +```bash +$ python3 manage.py runserver +``` + +Now you can access the website at `http://127.0.0.1:8000/` or `http://localhost:8000/`. + +## Run Tests + +```bash +➜ cd path/to/root/directory +$ python3 manage.py test fileshare.tests +``` + +## Contributing Guidelines for FileShare + +### Pull Requests +When submitting a pull request, please keep these points in mind: + +* **Simplicity**: Keep your changes straightforward and focused. Complex changes are harder to review and integrate. + +* **Avoid Non-Standard Libraries**: Whenever possible, refrain from adding new non-standard libraries. If your idea necessitates one, kindly discuss it first by opening an issue. This helps in evaluating the necessity and compatibility of the library. + +* **Ensure It Runs**: Before submitting a pull request, ensure that your code runs without errors and adheres to the project's coding standards. + +* **Pass All Tests**: Make sure all existing [tests](#run-tests) pass and add new tests as necessary. Pull requests will not be merged unless all tests pass successfully. + +### Filing Bug Reports and Submitting Pull Requests +If you encounter a bug, please follow these steps to report it: + +* **Bug Reports**: File bug reports on the [GitHub Issues](https://github.com/KafetzisThomas/FileShare/issues) page. +* **Pull Requests**: Open pull requests on the [GitHub Pull Requests](https://github.com/KafetzisThomas/FileShare/pulls) page. + +Before contributing, please review the [License](https://github.com/KafetzisThomas/FileShare/blob/main/LICENSE) to understand the terms and conditions governing the use and distribution of FileShare. + +Thank you for your interest in improving FileShare! diff --git a/fileshare/static/favicon.png b/fileshare/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..239aef8bb7fc47c1cf7a0bbce4b6e1427ad07021 GIT binary patch literal 32781 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 + + +