-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflowcase_upload_server.py
More file actions
72 lines (65 loc) · 2.64 KB
/
flowcase_upload_server.py
File metadata and controls
72 lines (65 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import argparse
import base64
import os
from flask import Flask, request, make_response
app = Flask(__name__)
parser = argparse.ArgumentParser()
parser.add_argument("--ssl", action="store_true")
parser.add_argument("--auth-token")
parser.add_argument("--port", default="4902")
parser.add_argument("--upload-dir", default=(os.path.join(os.getenv("HOME"), "Uploads")))
args, _ = parser.parse_known_args()
@app.route("/upload", methods=["POST"])
def upload():
if args.auth_token != "":
if "Authorization" in request.headers and request.headers["Authorization"].startswith("Basic "):
try:
user_pass_raw = base64.b64decode(request.headers["Authorization"].replace("Basic ", ""))
except:
return make_response(('Failed to decode auth 1', 403))
else:
try:
user_pass_as_text = user_pass_raw.decode("ISO-8859-1")
except:
return make_response(('Failed to decode auth 2', 403))
else:
if user_pass_as_text != args.auth_token:
return make_response(('Access Denied!', 403))
else:
return make_response(('Authorization Header missing or invalid', 403))
file = request.files["file"]
current_chunk = int(request.form["dzchunkindex"])
if args.upload_dir:
save_path = os.path.join(args.upload_dir, escapeFilename(file.filename))
if os.path.exists(save_path):
if current_chunk == 0:
return make_response(('File already exists', 400))
save_path = os.path.join(args.upload_dir, "." + escapeFilename(file.filename) + ".uploading")
if os.path.exists(save_path) and current_chunk == 0:
os.remove(save_path)
else:
return make_response(("Couldn't find upload path", 500))
if current_chunk == 0:
syssize = os.statvfs(args.upload_dir)
space = syssize.f_bsize * syssize.f_bavail
if space - int(request.form["dztotalfilesize"]) < 0:
return make_response(('No Space available', 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(("Couldn't write the file to disk", 500))
else:
total_chunks = int(request.form["dztotalchunkcount"])
if current_chunk + 1 == total_chunks:
if os.path.getsize(save_path) != int(request.form["dztotalfilesize"]):
os.remove(save_path)
return make_response(('Size mismatch', 500))
os.rename(save_path, os.path.join(args.upload_dir, escapeFilename(file.filename)))
return make_response(('uploaded Chunk', 200))
def escapeFilename(filename):
keepcharacters = (' ', '.', '_', '-')
return "".join((c for c in filename if c.isalnum() or c in keepcharacters)).rstrip()
if __name__ == "__main__":
app.run(host="0.0.0.0", port=args.port, ssl_context="adhoc" if args.ssl else None)