-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path_database_matchers.py
More file actions
105 lines (88 loc) · 3.24 KB
/
_database_matchers.py
File metadata and controls
105 lines (88 loc) · 3.24 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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
"""Helpers for getting databases which match keys given in requests."""
from collections.abc import Iterable, Mapping
from beartype import beartype
from vws_auth_tools import authorization_header
from mock_vws.database import VuforiaDatabase
@beartype
def get_database_matching_client_keys(
*,
request_headers: Mapping[str, str],
request_body: bytes | None,
request_method: str,
request_path: str,
databases: Iterable[VuforiaDatabase],
) -> VuforiaDatabase:
"""Return the first of the given databases which is being accessed by
the
given client request.
Args:
request_headers: The headers sent with the request.
request_body: The request body.
request_method: The HTTP method of the request.
request_path: The path of the request.
databases: The databases to check for matches.
Returns:
The database which is being accessed by the given client request.
Raises:
ValueError: No database matches the given request.
"""
request_headers_dict = dict(request_headers)
content_type = request_headers_dict.get("Content-Type", "").split(sep=";")[
0
]
auth_header = request_headers_dict.get("Authorization")
date = request_headers_dict.get("Date", "")
for database in databases:
expected_authorization_header = authorization_header(
access_key=database.client_access_key,
secret_key=database.client_secret_key,
method=request_method,
content=request_body,
content_type=content_type,
date=date,
request_path=request_path,
)
if auth_header == expected_authorization_header:
return database
raise ValueError
@beartype
def get_database_matching_server_keys(
*,
request_headers: Mapping[str, str],
request_body: bytes | None,
request_method: str,
request_path: str,
databases: Iterable[VuforiaDatabase],
) -> VuforiaDatabase:
"""Return the first of the given databases which is being accessed by
the
given server request.
Args:
request_headers: The headers sent with the request.
request_body: The request body.
request_method: The HTTP method of the request.
request_path: The path of the request.
databases: The databases to check for matches.
Returns:
The database being accessed by the given server request.
Raises:
ValueError: No database matches the given request.
"""
request_headers_dict = dict(request_headers)
content_type_header = request_headers_dict.get("Content-Type", "")
content_type = content_type_header.split(sep=";")[0]
auth_header = request_headers_dict.get("Authorization")
date = request_headers_dict.get("Date", "")
for database in databases:
expected_authorization_header = authorization_header(
access_key=database.server_access_key,
secret_key=database.server_secret_key,
method=request_method,
content=request_body,
content_type=content_type,
date=date,
request_path=request_path,
)
if auth_header == expected_authorization_header:
return database
raise ValueError