)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"75a63be19855cdfdec867d39a5e81dd96653ee5a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Identity authentication now uses rotated passwords"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"WIP"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ifc607f881aadae7c571352d38e6f7716a2c48150"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUX%2F%2Be1g%3D","line":9,"updated":"2014-02-20 23:17:25.000000000","message":"Looks like you need more commit message content.","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"635bd049703d1772726f0adae3958b32fd6ab660","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Identity authentication now uses rotated passwords"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"WIP"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ifc607f881aadae7c571352d38e6f7716a2c48150"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUX%2F%2BYNE%3D","line":9,"in_reply_to":"AAAAUX%2F%2Be1g%3D","updated":"2014-02-21 14:41:10.000000000","message":"done in next patchset","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fe5b00ee8daf3ea40831c54e7c93207cd03c133a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Identity authentication now uses rotated passwords"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"WIP"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ifc607f881aadae7c571352d38e6f7716a2c48150"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUX%2F%2Bz1Q%3D","line":10,"updated":"2014-02-18 21:42:24.000000000","message":"add bp password-rotation","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"635bd049703d1772726f0adae3958b32fd6ab660","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Identity authentication now uses rotated passwords"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"WIP"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ifc607f881aadae7c571352d38e6f7716a2c48150"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUX%2F%2BYPc%3D","line":10,"in_reply_to":"AAAAUX%2F%2Bz1Q%3D","updated":"2014-02-21 14:41:10.000000000","message":"done in next patchset","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dfc2a3812b4730114512f31d2560e670e5f4e4f3","unresolved":false,"context_lines":[{"line_number":9,"context_line":"A previous commit added the ability to store rotated passwords. The idea"},{"line_number":10,"context_line":"is that the rotated passwords would be valid for authentication for some"},{"line_number":11,"context_line":"configurable period of time. This commit enables those passwords to be"},{"line_number":12,"context_line":"used. A future commit will add the ability to manage those password"},{"line_number":13,"context_line":"through an extension API."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"bp password-rotation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAXH%2F%2FJJk%3D","line":12,"updated":"2014-04-23 18:19:11.000000000","message":"passwords*","commit_id":"6a3a5faca8bfe0edfa8abe60aed303e53c385c95"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a6c1defaad167138787447f0782e339b0b974e25","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            raise AssertionError(_(\u0027Invalid user / password\u0027))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        if not self._check_password(password, user_ref):"},{"line_number":127,"context_line":"            # TODO(dstanek): should we make sure that the password rotation"},{"line_number":128,"context_line":"            # extension is enabled?"},{"line_number":129,"context_line":"            rps \u003d self.list_active_rotated_passwords_by_user(user_id, None)"},{"line_number":130,"context_line":"            for rp_ref in rps:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2F62w%3D","line":127,"updated":"2014-02-24 03:54:00.000000000","message":"My opinion is yes!  I think you should make sure the extension is enabled","commit_id":"07c2556fcc599be4578dcd9829abcfed7f51df8a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a6c1defaad167138787447f0782e339b0b974e25","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            # TODO(dstanek): should we make sure that the password rotation"},{"line_number":128,"context_line":"            # extension is enabled?"},{"line_number":129,"context_line":"            rps \u003d self.list_active_rotated_passwords_by_user(user_id, None)"},{"line_number":130,"context_line":"            for rp_ref in rps:"},{"line_number":131,"context_line":"                if utils.check_password(password, rp_ref[\u0027password\u0027]):"},{"line_number":132,"context_line":"                    break"},{"line_number":133,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2F61g%3D","line":130,"updated":"2014-02-24 03:54:00.000000000","message":"So basically you check all the active passwords and as long as one of them matches you are good to go correct?  This is to handle having a grace period where there can be more than one valid password at a time, correct?","commit_id":"07c2556fcc599be4578dcd9829abcfed7f51df8a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"707555fcd706a2b0a3eff46f54900a95a3d4446e","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            # TODO(dstanek): should we make sure that the password rotation"},{"line_number":128,"context_line":"            # extension is enabled?"},{"line_number":129,"context_line":"            rps \u003d self.list_active_rotated_passwords_by_user(user_id, None)"},{"line_number":130,"context_line":"            for rp_ref in rps:"},{"line_number":131,"context_line":"                if utils.check_password(password, rp_ref[\u0027password\u0027]):"},{"line_number":132,"context_line":"                    break"},{"line_number":133,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAWH%2F9mlY%3D","line":130,"in_reply_to":"AAAAU3%2F%2F61g%3D","updated":"2014-04-03 12:40:28.000000000","message":"exactly","commit_id":"07c2556fcc599be4578dcd9829abcfed7f51df8a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0786b0cb2f921b364d6cd7bc3ce57cc81e06f2f7","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        except exception.UserNotFound:"},{"line_number":123,"context_line":"            raise AssertionError(_(\u0027Invalid user / password\u0027))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        if not self._check_password(password, user_ref):"},{"line_number":126,"context_line":"            # TODO(dstanek): should we make sure that the password rotation"},{"line_number":127,"context_line":"            # extension is enabled before performing a lookup in the"},{"line_number":128,"context_line":"            # rotated_passwords table?"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXX%2F%2FzSk%3D","line":125,"updated":"2014-04-26 20:23:52.000000000","message":"if you do an option dependency, then the checkout would be  if self.password_rotation_api:","commit_id":"6a3a5faca8bfe0edfa8abe60aed303e53c385c95"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dfc2a3812b4730114512f31d2560e670e5f4e4f3","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        if not self._check_password(password, user_ref):"},{"line_number":126,"context_line":"            # TODO(dstanek): should we make sure that the password rotation"},{"line_number":127,"context_line":"            # extension is enabled before performing a lookup in the"},{"line_number":128,"context_line":"            # rotated_passwords table?"},{"line_number":129,"context_line":"            rps \u003d self.list_active_rotated_passwords_by_user(user_id, None)"},{"line_number":130,"context_line":"            for rp_ref in rps:"},{"line_number":131,"context_line":"                if utils.check_password(password, rp_ref[\u0027password\u0027]):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXH%2F%2FJIU%3D","line":128,"updated":"2014-04-23 18:19:11.000000000","message":"I think so, that way if we aren\u0027t using OS-PW_ROTATE then we can just break and use the old impl and only use the extension if it\u0027s enabled. Thoughts?","commit_id":"6a3a5faca8bfe0edfa8abe60aed303e53c385c95"}],"keystone/tests/integration/identity/test_passwords.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4de70b49892a5eac49bafaed06875e8a9a67330b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self.identity_api.create_rotated_password(rotated_pw)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # the bad password won\u0027t match so this should fail"},{"line_number":94,"context_line":"        bad_password \u003d test_utils.new_uuid()"},{"line_number":95,"context_line":"        self.get_request_token(test_utils.new_uuid(), expected_status\u003d401)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2Bf98%3D","line":94,"updated":"2014-02-20 20:49:34.000000000","message":"^ could remove bad_password or use it below I think: \n\n    self.get_request_token(bad_password, expected_status\u003d401)","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"635bd049703d1772726f0adae3958b32fd6ab660","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        self.identity_api.create_rotated_password(rotated_pw)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # the bad password won\u0027t match so this should fail"},{"line_number":94,"context_line":"        bad_password \u003d test_utils.new_uuid()"},{"line_number":95,"context_line":"        self.get_request_token(test_utils.new_uuid(), expected_status\u003d401)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BYQY%3D","line":94,"in_reply_to":"AAAAUX%2F%2Bf98%3D","updated":"2014-02-21 14:41:10.000000000","message":"done in next patchset","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1e315bb530084dec7d1b18d8288a0f6414341172","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.token \u003d self.get_request_token(self.user_ref[\u0027password\u0027], 201)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_request_token(self, password, expected_status):"},{"line_number":107,"context_line":"        # TODO(dstanek): we may be able to move this up into common code and"},{"line_number":108,"context_line":"        # replace other instances of this type of code..."},{"line_number":109,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":110,"context_line":"            user_id\u003dself.user_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2Bz%2FI%3D","line":107,"updated":"2014-02-18 21:19:07.000000000","message":"Couldn\u0027t this be put in test_v3? I could see this being useful for others too.","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"635bd049703d1772726f0adae3958b32fd6ab660","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self.token \u003d self.get_request_token(self.user_ref[\u0027password\u0027], 201)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_request_token(self, password, expected_status):"},{"line_number":107,"context_line":"        # TODO(dstanek): we may be able to move this up into common code and"},{"line_number":108,"context_line":"        # replace other instances of this type of code..."},{"line_number":109,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":110,"context_line":"            user_id\u003dself.user_ref[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUX%2F%2BYP8%3D","line":107,"in_reply_to":"AAAAUX%2F%2Bz%2FI%3D","updated":"2014-02-21 14:41:10.000000000","message":"I think there is something already there that I can use. I just wanted something clean to start testing with. I probably end up using something that already existed.","commit_id":"cee711d466d43dbd34e457047f32c1ac423563d7"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a6c1defaad167138787447f0782e339b0b974e25","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                   expected_status\u003d401)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_rotated_password_success(self):"},{"line_number":48,"context_line":"        # NOTE(dstanek): Create the rotated password directly using the CRUD."},{"line_number":49,"context_line":"        # This test is about testing the authentication and not the"},{"line_number":50,"context_line":"        # rotation."},{"line_number":51,"context_line":"        password \u003d test_utils.new_uuid()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2F6v8%3D","line":48,"updated":"2014-02-24 03:54:00.000000000","message":"Nice test case.  Good to see you checking that when having concurrent valid passwords they both work","commit_id":"07c2556fcc599be4578dcd9829abcfed7f51df8a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a6c1defaad167138787447f0782e339b0b974e25","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.get_token_by_password(self.user_id, password,"},{"line_number":77,"context_line":"                                   expected_status\u003d401)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def test_wrong_password_fails(self):"},{"line_number":80,"context_line":"        # NOTE(dstanek): Create the rotated password directly using the CRUD."},{"line_number":81,"context_line":"        # This test is about testing the authentication and not the"},{"line_number":82,"context_line":"        # rotation."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAU3%2F%2F6vU%3D","line":79,"updated":"2014-02-24 03:54:00.000000000","message":"test coverage looks good!","commit_id":"07c2556fcc599be4578dcd9829abcfed7f51df8a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dfc2a3812b4730114512f31d2560e670e5f4e4f3","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                             original_password\u003dself.password,"},{"line_number":155,"context_line":"                             expected_status\u003d401)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def test_changing_password_disables_all_rotated_passwords(self):"},{"line_number":158,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAXH%2F%2FJE0%3D","line":157,"updated":"2014-04-23 18:19:11.000000000","message":"Is a test case going to be added here?","commit_id":"6a3a5faca8bfe0edfa8abe60aed303e53c385c95"}]}
