)]}'
{"keystone/common/sql/data_migration_repo/versions/016_migrate_lockout_ignore.py":[{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"e08ece3751bf22dbeb0f7ae19fb4b73b0c1d40c4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        CONF.security_compliance.password_expires_ignore_user_ids"},{"line_number":26,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    values \u003d {\u0027ignore_password_lockout\u0027: True}"},{"line_number":29,"context_line":"    for uid in ignore_password_lockout_user_ids:"},{"line_number":30,"context_line":"        stmt \u003d user_table.update().where(user_table.c.id \u003d\u003d uid).values(values)"},{"line_number":31,"context_line":"        stmt.execute()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a3905b3_e9ea35da","line":28,"updated":"2017-01-23 17:55:18.000000000","message":"Why are we setting it to \u0027True\u0027 for all existing users and \u0027False\u0027 as default for new users?","commit_id":"08dd61c6319f8dccee2639051b5914a416d0be7d"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"bb1573410c28fd05c1d53af7e99bd34d46ac11c6","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        CONF.security_compliance.password_expires_ignore_user_ids"},{"line_number":26,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    values \u003d {\u0027ignore_password_lockout\u0027: True}"},{"line_number":29,"context_line":"    for uid in ignore_password_lockout_user_ids:"},{"line_number":30,"context_line":"        stmt \u003d user_table.update().where(user_table.c.id \u003d\u003d uid).values(values)"},{"line_number":31,"context_line":"        stmt.execute()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a3905b3_21cd3185","line":28,"in_reply_to":"5a3905b3_6a02b30b","updated":"2017-01-23 19:40:11.000000000","message":"Makes sense. Thanks.","commit_id":"08dd61c6319f8dccee2639051b5914a416d0be7d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4a147c52fea07c9237094249a22728ecd0b45123","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        CONF.security_compliance.password_expires_ignore_user_ids"},{"line_number":26,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    values \u003d {\u0027ignore_password_lockout\u0027: True}"},{"line_number":29,"context_line":"    for uid in ignore_password_lockout_user_ids:"},{"line_number":30,"context_line":"        stmt \u003d user_table.update().where(user_table.c.id \u003d\u003d uid).values(values)"},{"line_number":31,"context_line":"        stmt.execute()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a3905b3_6a02b30b","line":28,"in_reply_to":"5a3905b3_e9ea35da","updated":"2017-01-23 18:47:53.000000000","message":"Setting to True for all user IDs currently in the ignore user configuration setting (line 24 and 29). So migrating that data to this new field.","commit_id":"08dd61c6319f8dccee2639051b5914a416d0be7d"}],"keystone/common/sql/expand_repo/versions/016_expand_lockout_ignore.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ed08f11c49343fc5e3104d7c3826795b60bb998a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    ignore_password_lockout \u003d sql.Column("},{"line_number":23,"context_line":"        \u0027ignore_password_lockout\u0027, sql.Boolean, default\u003dFalse, nullable\u003dFalse,"},{"line_number":24,"context_line":"        server_default\u003dsql.sql.expression.false())"},{"line_number":25,"context_line":"    user_table.create_column(ignore_password_lockout)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a3905b3_4a4977b6","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":14},"updated":"2017-01-23 19:02:50.000000000","message":"Move this column to the local_user table.","commit_id":"08dd61c6319f8dccee2639051b5914a416d0be7d"}],"keystone/identity/backends/resource_options.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ecf0d60671c89de02c0672d804a770079b5bc9e4","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"IGNORE_LOCKOUT_ATTEMPT_OPT \u003d ("},{"line_number":22,"context_line":"    resource_options.ResourceOption(\u00271001\u0027,"},{"line_number":23,"context_line":"                                    \u0027ignore_lockout_failure_attempts\u0027),"},{"line_number":24,"context_line":"    )"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_1c0705cb","line":23,"updated":"2017-01-27 21:08:05.000000000","message":"Is this supposed to be a tuple?","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65eefb4df067b0dc89c279ad93a31b957a163ecc","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"IGNORE_LOCKOUT_ATTEMPT_OPT \u003d ("},{"line_number":22,"context_line":"    resource_options.ResourceOption(\u00271001\u0027,"},{"line_number":23,"context_line":"                                    \u0027ignore_lockout_failure_attempts\u0027),"},{"line_number":24,"context_line":"    )"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_a56a54b1","line":23,"in_reply_to":"3a461143_1c0705cb","updated":"2017-01-27 22:50:13.000000000","message":"nope, thanks","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e6104ef127eab6382d87c42e44927aeab9d1b32e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        \"\"\"Check if the user account is locked."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        Checks if the user account is locked based on the number of failed"},{"line_number":83,"context_line":"        authentication attempts."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        :param user_id: The user ID"},{"line_number":86,"context_line":"        :param user_ref: Reference to the user object"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_6c474577","side":"PARENT","line":83,"updated":"2017-01-30 19:29:21.000000000","message":"Adding a note here that we could improve this docstring to take into account the options logic and how this can be bypassed using options.","commit_id":"47cd72911cff2bc42e9c4b867f35952104d69e70"}],"keystone/identity/schema.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ecf0d60671c89de02c0672d804a770079b5bc9e4","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"    \u0027properties\u0027: {"},{"line_number":69,"context_line":"        ro.IGNORE_CHANGE_PASSWORD_OPT.option_name: parameter_types.boolean,"},{"line_number":70,"context_line":"        ro.IGNORE_LOCKOUT_ATTEMPT_OPT.option_name: parameter_types.boolean"},{"line_number":71,"context_line":"    },"},{"line_number":72,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":73,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_1c2e2543","line":70,"updated":"2017-01-27 21:08:05.000000000","message":"Same this came up in discussion of the earlier review. Do we want to support a null value to remove the option completely?","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65eefb4df067b0dc89c279ad93a31b957a163ecc","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":68,"context_line":"    \u0027properties\u0027: {"},{"line_number":69,"context_line":"        ro.IGNORE_CHANGE_PASSWORD_OPT.option_name: parameter_types.boolean,"},{"line_number":70,"context_line":"        ro.IGNORE_LOCKOUT_ATTEMPT_OPT.option_name: parameter_types.boolean"},{"line_number":71,"context_line":"    },"},{"line_number":72,"context_line":"    \u0027additionalProperties\u0027: False"},{"line_number":73,"context_line":"}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_259d84bc","line":70,"in_reply_to":"3a461143_1c2e2543","updated":"2017-01-27 22:50:13.000000000","message":"hmm, probably...","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"}],"keystone/tests/unit/identity/test_backend_sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ecf0d60671c89de02c0672d804a770079b5bc9e4","unresolved":false,"context_lines":[{"line_number":901,"context_line":"        self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":902,"context_line":"        self.assertPasswordIsExpired(user[\u0027id\u0027], admin_password)"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"class ChangePasswordRequiredAfterFirstUse(test_backend_sql.SqlTests):"},{"line_number":905,"context_line":"    def _create_user(self, password, change_password_upon_first_use):"},{"line_number":906,"context_line":"        self.config_fixture.config("},{"line_number":907,"context_line":"            group\u003d\u0027security_compliance\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_1cd5451b","line":904,"updated":"2017-01-27 21:08:05.000000000","message":"Is this class from the earlier review of `change_password_upon_first_use`?","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"65eefb4df067b0dc89c279ad93a31b957a163ecc","unresolved":false,"context_lines":[{"line_number":901,"context_line":"        self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":902,"context_line":"        self.assertPasswordIsExpired(user[\u0027id\u0027], admin_password)"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"class ChangePasswordRequiredAfterFirstUse(test_backend_sql.SqlTests):"},{"line_number":905,"context_line":"    def _create_user(self, password, change_password_upon_first_use):"},{"line_number":906,"context_line":"        self.config_fixture.config("},{"line_number":907,"context_line":"            group\u003d\u0027security_compliance\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_e549bc61","line":904,"in_reply_to":"3a461143_1cd5451b","updated":"2017-01-27 22:50:13.000000000","message":"yep, copy pasta","commit_id":"bcc07896496512d46f055aea855a8cea9029a2b7"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4aa37de5246e2dab03fbc37d1dec7af7881da8fc","unresolved":false,"context_lines":[{"line_number":1856,"context_line":"        }"},{"line_number":1857,"context_line":"        self.update_user_validator.validate(request_to_validate)"},{"line_number":1858,"context_line":""},{"line_number":1859,"context_line":"    def test_user_update_with_two_options(self):"},{"line_number":1860,"context_line":"        request_to_validate \u003d {"},{"line_number":1861,"context_line":"            \u0027options\u0027: {"},{"line_number":1862,"context_line":"                ro.IGNORE_CHANGE_PASSWORD_OPT.option_name: True,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_a0a21bac","line":1859,"range":{"start_line":1859,"start_character":30,"end_line":1859,"end_character":33},"updated":"2017-01-30 14:51:58.000000000","message":"nit: \u0027multiple_options\u0027 as I\u0027m sure more are coming","commit_id":"9844fa1e264fe52276d9bd804b26b518ef3aaa24"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4aa37de5246e2dab03fbc37d1dec7af7881da8fc","unresolved":false,"context_lines":[{"line_number":1865,"context_line":"        }"},{"line_number":1866,"context_line":"        self.update_user_validator.validate(request_to_validate)"},{"line_number":1867,"context_line":""},{"line_number":1868,"context_line":"    def test_user_create_with_two_options(self):"},{"line_number":1869,"context_line":"        request_to_validate \u003d {"},{"line_number":1870,"context_line":"            \u0027name\u0027: self.user_name,"},{"line_number":1871,"context_line":"            \u0027options\u0027: {"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_00ae8f97","line":1868,"range":{"start_line":1868,"start_character":30,"end_line":1868,"end_character":33},"updated":"2017-01-30 14:51:58.000000000","message":"nit: same","commit_id":"9844fa1e264fe52276d9bd804b26b518ef3aaa24"}]}
