255 lines
10 KiB
Python
255 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from flask import Blueprint, Flask, request, flash, render_template, url_for, session, redirect, abort, make_response, flash, abort, send_file, send_from_directory
|
|
|
|
from werkzeug.utils import secure_filename
|
|
from markupsafe import escape
|
|
from PIL import Image
|
|
import time
|
|
import sqlite3
|
|
import os
|
|
from shutil import move
|
|
from tools.filesutils import getFileSizeMo, getFileSizeKo, check_and_create
|
|
from tools.utils import login_required
|
|
|
|
filesupload = Blueprint('filesupload', __name__, template_folder='templates')
|
|
|
|
app = Flask( 'pywallter' )
|
|
app.config.from_pyfile('config.py')
|
|
|
|
#### Variables ##################################################################################
|
|
|
|
DOSSIER_PERSO= app.config.get('DOSSIER_APP')
|
|
DOSSIER_PUBLIC= app.config.get('DOSSIER_PUBLIC')
|
|
|
|
extensionimg = app.config.get('EXT_IMG')
|
|
DATABASE = app.config.get('DATABASE')
|
|
BASE_URL= app.config.get('BASE_URL')
|
|
##################################################################################################
|
|
|
|
|
|
@filesupload.route( '/filesupload/', methods=['POST'])
|
|
@login_required
|
|
def upload():
|
|
user = '%s'% escape(session['username'])
|
|
if 'fic' not in request.files:
|
|
flash(u'Mauvais format de ficher', 'error')
|
|
return redirect(request.url)
|
|
file = request.files['fic']
|
|
|
|
# If the user does not select a file, the browser submits an
|
|
# empty file without a filename.
|
|
if file.filename == '':
|
|
flash(u'Vous avez oubliez de selectionner un fichier', 'error' )
|
|
else:
|
|
|
|
files = request.files.getlist('fic')
|
|
for f in files :
|
|
nom = secure_filename(f.filename)
|
|
check_and_create(os.path.join(DOSSIER_PERSO, user, 'files'))
|
|
check_and_create(os.path.join(DOSSIER_PERSO, user, 'images'))
|
|
if os.path.isfile(os.path.join(DOSSIER_PERSO,user, 'files', nom) or
|
|
os.path.isfile(DOSSIER_PERSO, user, 'images', nom)):
|
|
alert = "Le fichier "+str(f.filename)+" avec le même nom existe déjà, merci de spécifier un autre nom de fichier \n"
|
|
flash(alert, 'error')
|
|
else:
|
|
file, ext = os.path.splitext(nom)
|
|
if ext in extensionimg :
|
|
f.save(os.path.join(DOSSIER_PERSO, user, 'images', nom))
|
|
image = os.path.join(DOSSIER_PERSO, user, 'images', nom)
|
|
with Image.open(image) as img :
|
|
img.thumbnail((300,300))
|
|
img.save(os.path.join(DOSSIER_PERSO, user, 'images','thumbnails', nom ))
|
|
time_img_create=time.strftime("%A %d %B %Y %H:%M:%S")
|
|
IP=request.environ['REMOTE_ADDR']
|
|
client_platform=request.headers.get('User-Agent')
|
|
log_file=os.path.join(DOSSIER_PERSO, user, "log.txt")
|
|
log=open(log_file, "a")
|
|
log.write (time_img_create + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + nom + '\n')
|
|
log.close()
|
|
|
|
else:
|
|
f.save(os.path.join(DOSSIER_PERSO, user, 'files', nom))
|
|
time_file_upload=time.strftime("%A %d %B %Y %H:%M:%S")
|
|
IP=request.environ.get('REMOTE_ADDR')
|
|
client_platform=request.headers.get('User-Agent')
|
|
log=open("log.txt", "a") # Ouvre fichier log.txt
|
|
log.write (time_file_upload + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + nom + '\n') # Écrit dans log
|
|
log.close() # Ferme log.txt
|
|
flash(u'Les fichiers envoyées ont été traitée avec succés', 'succes')
|
|
|
|
|
|
return redirect(url_for('filesupload.list'))
|
|
|
|
@filesupload.route( '/upload-dropzone', methods=['POST'])
|
|
@login_required
|
|
def drop_upload():
|
|
user = '%s'% escape(session['username'])
|
|
file = request.files['file']
|
|
check_and_create(os.path.join(DOSSIER_PERSO, user, 'files'))
|
|
check_and_create(os.path.join(DOSSIER_PERSO, user, 'images' ))
|
|
filename = secure_filename(file.filename)
|
|
ext = os.path.splitext(filename)
|
|
is_image = False
|
|
print("nom du fichier :" +filename)
|
|
if ext in extensionimg :
|
|
save_path = os.path.join(DOSSIER_PERSO, user, 'images', filename )
|
|
is_image = True
|
|
else:
|
|
save_path = os.path.join(DOSSIER_PERSO, user, 'files', filename )
|
|
|
|
current_chunk = int(request.form['dzchunkindex'])
|
|
print (current_chunk)
|
|
|
|
if (os.path.isfile(save_path) or os.path.isfile( os.path.join(DOSSIER_PERSO, user, 'images', filename ))) and current_chunk == 0:
|
|
return make_response(('Un fichier avec le même nom existe déjà', 400))
|
|
|
|
try:
|
|
with open(save_path, 'ab') as f:
|
|
f.seek(int(request.form['dzchunkbyteoffset']))
|
|
f.write(file.stream.read())
|
|
except OSError:
|
|
return make_response(("Une erreur est survenue,"
|
|
" Impossible d'écrire le fichier sur le disque", 500))
|
|
total_chunks = int(request.form['dztotalchunkcount'])
|
|
if current_chunk + 1 == total_chunks:
|
|
# This was the last chunk, the file should be complete and the size we expect
|
|
if os.path.getsize(save_path) != int(request.form['dztotalfilesize']):
|
|
return make_response(('La taille du fichier source est différentes', 500))
|
|
else:
|
|
time_file_upload=time.strftime("%A %d %B %Y %H:%M:%S")
|
|
IP=request.environ['REMOTE_ADDR']
|
|
client_platform=request.headers.get('User-Agent')
|
|
log=open("log.txt", "a") # Ouvre fichier log.txt
|
|
log.write (time_file_upload + ' - ' + IP + ' - ' + user + ' - ' + client_platform + '\n' + '---> ' + filename + '\n') # Écrit dans log
|
|
log.close() # Ferme log.txt
|
|
|
|
if is_image :
|
|
with Image.open(save_path) as img :
|
|
img.thumbnail((300,300))
|
|
img.save(os.path.join(DOSSIER_PERSO, user, 'images', 'thumbnails', filename ) )
|
|
|
|
return make_response(('Chunk upload succesfull', 200))
|
|
|
|
@filesupload.route('/view/', methods=['GET'])
|
|
@login_required
|
|
def list():
|
|
|
|
user = '%s'% escape(session['username'])
|
|
|
|
check_and_create(os.path.join(DOSSIER_PUBLIC, user, 'files'))
|
|
check_and_create(os.path.join(DOSSIER_PERSO, user, 'files'))
|
|
|
|
return render_template('files.html',
|
|
section="Files",
|
|
BASE_URL=BASE_URL,
|
|
username=user)
|
|
|
|
|
|
@filesupload.route('/files/<status>/', methods=['GET'])
|
|
@login_required
|
|
def list_files(status: str ):
|
|
user = '%s' % escape(session['username'])
|
|
listFiles = []
|
|
nb_files = 0
|
|
size=0
|
|
folder=""
|
|
|
|
if status == "public":
|
|
folder=DOSSIER_PUBLIC
|
|
else:
|
|
folder=DOSSIER_PERSO
|
|
|
|
files = os.listdir(os.path.join(folder, user, 'files'))
|
|
|
|
if files:
|
|
for fich in files:
|
|
nb_files += 1
|
|
size = getFileSizeMo(os.path.join(folder, user, 'files', fich)) # size = taille des fichiers
|
|
listFiles.append([nb_files, fich, size]) # On implémente la listeFichiers avec le num le ficier et sa taille
|
|
resp = "<h2> Bonjour " + user +" ça va bien putain ca marche ? </h2>"
|
|
|
|
return render_template('list_files.html',
|
|
BASE_URL=BASE_URL,
|
|
status=status,
|
|
size=size,
|
|
username=user,
|
|
nb_files=nb_files,
|
|
listFiles=listFiles)
|
|
|
|
|
|
@filesupload.route('/myfiles/<username>/<filename>')
|
|
@login_required
|
|
def myfiles(username, filename):
|
|
user = '%s' % escape(session['username'])
|
|
return send_from_directory(
|
|
os.path.join(DOSSIER_PERSO, username, 'files'), filename )
|
|
|
|
@filesupload.route('/make_public/<filename>')
|
|
@login_required
|
|
def move_public(filename):
|
|
user = '%s' % escape(session['username'])
|
|
|
|
src = os.path.join(DOSSIER_PERSO, user, 'files', filename)
|
|
dst = os.path.join(DOSSIER_PUBLIC, user, 'files')
|
|
move (src, dst)
|
|
return redirect(url_for('filesupload.list', _external=True))
|
|
|
|
@filesupload.route('/make_private/<filename>')
|
|
@login_required
|
|
def move_private(filename):
|
|
user = '%s' % escape(session['username'])
|
|
src = os.path.join(DOSSIER_PUBLIC, user, 'files', filename)
|
|
dst = os.path.join(DOSSIER_PERSO, user, 'files')
|
|
move (src, dst)
|
|
return redirect(url_for('filesupload.list', _external=True))
|
|
|
|
|
|
|
|
|
|
@filesupload.route('/remove_privateFile/<filename>')
|
|
@login_required
|
|
def remove_privateFile(filename):
|
|
user = '%s' % escape(session['username'])
|
|
filename = secure_filename(filename)
|
|
try:
|
|
os.remove( os.path.join(DOSSIER_PERSO, user, 'files', filename)) # on le supprime
|
|
except FileNotFoundError:
|
|
flash(u'Fichier {filename} inexistant.'.format(filename=filename), 'error')
|
|
return redirect(url_for('filesupload.list', _external=True))
|
|
|
|
|
|
@filesupload.route('/remove_publicFile/<filename>')
|
|
@login_required
|
|
def remove_publicFile(filename):
|
|
user = '%s' % escape(session['username'])
|
|
filename = secure_filename(filename)
|
|
try:
|
|
os.remove( os.path.join(DOSSIER_PUBLIC, user, 'files', filename)) # on le supprime
|
|
except FileNotFoundError:
|
|
flash(u'Fichier {filename} inexistant.'.format(filename=filename), 'error')
|
|
return redirect(url_for('filesupload.list', _external=True))
|
|
|
|
|
|
@filesupload.route('/<author>/blog.css')
|
|
def blog_theme(author):
|
|
user = author
|
|
if os.path.isfile(os.path.join(DOSSIER_PERSO, user,'blog.css')):
|
|
return send_file(os.path.join(DOSSIER_PERSO, user, 'blog.css'), mimetype='text/css')
|
|
else:
|
|
return send_file("static/blog.css", mimetype='text/css')
|
|
|
|
@filesupload.route('/theme.min.css')
|
|
def theme():
|
|
if 'username' in session:
|
|
user = '%s' % escape(session['username'])
|
|
if os.path.isfile(os.path.join(DOSSIER_PERSO, user,'theme.min.css')):
|
|
return send_file(os.path.join(DOSSIER_PERSO, user,'theme.min.css'), mimetype='text/css')
|
|
|
|
return send_file("static/default.min.css", mimetype='text/css')
|
|
|
|
@filesupload.route('/public/<username>/<filename>')
|
|
def publicfiles(username, filename):
|
|
return send_from_directory(
|
|
os.path.join(DOSSIER_PUBLIC, username, 'files'), filename )
|