From abf7741b16141c18bdb545b598793ec3da58cda3 Mon Sep 17 00:00:00 2001 From: pporcheret Date: Thu, 22 Jun 2023 08:10:29 +0000 Subject: [PATCH] first commit --- README.md | 83 ++++++++++++++++++ app.py | 190 ++++++++++++++++++++++++++++++++++++++++ images/screen0.png | Bin 0 -> 23693 bytes images/screen1.png | Bin 0 -> 18404 bytes images/screen2.png | Bin 0 -> 17305 bytes requirement.txt | 8 ++ static/style.css | 113 ++++++++++++++++++++++++ templates/base.html | 19 ++++ templates/download.html | 17 ++++ templates/foot.html | 11 +++ templates/index.html | 31 +++++++ templates/login.html | 33 +++++++ templates/menu.html | 20 +++++ templates/nodown.html | 13 +++ templates/upload.html | 59 +++++++++++++ 15 files changed, 597 insertions(+) create mode 100644 README.md create mode 100755 app.py create mode 100644 images/screen0.png create mode 100644 images/screen1.png create mode 100644 images/screen2.png create mode 100755 requirement.txt create mode 100644 static/style.css create mode 100644 templates/base.html create mode 100644 templates/download.html create mode 100644 templates/foot.html create mode 100644 templates/index.html create mode 100644 templates/login.html create mode 100644 templates/menu.html create mode 100644 templates/nodown.html create mode 100644 templates/upload.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..04199e7 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# Transfert + +## About + +I used to transfert big files using Jirafeau. But I decided to create my own tool. + +I wanted : + - Something modern and safer than PHP + - with QRcode possibility + - No database + - Clean expired files automatically + - Manage single Download + - SSL Connexion + +[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/) [![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg)](https://opensource.org/licenses/) [![AGPL License](https://img.shields.io/badge/license-AGPL-blue.svg)](http://www.gnu.org/licenses/agpl-3.0) + + +## Install +```sh + +Ubuntu/Debian: + +git clone https://git.nerkdesign.com/pporcheret/Transfert.git +cd ./Transfert/ +mkdir storage +apt install python3 python3-pip +pip3 install -r requirement.txt + +Redhat: + +git clone https://git.nerkdesign.com/pporcheret/Transfert.git +cd ./Transfert/ +mkdir storage +yum install python3 python3-pip +pip3 install -r requirement.txt + + +``` + +## Start + +python3 app.py + +Use your browser to go to : +```sh + https://{{IP}}:5006 + +``` + +## Config + +You can edit the Flask port/host : +```sh +flask_port=5006 +flask_host='0.0.0.0' +flask_thread=True +flask_debug=False +``` +The size of the random link : +```sh +random_size = 12 +``` +The storage location of your files : +```sh +path = os.path.dirname(__file__) +storage_path= path+'/storage/' +``` + +## Login + + +Be carefull !! +By default, the authentification is PAM. +This PAM auth is based on the library [simplepam](https://github.com/leonnnn/python3-simplepam). +This means that by default, the allowed users, are the user in the server. + +## Screenshot + +![ScreenShot](./images/screen0.png) +![ScreenShot2](./images/screen1.png) +![ScreenShot2](./images/screen2.png) + + diff --git a/app.py b/app.py new file mode 100755 index 0000000..c0bf8e1 --- /dev/null +++ b/app.py @@ -0,0 +1,190 @@ + +#!/usr/bin/python3 +import os +import sys +import time +import string +import random +import datetime +from datetime import timedelta +from flask_qrcode import QRcode +from werkzeug.utils import secure_filename +from flask import Flask, render_template, Response, request, redirect, url_for, session, escape, send_from_directory, send_file, after_this_request +from flask_fontawesome import FontAwesome +from simplepam import authenticate +from flask_navigation import Navigation +from flask_dropzone import Dropzone + +##Variables +#Flask config +flask_port=5006 +flask_host='0.0.0.0' +flask_thread=True +flask_debug=False +#Other +random_size = 12 + +#path base for service lauch +path = os.path.dirname(__file__) +storage_path= path+'/storage/' + +#Flask init +app = Flask(__name__,static_url_path='',static_folder='static',template_folder='templates') + +#Init QRcode +QRcode(app) + +#Init FontAwsome +fa = FontAwesome(app) + +#Init Nav +nav = Navigation(app) + +nav.Bar('top', [ + nav.Item('Index', 'index'), + nav.Item('Upload', 'uploads'), +]) + +#DropZone +app.config.update( + UPLOADED_PATH= storage_path) +dropzone = Dropzone(app) + +##Functions +def today_format(): + x = datetime.datetime.now() + return x.strftime("%d%m%y%H%M%S") + +def time_end(date_up,retention): + retention = int(retention) + tdate = datetime.datetime.strptime(date_up, '%d%m%y%H%M%S') + end_date = tdate + timedelta(hours = retention) + end_date = end_date.strftime("%d%m%y%H%M%S") + return end_date + +def del_expired_files(): + files=os.listdir(storage_path) + for file in files: + list_file=file.split("_") + retention = ''.join(list_file[-2:-1]) + if retention != '0': + date_up = ''.join(list_file[-3:-2]) + end_date = time_end(date_up,retention) + end_date = datetime.datetime.strptime(end_date,"%d%m%y%H%M%S") + actual_date = datetime.datetime.now() + if end_date < actual_date: + if os.path.exists(storage_path+file): + os.remove(storage_path+file) + +def random_link(): + res = ''.join(random.choices(string.ascii_letters+string.digits, k=random_size)) + return res + +def list_files(): + out_files=[] + files=os.listdir(storage_path) + for file in files: + middle=[] + list_file=file.split("_") + singled = ''.join(list_file[-1:]) + retention=''.join(list_file[-2:-1]) + date_up=''.join(list_file[-3:-2]) + link=''.join(list_file[-4:-3]) + list_file_name=list_file[:-4] + list_file_name='_'.join(list_file_name) + end_date = time_end(date_up,retention) + middle.append(list_file_name) + middle.append(retention) + middle.append(date_up) + middle.append(link) + middle.append(end_date) + middle.append(request.url_root+"download/"+link) + middle.append(singled) + out_files.append(middle) + return out_files + +##Pages +@app.route('/') +def index(): + if 'username' in session: + del_expired_files() + return render_template('index.html',loguser=session['username'],listdir=list_files()) + return render_template('login.html',title="Login") + +@app.route('/down/') +def down(link): + del_expired_files() + files=list_files() + for file in files: + if link == file[3]: + filename=file[0]+"_"+file[3]+"_"+file[2]+"_"+file[1]+"_"+file[6] + if file[6] == 'YES': + @after_this_request + def remove_file(reponse): + os.remove(storage_path+filename) + return reponse + return send_file(storage_path+filename, download_name=secure_filename(file[0])) + return render_template('nodown.html',title='No Download') + +@app.route('/download/') +def download(link): + del_expired_files() + files=list_files() + for file in files: + if link == file[3]: + filename=file[0] + url_todl=request.url_root+"down/"+link + return render_template('download.html',title="Download",filename=filename,url_todl=url_todl,qrcode=QRcode.qrcode(url_todl, mode="base64")) + +@app.route('/uploads') +def uploads(): + if 'username' in session: + del_expired_files() + return render_template('upload.html',loguser=session['username']) + return render_template('login.html',title="Login") + +@app.route('/upload', methods = ['POST']) +def upload(): + del_expired_files() + retention = request.form['retention'] + r = ['on'] + if request.form.getlist('uniqd') == r: + singled = 'YES' + else: + singled = 'NO' + my_files = request.files + for item in my_files: + uploaded_file = my_files.get(item) + uploaded_file.filename = secure_filename(uploaded_file.filename) + link = random_link() + today = today_format() + print(uploaded_file.filename+"_"+link+"_"+today+"_"+retention+"_"+singled) + uploaded_file.save(os.path.join(app.config['UPLOADED_PATH'],uploaded_file.filename+"_"+link+"_"+today+"_"+retention+"_"+singled)) + return render_template('upload.html',title="Upload") + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + username = request.form['username'] + if username == 'root': + resultats='

