)]}'
{"keystone/common/config.py":[{"author":{"_account_id":8276,"name":"kiwik","email":"chenrui.momo@gmail.com","username":"kiwik"},"change_message_id":"2519729c0069b0e544983d43f4de0d07f0777160","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                   default\u003d\u0027keystone.contrib.password_rotation.\u0027"},{"line_number":385,"context_line":"                           \u0027backends.sql.Driver\u0027,"},{"line_number":386,"context_line":"                   help\u003d\u0027Password rotation backend driver.\u0027),"},{"line_number":387,"context_line":"        cfg.IntOpt(\u0027expiration\u0027, default\u003d120,"},{"line_number":388,"context_line":"                   help\u003d\u0027Amount of time a rotated password should remain \u0027"},{"line_number":389,"context_line":"                        \u0027valid (in seconds).\u0027),"},{"line_number":390,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2Fl7s%3D","line":387,"updated":"2014-04-11 22:21:13.000000000","message":"Add \u0027password_rotation\u0027 group into keystone.conf.sample, by the way, 120s maybe too short.","commit_id":"12c0f51b80473b136b88fbe7dc1d96ddec41b6a3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"980ad629200ebe04745d9533e58fcb37790dc99e","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                   default\u003d\u0027keystone.contrib.password_rotation.\u0027"},{"line_number":385,"context_line":"                           \u0027backends.sql.Driver\u0027,"},{"line_number":386,"context_line":"                   help\u003d\u0027Password rotation backend driver.\u0027),"},{"line_number":387,"context_line":"        cfg.IntOpt(\u0027expiration\u0027, default\u003d120,"},{"line_number":388,"context_line":"                   help\u003d\u0027Amount of time a rotated password should remain \u0027"},{"line_number":389,"context_line":"                        \u0027valid (in seconds).\u0027),"},{"line_number":390,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2Fl04%3D","line":387,"in_reply_to":"AAAAW3%2F%2Fl7s%3D","updated":"2014-04-11 22:45:51.000000000","message":"If this is set to 0 are passwords valid forever? What about negative numbers [ i know, should be in tests but random thought ]","commit_id":"12c0f51b80473b136b88fbe7dc1d96ddec41b6a3"}],"keystone/contrib/password_rotation/configuration.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62fabfdc23cb27cc596afecbc3e238140c2b1912","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Extension Example"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Please describe here in details how to enable your extension:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAAVX%2F%2FrzY%3D","line":18,"updated":"2014-03-01 03:25:17.000000000","message":"Update this doc","commit_id":"08000b01269940c949819ca03b1fec8b1f7232a5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"980ad629200ebe04745d9533e58fcb37790dc99e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    pipeline \u003d [...existing pipeline...] password_rotation_extension service_v3"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"2. Optional: Set the ``blah`` config value in your ``keystone.conf``. This"},{"line_number":32,"context_line":"   will allow you to control how long rotated password and considered valid."}],"source_content_type":"text/x-rst","patch_set":3,"id":"AAAAW3%2F%2Fl0k%3D","line":32,"updated":"2014-04-11 22:45:51.000000000","message":"This file should be in the docs directory for extensions and linked in appropriately.\n\nLooks like some boilerplate values in here as well \"set the ``blah`` config value\"?","commit_id":"12c0f51b80473b136b88fbe7dc1d96ddec41b6a3"}],"keystone/contrib/password_rotation/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62fabfdc23cb27cc596afecbc3e238140c2b1912","unresolved":false,"context_lines":[{"line_number":18,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":19,"context_line":"class V3Controller(controller.V3Controller):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"#    @controller.protected()"},{"line_number":22,"context_line":"    def rotate_password(self, context, user_id, user):"},{"line_number":23,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":24,"context_line":"        original_password \u003d user.get(\u0027original_password\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2FrzU%3D","line":21,"updated":"2014-03-01 03:25:17.000000000","message":"Uncommented these (eventually) and modify policy files.","commit_id":"08000b01269940c949819ca03b1fec8b1f7232a5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62fabfdc23cb27cc596afecbc3e238140c2b1912","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"#    @controller.protected()"},{"line_number":22,"context_line":"    def rotate_password(self, context, user_id, user):"},{"line_number":23,"context_line":"        \"\"\"Description of the controller logic.\"\"\""},{"line_number":24,"context_line":"        original_password \u003d user.get(\u0027original_password\u0027)"},{"line_number":25,"context_line":"        if original_password is None:"},{"line_number":26,"context_line":"            raise exception.ValidationError(target\u003d\u0027user\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2FrzE%3D","line":23,"updated":"2014-03-01 03:25:17.000000000","message":"Update descriptions","commit_id":"08000b01269940c949819ca03b1fec8b1f7232a5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"980ad629200ebe04745d9533e58fcb37790dc99e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":19,"context_line":"class V3Controller(controller.V3Controller):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"#    @controller.protected()"},{"line_number":22,"context_line":"    def rotate_password(self, context, user_id, user):"},{"line_number":23,"context_line":"        \"\"\"Rotate a user\u0027s password using the Identity API."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2Fl0M%3D","line":21,"updated":"2014-04-11 22:45:51.000000000","message":"If this is not protected, please remove the decorator vs. commenting out. (same comment on 45)","commit_id":"12c0f51b80473b136b88fbe7dc1d96ddec41b6a3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae121613033398e67bd52e029c24e20cc1bf125a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"@dependency.requires(\u0027identity_api\u0027)"},{"line_number":19,"context_line":"class V3Controller(controller.V3Controller):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"#    @controller.protected()"},{"line_number":22,"context_line":"    def rotate_password(self, context, user_id, user):"},{"line_number":23,"context_line":"        \"\"\"Rotate a user\u0027s password using the Identity API."},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FJTc%3D","line":21,"updated":"2014-04-23 18:08:06.000000000","message":"if we aren\u0027t using this wrapper we should probably remove.","commit_id":"37df86ecaf4cd27b9ec0cf107897d3e358b150cf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae121613033398e67bd52e029c24e20cc1bf125a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        except AssertionError:"},{"line_number":43,"context_line":"            raise exception.Unauthorized()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"#    @controller.protected()"},{"line_number":46,"context_line":"    def expire_old_passwords(self, context, user_id):"},{"line_number":47,"context_line":"        \"\"\"Expires all previously rotated passwords for a user."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FJTU%3D","line":45,"updated":"2014-04-23 18:08:06.000000000","message":"same comment as above.","commit_id":"37df86ecaf4cd27b9ec0cf107897d3e358b150cf"}],"keystone/contrib/password_rotation/routers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62fabfdc23cb27cc596afecbc3e238140c2b1912","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    def add_routes(self, mapper):"},{"line_number":22,"context_line":"        controller \u003d controllers.V3Controller()"},{"line_number":23,"context_line":"        mapper.connect("},{"line_number":24,"context_line":"            \u0027/users/{user_id}\u0027 + self.PATH_PREFIX + \u0027/password\u0027,"},{"line_number":25,"context_line":"            controller\u003dcontroller,"},{"line_number":26,"context_line":"            action\u003d\u0027rotate_password\u0027,"},{"line_number":27,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2FryM%3D","line":24,"updated":"2014-03-01 03:25:17.000000000","message":"Would it be silly to have both end with /passwords?","commit_id":"08000b01269940c949819ca03b1fec8b1f7232a5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"62fabfdc23cb27cc596afecbc3e238140c2b1912","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            \u0027/users/{user_id}\u0027 + self.PATH_PREFIX + \u0027/password\u0027,"},{"line_number":25,"context_line":"            controller\u003dcontroller,"},{"line_number":26,"context_line":"            action\u003d\u0027rotate_password\u0027,"},{"line_number":27,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"},{"line_number":28,"context_line":"        mapper.connect("},{"line_number":29,"context_line":"            \u0027/users/{user_id}\u0027 + self.PATH_PREFIX + \u0027/old_passwords\u0027,"},{"line_number":30,"context_line":"            controller\u003dcontroller,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVX%2F%2FryI%3D","line":27,"updated":"2014-03-01 03:25:17.000000000","message":"Does this guy return anything?","commit_id":"08000b01269940c949819ca03b1fec8b1f7232a5"}],"keystone/tests/integration/password_rotation/test_password_rotation.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae121613033398e67bd52e029c24e20cc1bf125a","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        self.expire_old_passwords()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        # original password now fails"},{"line_number":86,"context_line":"        self.get_request_token(self.original_password, expected_status\u003d401)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        # new password still works"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAXH%2F%2FJKo%3D","line":85,"updated":"2014-04-23 18:08:06.000000000","message":"I think the expected status and expiration of the old password could be passed into _test_rotating_password() as parameters, which would make _test_rotating_password a little more flexible and make this case more like the test_rotating_password_where_old_password_is_not_yet_expired test case.\n\nThat way _test_rotating_password() could handle the case it\u0027s testing depending on the parameters passed in, might be a little more reusable in the future?","commit_id":"37df86ecaf4cd27b9ec0cf107897d3e358b150cf"}]}
