)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"7ba1ac1494f56637deda52c76f6476ea63e79b5e","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Co-Authored-By: Gage Hugo \u003cgagehugo@gmail.com\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Steve Martinelli \u003cs.martinelli@gmail.com\u003e"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I13eada3d5c3a166223c3e3ce70b7054eaed1003a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"5a3905b3_df7646d6","line":20,"updated":"2017-01-21 22:01:32.000000000","message":"reference bp/removed-as-of-ocata\n\n  implements bp/removed-as-of-ocata","commit_id":"4f308c9cab06f8316e5133b7ab2dce0696ae4b09"}],"doc/source/configuration.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e7580b9f9f5058765ed4fcd73eb95f5937404003","unresolved":false,"context_lines":[{"line_number":1753,"context_line":"Nonetheless, the explicit option will always override the implicit option, so"},{"line_number":1754,"context_line":"specifying the options as shown above will always be correct."},{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":".. code-block:: ini"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"  [ldap]"},{"line_number":1759,"context_line":"  user_allow_create \u003d False"},{"line_number":1760,"context_line":"  user_allow_update \u003d False"},{"line_number":1761,"context_line":"  user_allow_delete \u003d False"},{"line_number":1762,"context_line":""},{"line_number":1763,"context_line":".. NOTE::"},{"line_number":1764,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a3905b3_dcaf3428","line":1761,"range":{"start_line":1756,"start_character":0,"end_line":1761,"end_character":27},"updated":"2017-01-21 21:27:53.000000000","message":"remove this","commit_id":"2457d07924854cc40aa8544b433198e167ebf874"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"f7df219d5a3f65bd32f29be5f3f457ac65ff44e8","unresolved":false,"context_lines":[{"line_number":1753,"context_line":"Nonetheless, the explicit option will always override the implicit option, so"},{"line_number":1754,"context_line":"specifying the options as shown above will always be correct."},{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":".. code-block:: ini"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"  [ldap]"},{"line_number":1759,"context_line":"  user_allow_create \u003d False"},{"line_number":1760,"context_line":"  user_allow_update \u003d False"},{"line_number":1761,"context_line":"  user_allow_delete \u003d False"},{"line_number":1762,"context_line":""},{"line_number":1763,"context_line":".. NOTE::"},{"line_number":1764,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"5a3905b3_5ff5f654","line":1761,"range":{"start_line":1756,"start_character":0,"end_line":1761,"end_character":27},"in_reply_to":"5a3905b3_dcaf3428","updated":"2017-01-21 21:52:44.000000000","message":"Done","commit_id":"2457d07924854cc40aa8544b433198e167ebf874"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0896cdd21b94e09356091d3b904f0979abbd7d9c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return self.user.filter_attributes(self.user.get_by_name(user_name))"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    # CRUD"},{"line_number":96,"context_line":"    def change_password(self, user_id, new_password):"},{"line_number":97,"context_line":"        raise exception.NotImplemented("},{"line_number":98,"context_line":"            _(\u0027Self-service user password changes are not implemented for \u0027"},{"line_number":99,"context_line":"              \u0027LDAP.\u0027))"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def get_group(self, group_id):"},{"line_number":102,"context_line":"        return self.group.get_filtered(group_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3905b3_128c4a7e","line":99,"range":{"start_line":96,"start_character":3,"end_line":99,"end_character":23},"updated":"2017-01-21 14:47:54.000000000","message":"this can get (re)moved too","commit_id":"d717cc12f21438dfde1fce2c876ac17d64a9c1b4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b063612b86d1b6abc97b28ec93267768afad32a5","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                     {\u0027user_id\u0027: user_id,"},{"line_number":143,"context_line":"                                      \u0027group_id\u0027: group_id})"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    # Unsupported methods"},{"line_number":146,"context_line":"    def create_user(self, user_id, user):"},{"line_number":147,"context_line":"        if common_ldap.WRITEABLE:"},{"line_number":148,"context_line":"            return self._create_user(user_id, user)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            raise exception.Forbidden(READ_ONLY_LDAP_ERROR_MESSAGE)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def update_user(self, user_id, user):"},{"line_number":153,"context_line":"        if common_ldap.WRITEABLE:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_f5c9635a","line":150,"range":{"start_line":145,"start_character":4,"end_line":150,"end_character":67},"updated":"2017-01-22 02:02:43.000000000","message":"Don\u0027t wrap this in this manner, just add at the top of each method (instead of doing the _\u003cblah\u003e call if common_ldap.WRITABLE a simple method that raises forbidden if common_ldap.WRITABLE is not True and call it at the top of each of the methods:\n\n  def _ldap_write_disallow(self):\n    if not common_ldap.WRITABLE:\n      raise exception.Forbidden(READ_ONLY_LDAP_ERROR_MESSAGE)\n\nLess code change and same net effect.\n\nThis change is fine as-is, but I dislike the almost copy/pasted code for each of the methods, if we can avoid doing that, it would be better.\n\nAnother method would be to update the handlers from keystone.identity.backends.ldap.common to block writes when common_ldap.WRITABLE is false.","commit_id":"00c86c8a574e362a1f04525139614729e2a5fe57"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"d2250eb5c0edc767f0b8e9952567634caf7ee298","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                                     {\u0027user_id\u0027: user_id,"},{"line_number":143,"context_line":"                                      \u0027group_id\u0027: group_id})"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    # Unsupported methods"},{"line_number":146,"context_line":"    def create_user(self, user_id, user):"},{"line_number":147,"context_line":"        if common_ldap.WRITEABLE:"},{"line_number":148,"context_line":"            return self._create_user(user_id, user)"},{"line_number":149,"context_line":"        else:"},{"line_number":150,"context_line":"            raise exception.Forbidden(READ_ONLY_LDAP_ERROR_MESSAGE)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def update_user(self, user_id, user):"},{"line_number":153,"context_line":"        if common_ldap.WRITEABLE:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_f5afa327","line":150,"range":{"start_line":145,"start_character":4,"end_line":150,"end_character":67},"in_reply_to":"5a3905b3_f5c9635a","updated":"2017-01-22 02:22:52.000000000","message":"Makes sense, will update to make a call to such a method. Much cleaner. Thanks!","commit_id":"00c86c8a574e362a1f04525139614729e2a5fe57"}],"keystone/tests/unit/ksfixtures/ldapdb.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e7580b9f9f5058765ed4fcd73eb95f5937404003","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.addCleanup(common_ldap._HANDLERS.clear)"},{"line_number":35,"context_line":"        self.addCleanup(self.disable_write)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def disable_write(self):"},{"line_number":38,"context_line":"        common_ldap.WRITEABLE \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def clear(self):"},{"line_number":41,"context_line":"        for shelf in fakeldap.FakeShelves:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_7f81d2c2","line":38,"range":{"start_line":37,"start_character":8,"end_line":38,"end_character":37},"updated":"2017-01-21 21:27:53.000000000","message":"at first glance we should probably be enabling write instead of disabling it","commit_id":"2457d07924854cc40aa8544b433198e167ebf874"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"f7df219d5a3f65bd32f29be5f3f457ac65ff44e8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.addCleanup(common_ldap._HANDLERS.clear)"},{"line_number":35,"context_line":"        self.addCleanup(self.disable_write)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def disable_write(self):"},{"line_number":38,"context_line":"        common_ldap.WRITEABLE \u003d False"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def clear(self):"},{"line_number":41,"context_line":"        for shelf in fakeldap.FakeShelves:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_1fe1ae9a","line":38,"range":{"start_line":37,"start_character":8,"end_line":38,"end_character":37},"in_reply_to":"5a3905b3_7f81d2c2","updated":"2017-01-21 21:52:44.000000000","message":"The setUp of the test (line 29), enables write by setting writeable to true. This is added to cleanup, so it is executed after the test has run, and it sets it back to nonwriteable which is the default.","commit_id":"2457d07924854cc40aa8544b433198e167ebf874"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b063612b86d1b6abc97b28ec93267768afad32a5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(LDAPDatabase, self).setUp()"},{"line_number":28,"context_line":"        self.clear()"},{"line_number":29,"context_line":"        common_ldap.WRITEABLE \u003d True"},{"line_number":30,"context_line":"        common_ldap._HANDLERS.clear()"},{"line_number":31,"context_line":"        common_ldap.register_handler(\u0027fake://\u0027, self._dbclass)"},{"line_number":32,"context_line":"        # TODO(dstanek): switch the flow here"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_75965340","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":36},"updated":"2017-01-22 02:02:43.000000000","message":"Ideally this and the code below should be rolled into it\u0027s own context manager.\n\nThis would then be added around tests that are doing LDAP writes in setup (outside of setUp(), which in itself, is wrong).\n\nIt would work something like:\n\n  with LDAPWrite():\n    \u003cdo write operations\u003e\n    ...\n  rest_of_test that doesn\u0027t cause writes.\n\nThis has the added benefit of ensuring a test isn\u0027t by side effect writing to LDAP except explicitly in the wrapped context.\n\n\nThis change is fine as it is, the context manager can be an improvement added as a follow up.","commit_id":"00c86c8a574e362a1f04525139614729e2a5fe57"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"d2250eb5c0edc767f0b8e9952567634caf7ee298","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(LDAPDatabase, self).setUp()"},{"line_number":28,"context_line":"        self.clear()"},{"line_number":29,"context_line":"        common_ldap.WRITEABLE \u003d True"},{"line_number":30,"context_line":"        common_ldap._HANDLERS.clear()"},{"line_number":31,"context_line":"        common_ldap.register_handler(\u0027fake://\u0027, self._dbclass)"},{"line_number":32,"context_line":"        # TODO(dstanek): switch the flow here"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a3905b3_956bbff0","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":36},"in_reply_to":"5a3905b3_75965340","updated":"2017-01-22 02:22:52.000000000","message":"I agree, but I want to do that in a follow-up as part of a larger and more thorough refactoring of the tests.","commit_id":"00c86c8a574e362a1f04525139614729e2a5fe57"}]}