Root not allowed

' + return render_template('login.html', alertmessage=resultats) + else: + password = request.form['password'] + if authenticate(str(username), str(password)): + session['username'] = request.form['username'] + return redirect(url_for('index')) + else: + resultats='

Invalid Username/Password !

' + return render_template('login.html', alertmessage=resultats) + +@app.route('/logout') +def logout(): + session.pop('username', None) + return redirect(url_for('index')) + +app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' + +if __name__ == '__main__': + app.run(host=flask_host, port=flask_port, threaded=flask_thread, debug=flask_debug, ssl_context='adhoc') + diff --git a/images/screen0.png b/images/screen0.png new file mode 100644 index 0000000000000000000000000000000000000000..37d50dc128238633cb9918bab39268aeac063b18 GIT binary patch literal 23693 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�vy7pEOG4Xm4{l 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 + + + + + +{{ fontawesome_css() }} +{{ dropzone.load_css() }} +{{ dropzone.style('border: 2px dashed #000; min-height: 200px;text-align:center;') }} + + +{{ title }} +
+ + + + +
+
diff --git a/templates/download.html b/templates/download.html new file mode 100644 index 0000000..3004e63 --- /dev/null +++ b/templates/download.html @@ -0,0 +1,17 @@ +{% include 'base.html' %} + +{% block main %} + +
Files to Download
+
+
+
+
+
+File name : {{ filename }}

+Direct URL : {{ url_todl }}

+ + +
+
+{% endblock %} diff --git a/templates/foot.html b/templates/foot.html new file mode 100644 index 0000000..62b8883 --- /dev/null +++ b/templates/foot.html @@ -0,0 +1,11 @@ + +
+ +{{ fontawesome_js() }} + + + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..1eb754e --- /dev/null +++ b/templates/index.html @@ -0,0 +1,31 @@ +{% include 'base.html' %} +{% block main %} +{% include 'menu.html' %} +
Files list
+
+
+ + + + + + + + + + + + + +{%for file in listdir %} + +{%for item in file %} + +{%endfor%} + +{%endfor%} + +
NameRetention (hours)Upload dateLinkEnd Download TimeDownload pageSingle Download
{{ item }}
+
+{% endblock %} +{% include 'foot.html' %} diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..6f6d147 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,33 @@ +{% include 'base.html' %} +{% block main %} +
+{{ alertmessage | safe }} +
+ + + +
+ +
+ +{% endblock %} +{% include 'foot.html' %} diff --git a/templates/menu.html b/templates/menu.html new file mode 100644 index 0000000..cdbf030 --- /dev/null +++ b/templates/menu.html @@ -0,0 +1,20 @@ +{% block main %} +
+ +
+
+
+{% endblock %} diff --git a/templates/nodown.html b/templates/nodown.html new file mode 100644 index 0000000..35b204b --- /dev/null +++ b/templates/nodown.html @@ -0,0 +1,13 @@ +{% include 'base.html' %} +{% block main %} +
No files to Download
+
+
+
+
+Nothing to download, file missing or already deleted.
+Contact your sender if you think it's a mistake. +
+ +{% endblock %} + diff --git a/templates/upload.html b/templates/upload.html new file mode 100644 index 0000000..c576264 --- /dev/null +++ b/templates/upload.html @@ -0,0 +1,59 @@ +{% include 'base.html' %} +{% include 'menu.html' %} +{% block main %} + {{ dropzone.load_js() }} + {{ dropzone.config() }} + +
Upload
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+
+
+ +
+ + + +{% endblock %} +{% include 'foot.html' %}