126 lines
4.7 KiB
Markdown
126 lines
4.7 KiB
Markdown
# FLEES
|
|
|
|
A very small file sharing website.
|
|
|
|
The name comes from mispronouncing "files" very badly.
|
|
|
|
|
|
# installation
|
|
|
|
- `bash create_config.sh`
|
|
- `docker-compose up --build`
|
|
- open URL: http://localhost:8136/list/test
|
|
- `pip install code/manager-requirements.txt`
|
|
|
|
# configuration
|
|
|
|
- generate and manage shares with `code/flees-manager.py`
|
|
- configure service with data/config.json
|
|
- Change your app_secret_key !!
|
|
- Change your public_url
|
|
- uid = user id for new files
|
|
- workers = parallel processes (i.e. one upload reserves a process)
|
|
- timeout = timeout for processes, single upload might take a long time!
|
|
- max_zip_size = zipping a share with more data is not allowed
|
|
- configure bind host and port in .env
|
|
- proxy with nginx, match body size and timeout to your needs:
|
|
```
|
|
location /flees/ {
|
|
proxy_pass http://localhost:8136/;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Scheme $scheme;
|
|
proxy_set_header X-Script-Name /flees;
|
|
client_max_body_size 8G;
|
|
client_body_timeout 3600s;
|
|
}
|
|
```
|
|
|
|
- configure local port in `docker-compose.yaml`
|
|
- change website colors in code/static/css/colors.css
|
|
|
|
- Check `flees-manager.py rest` command to get direct links to various
|
|
actions
|
|
|
|
# custom notifier
|
|
|
|
- Add a notifier module, and refer to it in the config with:
|
|
"notifier": "python-path-to-file:class-name"
|
|
ex.: "notifier": "notifier:Notifier"
|
|
- The class must have method `def notify(self, message)`
|
|
|
|
Check the notifier.py.template for clues.
|
|
Flees will send notification on upload and download events, with a Dict like this:
|
|
```
|
|
{
|
|
"recipient": "share recipient",
|
|
"share": "name",
|
|
"filename": "file_path",
|
|
"operation": "direct_download",
|
|
"environment": [env for request, including IP addresses etc]
|
|
}
|
|
```
|
|
|
|
Operation is one of download, direct_download, zip_download, or upload
|
|
|
|
|
|
# Passwords
|
|
|
|
- shares.json stores hashed version of password.
|
|
- Additionally, it may store plain text password, if users so wish.
|
|
- Internally, Flees only compares the hashes of passwords
|
|
- Tokens are secret strings that allow login/upload/download with
|
|
direct links. You can have many tokens for single share.
|
|
- Direct download token is (password hash + filename) hashed
|
|
- Changing password for share, changes all the direct download tokens!
|
|
|
|
|
|
# Routes
|
|
|
|
- @app.route("/")
|
|
Display the list of public shares, or the ones logged in to
|
|
- @app.route('/authenticate/<name>', methods=['GET','POST'])
|
|
Query the password for the share
|
|
- @app.route('/upload/<name>/<token>', methods=['POST'])
|
|
Upload a file from command line
|
|
- @app.route('/upload', methods=['POST'])
|
|
Upload file from the browser
|
|
- @app.route('/upload_join/<name>/<token>', methods=['POST'])
|
|
Commence joining of a splitted upload file
|
|
- @app.route('/paste/<name>/<token>', methods=['POST'])
|
|
Upload a string from command line
|
|
- @app.route('/paste', methods=['POST'])
|
|
Upload a string from the browser
|
|
- @app.route('/editor', methods=['POST','GET'])
|
|
Open text editor.
|
|
- @app.route('/files/<name>/<token>', methods=['GET'])
|
|
Return plain text list of files in the share
|
|
- @app.route('/list/<name>/<token>', methods=['GET'])
|
|
Login to a share with a token
|
|
- @app.route('/list/<name>', methods=['GET'])
|
|
List share contents for the browser
|
|
- @app.route('/logout/<name>', methods=['GET'])
|
|
Logout from share. Only for browser.
|
|
- @app.route('/direct/<name>/<token>/<filename>', methods=['GET'])
|
|
Download a file using the filename token (if direct download enabled)
|
|
- @app.route('/download/<name>/<token>/<filename>', methods=['GET'])
|
|
Download a file using the share token
|
|
- @app.route('/download_gui/<name>/<filename>', methods=['GET'])
|
|
Download a file with a browser
|
|
- @app.route('/zip/<name>/<token>', methods=['GET'])
|
|
Download the whole share as a zip file using share token
|
|
- @app.route('/zip/<name>', methods=['GET'])
|
|
Download the whole share as a zip file using browser
|
|
- @app.route('/script/upload/<name>/<token>', methods=['GET'])
|
|
Get a bash script that uploads multiple files. Folders are uploaded as .tar.gz
|
|
- @app.route('/script/download/<name>/<token>', methods=['GET'])
|
|
Get a bash script that downloads all the files in a share.
|
|
- @app.route('/script/direct/<name>/<token>', methods=['GET'])
|
|
Get a bash script that downloads all the files in a share using direct filename tokens.
|
|
- @app.route('/script/upload_split/<name>/<token>', methods=['GET'])
|
|
Get a python script that uploads multiple files and folders. The script splits files
|
|
to smaller chunks, to prevent timeouts. Folders are uploaded as .tar
|
|
- @app.route('/script/client/<name>/<token>', methods=['GET'])
|
|
Get a python script that is a console client for downloading and
|
|
uploading files.
|