)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f30c65e08e8567e52e138b2c4048b8885702e401","unresolved":false,"context_lines":[{"line_number":10,"context_line":"groups from the IdP, after filtering them according to either of these"},{"line_number":11,"context_line":"rules."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Co-Authored-By: Rodrigo Duarte Sousa \u003crodrigods@lsd.ufcg.edu.br\u003e"},{"line_number":14,"context_line":"Partially-Implements: bp mapping-enhancements"},{"line_number":15,"context_line":"Change-Id: I4592ba1c05e99c16645b5303c0192fc462b474aa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a961159_3dce26b8","line":13,"updated":"2015-01-13 14:25:51.000000000","message":"Add Marek Denis as Co-Author :)","commit_id":"77852b0c8aa4d0e6dedf5220fd13a1381c0e7a63"}],"keystone/contrib/federation/utils.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e2a53c1a6ab5e4c1469cbd0d0f5038d6731234b4","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                              group[\u0027domain\u0027].get(\u0027id\u0027))"},{"line_number":388,"context_line":"                    groups_by_domain.setdefault(domain, list()).append(group)"},{"line_number":389,"context_line":"                group_names.extend(extract_groups(groups_by_domain))"},{"line_number":390,"context_line":"            if \u0027groups\u0027 in identity_value and \u0027domain\u0027 in identity_value:"},{"line_number":391,"context_line":"                # in this case, identity_value[\u0027groups\u0027] is a string"},{"line_number":392,"context_line":"                # representation of a list, and we want a real list."},{"line_number":393,"context_line":"                group_names_list \u003d ast.literal_eval(identity_value[\u0027groups\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5d0da336","line":390,"updated":"2015-01-06 19:04:32.000000000","message":"I\u0027d remove \u0027domain\u0027 in identity_value check and later in line 395 handle case where domain is not present by raising some ValidationError or Unauthorized exception.\nOtherwise you are not handling a case where \u0027groups\u0027 are present but \u0027domain\u0027 not. This may confuse users as they will not see any warning, any error etc.","commit_id":"ec7e3b7354b9f44e6d6f3762385a8d1aa3298be0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f30c65e08e8567e52e138b2c4048b8885702e401","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                group_names.extend(extract_groups(groups_by_domain))"},{"line_number":404,"context_line":"            if \u0027groups\u0027 in identity_value:"},{"line_number":405,"context_line":"                if \u0027domain\u0027 not in identity_value:"},{"line_number":406,"context_line":"                    msg \u003d _(\"Invalid rule: %(v)s\") % {\u0027v\u0027: identity_value}"},{"line_number":407,"context_line":"                    raise exception.ValidationError(msg)"},{"line_number":408,"context_line":"                # in this case, identity_value[\u0027groups\u0027] is a string"},{"line_number":409,"context_line":"                # representation of a list, and we want a real list."}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_7d7a6e78","line":406,"updated":"2015-01-13 14:25:51.000000000","message":"Would use a more verbose msg here, something stating that if using \"groups\" key, the \"domain\" one is mandatory.","commit_id":"77852b0c8aa4d0e6dedf5220fd13a1381c0e7a63"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4badb62196939611a25b4f99a6bec26a0c15a58f","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                group_names.extend(extract_groups(groups_by_domain))"},{"line_number":404,"context_line":"            if \u0027groups\u0027 in identity_value:"},{"line_number":405,"context_line":"                if \u0027domain\u0027 not in identity_value:"},{"line_number":406,"context_line":"                    msg \u003d _(\"Invalid rule: %(v)s\") % {\u0027v\u0027: identity_value}"},{"line_number":407,"context_line":"                    raise exception.ValidationError(msg)"},{"line_number":408,"context_line":"                # in this case, identity_value[\u0027groups\u0027] is a string"},{"line_number":409,"context_line":"                # representation of a list, and we want a real list."}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_479cfbbf","line":406,"in_reply_to":"3a961159_7d7a6e78","updated":"2015-01-13 16:37:28.000000000","message":"Done","commit_id":"77852b0c8aa4d0e6dedf5220fd13a1381c0e7a63"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"30963d25911ad26e70c759a20ad2533ff4e496e8","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                # representation of a list, and we want a real list."},{"line_number":492,"context_line":"                group_names_list \u003d ast.literal_eval(identity_value[\u0027groups\u0027])"},{"line_number":493,"context_line":"                domain \u003d identity_value[\u0027domain\u0027]"},{"line_number":494,"context_line":"                group_dicts \u003d [{\u0027name\u0027: name} for name in group_names_list]"},{"line_number":495,"context_line":"                for group_dict in group_dicts:"},{"line_number":496,"context_line":"                    group_dict[\u0027domain\u0027] \u003d domain"},{"line_number":497,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_885c8c27","line":494,"updated":"2015-02-20 05:03:59.000000000","message":"why not just add the \"domain\" key/value here in the list comprehension?","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6df1cdbfd2b36e9cfe6954af2e7bef4b1994b2e1","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                # representation of a list, and we want a real list."},{"line_number":492,"context_line":"                group_names_list \u003d ast.literal_eval(identity_value[\u0027groups\u0027])"},{"line_number":493,"context_line":"                domain \u003d identity_value[\u0027domain\u0027]"},{"line_number":494,"context_line":"                group_dicts \u003d [{\u0027name\u0027: name} for name in group_names_list]"},{"line_number":495,"context_line":"                for group_dict in group_dicts:"},{"line_number":496,"context_line":"                    group_dict[\u0027domain\u0027] \u003d domain"},{"line_number":497,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_edb12fe2","line":494,"in_reply_to":"ba7be1f8_885c8c27","updated":"2015-02-24 06:57:52.000000000","message":"Done","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"30963d25911ad26e70c759a20ad2533ff4e496e8","unresolved":false,"context_lines":[{"line_number":636,"context_line":"                                         if v in whitelisted_values]"},{"line_number":637,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":638,"context_line":"                else:"},{"line_number":639,"context_line":"                    direct_maps +\u003d direct_map_values"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"                LOG.debug(\u0027updating a direct mapping: %s\u0027, direct_map_values)"},{"line_number":642,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_88aaccd2","line":639,"updated":"2015-02-20 05:03:59.000000000","message":"maybe do an append too for consistency?","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6df1cdbfd2b36e9cfe6954af2e7bef4b1994b2e1","unresolved":false,"context_lines":[{"line_number":636,"context_line":"                                         if v in whitelisted_values]"},{"line_number":637,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":638,"context_line":"                else:"},{"line_number":639,"context_line":"                    direct_maps +\u003d direct_map_values"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"                LOG.debug(\u0027updating a direct mapping: %s\u0027, direct_map_values)"},{"line_number":642,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_4dc6bb4a","line":639,"in_reply_to":"ba7be1f8_88aaccd2","updated":"2015-02-24 06:57:52.000000000","message":"append() will not here, but for consistency i changed to extend()","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"251e0361174f81d3e43167e1009bd80682da4db6","unresolved":false,"context_lines":[{"line_number":626,"context_line":""},{"line_number":627,"context_line":"                # If a blacklist or whitelist is used, we want to map to the"},{"line_number":628,"context_line":"                # whole list instead of just its values separately."},{"line_number":629,"context_line":"                if blacklisted_values is not None:"},{"line_number":630,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":631,"context_line":"                                         if v not in blacklisted_values]"},{"line_number":632,"context_line":"                    direct_maps.append(direct_map_values)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_fc3c15ca","line":629,"updated":"2015-02-26 06:58:47.000000000","message":"nit, use:\n\n  if not blacklisted_value:","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9497c43e97d6ef2cb58d6831ac08b6c35300e3a7","unresolved":false,"context_lines":[{"line_number":626,"context_line":""},{"line_number":627,"context_line":"                # If a blacklist or whitelist is used, we want to map to the"},{"line_number":628,"context_line":"                # whole list instead of just its values separately."},{"line_number":629,"context_line":"                if blacklisted_values is not None:"},{"line_number":630,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":631,"context_line":"                                         if v not in blacklisted_values]"},{"line_number":632,"context_line":"                    direct_maps.append(direct_map_values)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_30940c8a","line":629,"in_reply_to":"ba7be1f8_fc3c15ca","updated":"2015-02-26 09:40:46.000000000","message":"if blacklisted_values: :-)","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"251e0361174f81d3e43167e1009bd80682da4db6","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":631,"context_line":"                                         if v not in blacklisted_values]"},{"line_number":632,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":633,"context_line":"                elif whitelisted_values is not None:"},{"line_number":634,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":635,"context_line":"                                         if v in whitelisted_values]"},{"line_number":636,"context_line":"                    direct_maps.append(direct_map_values)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_3c330df7","line":633,"updated":"2015-02-26 06:58:47.000000000","message":"nit, use:\n\n  elif not whitelisted_value:","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9497c43e97d6ef2cb58d6831ac08b6c35300e3a7","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":631,"context_line":"                                         if v not in blacklisted_values]"},{"line_number":632,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":633,"context_line":"                elif whitelisted_values is not None:"},{"line_number":634,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":635,"context_line":"                                         if v in whitelisted_values]"},{"line_number":636,"context_line":"                    direct_maps.append(direct_map_values)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_508fc074","line":633,"in_reply_to":"ba7be1f8_3c330df7","updated":"2015-02-26 09:40:46.000000000","message":"if whitelisted_values: :-)","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a173de3ed4f8d6a747d0b9da390d541c35c8c264","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\"Utilities for Federation Extension.\"\"\""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ast"},{"line_number":16,"context_line":"import re"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import jsonschema"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_d34ee1c1","line":15,"updated":"2015-03-02 08:07:03.000000000","message":"we probably don\u0027t need to use this, the schema should validate things. maybe make a malicious test to have a malformed group mapping?","commit_id":"94d1c05b3cc9c4a4c0270d78cc84b80cb6180d46"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a173de3ed4f8d6a747d0b9da390d541c35c8c264","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                    raise exception.ValidationError(msg)"},{"line_number":515,"context_line":"                # in this case, identity_value[\u0027groups\u0027] is a string"},{"line_number":516,"context_line":"                # representation of a list, and we want a real list."},{"line_number":517,"context_line":"                group_names_list \u003d ast.literal_eval(identity_value[\u0027groups\u0027])"},{"line_number":518,"context_line":"                domain \u003d identity_value[\u0027domain\u0027]"},{"line_number":519,"context_line":"                group_dicts \u003d [{\u0027name\u0027: name, \u0027domain\u0027: domain} for name in"},{"line_number":520,"context_line":"                               group_names_list]"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_b36c0d38","line":517,"updated":"2015-03-02 08:07:03.000000000","message":"i think it\u0027s fine to just do:\n\n  identity_value[\u0027groups\u0027]\n\nwe already checked that it was there in line 509, and the schema should make sure it\u0027s a list","commit_id":"94d1c05b3cc9c4a4c0270d78cc84b80cb6180d46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"adcf1fd92e17f4fc0435614430847c1639afcff9","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                    raise exception.ValidationError(msg)"},{"line_number":515,"context_line":"                # in this case, identity_value[\u0027groups\u0027] is a string"},{"line_number":516,"context_line":"                # representation of a list, and we want a real list."},{"line_number":517,"context_line":"                group_names_list \u003d ast.literal_eval(identity_value[\u0027groups\u0027])"},{"line_number":518,"context_line":"                domain \u003d identity_value[\u0027domain\u0027]"},{"line_number":519,"context_line":"                group_dicts \u003d [{\u0027name\u0027: name, \u0027domain\u0027: domain} for name in"},{"line_number":520,"context_line":"                               group_names_list]"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba7be1f8_ceaaba19","line":517,"in_reply_to":"ba7be1f8_b36c0d38","updated":"2015-03-02 09:12:36.000000000","message":"Hm, at a first glance yes. But as local rule \"groups\" may be subject for direct mapping (\"{0}\", \"{1}\" is used) it will always be evaluated as string, so we may end up with \n\nidentity_value[\u0027groups\u0027] \u003d\u003d \"[\u0027group1, \u0027group2\u0027]\"\n\nThis is essentially due to logic handled in  _update_local_mapping.\n(In principle not a big fan of string substitution as a way of doing direct mapping).\nSo, ast stays for now and I will add a note.","commit_id":"94d1c05b3cc9c4a4c0270d78cc84b80cb6180d46"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ef36bb78fe734ad225e91fcb4a28609b595dc0b5","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                                         if v in whitelisted_values]"},{"line_number":665,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":666,"context_line":"                else:"},{"line_number":667,"context_line":"                    direct_maps.extend(direct_map_values)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"                LOG.debug(\u0027updating a direct mapping: %s\u0027, direct_map_values)"},{"line_number":670,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ba7be1f8_c4198b89","line":667,"updated":"2015-03-03 03:05:08.000000000","message":"Something feels off here. In this case you are extending the dirct_maps to include the values from direct_map_values. I think that is correct. In the other cases you are adding the list of matching/non-matching as an element to direct_maps instead of extending? It also doesn\u0027t look like the tests would catch an error here since there doesn\u0027t seem to be a case where they check for anything, but an empty list.","commit_id":"b84409c00f1dad9bdff65674db8fb5be4d0ee333"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d60eedcc7aa89654f31e0110bff58ecc0065fa92","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                                         if v in whitelisted_values]"},{"line_number":665,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":666,"context_line":"                else:"},{"line_number":667,"context_line":"                    direct_maps.extend(direct_map_values)"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"                LOG.debug(\u0027updating a direct mapping: %s\u0027, direct_map_values)"},{"line_number":670,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ba7be1f8_c684050d","line":667,"in_reply_to":"ba7be1f8_c4198b89","updated":"2015-03-03 19:48:16.000000000","message":"I think this is correct. With the first shape of the mapping engine we were directly mapping single values. Usually it was user name mapped directly from assertion\u0027s parameter. Hence, extend() is used.\nIn the white/blacklisting we may say: \u0027map all groups except those listed in the blacklist and store them in the local rule\u0027s groups attribute\u0027 . To do so, we need to use .append(), so later {n}\u0027th element from the direct_maps can be assigned to local rule attribute.\n\nfor the mapping \n\n\tMAPPING_GROUPS_BLACKLIST_MISSING_DOMAIN \u003d {\t821\n    \"rules\": [\t\n        {\t\n            \"remote\": [\t\n                {\t\n\t\t\t                    \"type\": \"orgPersonType\",\t\n                    \"blacklist\": [\t\n                        \"Developer\", \"Manager\"\n                    ]\n                },\n            ],\n            \"local\": [\n                {\t833\n                    \"groups\": \"{0}\",\n                },\t\n            ]\t\n        }\t\n    ]\t\n}\t\n\n\nand with the \u0027append()\u0027 variant a direct_map would like:\n\ndirect_map \u003d [ [\u0027Contractor\u0027, \u0027Manager\u0027] ]\nand later the mapping engine will take 0th element from direct_map, which is a whole list. If we used .extend(), we would have\n\ndirect_maps \u003d [\u0027Contractor\u0027, \u0027Manager\u0027]\n\nand clearly groups would not be what we want it to be.","commit_id":"b84409c00f1dad9bdff65674db8fb5be4d0ee333"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":456,"context_line":"            ]"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"        :returns: dictionary with user name, group_ids and group_names."},{"line_number":459,"context_line":"        :rtype: dict"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        \"\"\""},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_9b12f2b2","line":459,"updated":"2015-03-05 01:00:53.000000000","message":"revert this change it\u0027s not related.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":658,"context_line":"                if blacklisted_values:"},{"line_number":659,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":660,"context_line":"                                         if v not in blacklisted_values]"},{"line_number":661,"context_line":"                    direct_maps.append(direct_map_values)"},{"line_number":662,"context_line":"                elif whitelisted_values:"},{"line_number":663,"context_line":"                    direct_map_values \u003d [v for v in direct_map_values"},{"line_number":664,"context_line":"                                         if v in whitelisted_values]"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_11d183fb","line":661,"updated":"2015-03-05 01:00:53.000000000","message":"why is append used here rather than extend as below? Add a comment.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"}],"keystone/tests/mapping_fixtures.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ac85dfe997d232d30b30c0c5674732bc17640191","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    \u0027UserName\u0027: \u0027tbo\u0027,"},{"line_number":641,"context_line":"    \u0027FirstName\u0027: \u0027Tim\u0027,"},{"line_number":642,"context_line":"    \u0027LastName\u0027: \u0027Bo\u0027,"},{"line_number":643,"context_line":"    \u0027orgPersonType\u0027: \u0027Employee;BuildingX;\u0027"},{"line_number":644,"context_line":"}"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"EMPLOYEE_ASSERTION_MULTIPLE_GROUPS \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_63663657","line":643,"updated":"2015-01-14 06:15:52.000000000","message":"can you just add Contractor to this assertion? rather than creating a new one","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"677f2f1be4ef7dbd46275811ad02be49c90a70a9","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    \u0027UserName\u0027: \u0027tbo\u0027,"},{"line_number":641,"context_line":"    \u0027FirstName\u0027: \u0027Tim\u0027,"},{"line_number":642,"context_line":"    \u0027LastName\u0027: \u0027Bo\u0027,"},{"line_number":643,"context_line":"    \u0027orgPersonType\u0027: \u0027Employee;BuildingX;\u0027"},{"line_number":644,"context_line":"}"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"EMPLOYEE_ASSERTION_MULTIPLE_GROUPS \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_38925b9f","line":643,"in_reply_to":"3a961159_40673725","updated":"2015-01-15 15:05:24.000000000","message":"but the difference is not only this one \u0027Contractor\u0027 parameter.","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"493612e325be3a6505719b6d1d92eab58b036440","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    \u0027UserName\u0027: \u0027tbo\u0027,"},{"line_number":641,"context_line":"    \u0027FirstName\u0027: \u0027Tim\u0027,"},{"line_number":642,"context_line":"    \u0027LastName\u0027: \u0027Bo\u0027,"},{"line_number":643,"context_line":"    \u0027orgPersonType\u0027: \u0027Employee;BuildingX;\u0027"},{"line_number":644,"context_line":"}"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"EMPLOYEE_ASSERTION_MULTIPLE_GROUPS \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_75e156cf","line":643,"in_reply_to":"3a961159_63663657","updated":"2015-01-15 10:45:27.000000000","message":"I ma afraid I don\u0027t follow :(","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d020711d33578dde6801c4c2a9ea56351e834d04","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    \u0027UserName\u0027: \u0027tbo\u0027,"},{"line_number":641,"context_line":"    \u0027FirstName\u0027: \u0027Tim\u0027,"},{"line_number":642,"context_line":"    \u0027LastName\u0027: \u0027Bo\u0027,"},{"line_number":643,"context_line":"    \u0027orgPersonType\u0027: \u0027Employee;BuildingX;\u0027"},{"line_number":644,"context_line":"}"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"EMPLOYEE_ASSERTION_MULTIPLE_GROUPS \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_40673725","line":643,"in_reply_to":"3a961159_75e156cf","updated":"2015-01-15 12:32:27.000000000","message":"Marek, he meant to add another value into the \"orgPersonType\" key, instead of creating a new assertion (EMPLOYEE_ASSERTION_MULTIPLE_GROUPS).","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ac85dfe997d232d30b30c0c5674732bc17640191","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        self.put(url, expected_status\u003d400,"},{"line_number":579,"context_line":"                 body\u003d{\u0027mapping\u0027: mapping_fixtures.MAPPING_EXTRA_RULES_PROPS})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def test_create_mapping_with_blacklist_and_whitelist(self):"},{"line_number":582,"context_line":"        url \u003d self.MAPPING_URL + uuid.uuid4().hex"},{"line_number":583,"context_line":"        mapping \u003d mapping_fixtures.MAPPING_GROUPS_WHITELIST_AND_BLACKLIST"},{"line_number":584,"context_line":"        self.put(url, expected_status\u003d400, body\u003d{\u0027mapping\u0027: mapping})"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_83d96224","line":581,"updated":"2015-01-14 06:15:52.000000000","message":"why is this invalid? \ncause it\u0027s black list and white list? can you add a small comment on line 582 if that\u0027s the case","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"493612e325be3a6505719b6d1d92eab58b036440","unresolved":false,"context_lines":[{"line_number":578,"context_line":"        self.put(url, expected_status\u003d400,"},{"line_number":579,"context_line":"                 body\u003d{\u0027mapping\u0027: mapping_fixtures.MAPPING_EXTRA_RULES_PROPS})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def test_create_mapping_with_blacklist_and_whitelist(self):"},{"line_number":582,"context_line":"        url \u003d self.MAPPING_URL + uuid.uuid4().hex"},{"line_number":583,"context_line":"        mapping \u003d mapping_fixtures.MAPPING_GROUPS_WHITELIST_AND_BLACKLIST"},{"line_number":584,"context_line":"        self.put(url, expected_status\u003d400, body\u003d{\u0027mapping\u0027: mapping})"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_b4b66487","line":581,"in_reply_to":"3a961159_83d96224","updated":"2015-01-15 10:45:27.000000000","message":"Done","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ac85dfe997d232d30b30c0c5674732bc17640191","unresolved":false,"context_lines":[{"line_number":834,"context_line":"            }"},{"line_number":835,"context_line":"        }"},{"line_number":836,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":837,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    def test_rule_engine_blacklist_and_direct_groups_mapping(self):"},{"line_number":840,"context_line":"        \"\"\"Should return user\u0027s group Developer."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_43005a35","line":837,"updated":"2015-01-14 06:15:52.000000000","message":"assert the rest of the mapped_properties too, user_name/id and group_ids","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"493612e325be3a6505719b6d1d92eab58b036440","unresolved":false,"context_lines":[{"line_number":834,"context_line":"            }"},{"line_number":835,"context_line":"        }"},{"line_number":836,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":837,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    def test_rule_engine_blacklist_and_direct_groups_mapping(self):"},{"line_number":840,"context_line":"        \"\"\"Should return user\u0027s group Developer."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_b5265e65","line":837,"in_reply_to":"3a961159_43005a35","updated":"2015-01-15 10:45:27.000000000","message":"Done","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ac85dfe997d232d30b30c0c5674732bc17640191","unresolved":false,"context_lines":[{"line_number":861,"context_line":"            }"},{"line_number":862,"context_line":"        }"},{"line_number":863,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":864,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    def test_rule_engine_whitelist_direct_group_mapping_missing_domain(self):"},{"line_number":867,"context_line":"        \"\"\"Test if the local rule is rejected upon missing domain value"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_63fb9648","line":864,"updated":"2015-01-14 06:15:52.000000000","message":"same comment as above","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"493612e325be3a6505719b6d1d92eab58b036440","unresolved":false,"context_lines":[{"line_number":861,"context_line":"            }"},{"line_number":862,"context_line":"        }"},{"line_number":863,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":864,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"    def test_rule_engine_whitelist_direct_group_mapping_missing_domain(self):"},{"line_number":867,"context_line":"        \"\"\"Test if the local rule is rejected upon missing domain value"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_95940237","line":864,"in_reply_to":"3a961159_63fb9648","updated":"2015-01-15 10:45:27.000000000","message":"Done","commit_id":"cfcb1076a9a3049bbf13c51d79fc56197114671c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"eab8363c18a0b0c968bfe5835615be61e6cd5ad9","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                 body\u003d{\u0027mapping\u0027: mapping_fixtures.MAPPING_EXTRA_RULES_PROPS})"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def test_create_mapping_with_blacklist_and_whitelist(self):"},{"line_number":581,"context_line":"        \"\"\"Test for adding whitelist and blacklist in the rule."},{"line_number":582,"context_line":"        Server should respond with HTTP 400 error upon discovering both"},{"line_number":583,"context_line":"        ``whitelist`` and ``blacklist`` keywords in the same rule."},{"line_number":584,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa81d914_6f9d5359","line":581,"updated":"2015-01-29 06:40:14.000000000","message":"nit: suggest formatting to be consistent with pep8 docstring conventions; \n\nhttps://www.python.org/dev/peps/pep-0008/#documentation-strings\n\n    \"Test for adding whitelist and blacklist in the rule.\n\n     Server should response...","commit_id":"4d846b29a77f88a8c0221d9a7b9cae2ea673e122"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bb4173c5bdf42cff0d0340ac2bf37647e60c3964","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                 body\u003d{\u0027mapping\u0027: mapping_fixtures.MAPPING_EXTRA_RULES_PROPS})"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def test_create_mapping_with_blacklist_and_whitelist(self):"},{"line_number":581,"context_line":"        \"\"\"Test for adding whitelist and blacklist in the rule."},{"line_number":582,"context_line":"        Server should respond with HTTP 400 error upon discovering both"},{"line_number":583,"context_line":"        ``whitelist`` and ``blacklist`` keywords in the same rule."},{"line_number":584,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_969e5fb7","line":581,"in_reply_to":"fa81d914_6709f7dc","updated":"2015-02-13 18:34:42.000000000","message":"Yep! Works for me.","commit_id":"4d846b29a77f88a8c0221d9a7b9cae2ea673e122"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"1e626828f7508643999b2e7bcf34bebbc387c06c","unresolved":false,"context_lines":[{"line_number":578,"context_line":"                 body\u003d{\u0027mapping\u0027: mapping_fixtures.MAPPING_EXTRA_RULES_PROPS})"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"    def test_create_mapping_with_blacklist_and_whitelist(self):"},{"line_number":581,"context_line":"        \"\"\"Test for adding whitelist and blacklist in the rule."},{"line_number":582,"context_line":"        Server should respond with HTTP 400 error upon discovering both"},{"line_number":583,"context_line":"        ``whitelist`` and ``blacklist`` keywords in the same rule."},{"line_number":584,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa81d914_6709f7dc","line":581,"in_reply_to":"fa81d914_6f9d5359","updated":"2015-01-29 08:51:08.000000000","message":"i am not sure if I understood your intention, but see following patch.","commit_id":"4d846b29a77f88a8c0221d9a7b9cae2ea673e122"}],"keystone/tests/unit/mapping_fixtures.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"30963d25911ad26e70c759a20ad2533ff4e496e8","unresolved":false,"context_lines":[{"line_number":555,"context_line":"}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"MAPPING_GROUPS_WHITELIST \u003d {"},{"line_number":558,"context_line":"    \u0027rules\u0027: ["},{"line_number":559,"context_line":"        {"},{"line_number":560,"context_line":"            \"remote\": ["},{"line_number":561,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_a52419c7","line":558,"updated":"2015-02-20 05:03:59.000000000","message":"nit: use double quotes for consistency","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6df1cdbfd2b36e9cfe6954af2e7bef4b1994b2e1","unresolved":false,"context_lines":[{"line_number":555,"context_line":"}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"MAPPING_GROUPS_WHITELIST \u003d {"},{"line_number":558,"context_line":"    \u0027rules\u0027: ["},{"line_number":559,"context_line":"        {"},{"line_number":560,"context_line":"            \"remote\": ["},{"line_number":561,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_6dc53f3b","line":558,"in_reply_to":"ba7be1f8_a52419c7","updated":"2015-02-24 06:57:52.000000000","message":"Done","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"30963d25911ad26e70c759a20ad2533ff4e496e8","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"MAPPING_GROUPS_WHITELIST_MISSING_DOMAIN \u003d {"},{"line_number":587,"context_line":"    \u0027rules\u0027: ["},{"line_number":588,"context_line":"        {"},{"line_number":589,"context_line":"            \"remote\": ["},{"line_number":590,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_25182984","line":587,"updated":"2015-02-20 05:03:59.000000000","message":"here too","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6df1cdbfd2b36e9cfe6954af2e7bef4b1994b2e1","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"MAPPING_GROUPS_WHITELIST_MISSING_DOMAIN \u003d {"},{"line_number":587,"context_line":"    \u0027rules\u0027: ["},{"line_number":588,"context_line":"        {"},{"line_number":589,"context_line":"            \"remote\": ["},{"line_number":590,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_8dc0b32b","line":587,"in_reply_to":"ba7be1f8_25182984","updated":"2015-02-24 06:57:52.000000000","message":"Done","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"30963d25911ad26e70c759a20ad2533ff4e496e8","unresolved":false,"context_lines":[{"line_number":604,"context_line":"}"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"MAPPING_GROUPS_BLACKLIST \u003d {"},{"line_number":607,"context_line":"    \u0027rules\u0027: ["},{"line_number":608,"context_line":"        {"},{"line_number":609,"context_line":"            \"remote\": ["},{"line_number":610,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_451d1d73","line":607,"updated":"2015-02-20 05:03:59.000000000","message":"and the rest :)","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6df1cdbfd2b36e9cfe6954af2e7bef4b1994b2e1","unresolved":false,"context_lines":[{"line_number":604,"context_line":"}"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"MAPPING_GROUPS_BLACKLIST \u003d {"},{"line_number":607,"context_line":"    \u0027rules\u0027: ["},{"line_number":608,"context_line":"        {"},{"line_number":609,"context_line":"            \"remote\": ["},{"line_number":610,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_adde570f","line":607,"in_reply_to":"ba7be1f8_451d1d73","updated":"2015-02-24 06:57:52.000000000","message":"Done","commit_id":"bd76730ab929429d2273ac95e99267cd9a6d7cdf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"251e0361174f81d3e43167e1009bd80682da4db6","unresolved":false,"context_lines":[{"line_number":238,"context_line":"}"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"MAPPING_NO_RULES \u003d {"},{"line_number":241,"context_line":"    \"rules\": []"},{"line_number":242,"context_line":"}"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"MAPPING_NO_REMOTE \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_fc6a55b1","line":241,"updated":"2015-02-26 06:58:47.000000000","message":"seems like an unnecessary change","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9497c43e97d6ef2cb58d6831ac08b6c35300e3a7","unresolved":false,"context_lines":[{"line_number":238,"context_line":"}"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"MAPPING_NO_RULES \u003d {"},{"line_number":241,"context_line":"    \"rules\": []"},{"line_number":242,"context_line":"}"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"MAPPING_NO_REMOTE \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_4b61d5d1","line":241,"in_reply_to":"ba7be1f8_fc6a55b1","updated":"2015-02-26 09:40:46.000000000","message":"reverted.","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"251e0361174f81d3e43167e1009bd80682da4db6","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    ]"},{"line_number":555,"context_line":"}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"MAPPING_GROUPS_WHITELIST \u003d {"},{"line_number":558,"context_line":"    \"rules\": ["},{"line_number":559,"context_line":"        {"},{"line_number":560,"context_line":"            \"remote\": ["}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_7cd3c55f","line":557,"updated":"2015-02-26 06:58:47.000000000","message":"I think a more \"real\" rule would be the following, and i\u0027m not seeing it be tested yet. I don\u0027t think we would map to an individual user + I want to make sure the \u0027direct mapping\u0027 function still works for both cases.\n\n  {\n      \"rules\": [\n          {\t\n              \"remote\": [\t\n                  {\t\n                      \"type\": \"orgPersonType\",\t\n                      \"whitelist\": [\t\n                          \"Developer\", \"Contractor\"\n                      ]\t\n                  },\n                  {\t\n                      \"type\": \"userName\",\n                  },\n              ],\t\n              \"local\": [\n                  {\n                      \"groups\": \"{0}\",\t\n                      \"domain\": {\n                          \"id\": DEVELOPER_GROUP_DOMAIN_ID\t\n                      }\n                  },\n                  {\n                      \"user\": {\n                          \"name\": {1}\n                      }\t\n                  }\n              ]\n          }\n      ]\n  }","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9497c43e97d6ef2cb58d6831ac08b6c35300e3a7","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    ]"},{"line_number":555,"context_line":"}"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"MAPPING_GROUPS_WHITELIST \u003d {"},{"line_number":558,"context_line":"    \"rules\": ["},{"line_number":559,"context_line":"        {"},{"line_number":560,"context_line":"            \"remote\": ["}],"source_content_type":"text/x-python","patch_set":10,"id":"ba7be1f8_8b774d9f","line":557,"in_reply_to":"ba7be1f8_7cd3c55f","updated":"2015-02-26 09:40:46.000000000","message":"Done","commit_id":"a746650f54158e21ccaf936331c4d81d3e6eccd3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":17,"context_line":"TESTER_GROUP_ID \u003d \"123\""},{"line_number":18,"context_line":"TESTER_GROUP_NAME \u003d \"tester\""},{"line_number":19,"context_line":"DEVELOPER_GROUP_ID \u003d \"xyz\""},{"line_number":20,"context_line":"DEVELOPER_GROUP_NAME \u003d \"Developer\""},{"line_number":21,"context_line":"CONTRACTOR_GROUP_NAME \u003d \"Contractor\""},{"line_number":22,"context_line":"DEVELOPER_GROUP_DOMAIN_NAME \u003d \"outsourcing\""},{"line_number":23,"context_line":"DEVELOPER_GROUP_DOMAIN_ID \u003d \"5abc43\""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_711abf6f","line":20,"updated":"2015-03-05 01:00:53.000000000","message":"revert this change, it\u0027s unrelated.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":23,"context_line":"DEVELOPER_GROUP_DOMAIN_ID \u003d \"5abc43\""},{"line_number":24,"context_line":"FEDERATED_DOMAIN \u003d \"Federated\""},{"line_number":25,"context_line":"LOCAL_DOMAIN \u003d \"Local\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"# Mapping summary:"},{"line_number":28,"context_line":"# LastName Smith \u0026 Not Contractor or SubContractor -\u003e group 0cd5e9"},{"line_number":29,"context_line":"# FirstName Jill \u0026 Contractor or SubContractor -\u003e to group 85a868"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_3110474e","line":26,"updated":"2015-03-05 01:00:53.000000000","message":"revert the whitespace change on the previous line.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":600,"context_line":"            ],"},{"line_number":601,"context_line":"            \"local\": ["},{"line_number":602,"context_line":"                {"},{"line_number":603,"context_line":"                    \"groups\": \"{0}\","},{"line_number":604,"context_line":"                    \"domain\": {"},{"line_number":605,"context_line":"                        \"id\": DEVELOPER_GROUP_DOMAIN_ID"},{"line_number":606,"context_line":"                    }"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_11db43ee","line":603,"updated":"2015-03-05 01:00:53.000000000","message":"there should also be a test that uses \"groups\": \"{1}\" like the spec (although note that the spec has `\"groups\": {1},`, which isn\u0027t valid)","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":818,"context_line":"    ]"},{"line_number":819,"context_line":"}"},{"line_number":820,"context_line":""},{"line_number":821,"context_line":"MAPPING_GROUPS_BLACKLIST_MISSING_DOMAIN \u003d {"},{"line_number":822,"context_line":"    \"rules\": ["},{"line_number":823,"context_line":"        {"},{"line_number":824,"context_line":"            \"remote\": ["}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_31ff6736","line":821,"updated":"2015-03-05 01:00:53.000000000","message":"there should be a comment that says that this mapping is invalid, and why.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":838,"context_line":"    ]"},{"line_number":839,"context_line":"}"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"MAPPING_GROUPS_WHITELIST_AND_BLACKLIST \u003d {"},{"line_number":842,"context_line":"    \"rules\": ["},{"line_number":843,"context_line":"        {"},{"line_number":844,"context_line":"            \"remote\": ["}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_f1edcf8c","line":841,"updated":"2015-03-05 01:00:53.000000000","message":"there should be a comment that says that this mapping is invalid, and why.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ef36bb78fe734ad225e91fcb4a28609b595dc0b5","unresolved":false,"context_lines":[{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def test_mapping_federated_domain_specified(self):"},{"line_number":890,"context_line":"        \"\"\"Test mapping engine when domain \u0027ephemeral\u0027 is explicitely set."},{"line_number":891,"context_line":""},{"line_number":892,"context_line":"        For that, we use mapping rule MAPPING_EPHEMERAL_USER and assertion"},{"line_number":893,"context_line":"        EMPLOYEE_ASSERTION"},{"line_number":894,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ba7be1f8_8adb1d7b","side":"PARENT","line":891,"updated":"2015-03-03 03:05:08.000000000","message":"Why was this removed?","commit_id":"3236e5e7c6175898ec6e0fec9e9ff9d5b0775ae5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":929,"context_line":"            }"},{"line_number":930,"context_line":"        }"},{"line_number":931,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":932,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"        self.assertEqual(\u0027tbo\u0027, mapped_properties[\u0027user\u0027][\u0027name\u0027])"},{"line_number":935,"context_line":"        self.assertEqual([], mapped_properties[\u0027group_ids\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_b187d760","line":932,"updated":"2015-03-05 01:00:53.000000000","message":"use [] rather than .get so this is more stringent.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"937f5986c057dc6d0caf303a9adcb720d2306726","unresolved":false,"context_lines":[{"line_number":959,"context_line":"            }"},{"line_number":960,"context_line":"        }"},{"line_number":961,"context_line":"        for rule in mapped_properties[\u0027group_names\u0027]:"},{"line_number":962,"context_line":"            self.assertDictEqual(reference.get(rule.get(\u0027name\u0027)), rule)"},{"line_number":963,"context_line":"        self.assertEqual(\u0027tbo\u0027, mapped_properties[\u0027user\u0027][\u0027name\u0027])"},{"line_number":964,"context_line":"        self.assertEqual([], mapped_properties[\u0027group_ids\u0027])"},{"line_number":965,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_3193e7a4","line":962,"updated":"2015-03-05 01:00:53.000000000","message":"use [] rather than .get so this is more stringent.","commit_id":"d9534a2e70eb6733e074416a53a1722450972764"}]}
