|
16 | 16 | class Sink: |
17 | 17 | def __init__( |
18 | 18 | self, trigger, *, |
19 | | - unlisted_args_propagate=True, unlisted_kwargs_propagate=True, |
20 | | - arg_list=None, kwarg_list=None, |
21 | | - sanitisers=None |
| 19 | + unlisted_args_propagate=True, |
| 20 | + arg_dict=None, |
| 21 | + sanitisers=None, |
22 | 22 | ): |
23 | 23 | self._trigger = trigger |
24 | 24 | self.sanitisers = sanitisers or [] |
25 | 25 | self.arg_list_propagates = not unlisted_args_propagate |
26 | | - self.kwarg_list_propagates = not unlisted_kwargs_propagate |
27 | 26 |
|
28 | 27 | if trigger[-1] != '(': |
29 | | - if self.arg_list_propagates or self.kwarg_list_propagates or arg_list or kwarg_list: |
| 28 | + if self.arg_list_propagates or arg_dict: |
30 | 29 | raise ValueError("Propagation options specified, but trigger word isn't a function call") |
31 | 30 |
|
32 | | - self.arg_list = set(arg_list or ()) |
33 | | - self.kwarg_list = set(kwarg_list or ()) |
| 31 | + arg_dict = {} if arg_dict is None else arg_dict |
| 32 | + self.arg_position_to_kwarg = { |
| 33 | + position: name for name, position in arg_dict.items() if position is not None |
| 34 | + } |
| 35 | + self.kwarg_list = set(arg_dict.keys()) |
34 | 36 |
|
35 | 37 | def arg_propagates(self, index): |
36 | | - in_list = index in self.arg_list |
37 | | - return self.arg_list_propagates == in_list |
| 38 | + kwarg = self.get_kwarg_from_position(index) |
| 39 | + return self.kwarg_propagates(kwarg) |
38 | 40 |
|
39 | 41 | def kwarg_propagates(self, keyword): |
40 | 42 | in_list = keyword in self.kwarg_list |
41 | | - return self.kwarg_list_propagates == in_list |
| 43 | + return self.arg_list_propagates == in_list |
| 44 | + |
| 45 | + def get_kwarg_from_position(self, index): |
| 46 | + return self.arg_position_to_kwarg.get(index) |
42 | 47 |
|
43 | 48 | @property |
44 | 49 | def all_arguments_propagate_taint(self): |
45 | | - if self.arg_list or self.kwarg_list: |
| 50 | + if self.kwarg_list: |
46 | 51 | return False |
47 | 52 | return True |
48 | 53 |
|
|
0 commit comments