)]}'
{"keystone/common/kvs/core.py":[{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @property"},{"line_number":115,"context_line":"    def is_configured(self):"},{"line_number":116,"context_line":"        return \u0027backend\u0027 in self._region.__dict__"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _apply_region_proxy(self, proxy_list):"},{"line_number":119,"context_line":"        if isinstance(proxy_list, list):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_f4822dff","line":116,"updated":"2014-08-18 18:44:58.000000000","message":"Is there ever a chance that _region or _region.__dict__ could not exist? Maybe you want to guard against that case. If there is no chance, then of course disregard this comment.","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"}],"keystone/contrib/revoke/core.py":[{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.revoke("},{"line_number":112,"context_line":"            model.RevokeEvent(access_token_id\u003dpayload[\u0027resource_info\u0027]))"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _group_callback(self, service, resource_type, operation, payload):"},{"line_number":115,"context_line":"        user_ids \u003d (u[\u0027id\u0027] for u in self.identity_api.list_users_in_group("},{"line_number":116,"context_line":"            payload[\u0027resource_info\u0027]))"},{"line_number":117,"context_line":"        for uid in user_ids:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_d4cc5138","line":114,"updated":"2014-08-18 18:44:58.000000000","message":"It might be a good idea to properly initialize the arguments for this method. Also, a lot of trust is placed in the availability of the \u0027id\u0027 being present in a user object. Could the user object be constructed without the \u0027id\u0027 or could the group be empty?","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"1becf4c4df6476123186335ffe1f3c8b6c0d1a9d","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _register_listeners(self):"},{"line_number":115,"context_line":"        callbacks \u003d ["},{"line_number":116,"context_line":"            [\u0027deleted\u0027, \u0027OS-TRUST:trust\u0027, self._trust_callback],"},{"line_number":117,"context_line":"            [\u0027deleted\u0027, \u0027OS-OAUTH1:consumer\u0027, self._consumer_callback],"},{"line_number":118,"context_line":"            [\u0027deleted\u0027, \u0027OS-OAUTH1:access_token\u0027,"},{"line_number":119,"context_line":"             self._access_token_callback],"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_e6e9951b","side":"PARENT","line":116,"updated":"2014-08-19 03:04:08.000000000","message":"This section contains raw strings that are used enough to call for them being pulled out and organized into a common module.","commit_id":"bb948f04f68d6474d36f6d86117b9d637a333b5a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3480179478f4f96086814e82e273b00fec65b66c","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _register_listeners(self):"},{"line_number":115,"context_line":"        callbacks \u003d ["},{"line_number":116,"context_line":"            [\u0027deleted\u0027, \u0027OS-TRUST:trust\u0027, self._trust_callback],"},{"line_number":117,"context_line":"            [\u0027deleted\u0027, \u0027OS-OAUTH1:consumer\u0027, self._consumer_callback],"},{"line_number":118,"context_line":"            [\u0027deleted\u0027, \u0027OS-OAUTH1:access_token\u0027,"},{"line_number":119,"context_line":"             self._access_token_callback],"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_9c202ef9","side":"PARENT","line":116,"in_reply_to":"1abeadc6_e6e9951b","updated":"2014-08-19 05:59:17.000000000","message":"Fair point. I may defer that to a cleanup patch to ease reviewing of the code if that works.","commit_id":"bb948f04f68d6474d36f6d86117b9d637a333b5a"}],"keystone/identity/core.py":[{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":603,"context_line":"    @domains_configured"},{"line_number":604,"context_line":"    @exception_translated(\u0027user\u0027)"},{"line_number":605,"context_line":"    def update_user(self, user_id, user_ref):"},{"line_number":606,"context_line":"        old_user_ref \u003d self.get_user(user_id)"},{"line_number":607,"context_line":"        user \u003d user_ref.copy()"},{"line_number":608,"context_line":"        if \u0027name\u0027 in user:"},{"line_number":609,"context_line":"            user[\u0027name\u0027] \u003d clean.user_name(user[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_5474c1ce","line":606,"updated":"2014-08-18 18:44:58.000000000","message":"You should initialize user_id and user_ref to None and then guard your call to get_user against bad values.","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        user \u003d self._clear_domain_id_if_domain_unaware(driver, user)"},{"line_number":625,"context_line":"        ref \u003d driver.update_user(entity_id, user)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        if ((user.get(\u0027enabled\u0027) is False) and"},{"line_number":628,"context_line":"                user[\u0027enabled\u0027] !\u003d old_user_ref.get(\u0027enabled\u0027)):"},{"line_number":629,"context_line":"            self._emit_disable_user_notify(user_id)"},{"line_number":630,"context_line":"        elif user.get(\u0027password\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_342585c2","line":627,"updated":"2014-08-18 18:44:58.000000000","message":"You can use  \" (not user.get(\u0027enabled\u0027) and \"","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":634,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"    @notifications.disabled(_USER, public\u003dFalse)"},{"line_number":637,"context_line":"    def _emit_disable_user_notify(self, user_id):"},{"line_number":638,"context_line":"        # Simply emit that the user has been disabled so the callback system"},{"line_number":639,"context_line":"        # can do the right thing."},{"line_number":640,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_14188980","line":637,"updated":"2014-08-18 18:44:58.000000000","message":"Initialize user_id with None","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        pass"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"    @notifications.updated(_USER_PASSWORD, public\u003dFalse)"},{"line_number":643,"context_line":"    def _emit_user_password_notify(self, user_id):"},{"line_number":644,"context_line":"        # Simply emit that the user\u0027s password has been updated so the callback"},{"line_number":645,"context_line":"        # system can do the right thing."},{"line_number":646,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_cf04bc17","line":643,"updated":"2014-08-18 18:44:58.000000000","message":"Initialize user_id with None","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":750,"context_line":"        self._emit_user_removed_from_group_notification(user_id)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"    @notifications.updated(_USER_REMOVED_FROM_GROUP, public\u003dFalse)"},{"line_number":753,"context_line":"    def _emit_user_removed_from_group_notification(self, user_id):"},{"line_number":754,"context_line":"        # Simply emit that the user has been removed from a group so the"},{"line_number":755,"context_line":"        # callback system can do the right thing."},{"line_number":756,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_4f3eecb9","line":753,"updated":"2014-08-18 18:44:58.000000000","message":"Initialize user_id with None","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"40acd8d8a42e0c1755ad7cf458461474f6c09c6e","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        user \u003d self._clear_domain_id_if_domain_unaware(driver, user)"},{"line_number":625,"context_line":"        ref \u003d driver.update_user(entity_id, user)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        if ((user.get(\u0027enabled\u0027) is False) and"},{"line_number":628,"context_line":"                user[\u0027enabled\u0027] !\u003d old_user_ref.get(\u0027enabled\u0027)):"},{"line_number":629,"context_line":"            self._emit_disable_user_notify(user_id)"},{"line_number":630,"context_line":"        elif user.get(\u0027password\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_52a04c43","line":627,"updated":"2014-08-18 21:36:56.000000000","message":"not user.get(\u0027enabled\u0027) should work here.","commit_id":"b2eef05a8c234958f322b762dc9a0d8ab392eb76"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3aef9e960623eef946e543f14f6a7549555d15a7","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        user \u003d self._clear_domain_id_if_domain_unaware(driver, user)"},{"line_number":625,"context_line":"        ref \u003d driver.update_user(entity_id, user)"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        if ((user.get(\u0027enabled\u0027) is False) and"},{"line_number":628,"context_line":"                user[\u0027enabled\u0027] !\u003d old_user_ref.get(\u0027enabled\u0027)):"},{"line_number":629,"context_line":"            self._emit_disable_user_notify(user_id)"},{"line_number":630,"context_line":"        elif user.get(\u0027password\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_c35570c7","line":627,"in_reply_to":"1abeadc6_52a04c43","updated":"2014-08-18 23:13:31.000000000","message":"Except that if enabled is None we (in other cases) treat the object as enabled. The only time the object should be disabled is if it\u0027s explicitly set to false.","commit_id":"b2eef05a8c234958f322b762dc9a0d8ab392eb76"},{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"1becf4c4df6476123186335ffe1f3c8b6c0d1a9d","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    mapping by default is a more prudent way to introduce this functionality."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    \"\"\""},{"line_number":248,"context_line":"    _USER \u003d \u0027user\u0027"},{"line_number":249,"context_line":"    _USER_PASSWORD \u003d \u0027user_password\u0027"},{"line_number":250,"context_line":"    _USER_REMOVED_FROM_GROUP \u003d \u0027user_removed_from_group\u0027"},{"line_number":251,"context_line":"    _GROUP \u003d \u0027group\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_26a62d11","line":248,"updated":"2014-08-19 03:04:08.000000000","message":"This constant is not being used consistently. There are a few places where the raw string is being used in its place. This might be a good time to pull all of the raw strings out into a common place.","commit_id":"38d1f56f02ece3b923840600b7bde9f4f224f8e5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3480179478f4f96086814e82e273b00fec65b66c","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    mapping by default is a more prudent way to introduce this functionality."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    \"\"\""},{"line_number":248,"context_line":"    _USER \u003d \u0027user\u0027"},{"line_number":249,"context_line":"    _USER_PASSWORD \u003d \u0027user_password\u0027"},{"line_number":250,"context_line":"    _USER_REMOVED_FROM_GROUP \u003d \u0027user_removed_from_group\u0027"},{"line_number":251,"context_line":"    _GROUP \u003d \u0027group\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_bc740afe","line":248,"in_reply_to":"1abeadc6_26a62d11","updated":"2014-08-19 05:59:17.000000000","message":"Same as before, I\u0027d like to defer that change to a cleanup patch if that is ok (i\u0027ll make it a follow up to this one), it will ease reviewing so only the review is not mixing \"new functionality\" and \"cleanup\" at once.","commit_id":"38d1f56f02ece3b923840600b7bde9f4f224f8e5"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"7cfdad7285a0e75aa8bce9be1a40b5dadc4564d2","unresolved":false,"context_lines":[{"line_number":704,"context_line":"    def delete_group(self, group_id):"},{"line_number":705,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":706,"context_line":"            self._get_domain_driver_and_entity_id(group_id))"},{"line_number":707,"context_line":"        user_ids \u003d (u[\u0027id\u0027] for u in self.list_users_in_group(group_id))"},{"line_number":708,"context_line":"        driver.delete_group(entity_id)"},{"line_number":709,"context_line":"        self.id_mapping_api.delete_id_mapping(group_id)"},{"line_number":710,"context_line":"        for uid in user_ids:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_063211a7","line":707,"updated":"2014-08-19 03:17:36.000000000","message":"What will happen to roles assigned via group assignments?","commit_id":"38d1f56f02ece3b923840600b7bde9f4f224f8e5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3480179478f4f96086814e82e273b00fec65b66c","unresolved":false,"context_lines":[{"line_number":704,"context_line":"    def delete_group(self, group_id):"},{"line_number":705,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":706,"context_line":"            self._get_domain_driver_and_entity_id(group_id))"},{"line_number":707,"context_line":"        user_ids \u003d (u[\u0027id\u0027] for u in self.list_users_in_group(group_id))"},{"line_number":708,"context_line":"        driver.delete_group(entity_id)"},{"line_number":709,"context_line":"        self.id_mapping_api.delete_id_mapping(group_id)"},{"line_number":710,"context_line":"        for uid in user_ids:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_fcf3e270","line":707,"in_reply_to":"1abeadc6_063211a7","updated":"2014-08-19 05:59:17.000000000","message":"This is specifically invalidating users\u0027s tokens. The list_users_in_group should return the users we need to invalidate, if we need to expand the return of list_users_in_group, that would need to be a separate patch (as it would be introducing new functionality that was not previously here).\n\nIf we need to expand the revoking of tokens in this manner, we\u0027ll need a separate bug for it. (something to research)","commit_id":"38d1f56f02ece3b923840600b7bde9f4f224f8e5"}],"keystone/token/provider.py":[{"author":{"_account_id":5164,"name":"jsimms","email":"justin.simms@gmail.com","username":"jsimms"},"change_message_id":"cb6f445462d1f464f25e12bf4c31c55c77a598f7","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        self.persistence.delete_tokens(user_id\u003dtrust[\u0027trustor_user_id\u0027],"},{"line_number":470,"context_line":"                                       trust_id\u003dtrust_id)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"    def _delete_user_tokens_callback(self, service, resource_type, operation,"},{"line_number":473,"context_line":"                                     payload):"},{"line_number":474,"context_line":"        user_id \u003d payload[\u0027resource_info\u0027]"},{"line_number":475,"context_line":"        self.persistence.delete_tokens_for_user(user_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_af9b00c8","line":472,"updated":"2014-08-18 18:44:58.000000000","message":"Initialize service , resource_type, operation and payload to None.\nuser_id and the call to persistence.delete_tokens_for_user should condition on user_id not being None","commit_id":"926440c8bab4c1e0ca1df1c1bded709aafd456b2"}]}
