)]}'
{"keystone/identity/backends/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cfd95374b6a71394b76c681d4f0d5cbbd6cfbae7","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    \"\"\""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    driver_type \u003d None"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _get_conf(self):"},{"line_number":143,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_3e08e026","line":140,"range":{"start_line":140,"start_character":4,"end_line":140,"end_character":15},"updated":"2017-12-28 16:21:26.000000000","message":"This will certainly need a release note, especially is people are maintaining their own identity backends and we\u0027re relying on this property in the manager layer.","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"}],"keystone/identity/core.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ac73fbceaf891fd9fd999e7b98ec0c81a033103","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"                fed_hints)"},{"line_number":1039,"context_line":"            for fed_re in fed_res:"},{"line_number":1040,"context_line":"                res.append(fed_re)"},{"line_number":1041,"context_line":"        return res"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    @domains_configured"},{"line_number":1044,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_d672a749","line":1041,"updated":"2017-12-27 09:26:55.000000000","message":"Listing users by name in the ldap backend already worked, so I\u0027m unclear why this needed to be changed?","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"272545f4c3da7c9c57efe883656a53f9c7fa8855","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"                fed_hints)"},{"line_number":1039,"context_line":"            for fed_re in fed_res:"},{"line_number":1040,"context_line":"                res.append(fed_re)"},{"line_number":1041,"context_line":"        return res"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    @domains_configured"},{"line_number":1044,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_42eb94af","line":1041,"in_reply_to":"bf8cb3f7_d672a749","updated":"2017-12-28 03:20:44.000000000","message":"ldap backend doesn\u0027t store shadow users, shadow users\u0027 backend is sql. So when filter users with federated user name (which is \"display_name\" exactly), we should query it from sql, not ldap.","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"87f2750d0557caa7606a5d576b1a63d9e73c5196","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"                name \u003d filter_[\u0027value\u0027]"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"        if is_federated_filter:"},{"line_number":1040,"context_line":"            return PROVIDERS.shadow_users_api.get_federated_users(hints)"},{"line_number":1041,"context_line":""},{"line_number":1042,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1043,"context_line":"        # Note: If the backend is ldap and the filters contain \u0027name\u0027, we"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_b9dd8143","line":1040,"updated":"2018-01-05 16:32:30.000000000","message":"This breaks if the user filters by both name and e.g. idp_id","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"99e74001326b0dd5934cac1805ebd0138426519d","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"                name \u003d filter_[\u0027value\u0027]"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"        if is_federated_filter:"},{"line_number":1040,"context_line":"            return PROVIDERS.shadow_users_api.get_federated_users(hints)"},{"line_number":1041,"context_line":""},{"line_number":1042,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1043,"context_line":"        # Note: If the backend is ldap and the filters contain \u0027name\u0027, we"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_11354f8f","line":1040,"in_reply_to":"9f91af0f_b9dd8143","updated":"2018-01-08 02:02:27.000000000","message":"If use your code in shadow_backends/sql, it\u0027ll be solved.","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"87f2750d0557caa7606a5d576b1a63d9e73c5196","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1043,"context_line":"        # Note: If the backend is ldap and the filters contain \u0027name\u0027, we"},{"line_number":1044,"context_line":"        # should get the user from both ldap and shadow user backend."},{"line_number":1045,"context_line":"        if driver.driver_type \u003d\u003d \u0027ldap\u0027 and is_name_filter:"},{"line_number":1046,"context_line":"            fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users_by_name("},{"line_number":1047,"context_line":"                name)"},{"line_number":1048,"context_line":"            for fed_re in fed_res:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_b90ee18a","line":1045,"updated":"2018-01-05 16:32:30.000000000","message":"There shouldn\u0027t be any reason the ldap driver needs to be special","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"519c7f13e5b321598095328f19da06b56a87ea8c","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1043,"context_line":"        # Note: If the backend is ldap and the filters contain \u0027name\u0027, we"},{"line_number":1044,"context_line":"        # should get the user from both ldap and shadow user backend."},{"line_number":1045,"context_line":"        if driver.driver_type \u003d\u003d \u0027ldap\u0027 and is_name_filter:"},{"line_number":1046,"context_line":"            fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users_by_name("},{"line_number":1047,"context_line":"                name)"},{"line_number":1048,"context_line":"            for fed_re in fed_res:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_11678fbf","line":1045,"in_reply_to":"9f91af0f_b90ee18a","updated":"2018-01-08 01:51:59.000000000","message":"If the filter only contains \"name\", PROVIDERS.shadow_users_api.get_federated_users(hints) will not be called.\n\nSo if use ldap backend and only \"name\" filter,what will happen?","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"87f2750d0557caa7606a5d576b1a63d9e73c5196","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"                name)"},{"line_number":1048,"context_line":"            for fed_re in fed_res:"},{"line_number":1049,"context_line":"                res.append(fed_re)"},{"line_number":1050,"context_line":"        return res"},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"    @domains_configured"},{"line_number":1053,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_59e0f596","line":1050,"updated":"2018-01-05 16:32:30.000000000","message":"I don\u0027t think any of the changes in this file are needed, I am able to get this to work just fine for sql, ldap, and federated users without this manager change.","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"528fb04952aba69c22bff5e18d3dff27fdf598a4","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for filter_ in hints.filters:"},{"line_number":1032,"context_line":"            if filter_[\u0027name\u0027] in federated_attributes:"},{"line_number":1033,"context_line":"                return PROVIDERS.shadow_users_api.get_federated_users(hints)"},{"line_number":1034,"context_line":"        fed_hints \u003d copy.deepcopy(hints)"},{"line_number":1035,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"        # Note: If the filters contain \u0027name\u0027, we should get the user from both"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f93b717_6b331b15","line":1034,"range":{"start_line":1034,"start_character":8,"end_line":1034,"end_character":40},"updated":"2018-02-02 18:04:59.000000000","message":"Is there a reason this is being deep copied? I don\u0027t see the copy being acted on other than get()?","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c649011141e8dfd3baf4360bdb6766ae31473dfd","unresolved":false,"context_lines":[{"line_number":1031,"context_line":"        for filter_ in hints.filters:"},{"line_number":1032,"context_line":"            if filter_[\u0027name\u0027] in federated_attributes:"},{"line_number":1033,"context_line":"                return PROVIDERS.shadow_users_api.get_federated_users(hints)"},{"line_number":1034,"context_line":"        fed_hints \u003d copy.deepcopy(hints)"},{"line_number":1035,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"        # Note: If the filters contain \u0027name\u0027, we should get the user from both"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f93b717_6ad78c4c","line":1034,"range":{"start_line":1034,"start_character":8,"end_line":1034,"end_character":40},"in_reply_to":"5f93b717_6b331b15","updated":"2018-02-03 07:43:20.000000000","message":"because L1035 \"driver.list_users(hints)\" will remove the filters in the hints. So I deepcopy hints here to reuse at L1042","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"528fb04952aba69c22bff5e18d3dff27fdf598a4","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        fed_res \u003d []"},{"line_number":1040,"context_line":"        for filter_ in fed_hints.filters:"},{"line_number":1041,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027name\u0027:"},{"line_number":1042,"context_line":"                fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users("},{"line_number":1043,"context_line":"                    fed_hints)"},{"line_number":1044,"context_line":"                break"},{"line_number":1045,"context_line":"        for fed_re in fed_res:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f93b717_11108a4d","line":1042,"range":{"start_line":1042,"start_character":16,"end_line":1042,"end_character":25},"updated":"2018-02-02 18:04:59.000000000","message":"We could change this to be:\n\nres +\u003d\n\nthen get rid of the for loop below that is copying the users to res since it can be done here.","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c649011141e8dfd3baf4360bdb6766ae31473dfd","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"        fed_res \u003d []"},{"line_number":1040,"context_line":"        for filter_ in fed_hints.filters:"},{"line_number":1041,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027name\u0027:"},{"line_number":1042,"context_line":"                fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users("},{"line_number":1043,"context_line":"                    fed_hints)"},{"line_number":1044,"context_line":"                break"},{"line_number":1045,"context_line":"        for fed_re in fed_res:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f93b717_4a3970a1","line":1042,"range":{"start_line":1042,"start_character":16,"end_line":1042,"end_character":25},"in_reply_to":"5f93b717_11108a4d","updated":"2018-02-03 07:43:20.000000000","message":"sure. It\u0027s better.","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"60b6429430108eea78d80a144131184d28eff625","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"        # Note: If the filters contain \u0027name\u0027, we should get the user from both"},{"line_number":1038,"context_line":"        # local user and shadow user backend."},{"line_number":1039,"context_line":"        for filter_ in fed_hints.filters:"},{"line_number":1040,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027name\u0027:"},{"line_number":1041,"context_line":"                fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users("}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa0c359_f25917fe","line":1038,"updated":"2018-02-06 20:53:49.000000000","message":"Why should this just be for name? It should probably always look in both tables I think? Unless this is about performance?","commit_id":"e7a4d43ece44ee0187bb7ab02e0604b5ae2a592b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"95a9f13f03d84ef8bf52855563e81ac0efdd987c","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        res \u003d driver.list_users(hints)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"        # Note: If the filters contain \u0027name\u0027, we should get the user from both"},{"line_number":1038,"context_line":"        # local user and shadow user backend."},{"line_number":1039,"context_line":"        for filter_ in fed_hints.filters:"},{"line_number":1040,"context_line":"            if filter_[\u0027name\u0027] \u003d\u003d \u0027name\u0027:"},{"line_number":1041,"context_line":"                fed_res \u003d PROVIDERS.shadow_users_api.get_federated_users("}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa0c359_54cc6960","line":1038,"in_reply_to":"3fa0c359_f25917fe","updated":"2018-02-07 09:39:26.000000000","message":"Because only \"name\" is stored in both local user backend and shadow user backend.\nFor example, if the filter is \"enabled\", there is no need to search shadow_user backend, because \"enabled\" is saved in \"user\" table so that L1035 is enough.","commit_id":"e7a4d43ece44ee0187bb7ab02e0604b5ae2a592b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"60b6429430108eea78d80a144131184d28eff625","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                    fed_hints)"},{"line_number":1043,"context_line":"                res +\u003d fed_res"},{"line_number":1044,"context_line":"                break"},{"line_number":1045,"context_line":"        return res"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    @domains_configured"},{"line_number":1048,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa0c359_f2b597ef","line":1045,"updated":"2018-02-06 20:53:49.000000000","message":"This still doesn\u0027t work if domain_specific_drivers_enabled is set in keystone.conf because then this automatically adds domain_id\u003ddefault into the hints and of course federated users aren\u0027t in that domain http://git.openstack.org/cgit/openstack/keystone/tree/keystone/common/controller.py#n487\n\nI\u0027m okay with merging this as-is anyways since this is still an improvement for the majority of users.","commit_id":"e7a4d43ece44ee0187bb7ab02e0604b5ae2a592b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"772ed0d51ea511a35c3134f94c0e828d286d68de","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                    fed_hints)"},{"line_number":1043,"context_line":"                res +\u003d fed_res"},{"line_number":1044,"context_line":"                break"},{"line_number":1045,"context_line":"        return res"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    @domains_configured"},{"line_number":1048,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa0c359_edc7d144","line":1045,"in_reply_to":"3fa0c359_ef2b627f","updated":"2018-02-08 02:37:21.000000000","message":"Colleen, I created a bug https://bugs.launchpad.net/keystone/+bug/1748062 , but after thinking more, I think maybe it\u0027s not a bug. Need your idea there.","commit_id":"e7a4d43ece44ee0187bb7ab02e0604b5ae2a592b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"95a9f13f03d84ef8bf52855563e81ac0efdd987c","unresolved":false,"context_lines":[{"line_number":1042,"context_line":"                    fed_hints)"},{"line_number":1043,"context_line":"                res +\u003d fed_res"},{"line_number":1044,"context_line":"                break"},{"line_number":1045,"context_line":"        return res"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    @domains_configured"},{"line_number":1048,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa0c359_ef2b627f","line":1045,"in_reply_to":"3fa0c359_f2b597ef","updated":"2018-02-07 09:39:26.000000000","message":"Indeed! If domain_specific_drivers_enabled is set, not only \"name\", but aslo \"idp_id\", \"protocol_id\" and \"unique_id\" filters will not work, I think. The problem is here: https://github.com/openstack/keystone/blob/master/keystone/identity/shadow_backends/sql.py#L73 \nit always filters the domain_id. I can fix it in the following patch.","commit_id":"e7a4d43ece44ee0187bb7ab02e0604b5ae2a592b"}],"keystone/identity/shadow_backends/sql.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ac73fbceaf891fd9fd999e7b98ec0c81a033103","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        query \u003d query.filter(sqlalchemy.and_(*statements))"},{"line_number":66,"context_line":"        return query"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_federated_users(self, hints):"},{"line_number":69,"context_line":"        with sql.session_for_read() as session:"},{"line_number":70,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":71,"context_line":"            query \u003d query.filter(model.User.id \u003d\u003d model.FederatedUser.user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf8cb3f7_d6d5c7e6","line":68,"range":{"start_line":68,"start_character":34,"end_line":68,"end_character":39},"updated":"2017-12-27 09:26:55.000000000","message":"I think hints usually allows a name as a filter so I think it would make sense to fix this method to do the right thing instead of adding a new method, can you explain why a new method was necessary?","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ffd2fddf1006ff5b1d4935f29b0d57e0d315de12","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        query \u003d query.filter(sqlalchemy.and_(*statements))"},{"line_number":66,"context_line":"        return query"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_federated_users(self, hints):"},{"line_number":69,"context_line":"        with sql.session_for_read() as session:"},{"line_number":70,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":71,"context_line":"            query \u003d query.filter(model.User.id \u003d\u003d model.FederatedUser.user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_b476563e","line":68,"range":{"start_line":68,"start_character":34,"end_line":68,"end_character":39},"in_reply_to":"9f91af0f_22ff7068","updated":"2017-12-28 12:15:29.000000000","message":"I just ran into another case where it was convenient to implement a new get_by_name method instead of reusing an existing method, so I\u0027m not against adding a new method if it\u0027s necessary. But in this case you have get_federated_user_by_name with no name argument, you\u0027re still getting the name out of the hints object. So you didn\u0027t just create a convenience function, you rewrote get_federated_users to look up a whole new table. It seems like get_federated_users should have been doing that to begin with, am I wrong?","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"272545f4c3da7c9c57efe883656a53f9c7fa8855","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        query \u003d query.filter(sqlalchemy.and_(*statements))"},{"line_number":66,"context_line":"        return query"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def get_federated_users(self, hints):"},{"line_number":69,"context_line":"        with sql.session_for_read() as session:"},{"line_number":70,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":71,"context_line":"            query \u003d query.filter(model.User.id \u003d\u003d model.FederatedUser.user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f91af0f_22ff7068","line":68,"range":{"start_line":68,"start_character":34,"end_line":68,"end_character":39},"in_reply_to":"bf8cb3f7_d6d5c7e6","updated":"2017-12-28 03:20:44.000000000","message":"Yeah, we can fix it in this function of cause.\n\nBut It will be a little big work to distinguish sql+sql and ldap+sql.\n\nIf guys dont\u0027 like adding the new function. I\u0027d like to refactor this function instead.","commit_id":"3a31a6ac59d0272400947f4e02f768f3d6b73472"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"87f2750d0557caa7606a5d576b1a63d9e73c5196","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                model.LocalUser).outerjoin(model.FederatedUser)"},{"line_number":80,"context_line":"            query \u003d query.filter(model.FederatedUser.display_name \u003d\u003d name)"},{"line_number":81,"context_line":"            return [identity_base.filter_user(x.to_dict()) for x in query]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_federated_user(self, idp_id, protocol_id, unique_id):"},{"line_number":84,"context_line":"        # NOTE(notmorgan): Open a session here to ensure .to_dict is called"},{"line_number":85,"context_line":"        # within an active session context. This will prevent lazy-load"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_198eed2d","line":82,"updated":"2018-01-05 16:32:30.000000000","message":"You don\u0027t need a new method, you can fix get_federated_users like this:\n\ndiff --git a/keystone/identity/shadow_backends/sql.py b/keystone/identity/shadow_backends/sql.py\nindex ccf420c..839736c 100644\n--- a/keystone/identity/shadow_backends/sql.py\n+++ b/keystone/identity/shadow_backends/sql.py\n@@ -67,9 +67,17 @@ class ShadowUsers(base.ShadowUsersDriverBase):\n \n     def get_federated_users(self, hints):\n         with sql.session_for_read() as session:\n-            query \u003d session.query(model.User).outerjoin(model.LocalUser)\n+            query \u003d session.query(model.User).outerjoin(model.LocalUser).outerjoin(model.FederatedUser)\n             query \u003d query.filter(model.User.id \u003d\u003d model.FederatedUser.user_id)\n             query \u003d self._update_query_with_federated_statements(hints, query)\n+            name_filter \u003d None\n+            for filter_ in hints.filters:\n+                if filter_[\u0027name\u0027] \u003d\u003d \u0027name\u0027:\n+                    name_filter \u003d filter_\n+                    query \u003d query.filter(model.FederatedUser.display_name \u003d\u003d name_filter[\u0027value\u0027])\n+                    break\n+            if name_filter:\n+                hints.filters.remove(name_filter)\n             user_refs \u003d sql.filter_limit_query(model.User, query, hints)\n             return [identity_base.filter_user(x.to_dict()) for x in user_refs]","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"519c7f13e5b321598095328f19da06b56a87ea8c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                model.LocalUser).outerjoin(model.FederatedUser)"},{"line_number":80,"context_line":"            query \u003d query.filter(model.FederatedUser.display_name \u003d\u003d name)"},{"line_number":81,"context_line":"            return [identity_base.filter_user(x.to_dict()) for x in query]"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_federated_user(self, idp_id, protocol_id, unique_id):"},{"line_number":84,"context_line":"        # NOTE(notmorgan): Open a session here to ensure .to_dict is called"},{"line_number":85,"context_line":"        # within an active session context. This will prevent lazy-load"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f91af0f_d15cc7ee","line":82,"in_reply_to":"9f91af0f_198eed2d","updated":"2018-01-08 01:51:59.000000000","message":"sure.","commit_id":"c88b0ef48b13089bad0e96f5d0c08043dd71147b"}],"releasenotes/notes/bug-1738895-342864cd0285bc42.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9267f29cf5d85bd2e4fd41fd8325c042b962061b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`bug 1738895 \u003chttps://bugs.launchpad.net/keystone/+bug/1738895\u003e`_]"},{"line_number":5,"context_line":"    Fixed the bug that federated users can\u0027t be listed by `name` filter. Added"},{"line_number":6,"context_line":"    a new property called `driver_type` for User drivers as well. The defalut"},{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f91af0f_52ffd566","line":6,"range":{"start_line":6,"start_character":70,"end_line":6,"end_character":77},"updated":"2017-12-29 02:12:42.000000000","message":"default*","commit_id":"b7c861630daa704798adc7999f63701afad89680"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1b6382ea2e9f50647098ace663dc58703cbf321b","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`bug 1738895 \u003chttps://bugs.launchpad.net/keystone/+bug/1738895\u003e`_]"},{"line_number":5,"context_line":"    Fixed the bug that federated users can\u0027t be listed by `name` filter. Added"},{"line_number":6,"context_line":"    a new property called `driver_type` for User drivers as well. The defalut"},{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f91af0f_f24b89ad","line":6,"range":{"start_line":6,"start_character":70,"end_line":6,"end_character":77},"in_reply_to":"9f91af0f_52ffd566","updated":"2017-12-29 02:25:43.000000000","message":"Done","commit_id":"b7c861630daa704798adc7999f63701afad89680"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9267f29cf5d85bd2e4fd41fd8325c042b962061b","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    a new property called `driver_type` for User drivers as well. The defalut"},{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f91af0f_922a3de5","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":11},"updated":"2017-12-29 02:12:42.000000000","message":"We could add another statement here saying \"If you maintain out-of-tree identity drivers, you may need to introduce this property accordingly to ensure this behavior is consistent with your deployment\".","commit_id":"b7c861630daa704798adc7999f63701afad89680"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1b6382ea2e9f50647098ace663dc58703cbf321b","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    a new property called `driver_type` for User drivers as well. The defalut"},{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"9f91af0f_b2cbc11c","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":11},"in_reply_to":"9f91af0f_922a3de5","updated":"2017-12-29 02:25:43.000000000","message":"I just confused with how to describe it. Really helpful. Thanks.","commit_id":"b7c861630daa704798adc7999f63701afad89680"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3dc444c78ec3120af0a2bc180a655892f4803a88","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend. If you maintain out-of-tree identity drivers, you may need to"},{"line_number":10,"context_line":"    introduce this property according to ensure this behavior is consistent"},{"line_number":11,"context_line":"    with your deployment."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"9f91af0f_a9f25805","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":37},"updated":"2018-01-02 19:13:39.000000000","message":"\"accordingly\" or we could just remove the word \"according\".","commit_id":"c82ba7b87aedb9b0287ff30922009bc95d35d740"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7cd7f80e08d6967d545e4c1488d8e238702a0fe7","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    value is `None`. The customer user backends should override it to indicate"},{"line_number":8,"context_line":"    their driver type. For example, `ldap` for LDAP backend or `sql` for SQL"},{"line_number":9,"context_line":"    backend. If you maintain out-of-tree identity drivers, you may need to"},{"line_number":10,"context_line":"    introduce this property according to ensure this behavior is consistent"},{"line_number":11,"context_line":"    with your deployment."}],"source_content_type":"text/x-yaml","patch_set":9,"id":"9f91af0f_41b840c7","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":37},"in_reply_to":"9f91af0f_a9f25805","updated":"2018-01-03 01:57:37.000000000","message":"Done","commit_id":"c82ba7b87aedb9b0287ff30922009bc95d35d740"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"528fb04952aba69c22bff5e18d3dff27fdf598a4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`bug 1738895 \u003chttps://bugs.launchpad.net/keystone/+bug/1738895\u003e`_]"},{"line_number":5,"context_line":"    Fixed the bug that federated users can\u0027t be listed by `name` filter."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f93b717_861f7e6a","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":72},"updated":"2018-02-02 18:04:59.000000000","message":"Probably should add more detail here about how it worked for local users, but not federated.","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c649011141e8dfd3baf4360bdb6766ae31473dfd","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`bug 1738895 \u003chttps://bugs.launchpad.net/keystone/+bug/1738895\u003e`_]"},{"line_number":5,"context_line":"    Fixed the bug that federated users can\u0027t be listed by `name` filter."}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f93b717_6a3c6c92","line":5,"range":{"start_line":5,"start_character":4,"end_line":5,"end_character":72},"in_reply_to":"5f93b717_861f7e6a","updated":"2018-02-03 07:43:20.000000000","message":"sure.","commit_id":"33bc9a5957164f4513e134ad779b582b4d361e25"}]}
