)]}'
{"nova/api/openstack/compute/plugins/v3/servers.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"cade57f75b93edad6f3af1394397f5f83b758866","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        # Remove any query string parameters that are not valid search options"},{"line_number":272,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":273,"context_line":"            search_opts.pop(key, None)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":276,"context_line":"        remove_invalid_options(context, search_opts,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_1ccae1a0","line":273,"updated":"2015-01-26 22:59:04.000000000","message":"Shouldn\u0027t we be whitelisting rather than blacklisting?","commit_id":"0ba663da16ae234f5cbb1ac66b12e7e108662cd3"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"2a73fc9a7af7b4da36245b51dc858d405d552018","unresolved":false,"context_lines":[{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        # Remove any query string parameters that are not valid search options"},{"line_number":272,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":273,"context_line":"            search_opts.pop(key, None)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":276,"context_line":"        remove_invalid_options(context, search_opts,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a930d6b_c7bec6ad","line":273,"in_reply_to":"1a930d6b_1ccae1a0","updated":"2015-01-27 03:52:54.000000000","message":"Alexis, that is a good question. For an admin user nothing is filtered out (see remove_invalid_options function on line 1118).  If the admin passes an invalid filter then it is eventually filtered out in the DB layer here [1].\n\n[1]: https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/api.py#L2092\n\nAfter looking at this again, I think that the logic to remove these pagination parameters should happen in the remove_invalid_options function instead of here. I\u0027ll push another patch set with that update.","commit_id":"0ba663da16ae234f5cbb1ac66b12e7e108662cd3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a5dd122521d58d17a8ec46ffd75a49f57828ca27","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1085,"context_line":"    if context.is_admin:"},{"line_number":1086,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1087,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1088,"context_line":"            search_options.pop(key, None)"},{"line_number":1089,"context_line":"        return"},{"line_number":1090,"context_line":"    # Otherwise, strip out all unknown options"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_de646ce6","line":1087,"updated":"2015-04-21 12:49:20.000000000","message":"it feels like json scheme would protected us against this for the v3 API?","commit_id":"6a859466fc06cc06237d5a4c230d96527d04b3bf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c56d4a278c68ea989b80537dad31d984c98ff68a","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1085,"context_line":"    if context.is_admin:"},{"line_number":1086,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1087,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1088,"context_line":"            search_options.pop(key, None)"},{"line_number":1089,"context_line":"        return"},{"line_number":1090,"context_line":"    # Otherwise, strip out all unknown options"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_1e454416","line":1087,"in_reply_to":"dac4157f_de646ce6","updated":"2015-04-21 12:51:14.000000000","message":"also in v3, we are generally returning a bad request exception if there are unexpected arguments, rather than silently ignoring them, although I think this means you need to bump the microversion.","commit_id":"6a859466fc06cc06237d5a4c230d96527d04b3bf"}],"nova/api/openstack/compute/servers.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c56d4a278c68ea989b80537dad31d984c98ff68a","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"    \"\"\"Remove search options that are not valid for non-admin API/context.\"\"\""},{"line_number":1132,"context_line":"    if context.is_admin:"},{"line_number":1133,"context_line":"        # Only remove parameters for sorting and pagination"},{"line_number":1134,"context_line":"        for key in (\u0027sort_key\u0027, \u0027sort_dir\u0027, \u0027limit\u0027, \u0027marker\u0027):"},{"line_number":1135,"context_line":"            search_options.pop(key, None)"},{"line_number":1136,"context_line":"        return"},{"line_number":1137,"context_line":"    # Otherwise, strip out all unknown options"}],"source_content_type":"text/x-python","patch_set":4,"id":"dac4157f_9ee39433","line":1134,"updated":"2015-04-21 12:51:14.000000000","message":"fells like we should have a white list here, instead of a black list?","commit_id":"6a859466fc06cc06237d5a4c230d96527d04b3bf"}],"nova/tests/unit/api/openstack/compute/plugins/v3/test_servers.py":[{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"0edf18617d5c56dcaff9c1e30da9603d629c3f1f","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"    def test_get_servers_remove_non_search_options(self, get_all_mock):"},{"line_number":1285,"context_line":"        req \u003d fakes.HTTPRequestV3.blank(\u0027/servers\u0027"},{"line_number":1286,"context_line":"                                        \u0027?sort_key\u003did1\u0026sort_dir\u003dasc\u0027"},{"line_number":1287,"context_line":"                                        \u0027?sort_key\u003did2\u0026sort_dir\u003ddesc\u0027"},{"line_number":1288,"context_line":"                                        \u0027\u0026limit\u003d1\u0026marker\u003d123\u0027,"},{"line_number":1289,"context_line":"                                        use_admin_context\u003dTrue)"},{"line_number":1290,"context_line":"        self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a016987_b6587b57","line":1287,"updated":"2015-05-28 15:05:19.000000000","message":"Not sure I understand what\u0027s going on here, that first arg is like this right? It has two ?s in it.\n\n    /servers?sort_key\u003did1\u0026sort_dir\u003dasc?sort_key\u003did2\u0026sort_dir\u003ddesc\u0026limit\u003d1\u0026marker\u003d123\n\nDid you mean to delete line 1286 or 1287?","commit_id":"e5def4b6f71a8ca193cb1eebe202c3cbbaab9fc7"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"483dc55085e46961dfd4989e26be60e306dcc3ea","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"    def test_get_servers_remove_non_search_options(self, get_all_mock):"},{"line_number":1285,"context_line":"        req \u003d fakes.HTTPRequestV3.blank(\u0027/servers\u0027"},{"line_number":1286,"context_line":"                                        \u0027?sort_key\u003did1\u0026sort_dir\u003dasc\u0027"},{"line_number":1287,"context_line":"                                        \u0027?sort_key\u003did2\u0026sort_dir\u003ddesc\u0027"},{"line_number":1288,"context_line":"                                        \u0027\u0026limit\u003d1\u0026marker\u003d123\u0027,"},{"line_number":1289,"context_line":"                                        use_admin_context\u003dTrue)"},{"line_number":1290,"context_line":"        self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_b177cb3a","line":1287,"in_reply_to":"7a016987_b6587b57","updated":"2015-09-08 14:06:10.000000000","message":"They should both be there but line 1287 should not have started with \u0027?\u0027 (should be a \u0027\u0026\u0027). Both lines should be there to represent multiple keys/directions.","commit_id":"e5def4b6f71a8ca193cb1eebe202c3cbbaab9fc7"}],"nova/tests/unit/api/openstack/compute/test_servers.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e35d3770a87ddb584aa62a8a54e2e33350878df2","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"    def test_get_servers_remove_non_search_options(self, get_all_mock):"},{"line_number":1309,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/fake/servers\u0027"},{"line_number":1310,"context_line":"                                      \u0027?sort_key\u003did1\u0026sort_dir\u003dasc\u0027"},{"line_number":1311,"context_line":"                                      \u0027?sort_key\u003did2\u0026sort_dir\u003ddesc\u0027"},{"line_number":1312,"context_line":"                                      \u0027\u0026limit\u003d1\u0026marker\u003d123\u0027,"},{"line_number":1313,"context_line":"                                      use_admin_context\u003dTrue)"},{"line_number":1314,"context_line":"        self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_27e19d2a","line":1311,"updated":"2015-09-04 16:40:45.000000000","message":"this seems incorrect, two \"?\" seems bad, as in previous.","commit_id":"e5def4b6f71a8ca193cb1eebe202c3cbbaab9fc7"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"483dc55085e46961dfd4989e26be60e306dcc3ea","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"    def test_get_servers_remove_non_search_options(self, get_all_mock):"},{"line_number":1309,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/fake/servers\u0027"},{"line_number":1310,"context_line":"                                      \u0027?sort_key\u003did1\u0026sort_dir\u003dasc\u0027"},{"line_number":1311,"context_line":"                                      \u0027?sort_key\u003did2\u0026sort_dir\u003ddesc\u0027"},{"line_number":1312,"context_line":"                                      \u0027\u0026limit\u003d1\u0026marker\u003d123\u0027,"},{"line_number":1313,"context_line":"                                      use_admin_context\u003dTrue)"},{"line_number":1314,"context_line":"        self.controller.index(req)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da20952f_71713344","line":1311,"in_reply_to":"da20952f_27e19d2a","updated":"2015-09-08 14:06:10.000000000","message":"Done","commit_id":"e5def4b6f71a8ca193cb1eebe202c3cbbaab9fc7"}]}
