)]}'
{"keystone/identity/backends/kvs.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1309c9a008c59dbd94ee5d7c25aa83f2b9188ee6","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            except exception.MetadataNotFound:"},{"line_number":56,"context_line":"                metadata_ref \u003d {}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return (identity.filter_user(user_ref), tenant_ref, metadata_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_project(self, tenant_id):"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxS0%3D","side":"PARENT","line":58,"updated":"2013-05-23 13:40:51.000000000","message":"i prefer the old return statement; made it clear that it was a tuple being constructed \u0026 returned","commit_id":"7db13c58bc8fe0aac35b68ac7296cabee2b5004d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1309c9a008c59dbd94ee5d7c25aa83f2b9188ee6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":35,"context_line":"        return user_ref"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":38,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":39,"context_line":"        tenant_ref \u003d None"},{"line_number":40,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxSQ%3D","line":37,"updated":"2013-05-23 13:40:51.000000000","message":"can you change the word \"in\" to something else? that\u0027s very vague ... user_authorized_on_project() or authorize_user_on_project(), etc would be more explicit","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f2e38b2ed9815ec3935a60911782601f4b587952","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":35,"context_line":"        return user_ref"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":38,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":39,"context_line":"        tenant_ref \u003d None"},{"line_number":40,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fwho%3D","line":37,"in_reply_to":"AAAAPH%2F%2Fw7w%3D","updated":"2013-05-23 18:24:03.000000000","message":"maybe you don\u0027t need the \"user\" in the name (since you always authorise with a user)....so maybe verify_authorization_[for|on|to]_project...pick you\u0027re favorite preposition...","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1edaa587db7bee3f4573f454fd86866c1f0c99b3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":35,"context_line":"        return user_ref"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":38,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":39,"context_line":"        tenant_ref \u003d None"},{"line_number":40,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fw7w%3D","line":37,"in_reply_to":"AAAAPH%2F%2FxNc%3D","updated":"2013-05-23 17:18:35.000000000","message":"verify_user_authorization?  authorize_user?","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5ff95530003632611e3a87f1f8ebe81c0e8d5ed1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":35,"context_line":"        return user_ref"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":38,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":39,"context_line":"        tenant_ref \u003d None"},{"line_number":40,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxNc%3D","line":37,"in_reply_to":"AAAAPH%2F%2FxSQ%3D","updated":"2013-05-23 14:07:15.000000000","message":"Agree we should change the name.  What\u0027s unusual is that if there is no project, it still returns \"successfully\", with project as None, of course.  Maybe \"extend_authorization_to_include_project\" (maybe too much of a mouthful!)","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1309c9a008c59dbd94ee5d7c25aa83f2b9188ee6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                metadata_ref \u003d {}"},{"line_number":50,"context_line":"            except exception.MetadataNotFound:"},{"line_number":51,"context_line":"                metadata_ref \u003d {}"},{"line_number":52,"context_line":"        auth_data \u003d identity.filter_user(user_ref), tenant_ref, metadata_ref"},{"line_number":53,"context_line":"        return auth_data"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxSM%3D","line":52,"updated":"2013-05-23 13:40:51.000000000","message":"why is this still returning a user_ref? the caller already passed one in","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5ff95530003632611e3a87f1f8ebe81c0e8d5ed1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                metadata_ref \u003d {}"},{"line_number":50,"context_line":"            except exception.MetadataNotFound:"},{"line_number":51,"context_line":"                metadata_ref \u003d {}"},{"line_number":52,"context_line":"        auth_data \u003d identity.filter_user(user_ref), tenant_ref, metadata_ref"},{"line_number":53,"context_line":"        return auth_data"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxOE%3D","line":52,"in_reply_to":"AAAAPH%2F%2FxSM%3D","updated":"2013-05-23 14:07:15.000000000","message":"agreed - seems cleaner if this \"extending\" the authorisation to include project, so just this and the appropriate metadata is returned","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0f50d6c5778a8036e3088d31ea4606d3b82b6dd7","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Identity(kvs.Base, identity.Driver):"},{"line_number":25,"context_line":"    # Public interface"},{"line_number":26,"context_line":"    def authenticate(self, user_id\u003dNone, tenant_id\u003dNone, password\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"Authenticate based on a user, tenant and password."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        Expects the user object to have a password field and the tenant to be"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fk7w%3D","side":"PARENT","line":26,"updated":"2013-05-30 04:54:49.000000000","message":"this appears to have previously supported validating null passwords... any idea why that was / why you removed it?","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Identity(kvs.Base, identity.Driver):"},{"line_number":25,"context_line":"    # Public interface"},{"line_number":26,"context_line":"    def authenticate(self, user_id\u003dNone, tenant_id\u003dNone, password\u003dNone):"},{"line_number":27,"context_line":"        \"\"\"Authenticate based on a user, tenant and password."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        Expects the user object to have a password field and the tenant to be"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiXA%3D","side":"PARENT","line":26,"in_reply_to":"AAAAPH%2F%2Fk7w%3D","updated":"2013-05-31 00:28:11.000000000","message":"Should not have.  Put back in, and added to the main interface.","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0f50d6c5778a8036e3088d31ea4606d3b82b6dd7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            except exception.MetadataNotFound:"},{"line_number":56,"context_line":"                metadata_ref \u003d {}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return (identity.filter_user(user_ref), tenant_ref, metadata_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_project(self, tenant_id):"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fk8A%3D","side":"PARENT","line":58,"updated":"2013-05-30 04:54:49.000000000","message":"still prefer this syntax as it\u0027s much clearer that you\u0027re building \u0026 returning a tuple","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            except exception.MetadataNotFound:"},{"line_number":56,"context_line":"                metadata_ref \u003d {}"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        return (identity.filter_user(user_ref), tenant_ref, metadata_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_project(self, tenant_id):"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiWY%3D","side":"PARENT","line":58,"in_reply_to":"AAAAPH%2F%2Fk8A%3D","updated":"2013-05-31 00:28:11.000000000","message":"Done","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c59d0222f65991fbf5d9cdcdd8a39f89e65fc49c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":34,"context_line":"        return user_ref"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authorize_for_project(self, tenant_id, user_ref):"},{"line_number":37,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":38,"context_line":"        tenant_ref \u003d None"},{"line_number":39,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FimI%3D","line":36,"updated":"2013-05-30 22:15:25.000000000","message":"since tenant_id can be None, should use keyword arg for it.","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":34,"context_line":"        return user_ref"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authorize_for_project(self, tenant_id, user_ref):"},{"line_number":37,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":38,"context_line":"        tenant_ref \u003d None"},{"line_number":39,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiW8%3D","line":36,"in_reply_to":"AAAAPH%2F%2FimI%3D","updated":"2013-05-31 00:28:11.000000000","message":"Done","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d77fc0ede16684a436f0c9cad80808a51cb3620d","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # Identity interface"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":126,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxLA%3D","line":123,"updated":"2013-05-23 14:23:28.000000000","message":"Would it be useful to carry over the docstrings as well? This will help readability and they are already written. Thoughts?","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1edaa587db7bee3f4573f454fd86866c1f0c99b3","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # Identity interface"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":126,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fw7s%3D","line":123,"in_reply_to":"AAAAPH%2F%2FxLA%3D","updated":"2013-05-23 17:18:35.000000000","message":"good idea.  Yes it would.","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c59d0222f65991fbf5d9cdcdd8a39f89e65fc49c","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # Identity interface"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":126,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FimA%3D","line":123,"updated":"2013-05-30 22:15:25.000000000","message":"suggest keep the methods in the same order in all the backends, so put authenticate_user before authorize_for_project.","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # Identity interface"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":126,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiWQ%3D","line":123,"in_reply_to":"AAAAPH%2F%2FimA%3D","updated":"2013-05-31 00:28:11.000000000","message":"Done","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"}],"keystone/identity/backends/pam.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d77fc0ede16684a436f0c9cad80808a51cb3620d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        if user_id \u003d\u003d \u0027root\u0027:"},{"line_number":72,"context_line":"            metadata[\u0027is_admin\u0027] \u003d True"},{"line_number":73,"context_line":"        tenant \u003d {\u0027id\u0027: user_id, \u0027name\u0027: user_id}"},{"line_number":74,"context_line":"        data \u003d user_ref, tenant, metadata"},{"line_number":75,"context_line":"        return data"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxKY%3D","line":74,"updated":"2013-05-23 14:23:28.000000000","message":"I think it would be useful to document this method to state it returns a tuple as it is a little hard to spot this than the old implementation.","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1edaa587db7bee3f4573f454fd86866c1f0c99b3","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        if user_id \u003d\u003d \u0027root\u0027:"},{"line_number":72,"context_line":"            metadata[\u0027is_admin\u0027] \u003d True"},{"line_number":73,"context_line":"        tenant \u003d {\u0027id\u0027: user_id, \u0027name\u0027: user_id}"},{"line_number":74,"context_line":"        data \u003d user_ref, tenant, metadata"},{"line_number":75,"context_line":"        return data"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fw7o%3D","line":74,"in_reply_to":"AAAAPH%2F%2FxKY%3D","updated":"2013-05-23 17:18:35.000000000","message":"actually, I can remove the interim variable.","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0f50d6c5778a8036e3088d31ea4606d3b82b6dd7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def authorize_for_project(self, tenant_id, user_ref):"},{"line_number":69,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":70,"context_line":"        metadata \u003d {}"},{"line_number":71,"context_line":"        if user_id \u003d\u003d \u0027root\u0027:"},{"line_number":72,"context_line":"            metadata[\u0027is_admin\u0027] \u003d True"},{"line_number":73,"context_line":"        tenant \u003d {\u0027id\u0027: user_id, \u0027name\u0027: user_id}"},{"line_number":74,"context_line":"        return (user_ref, tenant, metadata)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fk7U%3D","line":71,"updated":"2013-05-30 04:54:49.000000000","message":"whoa, never seen that before","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def authorize_for_project(self, tenant_id, user_ref):"},{"line_number":69,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":70,"context_line":"        metadata \u003d {}"},{"line_number":71,"context_line":"        if user_id \u003d\u003d \u0027root\u0027:"},{"line_number":72,"context_line":"            metadata[\u0027is_admin\u0027] \u003d True"},{"line_number":73,"context_line":"        tenant \u003d {\u0027id\u0027: user_id, \u0027name\u0027: user_id}"},{"line_number":74,"context_line":"        return (user_ref, tenant, metadata)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiV8%3D","line":71,"in_reply_to":"AAAAPH%2F%2Fk7U%3D","updated":"2013-05-31 00:28:11.000000000","message":"Yeah, me neither. Maybe that should come out in the future.","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0f50d6c5778a8036e3088d31ea4606d3b82b6dd7","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            except exception.MetadataNotFound:"},{"line_number":192,"context_line":"                metadata_ref \u003d {}"},{"line_number":193,"context_line":"        user_ref \u003d identity.filter_user(user_ref.to_dict())"},{"line_number":194,"context_line":"        return (user_ref, tenant_ref, metadata_ref)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def _get_project(self, session, project_id):"},{"line_number":197,"context_line":"        project_ref \u003d session.query(Project).get(project_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fk7M%3D","side":"PARENT","line":194,"updated":"2013-05-30 04:54:49.000000000","message":"same, leave the tuple alone","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            except exception.MetadataNotFound:"},{"line_number":192,"context_line":"                metadata_ref \u003d {}"},{"line_number":193,"context_line":"        user_ref \u003d identity.filter_user(user_ref.to_dict())"},{"line_number":194,"context_line":"        return (user_ref, tenant_ref, metadata_ref)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def _get_project(self, session, project_id):"},{"line_number":197,"context_line":"        project_ref \u003d session.query(Project).get(project_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiV4%3D","side":"PARENT","line":194,"in_reply_to":"AAAAPH%2F%2Fk7M%3D","updated":"2013-05-31 00:28:11.000000000","message":"Done","commit_id":"2879d42de12cfb5a141197debbf7eaa53cd6750f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c59d0222f65991fbf5d9cdcdd8a39f89e65fc49c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            except exception.MetadataNotFound:"},{"line_number":186,"context_line":"                metadata_ref \u003d {}"},{"line_number":187,"context_line":"        user_ref \u003d identity.filter_user(user_ref.to_dict())"},{"line_number":188,"context_line":"        user_data \u003d user_ref, tenant_ref, metadata_ref"},{"line_number":189,"context_line":"        return user_data"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def _get_project(self, session, project_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2Fikw%3D","line":188,"updated":"2013-05-30 22:15:25.000000000","message":"don\u0027t you need the ()?","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"}],"keystone/identity/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1309c9a008c59dbd94ee5d7c25aa83f2b9188ee6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":66,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"},{"line_number":67,"context_line":"        user_ref \u003d self.driver.authenticate_user(user_id, password)"},{"line_number":68,"context_line":"        return self.driver.verify_user_in_project(tenant_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxRo%3D","line":65,"updated":"2013-05-23 13:40:51.000000000","message":"this is also verifying authorization","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1edaa587db7bee3f4573f454fd86866c1f0c99b3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":66,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"},{"line_number":67,"context_line":"        user_ref \u003d self.driver.authenticate_user(user_id, password)"},{"line_number":68,"context_line":"        return self.driver.verify_user_in_project(tenant_id, user_ref)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fw7k%3D","line":65,"in_reply_to":"AAAAPH%2F%2FxRo%3D","updated":"2013-05-23 17:18:35.000000000","message":"Yes, I just kept the old name.  This is maintaining API compatibility.","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1309c9a008c59dbd94ee5d7c25aa83f2b9188ee6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        raise exception.NotImplemented()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":102,"context_line":"        \"\"\"Authenticate a given user, tenant and password."},{"line_number":103,"context_line":"        :returns: (user_ref, tenant_ref, metadata_ref)"},{"line_number":104,"context_line":"        :raises: AssertionError"},{"line_number":105,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2FxRs%3D","line":102,"updated":"2013-05-23 13:40:51.000000000","message":"revise docstr to reflect new scope of responsibility","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1edaa587db7bee3f4573f454fd86866c1f0c99b3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        raise exception.NotImplemented()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def verify_user_in_project(self, tenant_id, user_ref):"},{"line_number":102,"context_line":"        \"\"\"Authenticate a given user, tenant and password."},{"line_number":103,"context_line":"        :returns: (user_ref, tenant_ref, metadata_ref)"},{"line_number":104,"context_line":"        :raises: AssertionError"},{"line_number":105,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPH%2F%2Fw7g%3D","line":102,"in_reply_to":"AAAAPH%2F%2FxRs%3D","updated":"2013-05-23 17:18:35.000000000","message":"Good point.","commit_id":"82fe9db53ef91aafa2360d8bed335c7e1af77ee1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85267123da1bcf5c303c1bd51ef248683743c651","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":66,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"},{"line_number":67,"context_line":"        \"\"\"Authenticate a given user and password and"},{"line_number":68,"context_line":"        authorize them for a tenant."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fc2o%3D","line":65,"updated":"2013-06-03 17:14:42.000000000","message":"shouldn\u0027t this be in password auth plugin?","commit_id":"db0370d2d30de086e5b973e14cd6a8790a555ee9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"02623f4c2bcec51f759b2ee71ec033ca91927614","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def __init__(self):"},{"line_number":63,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":66,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"},{"line_number":67,"context_line":"        \"\"\"Authenticate a given user and password and"},{"line_number":68,"context_line":"        authorize them for a tenant."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2FbtE%3D","line":65,"in_reply_to":"AAAAPH%2F%2Fc2o%3D","updated":"2013-06-04 19:06:42.000000000","message":"Maybe eventually, but that would involve rewriting a wide array of the unit tests.  This is merely a \"pull up\" refactoring from the driver to the manager.","commit_id":"db0370d2d30de086e5b973e14cd6a8790a555ee9"}],"tests/test_backend.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c59d0222f65991fbf5d9cdcdd8a39f89e65fc49c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test_authenticate_bad_user(self):"},{"line_number":60,"context_line":"        self.assertRaises(AssertionError,"},{"line_number":61,"context_line":"                          self.identity_man.authenticate,"},{"line_number":62,"context_line":"                          {},"},{"line_number":63,"context_line":"                          user_id\u003duuid.uuid4().hex,"},{"line_number":64,"context_line":"                          tenant_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":65,"context_line":"                          password\u003dself.user_foo[\u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FikM%3D","line":62,"updated":"2013-05-30 22:15:25.000000000","message":"for reviewers, it would be nice to have the {} named so that I know it\u0027s the context and not something else. So suggest a constant like EMPTY_CONTEXT.","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f28a3ae1021e5c163c3a4b9a2a5e050e871ab0d8","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def test_authenticate_bad_user(self):"},{"line_number":60,"context_line":"        self.assertRaises(AssertionError,"},{"line_number":61,"context_line":"                          self.identity_man.authenticate,"},{"line_number":62,"context_line":"                          {},"},{"line_number":63,"context_line":"                          user_id\u003duuid.uuid4().hex,"},{"line_number":64,"context_line":"                          tenant_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":65,"context_line":"                          password\u003dself.user_foo[\u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPH%2F%2FiV0%3D","line":62,"in_reply_to":"AAAAPH%2F%2FikM%3D","updated":"2013-05-31 00:28:11.000000000","message":"Done","commit_id":"632c3b978d8af15ac38d0a4574d62a863d5ccd71"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"08ec9c05c1521f68b6f6a975f8a1c1ca31b0887f","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_authenticate_no_project(self):"},{"line_number":85,"context_line":"        user_ref, tenant_ref, metadata_ref \u003d self.identity_man.authenticate("},{"line_number":86,"context_line":"            {},"},{"line_number":87,"context_line":"            user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":88,"context_line":"            password\u003dself.user_foo[\u0027password\u0027])"},{"line_number":89,"context_line":"        # NOTE(termie): the password field is left in user_foo to make"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPH%2F%2FdKI%3D","line":86,"updated":"2013-06-03 15:44:17.000000000","message":"Minor nit...we used EMPTY_CONTEXT above (which is nice and explanatory), here we use {}....probably best to be consistent.  Same for lines below.","commit_id":"f2362b2c7621d56217af5f869f592f7f6e345e42"}]}
