)]}'
{"README.rst":[{"author":{"_account_id":308,"name":"Thierry Carrez","email":"thierry@openstack.org","username":"ttx"},"change_message_id":"a853d2d853bdb8fd57ee2ae561fc0e8169f76408","unresolved":false,"context_lines":[{"line_number":282,"context_line":"-n and integer, and followed by any allowed command by the other filters:"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"``nice: /usr/bin/nice, root, nice, -n, -?\\d+``"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"Calling rootwrap from OpenStack services"},{"line_number":288,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_1fcb1e4b","line":285,"updated":"2014-06-17 13:29:07.000000000","message":"I would add a \u003c\u003c Note: this filter can\u0027t be used to impose that the subcommand is always run under the prefix command. In particular, it can\u0027t enforce that a particular command is only run under \"nice\", since the subcommand can explicitly be called directly. \u003e\u003e","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d71dfd9d3858d27462432fabb51015fc3f61151","unresolved":false,"context_lines":[{"line_number":282,"context_line":"-n and integer, and followed by any allowed command by the other filters:"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"``nice: /usr/bin/nice, root, nice, -n, -?\\d+``"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"Calling rootwrap from OpenStack services"},{"line_number":288,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1ae5cdf2_d0c9a5ad","line":285,"in_reply_to":"1ae5cdf2_1fcb1e4b","updated":"2014-06-17 15:10:43.000000000","message":"Thanks for your suggestion. I will add the text in the next revision.","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"}],"oslo/rootwrap/filters.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"fae7e47f849c8c9853cbc926184bf8450e06bd48","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        # Compare each arg (anchoring pattern explicitly at end of string)"},{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_15c4df3f","line":334,"updated":"2014-06-17 14:13:52.000000000","message":"Should we also prefix with ^ to make sure we\u0027re matching the entire arg?","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d71dfd9d3858d27462432fabb51015fc3f61151","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        # Compare each arg (anchoring pattern explicitly at end of string)"},{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_8649a790","line":334,"in_reply_to":"1ae5cdf2_15c4df3f","updated":"2014-06-17 15:10:43.000000000","message":"No, because re.match() matches only if the regexp matches at the top of given string.\n\n[cf. when you want to match the regexp to arbitrary places in the string, you need use re.search().]","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":308,"name":"Thierry Carrez","email":"thierry@openstack.org","username":"ttx"},"change_message_id":"e68719ce8ad30c80b263ce243ff40eb8bb766e8e","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        # Compare each arg (anchoring pattern explicitly at end of string)"},{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_0112b308","line":334,"in_reply_to":"1ae5cdf2_8649a790","updated":"2014-06-18 10:15:17.000000000","message":"Agreed","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"fae7e47f849c8c9853cbc926184bf8450e06bd48","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"},{"line_number":338,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_f57a1324","line":335,"updated":"2014-06-17 14:13:52.000000000","message":"Couldn\u0027t we just return false immediately?  That would allow us to remove the last return False entirely and the return True would just be what happens if we completed the loop (so no else needed either).","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":308,"name":"Thierry Carrez","email":"thierry@openstack.org","username":"ttx"},"change_message_id":"e68719ce8ad30c80b263ce243ff40eb8bb766e8e","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"},{"line_number":338,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_a1049fc6","line":335,"in_reply_to":"1ae5cdf2_065d9748","updated":"2014-06-18 10:15:17.000000000","message":"Yes, that sounds fair. You can \"fix\" regexpFilter in a separate commit","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d71dfd9d3858d27462432fabb51015fc3f61151","unresolved":false,"context_lines":[{"line_number":332,"context_line":"        for (pattern, arg) in zip(self.args, userargs):"},{"line_number":333,"context_line":"            try:"},{"line_number":334,"context_line":"                if not re.match(pattern + \u0027$\u0027, arg):"},{"line_number":335,"context_line":"                    break"},{"line_number":336,"context_line":"            except re.error:"},{"line_number":337,"context_line":"                # DENY: Badly-formed filter"},{"line_number":338,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_065d9748","line":335,"in_reply_to":"1ae5cdf2_f57a1324","updated":"2014-06-17 15:10:43.000000000","message":"That sounds OK for me. Maybe we should fix RegExpFilter too (where I derived this code from), if that is preferred.","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"}],"tests/test_rootwrap.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"fae7e47f849c8c9853cbc926184bf8450e06bd48","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        filter_list \u003d [filters.ChainingRegExpFilter(\u0027nice\u0027, \u0027root\u0027,"},{"line_number":321,"context_line":"                                                    \u0027nice\u0027, \u0027-?\\d+\u0027),"},{"line_number":322,"context_line":"                       filters.CommandFilter(\u0027cat\u0027, \u0027root\u0027)]"},{"line_number":323,"context_line":"        args \u003d [\u0027nice\u0027, \u00275\u0027, \u0027cat\u0027, \u0027/a\u0027]"},{"line_number":324,"context_line":"        dirs \u003d [\u0027/bin\u0027, \u0027/usr/bin\u0027]"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        self.assertIsNotNone(wrapper.match_filter(filter_list, args, dirs))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_f5d933f5","line":323,"updated":"2014-06-17 14:13:52.000000000","message":"Related to my previous comment, what would happen if I passed [\u0027nice\u0027, \u0027`rm -rf /` 5\u0027, etc...]?  I\u0027m not sure that would actually work, but it would pass the filter and I don\u0027t think we want it to.","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"},{"author":{"_account_id":9176,"name":"Tomoki Sekiyama","email":"tomoki.sekiyama@gmail.com","username":"tsekiyama"},"change_message_id":"2d71dfd9d3858d27462432fabb51015fc3f61151","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        filter_list \u003d [filters.ChainingRegExpFilter(\u0027nice\u0027, \u0027root\u0027,"},{"line_number":321,"context_line":"                                                    \u0027nice\u0027, \u0027-?\\d+\u0027),"},{"line_number":322,"context_line":"                       filters.CommandFilter(\u0027cat\u0027, \u0027root\u0027)]"},{"line_number":323,"context_line":"        args \u003d [\u0027nice\u0027, \u00275\u0027, \u0027cat\u0027, \u0027/a\u0027]"},{"line_number":324,"context_line":"        dirs \u003d [\u0027/bin\u0027, \u0027/usr/bin\u0027]"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        self.assertIsNotNone(wrapper.match_filter(filter_list, args, dirs))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_a6bce3dc","line":323,"in_reply_to":"1ae5cdf2_f5d933f5","updated":"2014-06-17 15:10:43.000000000","message":"Please see my previous comment, it doesn\u0027t match to \u0027rm -rf / 5\u0027 etc.","commit_id":"53f2bdd83cbea1bbe2456e4ffe41e3ad884ab620"}]}
