tblck.py - blck - ephemeral pastebin/url shortener
HTML git clone https://git.parazyd.org/blck
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
tblck.py (2396B)
---
1 #!/usr/bin/env python3
2 # copyleft (c) 2017-2021 parazyd <parazyd@dyne.org>
3 # see LICENSE file for copyright and license details.
4
5 from io import BytesIO
6 from os import remove, rename
7 from os.path import isfile
8 from random import choice
9 from string import ascii_uppercase, ascii_lowercase
10
11 from flask import (Flask, Blueprint, render_template, request, safe_join,
12 send_file, abort)
13 import magic
14
15 bp = Blueprint('blck', __name__, template_folder='templates')
16
17
18 @bp.route("/", methods=['GET', 'POST'])
19 def index():
20 if request.method == 'GET':
21 return render_template('index.html', root=args.r)
22 return short(request.files)
23
24
25 @bp.route("<urlshort>")
26 def urlget(urlshort):
27 fp = safe_join('files', urlshort)
28 if not isfile(fp):
29 abort(404)
30 r = BytesIO()
31 mime = magic.from_file(fp, mime=True)
32 with open(fp, 'rb') as fo:
33 r.write(fo.read())
34 r.seek(0)
35 remove(fp)
36 return send_file(r, mimetype=mime)
37
38
39 def short(c):
40 if not c or not c['c']:
41 return abort(400)
42
43 s = genid()
44 f = c['c']
45 f.save(safe_join('files', s))
46
47 mimetype = f.mimetype
48 if not mimetype:
49 mimetype = magic.from_file(safe_join('files', s), mime=True)
50
51 if mimetype:
52 t, s = s, '.'.join([s, mimetype.split('/')[1]])
53 rename(safe_join('files', t), safe_join('files', s))
54
55 if request.headers.get('X-Forwarded-Proto') == 'https':
56 return ''.join([
57 request.url_root.replace('http://', 'https://'),
58 args.r.lstrip('/'), s, '\n'
59 ])
60 return ''.join([request.url_root + args.r.lstrip('/'), s, '\n'])
61
62
63 def genid(size=4, chars=ascii_uppercase + ascii_lowercase):
64 return ''.join(choice(chars) for i in range(size))
65
66
67 if __name__ == '__main__':
68 from argparse import ArgumentParser
69 parser = ArgumentParser()
70 parser.add_argument('-r', default='/', help='application root')
71 parser.add_argument('-l', default='localhost', help='listen host')
72 parser.add_argument('-p', default=13321, help='listen port')
73 parser.add_argument('-d', default=False, action='store_true', help='debug')
74 args = parser.parse_args()
75
76 app = Flask(__name__)
77 app.register_blueprint(bp, url_prefix=args.r)
78
79 if args.d:
80 app.run(host=args.l, port=args.p, threaded=True, debug=args.d)
81 else:
82 from bjoern import run
83 run(app, args.l, int(args.p))