7
7
from ._common import app , get_real_ip_addr
8
8
from ._config import RATE_LIMIT , RATELIMIT_STORAGE_URL , REDIS_HOST , REDIS_PASSWORD
9
9
from ._exceptions import ValidationFailedException
10
- from ._params import extract_dates , extract_integers , extract_strings
10
+ from ._params import extract_dates , extract_integers , extract_strings , parse_source_signal_sets
11
11
from ._security import _is_public_route , current_user , resolve_auth_token , ERROR_MSG_RATE_LIMIT , ERROR_MSG_MULTIPLES
12
12
13
13
14
+
14
15
def deduct_on_success (response : Response ) -> bool :
15
16
if response .status_code != 200 :
16
17
return False
@@ -52,8 +53,9 @@ def get_multiples_count(request):
52
53
if "window" in request .args .keys ():
53
54
multiple_selection_allowed -= 1
54
55
for k , v in request .args .items ():
55
- if v == "*" :
56
+ if "*" in v :
56
57
multiple_selection_allowed -= 1
58
+ continue
57
59
try :
58
60
vals = multiples .get (k )(k )
59
61
if len (vals ) >= 2 :
@@ -70,16 +72,23 @@ def get_multiples_count(request):
70
72
71
73
def check_signals_allowlist (request ):
72
74
signals_allowlist = {":" .join (ss_pair ) for ss_pair in DashboardSignals ().srcsig_list ()}
73
- request_signals = []
74
- if "signal" in request .args .keys ():
75
- request_signals += extract_strings ("signal" )
76
- if "signals" in request .args .keys ():
77
- request_signals += extract_strings ("signals" )
78
- if "data_source" in request .args :
79
- request_signals = [f"{ request .args ['data_source' ]} :{ request_signal } " for request_signal in request_signals ]
75
+ request_signals = set ()
76
+ try :
77
+ source_signal_sets = parse_source_signal_sets ()
78
+ except ValidationFailedException :
79
+ return False
80
+ for source_signal in source_signal_sets :
81
+ # source_signal.signal is expected to be eiter list or bool:
82
+ # in case of bool, we have wildcard signal -> return False as there are no chances that
83
+ # all signals from given source will be whitelisted
84
+ # in case of list, we have list of signals
85
+ if isinstance (source_signal .signal , bool ):
86
+ return False
87
+ for signal in source_signal .signal :
88
+ request_signals .add (f"{ source_signal .source } :{ signal } " )
80
89
if len (request_signals ) == 0 :
81
90
return False
82
- return all ([ signal in signals_allowlist for signal in request_signals ] )
91
+ return request_signals . issubset ( signals_allowlist )
83
92
84
93
85
94
def _resolve_tracking_key () -> str :
0 commit comments