191 lines
5.7 KiB
Python
191 lines
5.7 KiB
Python
|
|
#!/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/<link>')
|
|
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/<link>')
|
|
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='<p id="alert" style="color:red">Root not allowed </p>'
|
|
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='<p id="alert" style="color:red">Invalid Username/Password ! </p>'
|
|
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')
|
|
|