)]}'
{"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a2a5f61d3660d672e56ba7667e66c72f5e444e02","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        if \u0027tenant_id\u0027 in values and \\"},{"line_number":459,"context_line":"                old_obj.get(\u0027tenant_id\u0027) !\u003d values[\u0027tenant_id\u0027]:"},{"line_number":460,"context_line":"            if old_obj[\u0027tenant_id\u0027]:"},{"line_number":461,"context_line":"                self.project_api.remove_user(old_obj[\u0027tenant_id\u0027], id)"},{"line_number":462,"context_line":"            if values[\u0027tenant_id\u0027]:"},{"line_number":463,"context_line":"                self.project_api.add_user(values[\u0027tenant_id\u0027], id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F4mE%3D","line":460,"updated":"2013-06-06 18:54:10.000000000","message":"project_api","commit_id":"d0df5546bcb02c07568af0c26af952e353dc235f"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a2a5f61d3660d672e56ba7667e66c72f5e444e02","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                old_obj.get(\u0027tenant_id\u0027) !\u003d values[\u0027tenant_id\u0027]:"},{"line_number":460,"context_line":"            if old_obj[\u0027tenant_id\u0027]:"},{"line_number":461,"context_line":"                self.project_api.remove_user(old_obj[\u0027tenant_id\u0027], id)"},{"line_number":462,"context_line":"            if values[\u0027tenant_id\u0027]:"},{"line_number":463,"context_line":"                self.project_api.add_user(values[\u0027tenant_id\u0027], id)"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        values \u003d utils.hash_ldap_user_password(values)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F4mA%3D","line":462,"updated":"2013-06-06 18:54:10.000000000","message":"project_api","commit_id":"d0df5546bcb02c07568af0c26af952e353dc235f"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a2a5f61d3660d672e56ba7667e66c72f5e444e02","unresolved":false,"context_lines":[{"line_number":472,"context_line":"    def delete(self, id):"},{"line_number":473,"context_line":"        user \u003d self.get(id)"},{"line_number":474,"context_line":"        if hasattr(user, \u0027tenant_id\u0027):"},{"line_number":475,"context_line":"            self.project_api.remove_user(user.tenant_id, id)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"        super(UserApi, self).delete(id)"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F4mg%3D","line":475,"updated":"2013-06-06 18:54:10.000000000","message":"we don\u0027t have project_api any more.","commit_id":"d0df5546bcb02c07568af0c26af952e353dc235f"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a2a5f61d3660d672e56ba7667e66c72f5e444e02","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        return projects"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    def get_role_assignments(self, tenant_id):"},{"line_number":536,"context_line":"        return self.role_api.get_role_assignments(tenant_id)"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"    def add_user(self, tenant_id, user_dn):"},{"line_number":539,"context_line":"        conn \u003d self.get_connection()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F4ms%3D","line":536,"updated":"2013-06-06 18:54:10.000000000","message":"we don\u0027t have role_api any more right? needs to be taken care.","commit_id":"d0df5546bcb02c07568af0c26af952e353dc235f"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a2a5f61d3660d672e56ba7667e66c72f5e444e02","unresolved":false,"context_lines":[{"line_number":555,"context_line":"            conn.modify_s(self._id_to_dn(tenant_id),"},{"line_number":556,"context_line":"                          [(ldap.MOD_DELETE,"},{"line_number":557,"context_line":"                            self.member_attribute,"},{"line_number":558,"context_line":"                            self.user_api._id_to_dn(user_id))])"},{"line_number":559,"context_line":"        except ldap.NO_SUCH_ATTRIBUTE:"},{"line_number":560,"context_line":"            raise exception.NotFound(user_id)"},{"line_number":561,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPX%2F%2F4lo%3D","line":558,"updated":"2013-06-06 18:54:10.000000000","message":"we don\u0027t have user_api now","commit_id":"d0df5546bcb02c07568af0c26af952e353dc235f"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"eab0c1aef16371542d9f2ba255f978aeadfbe895","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        user \u003d self.user.get(user_id)"},{"line_number":330,"context_line":"        if hasattr(user, \u0027tenant_id\u0027):"},{"line_number":331,"context_line":"            self.project.remove_user(user.tenant_id,"},{"line_number":332,"context_line":"                                     self.user_api._id_to_dn(user_id))"},{"line_number":333,"context_line":"        self.user.delete(user_id)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPX%2F%2F03o%3D","line":332,"updated":"2013-06-08 15:03:06.000000000","message":"user_api :-). replace \"self.user_api._id_to_dn(user_id)\" with \"user_dn\"","commit_id":"376f32aa555c5f993a26caa4fdc7e490f7afb31c"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"eab0c1aef16371542d9f2ba255f978aeadfbe895","unresolved":false,"context_lines":[{"line_number":844,"context_line":"            #todo clean up error reporting"},{"line_number":845,"context_line":"            raise exception.Conflict(_("},{"line_number":846,"context_line":"                \u0027User %(user_id)s is already a member of group %(group_id)s\u0027) %"},{"line_number":847,"context_line":"                {\u0027user_id\u0027: user_dn, \u0027group_id\u0027: group_id})"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def remove_user(self, user_dn, group_id):"},{"line_number":850,"context_line":"        conn \u003d self.get_connection()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPX%2F%2F03c%3D","line":847,"updated":"2013-06-08 15:03:06.000000000","message":"I know you have it as #todo here and few other places but just adding this comment so that it doesn\u0027t get overlooked :) if you are planning to take care of them as part of this patch.","commit_id":"376f32aa555c5f993a26caa4fdc7e490f7afb31c"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"c66f183f254bb4ab1acc7b132662b0e21c46e48b","unresolved":false,"context_lines":[{"line_number":329,"context_line":"        user \u003d self.user.get(user_id)"},{"line_number":330,"context_line":"        if hasattr(user, \u0027tenant_id\u0027):"},{"line_number":331,"context_line":"            self.project.remove_user(user.tenant_id,"},{"line_number":332,"context_line":"                                     self.user_api._id_to_dn(user_id))"},{"line_number":333,"context_line":"        self.user.delete(user_id)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPX%2F%2FuJA%3D","line":332,"updated":"2013-06-11 23:18:49.000000000","message":"user_api :-).. I think you missed replacing \"self.user_api._id_to_dn(user_id)\" with \"user_dn\". Thanks!","commit_id":"08d47c95195b9754876e024544d92aec16a6fc5d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"26243cb4b3b2e53e02c886c373a5c41bfd043322","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        if \u0027enabled\u0027 in user:"},{"line_number":243,"context_line":"            user[\u0027enabled\u0027] \u003d clean.user_enabled(user[\u0027enabled\u0027])"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        values \u003d user"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        if \u0027id\u0027 in values and values[\u0027id\u0027] !\u003d user_id:"},{"line_number":248,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2FmF4%3D","line":245,"updated":"2013-06-14 18:30:44.000000000","message":"why the indirection?","commit_id":"f8364bd2dc1a704c5b1321d26fb878e75d816197"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"26243cb4b3b2e53e02c886c373a5c41bfd043322","unresolved":false,"context_lines":[{"line_number":245,"context_line":"        values \u003d user"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        if \u0027id\u0027 in values and values[\u0027id\u0027] !\u003d user_id:"},{"line_number":248,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":249,"context_line":"        old_obj \u003d self.user.get(user_id)"},{"line_number":250,"context_line":"        if \u0027name\u0027 in values and old_obj.get(\u0027name\u0027) !\u003d values[\u0027name\u0027]:"},{"line_number":251,"context_line":"            raise exception.Conflict(\u0027Cannot change user name\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2FmGA%3D","line":248,"updated":"2013-06-14 18:30:44.000000000","message":"this conditional belongs in the identity.Manager","commit_id":"f8364bd2dc1a704c5b1321d26fb878e75d816197"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"26243cb4b3b2e53e02c886c373a5c41bfd043322","unresolved":false,"context_lines":[{"line_number":635,"context_line":"            conn.modify_s(role_dn, [(ldap.MOD_ADD,"},{"line_number":636,"context_line":"                                     self.member_attribute, user_dn)])"},{"line_number":637,"context_line":"        except ldap.TYPE_OR_VALUE_EXISTS:"},{"line_number":638,"context_line":"            #todo this changes the error message to a dn."},{"line_number":639,"context_line":"            #Push the messaging up one level"},{"line_number":640,"context_line":"            msg \u003d (\u0027User %s already has role %s in tenant %s\u0027"},{"line_number":641,"context_line":"                   % (user_dn, role_id, tenant_id))"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2FmFk%3D","line":638,"updated":"2013-06-14 18:30:44.000000000","message":"claim TODO\u0027s as your own\n\n  # TODO(name):","commit_id":"f8364bd2dc1a704c5b1321d26fb878e75d816197"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"87e8b357a5ae6d6d52b84c39e0e2d9eef3f2165a","unresolved":false,"context_lines":[{"line_number":723,"context_line":"        res \u003d []"},{"line_number":724,"context_line":"        for role_dn, _ in roles:"},{"line_number":725,"context_line":"            tenant \u003d ldap.dn.str2dn(role_dn)"},{"line_number":726,"context_line":"            tenant.pop(0)"},{"line_number":727,"context_line":"            tenant_dn \u003d ldap.dn.dn2str(tenant)"},{"line_number":728,"context_line":"            res.append(UserRoleAssociation("},{"line_number":729,"context_line":"                user_dn\u003duser_dn,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2FpZ8%3D","line":726,"updated":"2013-06-13 15:12:32.000000000","message":"why the pop here?  this could really use a comment explaining why the pop was necessary","commit_id":"f8364bd2dc1a704c5b1321d26fb878e75d816197"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"26243cb4b3b2e53e02c886c373a5c41bfd043322","unresolved":false,"context_lines":[{"line_number":723,"context_line":"        res \u003d []"},{"line_number":724,"context_line":"        for role_dn, _ in roles:"},{"line_number":725,"context_line":"            tenant \u003d ldap.dn.str2dn(role_dn)"},{"line_number":726,"context_line":"            tenant.pop(0)"},{"line_number":727,"context_line":"            tenant_dn \u003d ldap.dn.dn2str(tenant)"},{"line_number":728,"context_line":"            res.append(UserRoleAssociation("},{"line_number":729,"context_line":"                user_dn\u003duser_dn,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPX%2F%2FmFU%3D","line":726,"in_reply_to":"AAAAPX%2F%2FpZ8%3D","updated":"2013-06-14 18:30:44.000000000","message":"+1; especially from something that\u0027s not named as a collection","commit_id":"f8364bd2dc1a704c5b1321d26fb878e75d816197"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"04bd3044b366a4fb1173169ebada0edddd50c888","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        if \u0027name\u0027 in user:"},{"line_number":228,"context_line":"            user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":229,"context_line":"        if \u0027enabled\u0027 in user:"},{"line_number":230,"context_line":"            user[\u0027enabled\u0027] \u003d clean.user_enabled(user[\u0027enabled\u0027])"},{"line_number":231,"context_line":"        if \u0027id\u0027 in user and user[\u0027id\u0027] !\u003d user_id:"},{"line_number":232,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":233,"context_line":"        old_obj \u003d self.user.get(user_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2F55k%3D","line":230,"updated":"2013-06-18 16:21:53.000000000","message":"I think the 4 lines above this now in the manager....so I don\u0027t think you need these here...","commit_id":"d10855321c0505d5dc73b0235caa449322bddfea"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9cce411a7cef98d3bb9c4427da75e513e659380d","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        if \u0027name\u0027 in user:"},{"line_number":228,"context_line":"            user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":229,"context_line":"        if \u0027enabled\u0027 in user:"},{"line_number":230,"context_line":"            user[\u0027enabled\u0027] \u003d clean.user_enabled(user[\u0027enabled\u0027])"},{"line_number":231,"context_line":"        if \u0027id\u0027 in user and user[\u0027id\u0027] !\u003d user_id:"},{"line_number":232,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":233,"context_line":"        old_obj \u003d self.user.get(user_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2F4CA%3D","line":230,"in_reply_to":"AAAAPn%2F%2F45U%3D","updated":"2013-06-19 09:02:21.000000000","message":"I believe patch https://review.openstack.org/#/c/33181/3 (that pulled these checks into the manager) also fixed the tests (if there are other tests that it didn\u0027t fix, then I\u0027m not sure how it passed).  The code code above appears to be putting these checks back into the individual driver.","commit_id":"d10855321c0505d5dc73b0235caa449322bddfea"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e9c1b5154cae669ed4a5931a4cb64ba753428237","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        if \u0027name\u0027 in user:"},{"line_number":228,"context_line":"            user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"},{"line_number":229,"context_line":"        if \u0027enabled\u0027 in user:"},{"line_number":230,"context_line":"            user[\u0027enabled\u0027] \u003d clean.user_enabled(user[\u0027enabled\u0027])"},{"line_number":231,"context_line":"        if \u0027id\u0027 in user and user[\u0027id\u0027] !\u003d user_id:"},{"line_number":232,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":233,"context_line":"        old_obj \u003d self.user.get(user_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2F45U%3D","line":230,"in_reply_to":"AAAAPn%2F%2F55k%3D","updated":"2013-06-18 22:20:53.000000000","message":"unit tests talk directly to the back ends, so unless I go and change all of the unit tests, I need to keep this here.  If I try to change the unit tests, I have to change all of the backends, which is out of the scope of this patch.","commit_id":"d10855321c0505d5dc73b0235caa449322bddfea"}]}
