-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbp_visit.py
executable file
·78 lines (63 loc) · 2.79 KB
/
bp_visit.py
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
73
74
75
76
77
78
import json
import os
import re
from datetime import datetime
from flask import Blueprint, abort, g, request, send_from_directory
from sqlalchemy import select
from models import Hurl, Visit, db
from utils import make_path
bp_visit = Blueprint("bp_visit", __name__, template_folder="templates")
def create_visit(token):
g.end_datetime_utc = datetime.utcnow()
visit = Visit(
token=token,
x_forwarded_for=request.headers.get("X-Forwarded-For", None),
remote_addr=request.headers.get("Remote-Addr", None),
referrer=request.referrer,
content_md5=request.content_md5,
origin=request.origin,
view_args=json.dumps(request.view_args),
scheme=request.scheme,
method=request.method,
root_path=request.root_path,
path=request.path,
query_string=request.query_string.decode(),
duration=(g.end_datetime_utc - g.start_datetime_utc).total_seconds(),
start_datetime_utc=g.start_datetime_utc,
end_datetime_utc=g.end_datetime_utc,
user_agent=request.user_agent.__str__(),
x_forwarded_proto=request.headers.get("X-Forwarded-Proto", None),
x_forwarded_host=request.headers.get("X-Forwarded-Host", None),
x_forwarded_prefix=request.headers.get("X-Forwarded-Prefix", None),
host=request.headers.get("Host", None),
connection=request.headers.get("Connection", None),
accept=request.headers.get("Accept", None),
accept_language=request.headers.get("Accept-Language", None),
accept_encoding=request.headers.get("Accept-Encoding", None),
dnt=request.headers.get("Dnt", None),
upgrade_insecure_requests=request.headers.get("Upgrade-Insecure-Requests", None),
sec_fetch_dest=request.headers.get("Sec-Fetch-Dest", None),
sec_fetch_mode=request.headers.get("Sec-Fetch-Mode", None),
sec_fetch_site=request.headers.get("Sec-Fetch-Site", None),
sec_fetch_user=request.headers.get("Sec-Fetch-User", None),
cookies=json.dumps(request.cookies),
content_length=request.content_length,
)
return visit
@bp_visit.route("/static/images/<string:token>/<string:pixel_name>.gif", methods=["GET"])
def visit(token, pixel_name):
path = make_path("static", "images")
pattern = "^[a-zA-Z0-9]{1,64}$"
if re.fullmatch(pattern, token) is None:
abort(404)
visit = create_visit(token)
hurl = db.session.scalar(select(Hurl).where(Hurl.token == token).where(Hurl.is_active == True))
if not hurl:
return abort(404)
hurl.visits.extend([visit])
db.session.add(hurl)
db.session.commit()
file_name = f"{pixel_name}.gif"
if os.path.isfile(os.path.join(path, file_name)):
return send_from_directory(path, file_name)
return send_from_directory(path, "main.gif")