)]}'
{"keystone/common/sql/expand_repo/versions/013_user_mfa_table.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1275af96125ef5dc246f3dae49e46205bc6342e7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027, sql.Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), sql.ForeignKey(user_table.c.id,"},{"line_number":29,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, unique\u003dTrue),"},{"line_number":30,"context_line":"        sql.Column(\u0027rules\u0027, ks_sql.JsonBlob, nullable\u003dFalse),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_810be47c","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":61},"updated":"2017-01-10 01:37:11.000000000","message":"hmm, i don\u0027t remember the spec well enough, can you give me a refresher on what the rules were?","commit_id":"fc4c8a9916a64d57542d89a563f954d4dc2f68a4"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"28e929c8667a381d72b1c6b65efaf37302bdfa8b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027, sql.Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":28,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64), sql.ForeignKey(user_table.c.id,"},{"line_number":29,"context_line":"                   ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, unique\u003dTrue),"},{"line_number":30,"context_line":"        sql.Column(\u0027rules\u0027, ks_sql.JsonBlob, nullable\u003dFalse),"},{"line_number":31,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":32,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba5201f7_0be0bcf9","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":61},"in_reply_to":"ba5201f7_810be47c","updated":"2017-01-10 23:52:45.000000000","message":"Effectively a set of auth method combinations a user can auth with.\n\n\"required_auth_plugins\": [\n  [\"password\", \"totp\"],\n  [\"x509\"],\n  [\"password\", \"one-time-backup\"]\n]\n\nAs long as the used/authed methods matches one of those rules, a token is supplied.","commit_id":"fc4c8a9916a64d57542d89a563f954d4dc2f68a4"}],"keystone/identity/backends/resource_options.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b6e8925a035f77a7d8d43f8ce204b57736c73f9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            if element in string_set:"},{"line_number":47,"context_line":"                raise ValueError(msg)"},{"line_number":48,"context_line":"            sublist_set.add(element)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"USER_OPTIONS_REGISTRY \u003d resource_options.ResourceOptionRegistry(\u0027USER\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a461143_e8e981e7","line":49,"updated":"2017-01-29 18:40:14.000000000","message":"too many blank lines...","commit_id":"160032b048e937101aeb274da689d8cdbc6581a7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"64b12266cc561fed0404a1616be3e29ea62ce01d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            \u0027items\u0027: {"},{"line_number":79,"context_line":"                # Of Lists"},{"line_number":80,"context_line":"                \u0027type\u0027: \u0027array\u0027,"},{"line_number":81,"context_line":"                \u0027items\u0027: {"},{"line_number":82,"context_line":"                    # Of Strings, each string must be unique, minimum 1"},{"line_number":83,"context_line":"                    # element"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027minItems\u0027: 1,"},{"line_number":87,"context_line":"                \u0027uniqueItems\u0027: True"},{"line_number":88,"context_line":"            },"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a461143_487d35b0","line":85,"range":{"start_line":81,"start_character":16,"end_line":85,"end_character":18},"updated":"2017-01-29 20:45:40.000000000","message":"shouldn\u0027t this be minItems:2 ?","commit_id":"6722b2acae35555eff1836197a99fc99e85af779"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c56f946ad7387784a366729dcc4fe34dbb159d68","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            \u0027items\u0027: {"},{"line_number":79,"context_line":"                # Of Lists"},{"line_number":80,"context_line":"                \u0027type\u0027: \u0027array\u0027,"},{"line_number":81,"context_line":"                \u0027items\u0027: {"},{"line_number":82,"context_line":"                    # Of Strings, each string must be unique, minimum 1"},{"line_number":83,"context_line":"                    # element"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027minItems\u0027: 1,"},{"line_number":87,"context_line":"                \u0027uniqueItems\u0027: True"},{"line_number":88,"context_line":"            },"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a461143_482b7594","line":85,"range":{"start_line":81,"start_character":16,"end_line":85,"end_character":18},"in_reply_to":"3a461143_487d35b0","updated":"2017-01-29 20:57:26.000000000","message":"Nope, you can totally have 1 item, aka Token as a valid rule if you want. It may be something like.\n\n[[\"password\", \"totp\"], [\"token\"], [\"external\"], [\"mapped\"]]","commit_id":"6722b2acae35555eff1836197a99fc99e85af779"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"64b12266cc561fed0404a1616be3e29ea62ce01d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        option_id\u003d\u0027MFAR\u0027,"},{"line_number":73,"context_line":"        option_name\u003d\u0027multi_factor_auth_rules\u0027,"},{"line_number":74,"context_line":"        validator\u003d_mfa_rules_validator_list_of_lists_of_strings_no_duplicates,"},{"line_number":75,"context_line":"        json_schema_validation\u003d{"},{"line_number":76,"context_line":"            # List"},{"line_number":77,"context_line":"            \u0027type\u0027: \u0027array\u0027,"},{"line_number":78,"context_line":"            \u0027items\u0027: {"},{"line_number":79,"context_line":"                # Of Lists"},{"line_number":80,"context_line":"                \u0027type\u0027: \u0027array\u0027,"},{"line_number":81,"context_line":"                \u0027items\u0027: {"},{"line_number":82,"context_line":"                    # Of Strings, each string must be unique, minimum 1"},{"line_number":83,"context_line":"                    # element"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027minItems\u0027: 1,"},{"line_number":87,"context_line":"                \u0027uniqueItems\u0027: True"},{"line_number":88,"context_line":"            },"},{"line_number":89,"context_line":"            \u0027uniqueItems\u0027: True"},{"line_number":90,"context_line":"        }))"},{"line_number":91,"context_line":"MFA_ENABLED_OPT \u003d ("},{"line_number":92,"context_line":"    resource_options.ResourceOption("},{"line_number":93,"context_line":"        option_id\u003d\u0027MFAE\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a461143_684cb19e","line":90,"range":{"start_line":75,"start_character":8,"end_line":90,"end_character":9},"updated":"2017-01-29 20:45:40.000000000","message":"maybe pull this out so it looks cleaner? just a suggestion","commit_id":"6722b2acae35555eff1836197a99fc99e85af779"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c56f946ad7387784a366729dcc4fe34dbb159d68","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        option_id\u003d\u0027MFAR\u0027,"},{"line_number":73,"context_line":"        option_name\u003d\u0027multi_factor_auth_rules\u0027,"},{"line_number":74,"context_line":"        validator\u003d_mfa_rules_validator_list_of_lists_of_strings_no_duplicates,"},{"line_number":75,"context_line":"        json_schema_validation\u003d{"},{"line_number":76,"context_line":"            # List"},{"line_number":77,"context_line":"            \u0027type\u0027: \u0027array\u0027,"},{"line_number":78,"context_line":"            \u0027items\u0027: {"},{"line_number":79,"context_line":"                # Of Lists"},{"line_number":80,"context_line":"                \u0027type\u0027: \u0027array\u0027,"},{"line_number":81,"context_line":"                \u0027items\u0027: {"},{"line_number":82,"context_line":"                    # Of Strings, each string must be unique, minimum 1"},{"line_number":83,"context_line":"                    # element"},{"line_number":84,"context_line":"                    \u0027type\u0027: \u0027string\u0027,"},{"line_number":85,"context_line":"                },"},{"line_number":86,"context_line":"                \u0027minItems\u0027: 1,"},{"line_number":87,"context_line":"                \u0027uniqueItems\u0027: True"},{"line_number":88,"context_line":"            },"},{"line_number":89,"context_line":"            \u0027uniqueItems\u0027: True"},{"line_number":90,"context_line":"        }))"},{"line_number":91,"context_line":"MFA_ENABLED_OPT \u003d ("},{"line_number":92,"context_line":"    resource_options.ResourceOption("},{"line_number":93,"context_line":"        option_id\u003d\u0027MFAE\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a461143_881f1d6b","line":90,"range":{"start_line":75,"start_character":8,"end_line":90,"end_character":9},"in_reply_to":"3a461143_684cb19e","updated":"2017-01-29 20:57:26.000000000","message":"explain?","commit_id":"6722b2acae35555eff1836197a99fc99e85af779"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4328107dda409cf25d2777e1b63dae4f96b72303","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # e.g. [[\u0027str1\u0027, \u0027str2\u0027], [\u0027str3\u0027, \u0027str4\u0027]]"},{"line_number":26,"context_line":"    # No sub-list may be empty. Duplication of sub-lists and duplication of"},{"line_number":27,"context_line":"    # string elements are not permitted."},{"line_number":28,"context_line":"    msg \u003d _(\u0027Invalid data type, must be a list of lists comprised of strings. \u0027"},{"line_number":29,"context_line":"            \u0027Sub-lists may not be duplicated. Strings in sub-lists may not be \u0027"},{"line_number":30,"context_line":"            \u0027duplicated.\u0027)"},{"line_number":31,"context_line":"    if not isinstance(value, list):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_20fb8bc2","line":28,"updated":"2017-01-30 14:54:30.000000000","message":"\"list of lists of strings\" can be a little confusing to read, but I\u0027m not sure how else to word this yet.","commit_id":"ab9237f2c378eb2cf51b492ca9528327fa48b0b6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"255fff5f6553ac46d212625438bea8885e505759","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    # e.g. [[\u0027str1\u0027, \u0027str2\u0027], [\u0027str3\u0027, \u0027str4\u0027]]"},{"line_number":26,"context_line":"    # No sub-list may be empty. Duplication of sub-lists and duplication of"},{"line_number":27,"context_line":"    # string elements are not permitted."},{"line_number":28,"context_line":"    msg \u003d _(\u0027Invalid data type, must be a list of lists comprised of strings. \u0027"},{"line_number":29,"context_line":"            \u0027Sub-lists may not be duplicated. Strings in sub-lists may not be \u0027"},{"line_number":30,"context_line":"            \u0027duplicated.\u0027)"},{"line_number":31,"context_line":"    if not isinstance(value, list):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_fbfe8dac","line":28,"in_reply_to":"3a461143_20fb8bc2","updated":"2017-01-30 17:44:16.000000000","message":"FWIW, this should never be hit except by developers. This is also validated at the API layer in schema. The only reason you\u0027d hit this is if you were submitting a rule list that didn\u0027t go through the schema validator.","commit_id":"ab9237f2c378eb2cf51b492ca9528327fa48b0b6"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4328107dda409cf25d2777e1b63dae4f96b72303","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # string elements are not permitted."},{"line_number":28,"context_line":"    msg \u003d _(\u0027Invalid data type, must be a list of lists comprised of strings. \u0027"},{"line_number":29,"context_line":"            \u0027Sub-lists may not be duplicated. Strings in sub-lists may not be \u0027"},{"line_number":30,"context_line":"            \u0027duplicated.\u0027)"},{"line_number":31,"context_line":"    if not isinstance(value, list):"},{"line_number":32,"context_line":"        raise TypeError(msg)"},{"line_number":33,"context_line":"    sublist_set \u003d set()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_80b99f17","line":30,"updated":"2017-01-30 14:54:30.000000000","message":"We will have to double check on this now that we are in a hard string freeze.","commit_id":"ab9237f2c378eb2cf51b492ca9528327fa48b0b6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"255fff5f6553ac46d212625438bea8885e505759","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # string elements are not permitted."},{"line_number":28,"context_line":"    msg \u003d _(\u0027Invalid data type, must be a list of lists comprised of strings. \u0027"},{"line_number":29,"context_line":"            \u0027Sub-lists may not be duplicated. Strings in sub-lists may not be \u0027"},{"line_number":30,"context_line":"            \u0027duplicated.\u0027)"},{"line_number":31,"context_line":"    if not isinstance(value, list):"},{"line_number":32,"context_line":"        raise TypeError(msg)"},{"line_number":33,"context_line":"    sublist_set \u003d set()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_3b33b5ac","line":30,"in_reply_to":"3a461143_18eb5f14","updated":"2017-01-30 17:44:16.000000000","message":"What steve said.","commit_id":"ab9237f2c378eb2cf51b492ca9528327fa48b0b6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"defdb82cbf017ccbca85df8d5936ece12d32e656","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # string elements are not permitted."},{"line_number":28,"context_line":"    msg \u003d _(\u0027Invalid data type, must be a list of lists comprised of strings. \u0027"},{"line_number":29,"context_line":"            \u0027Sub-lists may not be duplicated. Strings in sub-lists may not be \u0027"},{"line_number":30,"context_line":"            \u0027duplicated.\u0027)"},{"line_number":31,"context_line":"    if not isinstance(value, list):"},{"line_number":32,"context_line":"        raise TypeError(msg)"},{"line_number":33,"context_line":"    sublist_set \u003d set()"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a461143_18eb5f14","line":30,"in_reply_to":"3a461143_80b99f17","updated":"2017-01-30 17:17:22.000000000","message":"hard string freeze is only enacted when rc1 is tagged\n\nhttps://releases.openstack.org/ocata/schedule.html#o-hard-sf","commit_id":"ab9237f2c378eb2cf51b492ca9528327fa48b0b6"}],"keystone/identity/backends/sql_model.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f2b7ef1ced3d94307e426bd7da89145188820f30","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    __tablename__ \u003d \u0027user\u0027"},{"line_number":30,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":31,"context_line":"                  \u0027default_project_id\u0027, \u0027password_expires_at\u0027]"},{"line_number":32,"context_line":"    readonly_attributes \u003d [\u0027id\u0027, \u0027password_expires_at\u0027, \u0027mfa_rules\u0027,"},{"line_number":33,"context_line":"                           \u0027mfa_rules_enabled\u0027]"},{"line_number":34,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":35,"context_line":"    _enabled \u003d sql.Column(\u0027enabled\u0027, sql.Boolean)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a3905b3_2b47084c","line":32,"updated":"2017-01-22 04:00:55.000000000","message":"OOPs! this should be on \"attributes\" not \"read-only\"","commit_id":"10d9876d9a5cb1c491613c5ac17df78870d4c1fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"67377ad30f50ded64bf642d75eea2e7b4f82483d","unresolved":false,"context_lines":[{"line_number":361,"context_line":"    id \u003d sql.Column(sql.Integer, primary_key\u003dTrue)"},{"line_number":362,"context_line":"    user_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027user.id\u0027,"},{"line_number":363,"context_line":"                         ondelete\u003d\u0027CASCADE\u0027), nullable\u003dFalse, unique\u003dTrue)"},{"line_number":364,"context_line":"    rules \u003d sql.Column(sql.JsonBlob())"},{"line_number":365,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse, default\u003dTrue,"},{"line_number":366,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_627ac989","line":364,"range":{"start_line":364,"start_character":4,"end_line":364,"end_character":38},"updated":"2017-01-24 04:25:22.000000000","message":"add nullable\u003dFalse to match the schema","commit_id":"6a409c4cee7175e883edb9a353ae4d5af3c6ad83"}],"keystone/tests/unit/identity/backends/test_base.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"67377ad30f50ded64bf642d75eea2e7b4f82483d","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":113,"context_line":"            \u0027default_project_id\u0027: uuid.uuid4().hex,"},{"line_number":114,"context_line":"            \u0027password_expires_at\u0027: None,"},{"line_number":115,"context_line":"            \u0027mfa_rules\u0027: [],"},{"line_number":116,"context_line":"            \u0027mfa_rules_enabled\u0027: True"},{"line_number":117,"context_line":"        }"},{"line_number":118,"context_line":"        if self.driver.is_domain_aware():"},{"line_number":119,"context_line":"            user[\u0027domain_id\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_02b9052e","line":116,"range":{"start_line":115,"start_character":12,"end_line":116,"end_character":37},"updated":"2017-01-24 04:25:22.000000000","message":"these attributes will now be printed on user show and user list, i know they are additive, but it wasn\u0027t clear to me in the spec that they would be added, just confirming that this is something we want to do and not pop these attributes","commit_id":"6a409c4cee7175e883edb9a353ae4d5af3c6ad83"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"ddd74b1ee0aeb173ced5e5214acc4708a3f34cf7","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":113,"context_line":"            \u0027default_project_id\u0027: uuid.uuid4().hex,"},{"line_number":114,"context_line":"            \u0027password_expires_at\u0027: None,"},{"line_number":115,"context_line":"            \u0027mfa_rules\u0027: [],"},{"line_number":116,"context_line":"            \u0027mfa_rules_enabled\u0027: True"},{"line_number":117,"context_line":"        }"},{"line_number":118,"context_line":"        if self.driver.is_domain_aware():"},{"line_number":119,"context_line":"            user[\u0027domain_id\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_c544674b","line":116,"range":{"start_line":115,"start_character":12,"end_line":116,"end_character":37},"in_reply_to":"5a3905b3_02b9052e","updated":"2017-01-24 05:04:08.000000000","message":"I think having them as part of show and list is a good thing.\n\nHaving them allows much easier auditing, rather than needing to check each user separately after a user list.\n\nIf you have admin, you can get at them anyway, and if you are looking at your own user, nothing wrong with seeing your own rules.","commit_id":"6a409c4cee7175e883edb9a353ae4d5af3c6ad83"}],"keystone/tests/unit/test_backend_ldap.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"67377ad30f50ded64bf642d75eea2e7b4f82483d","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        self.load_backends()"},{"line_number":323,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # Add in the mfa_rules and mfa_rules_enabled values for user_sna"},{"line_number":326,"context_line":"        # Until LDAP writes are no longer part of Keysgtone tests this is a"},{"line_number":327,"context_line":"        # work-around for LDAP tests that deal with user_ref matching. LDAP"},{"line_number":328,"context_line":"        # does not store the mfa_rules or mfa_rules_enabled attributes"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_62880972","line":325,"range":{"start_line":325,"start_character":64,"end_line":325,"end_character":72},"updated":"2017-01-24 04:25:22.000000000","message":"?","commit_id":"6a409c4cee7175e883edb9a353ae4d5af3c6ad83"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"67377ad30f50ded64bf642d75eea2e7b4f82483d","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"        # Add in the mfa_rules and mfa_rules_enabled values for user_sna"},{"line_number":326,"context_line":"        # Until LDAP writes are no longer part of Keysgtone tests this is a"},{"line_number":327,"context_line":"        # work-around for LDAP tests that deal with user_ref matching. LDAP"},{"line_number":328,"context_line":"        # does not store the mfa_rules or mfa_rules_enabled attributes"},{"line_number":329,"context_line":"        # directly."}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_827b357a","line":326,"range":{"start_line":326,"start_character":50,"end_line":326,"end_character":59},"updated":"2017-01-24 04:25:22.000000000","message":"keystone*","commit_id":"6a409c4cee7175e883edb9a353ae4d5af3c6ad83"}]}
