)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"98ca0086baa258256cfa6846dcf7eb6e8d1c9583","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Modify the FederationProtocolModel class and add the"},{"line_number":10,"context_line":"remote_id_atributte to the federation_protocol table."},{"line_number":11,"context_line":"And add the respective migration files."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9802c8a5c187bae16de89893ca8639b01cd7cb1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9fdfeff1_286691ee","line":12,"updated":"2019-02-17 11:54:17.000000000","message":"Could you add \"Partial-bug: #1724645\" so that it gets linked to the bug?","commit_id":"2fbf6dd03d6c23f23bb34fc251dc520895a4c519"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3aca08ecf91f884ee3af616233326799e0866db1","unresolved":false,"context_lines":[{"line_number":12,"context_line":"also modify the schema to expect a remote_it_attribute"},{"line_number":13,"context_line":"property."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Partial-bug: #1724645"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I9802c8a5c187bae16de89893ca8639b01cd7cb1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"5fc1f717_4dca2c1b","line":15,"updated":"2019-03-15 10:13:47.000000000","message":"Since all the work is happening in one patch instead of being split apart, this can be \"Closes-bug\" instead of \"Partial-bug\"","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9a6a1950b6745abc5751bfdf686613cbcc5106c1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Modify the FederationProtocolModel class and add the"},{"line_number":10,"context_line":"remote_id_atributte to the federation_protocol table."},{"line_number":11,"context_line":"Add the respective migration and tests files. And"},{"line_number":12,"context_line":"also modify the schema to expect a remote_it_attribute"},{"line_number":13,"context_line":"property."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-bug: #1724645"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7faddb67_07ec148d","line":12,"range":{"start_line":12,"start_character":35,"end_line":12,"end_character":54},"updated":"2019-07-17 06:43:45.000000000","message":"remote_id_attribute","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0bf6cff2f2d8a5bc26c1da14c5dbe3b657abdf57","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Modify the FederationProtocolModel class and add the"},{"line_number":10,"context_line":"remote_id_atributte to the federation_protocol table."},{"line_number":11,"context_line":"Add the respective migration and tests files. And"},{"line_number":12,"context_line":"also modify the schema to expect a remote_it_attribute"},{"line_number":13,"context_line":"property."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Closes-bug: #1724645"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7faddb67_ea0bb426","line":12,"range":{"start_line":12,"start_character":35,"end_line":12,"end_character":54},"in_reply_to":"7faddb67_07ec148d","updated":"2019-07-17 17:50:19.000000000","message":"Done","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"}],"keystone/api/auth.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9a6a1950b6745abc5751bfdf686613cbcc5106c1","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            remote_id_name \u003d federation_utils.get_remote_id_parameter("},{"line_number":340,"context_line":"                idp, protocol_id)"},{"line_number":341,"context_line":"            remote_id \u003d flask.request.environ.get(remote_id_name)"},{"line_number":342,"context_line":"            if remote_id:"},{"line_number":343,"context_line":"                break"},{"line_number":344,"context_line":"        if not remote_id:"},{"line_number":345,"context_line":"            msg \u003d \u0027Missing entity ID from environment\u0027"},{"line_number":346,"context_line":"            tr_msg \u003d _(\u0027Missing entity ID from environment\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_d23c7c30","line":343,"range":{"start_line":342,"start_character":12,"end_line":343,"end_character":21},"updated":"2019-07-17 06:43:45.000000000","message":"IIUC we are iterating over the idps list and the when we get the very first remote_id we are breaking the loop.The remote_id will be same for all the idps? some idp may contain and some not?","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"96d481aa65ad4077dc8a8eaf10b713022c08ffdb","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            remote_id_name \u003d federation_utils.get_remote_id_parameter("},{"line_number":340,"context_line":"                idp, protocol_id)"},{"line_number":341,"context_line":"            remote_id \u003d flask.request.environ.get(remote_id_name)"},{"line_number":342,"context_line":"            if remote_id:"},{"line_number":343,"context_line":"                break"},{"line_number":344,"context_line":"        if not remote_id:"},{"line_number":345,"context_line":"            msg \u003d \u0027Missing entity ID from environment\u0027"},{"line_number":346,"context_line":"            tr_msg \u003d _(\u0027Missing entity ID from environment\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_e164324c","line":343,"range":{"start_line":342,"start_character":12,"end_line":343,"end_character":21},"in_reply_to":"7faddb67_2a16ac56","updated":"2019-07-18 05:59:18.000000000","message":"thanks for clarifying","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0bf6cff2f2d8a5bc26c1da14c5dbe3b657abdf57","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            remote_id_name \u003d federation_utils.get_remote_id_parameter("},{"line_number":340,"context_line":"                idp, protocol_id)"},{"line_number":341,"context_line":"            remote_id \u003d flask.request.environ.get(remote_id_name)"},{"line_number":342,"context_line":"            if remote_id:"},{"line_number":343,"context_line":"                break"},{"line_number":344,"context_line":"        if not remote_id:"},{"line_number":345,"context_line":"            msg \u003d \u0027Missing entity ID from environment\u0027"},{"line_number":346,"context_line":"            tr_msg \u003d _(\u0027Missing entity ID from environment\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_2a16ac56","line":343,"range":{"start_line":342,"start_character":12,"end_line":343,"end_character":21},"in_reply_to":"7faddb67_d23c7c30","updated":"2019-07-17 17:50:19.000000000","message":"If the remote id attribute key is present in the flask environment, that is good enough to break here. There will only be one remote ID in the flask environment. We still use the remote ID we found in the flask environment to make sure we get to the right idp on line 351.","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"}],"keystone/common/sql/contract_repo/versions/056_contract_add__remote_id_attribute_to_federation_protocol_table.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3aca08ecf91f884ee3af616233326799e0866db1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5fc1f717_cd793cc8","side":"PARENT","updated":"2019-03-15 10:13:47.000000000","message":"You should remove this file and all the other 056 files from this change. We merged https://review.openstack.org/631936 which is why the migration version needed to be bumped again.","commit_id":"9d366a528ba03408d80f57e3e08bbb7e3240a8f6"}],"keystone/common/sql/expand_repo/versions/057_expand_add__remote_id_attribute_to_federation_protocol_table.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"927fe0ee31ab21ecfeeaae8c6f10b65188b23952","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    federation_protocol_table \u003d sql.Table(\u0027federation_protocol\u0027, meta, autoload\u003dTrue)"},{"line_number":21,"context_line":"    remote_id_attribute \u003d sql.Column(\u0027remote_id_attribute\u0027, sql.String(64))"},{"line_number":22,"context_line":"    federation_protocol_table.create_column(remote_id_attribute)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_b4fc4170","line":22,"range":{"start_line":22,"start_character":44,"end_line":22,"end_character":63},"updated":"2019-03-15 06:49:56.000000000","message":"Could we just use \"remote_id\" instead of remote_id_attribute as every parameter is a attribute for a db table.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"4a2c29c9cbebd91d7bb2db2a7fc04267ad5c36ad","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    federation_protocol_table \u003d sql.Table(\u0027federation_protocol\u0027, meta, autoload\u003dTrue)"},{"line_number":21,"context_line":"    remote_id_attribute \u003d sql.Column(\u0027remote_id_attribute\u0027, sql.String(64))"},{"line_number":22,"context_line":"    federation_protocol_table.create_column(remote_id_attribute)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3fce034c_0a13375e","line":22,"range":{"start_line":22,"start_character":44,"end_line":22,"end_character":63},"in_reply_to":"5fc1f717_927fd5a9","updated":"2019-04-15 09:59:32.000000000","message":"Thanks cmurphy got it.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"1076aec4be19555d9da079024e3ee2337e57fc16","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    federation_protocol_table \u003d sql.Table(\u0027federation_protocol\u0027, meta, autoload\u003dTrue)"},{"line_number":21,"context_line":"    remote_id_attribute \u003d sql.Column(\u0027remote_id_attribute\u0027, sql.String(64))"},{"line_number":22,"context_line":"    federation_protocol_table.create_column(remote_id_attribute)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_927fd5a9","line":22,"range":{"start_line":22,"start_character":44,"end_line":22,"end_character":63},"in_reply_to":"5fc1f717_b4fc4170","updated":"2019-03-15 09:19:04.000000000","message":"No, it would not be correct to call it \u0027remote_id\u0027. \u0027remote_id\u0027 would refer to the IdP\u0027s entity ID, like \u0027https://samltest.id/idp\u0027. \u0027remote_id_attribute\u0027 is not that, rather it\u0027s the Apache header that is set by the SP module that indicates where keystone should *look for* the remote ID, for example \u0027Shib-Identity-Provider\u0027 or \u0027MELLON_IDP\u0027. \u0027remote_id_attribute\u0027 also mirrors the keystone.conf option that this is replacing.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"}],"keystone/federation/backends/sql.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"5e5708db6f5a2f4acc1b1c1980752b1814a529b8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class FederationProtocolModel(sql.ModelBase, sql.ModelDictMixin):"},{"line_number":30,"context_line":"    __tablename__ \u003d \u0027federation_protocol\u0027"},{"line_number":31,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027idp_id\u0027, \u0027mapping_id\u0027, \u0027remote_id_attribute\u0027]"},{"line_number":32,"context_line":"    mutable_attributes \u003d frozenset([\u0027mapping_id\u0027])"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":35,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5fc1f717_be20a5b1","line":32,"updated":"2019-04-09 18:00:39.000000000","message":"You need to add \u0027remote_id_attribute\u0027 to this list as well, since it should also be mutable/changeable, this will ensure the protocol can be updated after creation.","commit_id":"5a2a3144c0b3de5186fc2ab2d5a4978cdaa8359a"}],"keystone/federation/utils.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3aca08ecf91f884ee3af616233326799e0866db1","unresolved":false,"context_lines":[{"line_number":282,"context_line":"    # NOTE(marco-fargetta): Since we support any protocol ID, we attempt to"},{"line_number":283,"context_line":"    # retrieve the remote_id_attribute of the protocol ID. If it\u0027s not"},{"line_number":284,"context_line":"    # registered in the config, then register the option and try again."},{"line_number":285,"context_line":"    # This allows the user to register protocols other than oidc and saml2."},{"line_number":286,"context_line":"    protocol_ref \u003d PROVIDERS.federation_api.get_protocol(idp[\u0027id\u0027], protocol)"},{"line_number":287,"context_line":"    remote_id_parameter \u003d protocol_ref.get(\u0027remote_id_attribute\u0027)"},{"line_number":288,"context_line":"    if remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_cd6ffc28","line":285,"updated":"2019-03-15 10:13:47.000000000","message":"This comment only applies to the part after this step where the attribute is retrieved from CONF, so I would either move it down or update the comment to reflect what\u0027s happening now.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"3aca08ecf91f884ee3af616233326799e0866db1","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"def validate_idp(idp, protocol, assertion):"},{"line_number":312,"context_line":"    \"\"\"The IdP providing the assertion should be registered for the mapping.\"\"\""},{"line_number":313,"context_line":"    remote_id_parameter \u003d get_remote_id_parameter(protocol)"},{"line_number":314,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"},{"line_number":315,"context_line":"        LOG.debug(\u0027Impossible to identify the IdP %s \u0027, idp[\u0027id\u0027])"},{"line_number":316,"context_line":"        # If nothing is defined, the administrator may want to"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_ad4950b7","line":313,"updated":"2019-03-15 10:13:47.000000000","message":"The function call needs to be updated to pass the idp to get_remote_id_parameter.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"86aba715df6bdd452eaf3391a10e70d79f3ecae9","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        raise exception.Unauthorized(_(\u0027Federation token is expired\u0027))"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"def get_remote_id_parameter(protocol):"},{"line_number":281,"context_line":"    # NOTE(marco-fargetta): Since we support any protocol ID, we attempt to"},{"line_number":282,"context_line":"    # retrieve the remote_id_attribute of the protocol ID. If it\u0027s not"},{"line_number":283,"context_line":"    # registered in the config, then register the option and try again."}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_27623d0b","line":280,"updated":"2019-03-18 13:35:55.000000000","message":"I think you accidentally undid your work on this file?","commit_id":"ac4a5cc86258f99aabf9f796e31849202b3e1a37"}],"keystone/tests/unit/federation/test_core.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9a6a1950b6745abc5751bfdf686613cbcc5106c1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_create_protocol(self):"},{"line_number":46,"context_line":"        protocol \u003d {"},{"line_number":47,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":48,"context_line":"            \u0027mapping_id\u0027: self.mapping[\u0027id\u0027],"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":"        protocol_ret \u003d PROVIDERS.federation_api.create_protocol("},{"line_number":51,"context_line":"            self.idp[\u0027id\u0027], protocol[\u0027id\u0027], protocol"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_f2b418f4","line":48,"range":{"start_line":48,"start_character":44,"end_line":48,"end_character":45},"updated":"2019-07-17 06:43:45.000000000","message":"Unrelated change? Can we do this into another patch updating others too such as L58.","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"0bf6cff2f2d8a5bc26c1da14c5dbe3b657abdf57","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def test_create_protocol(self):"},{"line_number":46,"context_line":"        protocol \u003d {"},{"line_number":47,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":48,"context_line":"            \u0027mapping_id\u0027: self.mapping[\u0027id\u0027],"},{"line_number":49,"context_line":"        }"},{"line_number":50,"context_line":"        protocol_ret \u003d PROVIDERS.federation_api.create_protocol("},{"line_number":51,"context_line":"            self.idp[\u0027id\u0027], protocol[\u0027id\u0027], protocol"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_6c15a13f","line":48,"range":{"start_line":48,"start_character":44,"end_line":48,"end_character":45},"in_reply_to":"7faddb67_f2b418f4","updated":"2019-07-17 17:50:19.000000000","message":"Done","commit_id":"ce40ab24ed4d772454e9e8e43789e5c3fc38752d"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"61b55f98a006a94390022fbee4993ece25cdfb7a","unresolved":false,"context_lines":[{"line_number":3253,"context_line":"            \u0027mapping_id\u0027: uuid.uuid4().hex,"},{"line_number":3254,"context_line":"            \u0027remote_id_attribute\u0027: uuid.uuid4().hex"},{"line_number":3255,"context_line":"        }"},{"line_number":3256,"context_line":"        federation_protocol_table.insert().values(federation_protocol).execute()"},{"line_number":3257,"context_line":""},{"line_number":3258,"context_line":"        federation_protocol_without_remote_id_attribute \u003d {"},{"line_number":3259,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_5e48302d","line":3256,"updated":"2019-02-20 10:07:33.000000000","message":"The lower-constraints unit tests are failing because the foreign keys in the federation_protocol table require some values to exist in the identity_provider and mapping tables first. You could create those values first but I would be okay with just omitting these table inserts from the test, I don\u0027t find them that important since the new attribute is just a string column and not a special key.","commit_id":"bd08cce4702b6ff31d3ad587d4a5dc43e7da5cad"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"eeadfb4b746caf3c2a10c89708d27ac038086c60","unresolved":false,"context_lines":[{"line_number":3243,"context_line":"            [\u0027id\u0027, \u0027idp_id\u0027, \u0027mapping_id\u0027, \u0027remote_id_attribute\u0027]"},{"line_number":3244,"context_line":"        )"},{"line_number":3245,"context_line":""},{"line_number":3246,"context_line":"        federation_protocol_table \u003d sqlalchemy.Table("},{"line_number":3247,"context_line":"            federation_protocol_table_name, self.metadata, autoload\u003dTrue"},{"line_number":3248,"context_line":"        )"},{"line_number":3249,"context_line":""},{"line_number":3250,"context_line":""},{"line_number":3251,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_4364aa49","line":3248,"range":{"start_line":3246,"start_character":8,"end_line":3248,"end_character":9},"updated":"2019-02-22 12:11:52.000000000","message":"The pep8 job is failing because you\u0027re not using this variable. Since we\u0027re not testing the ability to insert a row any more, you can just remove this. You can run the pep8 jobs before submitting changes with `tox -epep8`.","commit_id":"0752e443356e003a6c87c13a764be785ca6c146c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"86aba715df6bdd452eaf3391a10e70d79f3ecae9","unresolved":false,"context_lines":[{"line_number":3291,"context_line":""},{"line_number":3292,"context_line":"        self.expand(57)"},{"line_number":3293,"context_line":"        self.migrate(57)"},{"line_number":3294,"context_line":"        self.contract(57)"},{"line_number":3295,"context_line":""},{"line_number":3296,"context_line":"        self.assertTableColumns("},{"line_number":3297,"context_line":"            federation_protocol_table_name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_676b65f0","line":3294,"updated":"2019-03-18 13:35:55.000000000","message":"You should add back these migration steps so it\u0027s clear this is updated to version 57.","commit_id":"2aaa5071a97ef5a7049ed21013d2b72b8567a536"}]}
