diff --git a/fakeredis/model/_acl.py b/fakeredis/model/_acl.py index 6859ef42..5d70746d 100644 --- a/fakeredis/model/_acl.py +++ b/fakeredis/model/_acl.py @@ -159,14 +159,26 @@ def as_array(self) -> List[Union[bytes, List[bytes]]]: ) return results + def _get_selectors_for_rule(self) -> List[bytes]: + results: List[bytes] = list() + for command, selector in self._selectors.items(): + s = b"-@all " + (b"+" if selector.allowed else b"-") + command + channels = b"resetchannels" + ((b" " + selector.channels) if selector.channels != b"" else b"") + results.append(b"(" + b" ".join([selector.keys, channels, s]) + b")") + return results + def as_rule(self) -> bytes: + selectors = self._get_selectors_for_rule() + channels = self._get_channel_patterns() + if channels != [b"&*"]: + channels = [b"resetchannels"] + channels rule_parts: List[bytes] = ( self._get_flags() - + list(self._passwords) + + [b"#" + password for password in self._passwords] + self._get_commands() + self._get_key_patterns() - + self._get_channel_patterns() - + self._get_selectors() + + channels + + selectors ) return b" ".join(rule_parts) diff --git a/test/test_mixins/test_acl_commands.py b/test/test_mixins/test_acl_commands.py index f4bc34ea..75a95b76 100644 --- a/test/test_mixins/test_acl_commands.py +++ b/test/test_mixins/test_acl_commands.py @@ -76,7 +76,9 @@ def test_acl_list(r: redis.Redis): assert "#e6c3da5b206634d7f3f3586d747ffdb36b5c675757b380c6a5fe5c570c714349" in user_rule assert "#1ba3d16e9881959f8c9a9762854f72c6e6321cdd44358a10a4e939033117eab9" in user_rule assert "on" in user_rule - assert "~cache:* ~objects:* resetchannels &message:*" in user_rule + assert "~cache:*" in user_rule + assert "~objects:*" in user_rule + assert "resetchannels &message:*" in user_rule assert "(%W~app* resetchannels -@all +set)" in user_rule assert "(~app* resetchannels &x -@all +get)" in user_rule assert "(%W~app* resetchannels -@all -hset)" in user_rule