)]}'
{"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":2908,"context_line":"    AUTH_METHOD \u003d \u0027token\u0027"},{"line_number":2909,"context_line":""},{"line_number":2910,"context_line":"    def _check_scoped_token_attributes(self, token):"},{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_4309f193","line":2911,"updated":"2015-07-29 16:24:21.000000000","message":"project_xor_domain","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":2908,"context_line":"    AUTH_METHOD \u003d \u0027token\u0027"},{"line_number":2909,"context_line":""},{"line_number":2910,"context_line":"    def _check_scoped_token_attributes(self, token):"},{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_5463c241","line":2911,"in_reply_to":"3a50d1a3_4309f193","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":2909,"context_line":""},{"line_number":2910,"context_line":"    def _check_scoped_token_attributes(self, token):"},{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"},{"line_number":2915,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_c3f50183","line":2912,"updated":"2015-07-29 16:24:21.000000000","message":"simplify!\n\n  return (\u0027project\u0027 in token_keys) ^ (\u0027domain\u0027 in token_keys)","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":2909,"context_line":""},{"line_number":2910,"context_line":"    def _check_scoped_token_attributes(self, token):"},{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"},{"line_number":2915,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_f4ce8e2c","line":2912,"in_reply_to":"3a50d1a3_c3f50183","updated":"2015-07-30 10:04:10.000000000","message":"like your reviews, really :-)","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"},{"line_number":2915,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":2916,"context_line":"            self.assertIn(obj, token)"},{"line_number":2917,"context_line":"        # Check for either project or domain"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_e3091d85","line":2914,"updated":"2015-07-29 16:24:21.000000000","message":"everything is an object!\n\n  for key in ...","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":2911,"context_line":"        def xor_project_domain(token_keys):"},{"line_number":2912,"context_line":"            return sum((\u0027project\u0027 in token_keys, \u0027domain\u0027 in token_keys)) % 2"},{"line_number":2913,"context_line":""},{"line_number":2914,"context_line":"        for obj in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"},{"line_number":2915,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":2916,"context_line":"            self.assertIn(obj, token)"},{"line_number":2917,"context_line":"        # Check for either project or domain"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_74911ef1","line":2914,"in_reply_to":"3a50d1a3_e3091d85","updated":"2015-07-30 10:04:10.000000000","message":"Done,\n\nInstead of \"Reply Done\" button i should have \"Obviously you are right\" one.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"        # Check for either project or domain"},{"line_number":2918,"context_line":"        if not xor_project_domain(list(token.keys())):"},{"line_number":2919,"context_line":"            raise AssertionError(\"You must specify either\""},{"line_number":2920,"context_line":"                                 \"project or domain.\")"},{"line_number":2921,"context_line":""},{"line_number":2922,"context_line":"        self.assertIn(\u0027OS-FEDERATION\u0027, token[\u0027user\u0027])"},{"line_number":2923,"context_line":"        os_federation \u003d token[\u0027user\u0027][\u0027OS-FEDERATION\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_a36f9529","line":2920,"updated":"2015-07-29 16:24:21.000000000","message":"simplify!\n\n  self.assertTrue(project_xor_domain(token.keys()), \u0027You must specify either a project or domain.\u0027)\n\nconditionals in tests are also a big red flag to me (tests should be assertive, not adaptive) -- avoid them whenever you can.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"        # Check for either project or domain"},{"line_number":2918,"context_line":"        if not xor_project_domain(list(token.keys())):"},{"line_number":2919,"context_line":"            raise AssertionError(\"You must specify either\""},{"line_number":2920,"context_line":"                                 \"project or domain.\")"},{"line_number":2921,"context_line":""},{"line_number":2922,"context_line":"        self.assertIn(\u0027OS-FEDERATION\u0027, token[\u0027user\u0027])"},{"line_number":2923,"context_line":"        os_federation \u003d token[\u0027user\u0027][\u0027OS-FEDERATION\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_543422fa","line":2920,"in_reply_to":"3a50d1a3_a36f9529","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":2926,"context_line":"        self.assertListEqual(sorted([\u0027groups\u0027,"},{"line_number":2927,"context_line":"                                     \u0027identity_provider\u0027,"},{"line_number":2928,"context_line":"                                     \u0027protocol\u0027]),"},{"line_number":2929,"context_line":"                             sorted(os_federation.keys()))"},{"line_number":2930,"context_line":""},{"line_number":2931,"context_line":"    def load_fixtures(self, fixtures):"},{"line_number":2932,"context_line":"        super(FernetFederatedTokenTests, self).load_fixtures(fixtures)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_63918df0","line":2929,"updated":"2015-07-29 16:24:21.000000000","message":"can you make assertions about the values of these?","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":2926,"context_line":"        self.assertListEqual(sorted([\u0027groups\u0027,"},{"line_number":2927,"context_line":"                                     \u0027identity_provider\u0027,"},{"line_number":2928,"context_line":"                                     \u0027protocol\u0027]),"},{"line_number":2929,"context_line":"                             sorted(os_federation.keys()))"},{"line_number":2930,"context_line":""},{"line_number":2931,"context_line":"    def load_fixtures(self, fixtures):"},{"line_number":2932,"context_line":"        super(FernetFederatedTokenTests, self).load_fixtures(fixtures)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_34163659","line":2929,"in_reply_to":"3a50d1a3_63918df0","updated":"2015-07-30 10:04:10.000000000","message":"I will do that.\nHowever, the goal of this test was also making sure  there are only \u0027groups, identity_provider, protocol\u0027 keys and nothing more.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"686e2a489f1d47734e88edfab21371cd072ac525","unresolved":false,"context_lines":[{"line_number":2911,"context_line":""},{"line_number":2912,"context_line":"    def _check_scoped_token_attributes(self, token):"},{"line_number":2913,"context_line":"        def project_xor_domain(token_keys):"},{"line_number":2914,"context_line":"            return (\u0027project\u0027 in token_keys) ^ (\u0027domain\u0027 in token_keys)"},{"line_number":2915,"context_line":""},{"line_number":2916,"context_line":"        for key in (\u0027user\u0027, \u0027catalog\u0027, \u0027expires_at\u0027, \u0027issued_at\u0027,"},{"line_number":2917,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_61080281","line":2914,"updated":"2015-08-03 07:45:14.000000000","message":"nice use of ^","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":2918,"context_line":"            self.assertIn(key, token)"},{"line_number":2919,"context_line":"        # Check for either project or domain"},{"line_number":2920,"context_line":"        self.assertTrue(project_xor_domain(token.keys()),"},{"line_number":2921,"context_line":"                        \"You must specify either a project or a domain\")"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"        self.assertIn(\u0027OS-FEDERATION\u0027, token[\u0027user\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_7681248f","line":2920,"updated":"2015-08-03 21:47:50.000000000","message":"the caller should know whether it\u0027s domain or project or neither and tell this function which is expected. Tests shouldn\u0027t work when the code is wrong (e.g., if domain is there when project is supposed to be).","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"                    \u0027methods\u0027, \u0027roles\u0027):"},{"line_number":2918,"context_line":"            self.assertIn(key, token)"},{"line_number":2919,"context_line":"        # Check for either project or domain"},{"line_number":2920,"context_line":"        self.assertTrue(project_xor_domain(token.keys()),"},{"line_number":2921,"context_line":"                        \"You must specify either a project or a domain\")"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"        self.assertIn(\u0027OS-FEDERATION\u0027, token[\u0027user\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b4879260","line":2920,"in_reply_to":"1a4dcd0f_7681248f","updated":"2015-08-04 08:11:13.000000000","message":"actually since we already put groups in both unscoped and scoped tokens we can use implementation of FederatedSetupMixin._check_scoped_token_attributes .\n\nAnd all suggested fixes should be proposed in a separate patch.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":2920,"context_line":"        self.assertTrue(project_xor_domain(token.keys()),"},{"line_number":2921,"context_line":"                        \"You must specify either a project or a domain\")"},{"line_number":2922,"context_line":""},{"line_number":2923,"context_line":"        self.assertIn(\u0027OS-FEDERATION\u0027, token[\u0027user\u0027])"},{"line_number":2924,"context_line":"        os_federation \u003d token[\u0027user\u0027][\u0027OS-FEDERATION\u0027]"},{"line_number":2925,"context_line":"        self.assertIn(\u0027groups\u0027, os_federation)"},{"line_number":2926,"context_line":"        self.assertIn(\u0027identity_provider\u0027, os_federation)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_21ffd802","line":2923,"updated":"2015-08-03 21:47:50.000000000","message":"this is unnecessary since the next line will fail with an exception if there\u0027s no OS-FEDERATION.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":2925,"context_line":"        self.assertIn(\u0027groups\u0027, os_federation)"},{"line_number":2926,"context_line":"        self.assertIn(\u0027identity_provider\u0027, os_federation)"},{"line_number":2927,"context_line":"        self.assertIn(\u0027protocol\u0027, os_federation)"},{"line_number":2928,"context_line":"        self.assertEqual(3, len(os_federation))"},{"line_number":2929,"context_line":""},{"line_number":2930,"context_line":"        self.assertEqual(self.IDP, os_federation[\u0027identity_provider\u0027][\u0027id\u0027])"},{"line_number":2931,"context_line":"        self.assertEqual(self.PROTOCOL, os_federation[\u0027protocol\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_56366804","line":2928,"updated":"2015-08-03 21:47:50.000000000","message":"suggest use HasLength matcher since it can print nicer output.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"}],"keystone/tests/unit/token/test_fernet_provider.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self.assertEqual(exp_expires_at, expires_at)"},{"line_number":359,"context_line":"        self.assertEqual(exp_audit_ids, audit_ids)"},{"line_number":360,"context_line":"        self.assertEqual(exp_federated_info[\u0027group_ids\u0027][0][\u0027id\u0027],"},{"line_number":361,"context_line":"                         federated_info[\u0027group_ids\u0027][0][\u0027id\u0027])"},{"line_number":362,"context_line":"        self.assertEqual(exp_federated_info[\u0027idp_id\u0027],"},{"line_number":363,"context_line":"                         federated_info[\u0027idp_id\u0027])"},{"line_number":364,"context_line":"        self.assertEqual(exp_federated_info[\u0027protocol_id\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_21883822","line":361,"updated":"2015-08-03 21:47:50.000000000","message":"This should be\n\n self.assertEqual(exp_federated_info[\u0027group_ids\u0027], federated_info[\u0027group_ids\u0027])\n\nsince it will validate more (like the # of group_ids).\n\n(Same applies in copy-pasted code below in test_federated_domain_scoped_payload)","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self.assertEqual(exp_expires_at, expires_at)"},{"line_number":359,"context_line":"        self.assertEqual(exp_audit_ids, audit_ids)"},{"line_number":360,"context_line":"        self.assertEqual(exp_federated_info[\u0027group_ids\u0027][0][\u0027id\u0027],"},{"line_number":361,"context_line":"                         federated_info[\u0027group_ids\u0027][0][\u0027id\u0027])"},{"line_number":362,"context_line":"        self.assertEqual(exp_federated_info[\u0027idp_id\u0027],"},{"line_number":363,"context_line":"                         federated_info[\u0027idp_id\u0027])"},{"line_number":364,"context_line":"        self.assertEqual(exp_federated_info[\u0027protocol_id\u0027],"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b46312b1","line":361,"in_reply_to":"1a4dcd0f_21883822","updated":"2015-08-04 08:11:13.000000000","message":"Done","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9c3cd4ec5d3b58f1f6909d26444c20e92eacd143","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self.assertEqual(exp_project_id, project_id)"},{"line_number":359,"context_line":"        self.assertEqual(exp_expires_at, expires_at)"},{"line_number":360,"context_line":"        self.assertEqual(exp_audit_ids, audit_ids)"},{"line_number":361,"context_line":"        self.assertEqual(exp_federated_info[\u0027group_ids\u0027],"},{"line_number":362,"context_line":"                         federated_info[\u0027group_ids\u0027])"},{"line_number":363,"context_line":"        self.assertEqual(exp_federated_info[\u0027idp_id\u0027],"},{"line_number":364,"context_line":"                         federated_info[\u0027idp_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_61c02f2b","line":361,"updated":"2015-08-19 01:46:18.000000000","message":"can you just do:\n\nself.assertDictEqual(exp_federated_info, federated_info)\n\nor is something else stashed in there when being disassembled?","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9c76eef621cd745a91fc05dabb8bd5cb9c6b534b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        self.assertEqual(exp_project_id, project_id)"},{"line_number":359,"context_line":"        self.assertEqual(exp_expires_at, expires_at)"},{"line_number":360,"context_line":"        self.assertEqual(exp_audit_ids, audit_ids)"},{"line_number":361,"context_line":"        self.assertEqual(exp_federated_info[\u0027group_ids\u0027],"},{"line_number":362,"context_line":"                         federated_info[\u0027group_ids\u0027])"},{"line_number":363,"context_line":"        self.assertEqual(exp_federated_info[\u0027idp_id\u0027],"},{"line_number":364,"context_line":"                         federated_info[\u0027idp_id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_378eabd0","line":361,"in_reply_to":"fa1b9901_61c02f2b","updated":"2015-08-25 11:53:59.000000000","message":"i changed is to assertDictEqual (same for domain_scoped_payload below).","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"}],"keystone/token/providers/fernet/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5815a0cf7d8c7ca6f5d498cb38e817b4197038d7","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":121,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":122,"context_line":"            return federated_dict"},{"line_number":123,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":124,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":125,"context_line":"            return federated_dict"},{"line_number":126,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_94695228","line":123,"updated":"2015-07-16 15:55:03.000000000","message":"This needs to be revisited. This, as it stands now, will attempt to build a federated_dict with an idp of None and a protocol of None because of lines 105 and 107. We need to have a better way of determining if we\u0027re dealing with a federated context or not. \n\nBecause those values are there and the fact that they are None will cause this all to fail in the token_formatters.","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"989d8cd21f5afc40e5f359da11c004272eae19d6","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":121,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":122,"context_line":"            return federated_dict"},{"line_number":123,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":124,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":125,"context_line":"            return federated_dict"},{"line_number":126,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_ab3bd437","line":123,"in_reply_to":"9a41bdd9_94695228","updated":"2015-07-16 16:28:35.000000000","message":"Done","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4072783e8a616912258688777ef5b2bd4900db95","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            return federated_dict"},{"line_number":123,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":124,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":125,"context_line":"            return federated_dict"},{"line_number":126,"context_line":"        return None"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _rebuild_federated_info(self, federated_dict, user_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_f37a6623","line":125,"updated":"2015-07-15 20:37:51.000000000","message":"we need to go through this same process in _rebuild_federated_info()","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"989d8cd21f5afc40e5f359da11c004272eae19d6","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            return federated_dict"},{"line_number":123,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":124,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":125,"context_line":"            return federated_dict"},{"line_number":126,"context_line":"        return None"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _rebuild_federated_info(self, federated_dict, user_id):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_4b4808cd","line":125,"in_reply_to":"9a41bdd9_f37a6623","updated":"2015-07-16 16:28:35.000000000","message":"Done","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d8baf8f49e3459acb8f03cce70187a197615e098","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        protocol_id \u003d token_data[\u0027token\u0027].get(\u0027user\u0027, {}).get("},{"line_number":108,"context_line":"            federation.FEDERATION, {}).get(\u0027protocol\u0027, {}).get(\u0027id\u0027)"},{"line_number":109,"context_line":"        if not group_ids:"},{"line_number":110,"context_line":"            group_ids \u003d list()"},{"line_number":111,"context_line":"        if group_ids:"},{"line_number":112,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":113,"context_line":"                                  protocol_id\u003dprotocol_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_8bc4c35f","side":"PARENT","line":110,"updated":"2015-07-16 21:39:42.000000000","message":"this should have been .get(\u0027groups\u0027, list()) in L104 above previously","commit_id":"673776e6103b925e5a5f62e6f802a2de3cf2105a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d8baf8f49e3459acb8f03cce70187a197615e098","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # information, token validation will fail when validating a"},{"line_number":117,"context_line":"        # FederatedDomainScopedPayload or a FederatedProjectScopedPayload"},{"line_number":118,"context_line":"        # because the user won\u0027t have the proper roles."},{"line_number":119,"context_line":"        if group_ids and not (project_id or domain_id):"},{"line_number":120,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":121,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":122,"context_line":"            return federated_dict"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_aba2e798","line":119,"updated":"2015-07-16 21:39:42.000000000","message":"what if the list of group_ids is empty and it\u0027s an unscoped token? then idp_id and protocol_id are discarded just because the user wasn\u0027t mapped into anything and we return None","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ffd487945fc44b9da5c71d86a6645579dd371a75","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # information, token validation will fail when validating a"},{"line_number":117,"context_line":"        # FederatedDomainScopedPayload or a FederatedProjectScopedPayload"},{"line_number":118,"context_line":"        # because the user won\u0027t have the proper roles."},{"line_number":119,"context_line":"        if group_ids and not (project_id or domain_id):"},{"line_number":120,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":121,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":122,"context_line":"            return federated_dict"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_8274acfd","line":119,"in_reply_to":"9a41bdd9_5ed50db7","updated":"2015-07-20 07:27:51.000000000","message":"correct, empty group_ids should result in Unauthorized() exception.","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"31c5c668b34423be6d951d8c356f077fdbb89d09","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        # information, token validation will fail when validating a"},{"line_number":117,"context_line":"        # FederatedDomainScopedPayload or a FederatedProjectScopedPayload"},{"line_number":118,"context_line":"        # because the user won\u0027t have the proper roles."},{"line_number":119,"context_line":"        if group_ids and not (project_id or domain_id):"},{"line_number":120,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":121,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":122,"context_line":"            return federated_dict"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_5ed50db7","line":119,"in_reply_to":"9a41bdd9_aba2e798","updated":"2015-07-17 04:15:39.000000000","message":"So, in that case do we raise an exception since there not a whole lot we can do for the user? I believe we require group IDs for unscoped federated tokens to work, right?","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d8baf8f49e3459acb8f03cce70187a197615e098","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            # federated_dict *if* we know we have an idp_id and a protocol_id."},{"line_number":126,"context_line":"            # Otherwise we\u0027re just dealing with a non-federated scoped token of"},{"line_number":127,"context_line":"            # some kind."},{"line_number":128,"context_line":"            if idp_id and protocol_id:"},{"line_number":129,"context_line":"                federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":130,"context_line":"                return federated_dict"},{"line_number":131,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_8bc0432c","line":128,"updated":"2015-07-16 21:39:42.000000000","message":"it seems like this should be the first check before any of the scope stuff.\n\n  if not (idp_id and protocol_id): return None","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"31c5c668b34423be6d951d8c356f077fdbb89d09","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            # federated_dict *if* we know we have an idp_id and a protocol_id."},{"line_number":126,"context_line":"            # Otherwise we\u0027re just dealing with a non-federated scoped token of"},{"line_number":127,"context_line":"            # some kind."},{"line_number":128,"context_line":"            if idp_id and protocol_id:"},{"line_number":129,"context_line":"                federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":130,"context_line":"                return federated_dict"},{"line_number":131,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_9ec075e2","line":128,"in_reply_to":"9a41bdd9_8bc0432c","updated":"2015-07-17 04:15:39.000000000","message":"Done","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d8baf8f49e3459acb8f03cce70187a197615e098","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        V3TokenDataHelper."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027)"},{"line_number":144,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":145,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":146,"context_line":"        federated_info \u003d dict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_0b02f36f","line":143,"updated":"2015-07-16 21:39:42.000000000","message":"if you\u0027re going to do .get(), provide a default of an empty list at least?","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"31c5c668b34423be6d951d8c356f077fdbb89d09","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        V3TokenDataHelper."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027)"},{"line_number":144,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":145,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":146,"context_line":"        federated_info \u003d dict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_5ebaed6f","line":143,"in_reply_to":"9a41bdd9_0b02f36f","updated":"2015-07-17 04:15:39.000000000","message":"Done","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"ffd487945fc44b9da5c71d86a6645579dd371a75","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027)"},{"line_number":144,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":145,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":146,"context_line":"        federated_info \u003d dict()"},{"line_number":147,"context_line":"        if g_ids:"},{"line_number":148,"context_line":"            federated_info[\u0027groups\u0027] \u003d g_ids"},{"line_number":149,"context_line":"        federated_info[\u0027identity_provider\u0027] \u003d dict(id\u003didp_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_02d65cc5","line":146,"updated":"2015-07-20 07:27:51.000000000","message":"replace dict() with {} ?","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d8baf8f49e3459acb8f03cce70187a197615e098","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":145,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":146,"context_line":"        federated_info \u003d dict()"},{"line_number":147,"context_line":"        if g_ids:"},{"line_number":148,"context_line":"            federated_info[\u0027groups\u0027] \u003d g_ids"},{"line_number":149,"context_line":"        federated_info[\u0027identity_provider\u0027] \u003d dict(id\u003didp_id)"},{"line_number":150,"context_line":"        federated_info[\u0027protocol\u0027] \u003d dict(id\u003dprotocol_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_eb330f61","line":147,"updated":"2015-07-16 21:39:42.000000000","message":"if you have an empty list of groups, does this need to be conditional?","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"31c5c668b34423be6d951d8c356f077fdbb89d09","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":145,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":146,"context_line":"        federated_info \u003d dict()"},{"line_number":147,"context_line":"        if g_ids:"},{"line_number":148,"context_line":"            federated_info[\u0027groups\u0027] \u003d g_ids"},{"line_number":149,"context_line":"        federated_info[\u0027identity_provider\u0027] \u003d dict(id\u003didp_id)"},{"line_number":150,"context_line":"        federated_info[\u0027protocol\u0027] \u003d dict(id\u003dprotocol_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_a103de0c","line":147,"in_reply_to":"9a41bdd9_eb330f61","updated":"2015-07-17 04:15:39.000000000","message":"When we have project or domain scoped federated tokens, groups are not included in the response. The groups are only returned in the response when we are getting an unscoped federated token. \n\nI believe if we remove the conditional here we will be exposing groups for all federated token responses (unscoped, domain-scoped, and project-scoped), even if it is just an empty list, which isn\u0027t what we do today. I think Marek has a follow on patch for asserting group IDs in responses where we expect an unscoped federated token and vice versa for project and domain scoped federated tokens.","commit_id":"913554e9103fa889615bf25b278ec59e011b0eee"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9b2f60dc5a4fa27d81ca1ab81c00529d2369bcb6","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            federation_constants.FEDERATION, {}).get(\u0027protocol\u0027, {}).get(\u0027id\u0027)"},{"line_number":110,"context_line":"        # If we don\u0027t have an identity provider ID and a protocol ID, it\u0027s safe"},{"line_number":111,"context_line":"        # to assume we aren\u0027t dealing with a federated token."},{"line_number":112,"context_line":"        if not (idp_id and protocol_id):"},{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        project_id \u003d token_data[\u0027token\u0027].get(\u0027project\u0027, {}).get(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_dccf2954","line":112,"updated":"2015-07-23 13:42:42.000000000","message":"why didn\u0027t we consider domain_id here?","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d165d52f33a89059a5756f493b6cd63d768aae36","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            federation_constants.FEDERATION, {}).get(\u0027protocol\u0027, {}).get(\u0027id\u0027)"},{"line_number":110,"context_line":"        # If we don\u0027t have an identity provider ID and a protocol ID, it\u0027s safe"},{"line_number":111,"context_line":"        # to assume we aren\u0027t dealing with a federated token."},{"line_number":112,"context_line":"        if not (idp_id and protocol_id):"},{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        project_id \u003d token_data[\u0027token\u0027].get(\u0027project\u0027, {}).get(\u0027id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_5bac0335","line":112,"in_reply_to":"3a50d1a3_dccf2954","updated":"2015-07-27 09:25:08.000000000","message":"lol, misread protocol_id as project_id...:(","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9b2f60dc5a4fa27d81ca1ab81c00529d2369bcb6","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":127,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":128,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":129,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":130,"context_line":"        return federated_dict"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _rebuild_federated_info(self, federated_dict, user_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_1ce911b7","line":129,"updated":"2015-07-23 13:42:42.000000000","message":"you forgot to pass domain_id. \nI wonder whether we should also make sure domain_id XOR project_id \u003d\u003d 1, so we pass only one value, not two.\n\nhow about inline function:\n\ndef xor(project_id\u003dNone, domain_id\u003dNone):\n     if sum([project_id, domain_id]) % 2 !\u003d 1:\n         raise exception.ValidationError(\u0027please scope to one\u0027)","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d165d52f33a89059a5756f493b6cd63d768aae36","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            federated_dict \u003d dict(group_ids\u003dgroup_ids, idp_id\u003didp_id,"},{"line_number":127,"context_line":"                                  protocol_id\u003dprotocol_id)"},{"line_number":128,"context_line":"        elif not group_ids and (project_id or domain_id):"},{"line_number":129,"context_line":"            federated_dict \u003d dict(idp_id\u003didp_id, protocol_id\u003dprotocol_id)"},{"line_number":130,"context_line":"        return federated_dict"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _rebuild_federated_info(self, federated_dict, user_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_fbaaaf18","line":129,"in_reply_to":"3a50d1a3_1ce911b7","updated":"2015-07-27 09:25:08.000000000","message":"lol, misread protocol_id as project_id...:(","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9b2f60dc5a4fa27d81ca1ab81c00529d2369bcb6","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027, [])"},{"line_number":143,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":144,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":145,"context_line":"        federated_info \u003d dict()"},{"line_number":146,"context_line":"        if g_ids:"},{"line_number":147,"context_line":"            federated_info[\u0027groups\u0027] \u003d g_ids"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_3c15ed9a","line":144,"updated":"2015-07-23 13:42:42.000000000","message":"what about domain_id ?","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d165d52f33a89059a5756f493b6cd63d768aae36","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        \"\"\""},{"line_number":142,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027, [])"},{"line_number":143,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":144,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":145,"context_line":"        federated_info \u003d dict()"},{"line_number":146,"context_line":"        if g_ids:"},{"line_number":147,"context_line":"            federated_info[\u0027groups\u0027] \u003d g_ids"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a50d1a3_1ba67b53","line":144,"in_reply_to":"3a50d1a3_3c15ed9a","updated":"2015-07-27 09:25:08.000000000","message":"lol, misread protocol_id as project_id...:(","commit_id":"49a61ad810b89f68550d7e51bd4920f0250dc54b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE(marek-denis): No matter whether it\u0027s unscoped or scoped token -"},{"line_number":116,"context_line":"        # always pass group ids. This is an exception, but group id\u0027s are"},{"line_number":117,"context_line":"        # needed for building set of roles on a (groups, project/domain) pair,"},{"line_number":118,"context_line":"        # hence they are needed also in the validation phase."},{"line_number":119,"context_line":"        federated_dict \u003d {\u0027group_ids\u0027: group_ids, \u0027idp_id\u0027: idp_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_de06361b","line":116,"updated":"2015-07-29 16:24:21.000000000","message":"why is this an \"exception\"? the rest of the sentence is a good explanation, but the \"This is an exception, but\" doesn\u0027t seem necessary.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # NOTE(marek-denis): No matter whether it\u0027s unscoped or scoped token -"},{"line_number":116,"context_line":"        # always pass group ids. This is an exception, but group id\u0027s are"},{"line_number":117,"context_line":"        # needed for building set of roles on a (groups, project/domain) pair,"},{"line_number":118,"context_line":"        # hence they are needed also in the validation phase."},{"line_number":119,"context_line":"        federated_dict \u003d {\u0027group_ids\u0027: group_ids, \u0027idp_id\u0027: idp_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_9715cce6","line":116,"in_reply_to":"3a50d1a3_de06361b","updated":"2015-07-30 10:04:10.000000000","message":"with regard of https://review.openstack.org/#/c/207167 this comment is redundant. So i will remove it.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        V3TokenDataHelper."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027, [])"},{"line_number":134,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":135,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":136,"context_line":"        federated_info \u003d dict()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_1e76dea3","line":133,"updated":"2015-07-29 16:24:21.000000000","message":"why would group IDs be missing from the federated dict? the .get() seems needlessly defensive, or indicative of a bug somewhere else if it\u0027s actually necessary here.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        V3TokenDataHelper."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        g_ids \u003d federated_dict.get(\u0027group_ids\u0027, [])"},{"line_number":134,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":135,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":136,"context_line":"        federated_info \u003d dict()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_f7b3f098","line":133,"in_reply_to":"3a50d1a3_1e76dea3","updated":"2015-07-30 10:04:10.000000000","message":"i reverted to d[] format.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        federated_info[\u0027identity_provider\u0027] \u003d dict(id\u003didp_id)"},{"line_number":139,"context_line":"        federated_info[\u0027protocol\u0027] \u003d dict(id\u003dprotocol_id)"},{"line_number":140,"context_line":"        token_dict \u003d {\u0027user\u0027:"},{"line_number":141,"context_line":"                      {federation_constants.FEDERATION: federated_info}}"},{"line_number":142,"context_line":"        token_dict[\u0027user\u0027][\u0027id\u0027] \u003d user_id"},{"line_number":143,"context_line":"        token_dict[\u0027user\u0027][\u0027name\u0027] \u003d user_id"},{"line_number":144,"context_line":"        return token_dict"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_beda4a76","line":141,"updated":"2015-07-29 16:24:21.000000000","message":"changing the method of instantiating dicts from one line to the next is distracting. stick with either dict() or {}\n\nit seems like all of this could be easier to read as a single return statement with a big dictionary, rather than a bunch of smaller steps","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        federated_info[\u0027identity_provider\u0027] \u003d dict(id\u003didp_id)"},{"line_number":139,"context_line":"        federated_info[\u0027protocol\u0027] \u003d dict(id\u003dprotocol_id)"},{"line_number":140,"context_line":"        token_dict \u003d {\u0027user\u0027:"},{"line_number":141,"context_line":"                      {federation_constants.FEDERATION: federated_info}}"},{"line_number":142,"context_line":"        token_dict[\u0027user\u0027][\u0027id\u0027] \u003d user_id"},{"line_number":143,"context_line":"        token_dict[\u0027user\u0027][\u0027name\u0027] \u003d user_id"},{"line_number":144,"context_line":"        return token_dict"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_a2cc488b","line":141,"in_reply_to":"3a50d1a3_beda4a76","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _rebuild_federated_token_roles(self, federated_dict, user_id,"},{"line_number":147,"context_line":"                                       project_id, domain_id):"},{"line_number":148,"context_line":"        \"\"\"Populate roles based on (groups,project/domain) pair."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        This is required as \u0027classic\u0027 workflow tries to do this basing on"},{"line_number":151,"context_line":"        (existing user,project/domain) pair and will fail in case of ephemeral"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_1e07beca","line":148,"updated":"2015-07-29 16:24:21.000000000","message":"missing a space after the comma","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _rebuild_federated_token_roles(self, federated_dict, user_id,"},{"line_number":147,"context_line":"                                       project_id, domain_id):"},{"line_number":148,"context_line":"        \"\"\"Populate roles based on (groups,project/domain) pair."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        This is required as \u0027classic\u0027 workflow tries to do this basing on"},{"line_number":151,"context_line":"        (existing user,project/domain) pair and will fail in case of ephemeral"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_d7ab541d","line":148,"in_reply_to":"3a50d1a3_1e07beca","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        \"\"\"Populate roles based on (groups,project/domain) pair."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        This is required as \u0027classic\u0027 workflow tries to do this basing on"},{"line_number":151,"context_line":"        (existing user,project/domain) pair and will fail in case of ephemeral"},{"line_number":152,"context_line":"        users."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_fe58d2fa","line":151,"updated":"2015-07-29 16:24:21.000000000","message":"missing a space after the comma. also, please don\u0027t invent unnecessary terminology (\u0027classic\u0027 workflow). Instead, try to be specific about what\u0027s going on.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        \"\"\"Populate roles based on (groups,project/domain) pair."},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        This is required as \u0027classic\u0027 workflow tries to do this basing on"},{"line_number":151,"context_line":"        (existing user,project/domain) pair and will fail in case of ephemeral"},{"line_number":152,"context_line":"        users."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_c2bf14fb","line":151,"in_reply_to":"3a50d1a3_fe58d2fa","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            federated_info\u003dself._build_federated_info(token_data)"},{"line_number":243,"context_line":"        )"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def _handle_mapped_tokens(self, auth_context, project_id, domain_id):"},{"line_number":246,"context_line":"        token_data \u003d super(Provider, self)._handle_mapped_tokens(auth_context,"},{"line_number":247,"context_line":"                                                                 project_id,"},{"line_number":248,"context_line":"                                                                 domain_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_1e91fe46","line":245,"updated":"2015-07-29 16:24:21.000000000","message":"it would be worth explaining why you need to extend the parent mathod in a docstr","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":242,"context_line":"            federated_info\u003dself._build_federated_info(token_data)"},{"line_number":243,"context_line":"        )"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    def _handle_mapped_tokens(self, auth_context, project_id, domain_id):"},{"line_number":246,"context_line":"        token_data \u003d super(Provider, self)._handle_mapped_tokens(auth_context,"},{"line_number":247,"context_line":"                                                                 project_id,"},{"line_number":248,"context_line":"                                                                 domain_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_17445c19","line":245,"in_reply_to":"3a50d1a3_1e91fe46","updated":"2015-07-30 10:04:10.000000000","message":"the method is going to be removed with regard of depending patch https://review.openstack.org/#/c/207167","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ee39071a3f10e4b10510d7db5c8f34eec4a95ef9","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                \u0027name\u0027: user_id"},{"line_number":144,"context_line":"            }"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return token_dict"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _rebuild_federated_token_roles(self, federated_dict, user_id,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_9597e839","line":146,"updated":"2015-07-30 20:03:24.000000000","message":"this is way easier to read now, thanks","commit_id":"7caccacf6c81241fea25174dfb09eecd4a6c5690"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"51cbeb3fd5fe3065441238f0e070255fe44d38bc","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        :param domain_id: domain ID the token is being scoped to"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        :returns: dictionary with set of roles assigned for user\u0027s groups as"},{"line_number":163,"context_line":"            well project or domain"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_43a98323","line":163,"updated":"2015-07-31 15:10:57.000000000","message":"(out of scope, as we\u0027re not using it yet, but) I\u0027d be curious what dstanek\u0027s pypi/typist expects for null returns...\n\n  :returns: None\n\nMaybe?","commit_id":"7caccacf6c81241fea25174dfb09eecd4a6c5690"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ee39071a3f10e4b10510d7db5c8f34eec4a95ef9","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"},{"line_number":167,"context_line":"        roles \u003d self.v3_token_data_helper._populate_roles_for_groups("},{"line_number":168,"context_line":"            group_ids, project_id, domain_id, user_id)"},{"line_number":169,"context_line":"        return {\u0027roles\u0027: roles}"},{"line_number":170,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_b538e43e","line":167,"updated":"2015-07-30 20:03:24.000000000","message":"this shouldn\u0027t be a private method if we have to call into it from here","commit_id":"7caccacf6c81241fea25174dfb09eecd4a6c5690"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # If we don\u0027t have an identity provider ID and a protocol ID, it\u0027s safe"},{"line_number":111,"context_line":"        # to assume we aren\u0027t dealing with a federated token."},{"line_number":112,"context_line":"        if not (idp_id and protocol_id):"},{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return {\u0027group_ids\u0027: group_ids,"},{"line_number":116,"context_line":"                \u0027idp_id\u0027: idp_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_422b0283","line":113,"updated":"2015-08-03 21:47:50.000000000","message":"group_ids is unused if not (idp_id and protocol_id), so move initializing it below this check.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # If we don\u0027t have an identity provider ID and a protocol ID, it\u0027s safe"},{"line_number":111,"context_line":"        # to assume we aren\u0027t dealing with a federated token."},{"line_number":112,"context_line":"        if not (idp_id and protocol_id):"},{"line_number":113,"context_line":"            return None"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        return {\u0027group_ids\u0027: group_ids,"},{"line_number":116,"context_line":"                \u0027idp_id\u0027: idp_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b4d8f254","line":113,"in_reply_to":"1a4dcd0f_422b0283","updated":"2015-08-04 08:11:13.000000000","message":"done, but what is the purpose of that?","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"686e2a489f1d47734e88edfab21371cd072ac525","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        token_dict \u003d {"},{"line_number":140,"context_line":"            \u0027user\u0027: {"},{"line_number":141,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":142,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":143,"context_line":"                \u0027name\u0027: user_id"},{"line_number":144,"context_line":"            }"},{"line_number":145,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_81ff4e65","line":142,"updated":"2015-08-03 07:45:14.000000000","message":"shouldn\u0027t this be the url safe version of user name?","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":143,"context_line":"                \u0027name\u0027: user_id"},{"line_number":144,"context_line":"            }"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return token_dict"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_621abe19","line":145,"updated":"2015-08-03 21:47:50.000000000","message":"these changes are just switching from one way of creating dict to another so should be in a separate commit from the actual fix.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":143,"context_line":"                \u0027name\u0027: user_id"},{"line_number":144,"context_line":"            }"},{"line_number":145,"context_line":"        }"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return token_dict"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_68d36e39","line":145,"in_reply_to":"1a4dcd0f_621abe19","updated":"2015-08-04 08:11:13.000000000","message":"ok","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        \"\"\"Populate roles based on (groups, project/domain) pair."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        We must populate roles from (groups, project/domain) as ephemeral users"},{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_22ba76e2","line":154,"updated":"2015-08-03 21:47:50.000000000","message":"suggest change the name to token_dict_in_out since it\u0027s modified.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        \"\"\"Populate roles based on (groups, project/domain) pair."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        We must populate roles from (groups, project/domain) as ephemeral users"},{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_08a18a94","line":154,"in_reply_to":"1a4dcd0f_22ba76e2","updated":"2015-08-04 08:11:13.000000000","message":"naming is  consistent with other methods like https://github.com/openstack/keystone/blob/master/keystone/token/providers/common.py#L286 or https://github.com/openstack/keystone/blob/master/keystone/token/providers/common.py#L222 where token_data is also modified. Suggested to fix it collectively in a separate patch.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"09cf01c63ba79dd2738478f5b080a0081d26031b","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        We must populate roles from (groups, project/domain) as ephemeral users"},{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"},{"line_number":158,"context_line":"        :param federated_dict: federated information such as identity provider"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a50d1a3_0394dbe5","line":155,"updated":"2015-07-31 15:10:16.000000000","message":"nit:\n\n  Upon success, a ``roles`` key will be added to ``token_dict``.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        We must populate roles from (groups, project/domain) as ephemeral users"},{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"},{"line_number":158,"context_line":"        :param federated_dict: federated information such as identity provider"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a8c41640","line":155,"in_reply_to":"3a50d1a3_0394dbe5","updated":"2015-08-04 08:11:13.000000000","message":"Done","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"},{"line_number":158,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":159,"context_line":"            protocol and set of group IDs"},{"line_number":160,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_02b97ae9","line":157,"updated":"2015-08-03 21:47:50.000000000","message":"token_dict\n\nchange \"tokene\" to \"token\"","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        don\u0027t exist in the backend. Upon success argument ``token_dict`` will"},{"line_number":155,"context_line":"        be modified and a new key ``roles`` will be added."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :param token_data: dictionary with data used for building tokene"},{"line_number":158,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":159,"context_line":"            protocol and set of group IDs"},{"line_number":160,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_c8c16230","line":157,"in_reply_to":"1a4dcd0f_02b97ae9","updated":"2015-08-04 08:11:13.000000000","message":"Done","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc594aadc8610912a487483d9b111be97a347b9d","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \"\"\""},{"line_number":165,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"},{"line_number":166,"context_line":"        self.v3_token_data_helper.populate_roles_for_groups("},{"line_number":167,"context_line":"            token_dict, group_ids, project_id, domain_id, user_id)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def validate_v2_token(self, token_ref):"},{"line_number":170,"context_line":"        \"\"\"Validate a V2 formatted token."}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_29eee422","line":167,"updated":"2015-08-03 18:11:19.000000000","message":"Isn\u0027t this already done by the v3_data_helper in get_token_data?","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \"\"\""},{"line_number":165,"context_line":"        group_ids \u003d [x[\u0027id\u0027] for x in federated_dict[\u0027group_ids\u0027]]"},{"line_number":166,"context_line":"        self.v3_token_data_helper.populate_roles_for_groups("},{"line_number":167,"context_line":"            token_dict, group_ids, project_id, domain_id, user_id)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def validate_v2_token(self, token_ref):"},{"line_number":170,"context_line":"        \"\"\"Validate a V2 formatted token."}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_287c8671","line":167,"in_reply_to":"1a4dcd0f_29eee422","updated":"2015-08-04 08:11:13.000000000","message":"no, usually it\u0027s done by _handle_mapped_tokens()\nhttps://github.com/openstack/keystone/blob/master/keystone/token/providers/common.py#L556","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3a90a028a684a0aac771aaa4972833bcbbbfc75","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        g_ids \u003d federated_dict[\u0027group_ids\u0027]"},{"line_number":131,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":132,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        federated_info \u003d dict(groups\u003dg_ids,"},{"line_number":135,"context_line":"                              identity_provider\u003ddict(id\u003didp_id),"},{"line_number":136,"context_line":"                              protocol\u003ddict(id\u003dprotocol_id))"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_b4e3b1a3","line":133,"updated":"2015-08-05 15:31:43.000000000","message":"unrelated whitespace change, or just preference?","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"5e3221f147dc62820eb31979c5eb45a6cc56de1f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        g_ids \u003d federated_dict[\u0027group_ids\u0027]"},{"line_number":131,"context_line":"        idp_id \u003d federated_dict[\u0027idp_id\u0027]"},{"line_number":132,"context_line":"        protocol_id \u003d federated_dict[\u0027protocol_id\u0027]"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        federated_info \u003d dict(groups\u003dg_ids,"},{"line_number":135,"context_line":"                              identity_provider\u003ddict(id\u003didp_id),"},{"line_number":136,"context_line":"                              protocol\u003ddict(id\u003dprotocol_id))"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_204c0d9d","line":133,"in_reply_to":"1a4dcd0f_b4e3b1a3","updated":"2015-08-06 14:15:42.000000000","message":"unrelated.","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"98e198930392449785b0a2ce2c8ce3aa5ae5475c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        token_dict \u003d {"},{"line_number":138,"context_line":"            \u0027user\u0027: {"},{"line_number":139,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":140,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":141,"context_line":"                \u0027name\u0027: user_id"},{"line_number":142,"context_line":"            }"},{"line_number":143,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_433aaccd","line":140,"updated":"2015-08-05 18:16:52.000000000","message":"stevemar asked on patch set 16: shouldn\u0027t this be the url safe version of user name?","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"5e3221f147dc62820eb31979c5eb45a6cc56de1f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        token_dict \u003d {"},{"line_number":138,"context_line":"            \u0027user\u0027: {"},{"line_number":139,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":140,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":141,"context_line":"                \u0027name\u0027: user_id"},{"line_number":142,"context_line":"            }"},{"line_number":143,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_be76fad4","line":140,"in_reply_to":"1a4dcd0f_433aaccd","updated":"2015-08-06 14:15:42.000000000","message":"it\u0027s true, but i\u0027d invert it - user_name should be unquoted. as from the very beginning it\u0027s user_id that;s being treated with parse.quote(user_name) and from that point it\u0027s being used.","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"98e198930392449785b0a2ce2c8ce3aa5ae5475c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        don\u0027t exist in the backend. Upon success, a ``roles`` key will be added"},{"line_number":153,"context_line":"        to ``token_dict``."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        :param token_data: dictionary with data used for building token"},{"line_number":156,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":157,"context_line":"            protocol and set of group IDs"},{"line_number":158,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_0347c44b","line":155,"updated":"2015-08-05 18:16:52.000000000","message":"the parameter name is token_dict","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"5e3221f147dc62820eb31979c5eb45a6cc56de1f","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        don\u0027t exist in the backend. Upon success, a ``roles`` key will be added"},{"line_number":153,"context_line":"        to ``token_dict``."},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        :param token_data: dictionary with data used for building token"},{"line_number":156,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":157,"context_line":"            protocol and set of group IDs"},{"line_number":158,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a4dcd0f_2033ad15","line":155,"in_reply_to":"1a4dcd0f_0347c44b","updated":"2015-08-06 14:15:42.000000000","message":"Done","commit_id":"5bc3f11cd9afdc8701be266a394080cc3c494a67"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"075b37e3dbb1cb7ddd2677be4b236e0a5c6e8330","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        don\u0027t exist in the backend. Upon success, a ``roles`` key will be added"},{"line_number":154,"context_line":"        to ``token_dict``."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        :param token_data: dictionary with data used for building token"},{"line_number":157,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":158,"context_line":"            protocol and set of group IDs"},{"line_number":159,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_3b13c566","line":156,"updated":"2015-08-12 21:26:07.000000000","message":"this is still token_data","commit_id":"d00f92a878e8c3c3d3ad73f65f7253283fd4316b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ceb9bc598b1e41f467fd3c546854fa63e31ad092","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        don\u0027t exist in the backend. Upon success, a ``roles`` key will be added"},{"line_number":154,"context_line":"        to ``token_dict``."},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        :param token_data: dictionary with data used for building token"},{"line_number":157,"context_line":"        :param federated_dict: federated information such as identity provider"},{"line_number":158,"context_line":"            protocol and set of group IDs"},{"line_number":159,"context_line":"        :param user_id: user ID"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_302fe7f7","line":156,"in_reply_to":"1a4dcd0f_3b13c566","updated":"2015-08-18 23:36:46.000000000","message":"Done","commit_id":"d00f92a878e8c3c3d3ad73f65f7253283fd4316b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"9c3cd4ec5d3b58f1f6909d26444c20e92eacd143","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            \u0027user\u0027: {"},{"line_number":167,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":168,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":169,"context_line":"                \u0027name\u0027: parse.unquote(user_id)"},{"line_number":170,"context_line":"            }"},{"line_number":171,"context_line":"        }"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_c15a5b83","line":169,"updated":"2015-08-19 01:46:18.000000000","message":"Any reason you unquote here and not for the ID?","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b181bbe9fb80cd783ca1872fd646f2d2cbfee898","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            \u0027user\u0027: {"},{"line_number":167,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":168,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":169,"context_line":"                \u0027name\u0027: parse.unquote(user_id)"},{"line_number":170,"context_line":"            }"},{"line_number":171,"context_line":"        }"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_b6473dbb","line":169,"updated":"2015-08-19 19:46:25.000000000","message":"This at least needs a comment so that we know why this needs to be done. All the tests pass even without the unquote so a test also needs to be added.","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9c76eef621cd745a91fc05dabb8bd5cb9c6b534b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            \u0027user\u0027: {"},{"line_number":167,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":168,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":169,"context_line":"                \u0027name\u0027: parse.unquote(user_id)"},{"line_number":170,"context_line":"            }"},{"line_number":171,"context_line":"        }"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_9607af80","line":169,"in_reply_to":"fa1b9901_b6473dbb","updated":"2015-08-25 11:53:59.000000000","message":"i will fix in in the followup patch, as this probably qualifies for a separate bug.","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"9c76eef621cd745a91fc05dabb8bd5cb9c6b534b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            \u0027user\u0027: {"},{"line_number":167,"context_line":"                federation_constants.FEDERATION: federated_info,"},{"line_number":168,"context_line":"                \u0027id\u0027: user_id,"},{"line_number":169,"context_line":"                \u0027name\u0027: parse.unquote(user_id)"},{"line_number":170,"context_line":"            }"},{"line_number":171,"context_line":"        }"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"fa1b9901_126055ce","line":169,"in_reply_to":"fa1b9901_c15a5b83","updated":"2015-08-25 11:53:59.000000000","message":"in general id must be url-safe while name does not.","commit_id":"21d1fbc68844af4aea7bea2d96a5f6e4288f258d"}],"keystone/token/providers/fernet/token_formatters.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"734bd25ae977b30430dfd0e40a95334fee50627d","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        \"\"\""},{"line_number":685,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":686,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])p"},{"line_number":687,"context_line":"        domain_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[2])"},{"line_number":688,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":689,"context_line":"        protocol_id \u003d payload[4]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a41bdd9_8685e7cf","line":686,"updated":"2015-07-15 16:23:24.000000000","message":"trailing \u0027p\u0027?","commit_id":"3926125a730668e85368e4749a4ab30d2366821f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                trust_id)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"class FederatedPayload(BasePayload):"},{"line_number":502,"context_line":"    version \u003d 4"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_666c6308","side":"PARENT","line":501,"updated":"2015-07-15 16:30:46.000000000","message":"in a follow up, we should rename this to Unscoped","commit_id":"e517baf5f094570853056223627e62834325b10b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    @classmethod"},{"line_number":535,"context_line":"    def disassemble(cls, payload):"},{"line_number":536,"context_line":"        \"\"\"Validate a federated paylod."},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        :param token_string: a string representing the token"},{"line_number":539,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_c9530016","side":"PARENT","line":536,"updated":"2015-07-15 16:30:46.000000000","message":"guess this had a typo to begin with: https://review.openstack.org/#/c/202178/","commit_id":"e517baf5f094570853056223627e62834325b10b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                expires_at,"},{"line_number":117,"context_line":"                audit_ids,"},{"line_number":118,"context_line":"                trust_id)"},{"line_number":119,"context_line":"        elif project_id and federated_info:"},{"line_number":120,"context_line":"            version \u003d FederatedProjectScopedPayload.version"},{"line_number":121,"context_line":"            payload \u003d FederatedProjectScopedPayload.assemble("},{"line_number":122,"context_line":"                user_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_6659c38d","line":119,"updated":"2015-07-15 16:30:46.000000000","message":"conditionals look good","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        elif version \u003d\u003d FederatedPayload.version:"},{"line_number":215,"context_line":"            (user_id, methods, expires_at, audit_ids, federated_info) \u003d ("},{"line_number":216,"context_line":"                FederatedPayload.disassemble(payload))"},{"line_number":217,"context_line":"        elif version \u003d\u003d FederatedProjectScopedPayload:"},{"line_number":218,"context_line":"            (user_id, methods, project_id, expires_at, audit_ids,"},{"line_number":219,"context_line":"             federated_info) \u003d (FederatedProjectScopedPayload.disassemble("},{"line_number":220,"context_line":"                                    payload))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_a6ca6b19","line":217,"updated":"2015-07-15 16:30:46.000000000","message":"... Payload.version","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                FederatedPayload.disassemble(payload))"},{"line_number":217,"context_line":"        elif version \u003d\u003d FederatedProjectScopedPayload:"},{"line_number":218,"context_line":"            (user_id, methods, project_id, expires_at, audit_ids,"},{"line_number":219,"context_line":"             federated_info) \u003d (FederatedProjectScopedPayload.disassemble("},{"line_number":220,"context_line":"                                    payload))"},{"line_number":221,"context_line":"        elif version \u003d\u003d FederatedDomainScopedPayload:"},{"line_number":222,"context_line":"            (user_id, methods, domain_id, expires_at, audit_ids,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_268dfbd5","line":219,"updated":"2015-07-15 16:30:46.000000000","message":"nit: outer parens are unnecessary","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            (user_id, methods, project_id, expires_at, audit_ids,"},{"line_number":219,"context_line":"             federated_info) \u003d (FederatedProjectScopedPayload.disassemble("},{"line_number":220,"context_line":"                                    payload))"},{"line_number":221,"context_line":"        elif version \u003d\u003d FederatedDomainScopedPayload:"},{"line_number":222,"context_line":"            (user_id, methods, domain_id, expires_at, audit_ids,"},{"line_number":223,"context_line":"             federated_info) \u003d (FederatedDomainScopedPayload.disassemble("},{"line_number":224,"context_line":"                                    payload))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_86d3a7d4","line":221,"updated":"2015-07-15 16:30:46.000000000","message":"... Payload.version","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                                    payload))"},{"line_number":221,"context_line":"        elif version \u003d\u003d FederatedDomainScopedPayload:"},{"line_number":222,"context_line":"            (user_id, methods, domain_id, expires_at, audit_ids,"},{"line_number":223,"context_line":"             federated_info) \u003d (FederatedDomainScopedPayload.disassemble("},{"line_number":224,"context_line":"                                    payload))"},{"line_number":225,"context_line":"        else:"},{"line_number":226,"context_line":"            # If the token_format is not recognized, raise Unauthorized."}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_46883fc5","line":223,"updated":"2015-07-15 16:30:46.000000000","message":"nit: outer parens","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":590,"context_line":"    @classmethod"},{"line_number":591,"context_line":"    def assemble(cls, user_id, methods, project_id, expires_at, audit_ids,"},{"line_number":592,"context_line":"                 federated_info):"},{"line_number":593,"context_line":"        \"\"\"Assemble the payload of a federated token."},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        :param user_id: ID of the user in the token request"},{"line_number":596,"context_line":"        :param methods: list of authentication methods used"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_0601d705","line":593,"updated":"2015-07-15 16:30:46.000000000","message":"include \"project-scoped\"","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @classmethod"},{"line_number":620,"context_line":"    def disassemble(cls, payload):"},{"line_number":621,"context_line":"        \"\"\"Validate a federated paylod."},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        :param token_string: a string representing the token"},{"line_number":624,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_6611c35c","line":621,"updated":"2015-07-15 16:30:46.000000000","message":"include \"project-scoped\"\n\nspelling: payload*","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eb7bdb61e9d0cadd701100ef5949977044c8dd95","unresolved":false,"context_lines":[{"line_number":634,"context_line":"        protocol_id \u003d payload[4]"},{"line_number":635,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[5])"},{"line_number":636,"context_line":"        audit_ids \u003d list(map(provider.base64_encode, payload[6]))"},{"line_number":637,"context_line":"        federated_info \u003d dict(idp_id\u003didp_idp, protocol_id\u003dprotocol_id)"},{"line_number":638,"context_line":"        return (user_id, methods, project_id, expires_at_str, audit_ids,"},{"line_number":639,"context_line":"                federated_info)"},{"line_number":640,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_09d6c8f0","line":637,"updated":"2015-07-15 16:38:23.000000000","message":"idp_idp -\u003e idp_id","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":645,"context_line":"    @classmethod"},{"line_number":646,"context_line":"    def assemble(cls, user_id, methods, domain_id, expires_at, audit_ids,"},{"line_number":647,"context_line":"                 federated_info):"},{"line_number":648,"context_line":"        \"\"\"Assemble the payload of a federated token."},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        :param user_id: ID of the user in the token request"},{"line_number":651,"context_line":"        :param methods: list of authentication methods used"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_8922d8a1","line":648,"updated":"2015-07-15 16:30:46.000000000","message":"include \"domain-scoped\"","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    @classmethod"},{"line_number":675,"context_line":"    def disassemble(cls, payload):"},{"line_number":676,"context_line":"        \"\"\"Validate a federated paylod."},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        :param token_string: a string representing the token"},{"line_number":679,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_e93364f4","line":676,"updated":"2015-07-15 16:30:46.000000000","message":"include: \"domain-scoped\"\n\nspelling: payload*","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"90dfb9729e275956645f91f184d988bd4f289254","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        \"\"\""},{"line_number":685,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":686,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])p"},{"line_number":687,"context_line":"        domain_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[2])"},{"line_number":688,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":689,"context_line":"        protocol_id \u003d payload[4]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_26589b87","line":686,"updated":"2015-07-15 16:23:55.000000000","message":"trailing \u0027p\u0027?","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e593122f6bc647bff28c4b7968f2dbc043c45fbc","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        \"\"\""},{"line_number":685,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":686,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])p"},{"line_number":687,"context_line":"        domain_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[2])"},{"line_number":688,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":689,"context_line":"        protocol_id \u003d payload[4]"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_a9ec7c2a","line":686,"updated":"2015-07-15 16:30:46.000000000","message":"typo","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eb7bdb61e9d0cadd701100ef5949977044c8dd95","unresolved":false,"context_lines":[{"line_number":689,"context_line":"        protocol_id \u003d payload[4]"},{"line_number":690,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[5])"},{"line_number":691,"context_line":"        audit_ids \u003d list(map(provider.base64_encode, payload[6]))"},{"line_number":692,"context_line":"        federated_info \u003d dict(idp_id\u003didp_idp, protocol_id\u003dprotocol_id)"},{"line_number":693,"context_line":"        return (user_id, methods, domain_id, expires_at_str, audit_ids,"},{"line_number":694,"context_line":"                federated_info)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a41bdd9_69fd146d","line":692,"updated":"2015-07-15 16:38:23.000000000","message":"idp_idp -\u003e idp_id","commit_id":"4b2d5fe118949abade74f62642cb313478f6c166"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9e5f49775c0f39a891800b415f43a5f9b171faf1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            payload \u003d FederatedProjectScopedPayload.assemble("},{"line_number":122,"context_line":"                user_id,"},{"line_number":123,"context_line":"                methods,"},{"line_number":124,"context_line":"                project_id,"},{"line_number":125,"context_line":"                expires_at,"},{"line_number":126,"context_line":"                audit_ids,"},{"line_number":127,"context_line":"                federated_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_8833a9f5","line":124,"updated":"2015-07-15 20:11:33.000000000","message":"This doesn\u0027t seem to map to what the assemble methods returns.","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"989d8cd21f5afc40e5f359da11c004272eae19d6","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            payload \u003d FederatedProjectScopedPayload.assemble("},{"line_number":122,"context_line":"                user_id,"},{"line_number":123,"context_line":"                methods,"},{"line_number":124,"context_line":"                project_id,"},{"line_number":125,"context_line":"                expires_at,"},{"line_number":126,"context_line":"                audit_ids,"},{"line_number":127,"context_line":"                federated_info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_4b1fa8b7","line":124,"in_reply_to":"9a41bdd9_8833a9f5","updated":"2015-07-16 16:28:35.000000000","message":"disregard... I confused myself...","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9e5f49775c0f39a891800b415f43a5f9b171faf1","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif domain_id and federated_info:"},{"line_number":129,"context_line":"            version \u003d FederatedDomainScopedPayload.version"},{"line_number":130,"context_line":"            payload \u003d FederatedDomainScopedPayload.assemble("},{"line_number":131,"context_line":"                user_id,"},{"line_number":132,"context_line":"                methods,"},{"line_number":133,"context_line":"                domain_id,"},{"line_number":134,"context_line":"                expires_at,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_4877e19f","line":131,"updated":"2015-07-15 20:11:33.000000000","message":"same comment here","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"989d8cd21f5afc40e5f359da11c004272eae19d6","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        elif domain_id and federated_info:"},{"line_number":129,"context_line":"            version \u003d FederatedDomainScopedPayload.version"},{"line_number":130,"context_line":"            payload \u003d FederatedDomainScopedPayload.assemble("},{"line_number":131,"context_line":"                user_id,"},{"line_number":132,"context_line":"                methods,"},{"line_number":133,"context_line":"                domain_id,"},{"line_number":134,"context_line":"                expires_at,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a41bdd9_cb8178c5","line":131,"in_reply_to":"9a41bdd9_4877e19f","updated":"2015-07-16 16:28:35.000000000","message":"ditto to being confused...","commit_id":"135e40275c106d924d546ead93d9608025758b12"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    version \u003d 4"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    @classmethod"},{"line_number":531,"context_line":"    def pack_group_ids(cls, group_dict):"},{"line_number":532,"context_line":"        return cls.attempt_convert_uuid_hex_to_bytes(group_dict[\u0027id\u0027])"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_3ee2bad5","line":531,"updated":"2015-07-29 16:24:21.000000000","message":"i know you didn\u0027t name it, but this method name should not be plural -- it\u0027s only handling a single group ID.","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    version \u003d 4"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"    @classmethod"},{"line_number":531,"context_line":"    def pack_group_ids(cls, group_dict):"},{"line_number":532,"context_line":"        return cls.attempt_convert_uuid_hex_to_bytes(group_dict[\u0027id\u0027])"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_e27fb015","line":531,"in_reply_to":"3a50d1a3_3ee2bad5","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        return cls.attempt_convert_uuid_hex_to_bytes(group_dict[\u0027id\u0027])"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    @classmethod"},{"line_number":535,"context_line":"    def unpack_group_ids(cls, group_id_in_bytes):"},{"line_number":536,"context_line":"        group_id \u003d cls.attempt_convert_uuid_bytes_to_hex(group_id_in_bytes)"},{"line_number":537,"context_line":"        return {\u0027id\u0027: group_id}"},{"line_number":538,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_fee772e0","line":535,"updated":"2015-07-29 16:24:21.000000000","message":"same","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        return cls.attempt_convert_uuid_hex_to_bytes(group_dict[\u0027id\u0027])"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    @classmethod"},{"line_number":535,"context_line":"    def unpack_group_ids(cls, group_id_in_bytes):"},{"line_number":536,"context_line":"        group_id \u003d cls.attempt_convert_uuid_bytes_to_hex(group_id_in_bytes)"},{"line_number":537,"context_line":"        return {\u0027id\u0027: group_id}"},{"line_number":538,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_0285fc05","line":535,"in_reply_to":"3a50d1a3_fee772e0","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        b_audit_ids \u003d list(map(provider.random_urlsafe_str_to_bytes,"},{"line_number":620,"context_line":"                               audit_ids))"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"        return (b_user_id, methods, b_group_ids, b_project_id, b_idp_id,"},{"line_number":623,"context_line":"                protocol_id, expires_at_int, b_audit_ids)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_5e56a62a","line":622,"updated":"2015-07-29 16:24:21.000000000","message":"super nit! the order of elements in the tuple is inconsistent when compared to the other payload formats, which makes any sort of refactoring later on that much more challenging. the only change i would make is to swap the order of group IDs and the project ID so that it\u0027s:\n\n  user ID, methods, project ID, group IDs, IDP ID, ...","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        b_audit_ids \u003d list(map(provider.random_urlsafe_str_to_bytes,"},{"line_number":620,"context_line":"                               audit_ids))"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"        return (b_user_id, methods, b_group_ids, b_project_id, b_idp_id,"},{"line_number":623,"context_line":"                protocol_id, expires_at_int, b_audit_ids)"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_e23810f1","line":622,"in_reply_to":"3a50d1a3_5e56a62a","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":637,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])"},{"line_number":638,"context_line":"        group_ids \u003d list(map(cls.unpack_group_ids, payload[2]))"},{"line_number":639,"context_line":"        project_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":640,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[4])"},{"line_number":641,"context_line":"        protocol_id \u003d payload[5]"},{"line_number":642,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[6])"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_5e2d46a6","line":639,"updated":"2015-07-29 16:24:21.000000000","message":"the above will affect L638 and L639 of course","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":637,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])"},{"line_number":638,"context_line":"        group_ids \u003d list(map(cls.unpack_group_ids, payload[2]))"},{"line_number":639,"context_line":"        project_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":640,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[4])"},{"line_number":641,"context_line":"        protocol_id \u003d payload[5]"},{"line_number":642,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[6])"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_023e5cda","line":639,"in_reply_to":"3a50d1a3_5e2d46a6","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        methods \u003d auth_plugins.convert_method_list_to_integer(methods)"},{"line_number":674,"context_line":"        b_group_ids \u003d list(map(cls.pack_group_ids,"},{"line_number":675,"context_line":"                               federated_info[\u0027group_ids\u0027]))"},{"line_number":676,"context_line":"        b_domain_id \u003d cls.attempt_convert_uuid_hex_to_bytes(domain_id)"},{"line_number":677,"context_line":"        b_idp_id \u003d cls.attempt_convert_uuid_hex_to_bytes("},{"line_number":678,"context_line":"            federated_info[\u0027idp_id\u0027])"},{"line_number":679,"context_line":"        protocol_id \u003d federated_info[\u0027protocol_id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_de0f1637","line":676,"updated":"2015-07-29 16:24:21.000000000","message":"same","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        methods \u003d auth_plugins.convert_method_list_to_integer(methods)"},{"line_number":674,"context_line":"        b_group_ids \u003d list(map(cls.pack_group_ids,"},{"line_number":675,"context_line":"                               federated_info[\u0027group_ids\u0027]))"},{"line_number":676,"context_line":"        b_domain_id \u003d cls.attempt_convert_uuid_hex_to_bytes(domain_id)"},{"line_number":677,"context_line":"        b_idp_id \u003d cls.attempt_convert_uuid_hex_to_bytes("},{"line_number":678,"context_line":"            federated_info[\u0027idp_id\u0027])"},{"line_number":679,"context_line":"        protocol_id \u003d federated_info[\u0027protocol_id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_c22074b3","line":676,"in_reply_to":"3a50d1a3_de0f1637","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":682,"context_line":"                               audit_ids))"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        return (b_user_id, methods, b_group_ids, b_domain_id, b_idp_id,"},{"line_number":685,"context_line":"                protocol_id, expires_at_int, b_audit_ids)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    @classmethod"},{"line_number":688,"context_line":"    def disassemble(cls, payload):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_de3876f0","line":685,"updated":"2015-07-29 16:24:21.000000000","message":"same as above, swap domain ID with group IDs","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":682,"context_line":"                               audit_ids))"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"        return (b_user_id, methods, b_group_ids, b_domain_id, b_idp_id,"},{"line_number":685,"context_line":"                protocol_id, expires_at_int, b_audit_ids)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"    @classmethod"},{"line_number":688,"context_line":"    def disassemble(cls, payload):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_622de0a7","line":685,"in_reply_to":"3a50d1a3_de3876f0","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"42e4a540a43ff902b6a6a6624c974a44825c3304","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":699,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])"},{"line_number":700,"context_line":"        group_ids \u003d list(map(cls.unpack_group_ids, payload[2]))"},{"line_number":701,"context_line":"        domain_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":702,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[4])"},{"line_number":703,"context_line":"        protocol_id \u003d payload[5]"},{"line_number":704,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[6])"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_fe121260","line":701,"updated":"2015-07-29 16:24:21.000000000","message":"same","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"193753b598b179c33b47aacc66b860f92c78784d","unresolved":false,"context_lines":[{"line_number":698,"context_line":"        user_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[0])"},{"line_number":699,"context_line":"        methods \u003d auth_plugins.convert_integer_to_method_list(payload[1])"},{"line_number":700,"context_line":"        group_ids \u003d list(map(cls.unpack_group_ids, payload[2]))"},{"line_number":701,"context_line":"        domain_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[3])"},{"line_number":702,"context_line":"        idp_id \u003d cls.attempt_convert_uuid_bytes_to_hex(payload[4])"},{"line_number":703,"context_line":"        protocol_id \u003d payload[5]"},{"line_number":704,"context_line":"        expires_at_str \u003d cls._convert_int_to_time_string(payload[6])"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a50d1a3_822a6c8f","line":701,"in_reply_to":"3a50d1a3_fe121260","updated":"2015-07-30 10:04:10.000000000","message":"Done","commit_id":"9919755259bf02877ec9dbb792d949c6dfe9d894"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ee39071a3f10e4b10510d7db5c8f34eec4a95ef9","unresolved":false,"context_lines":[{"line_number":529,"context_line":"    version \u003d 4"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    @classmethod"},{"line_number":532,"context_line":"    def pack_group_id(cls, group_dict):"},{"line_number":533,"context_line":"        return cls.attempt_convert_uuid_hex_to_bytes(group_dict[\u0027id\u0027])"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_75fedc39","line":532,"updated":"2015-07-30 20:03:24.000000000","message":"Now that this is a class method, it\u0027s not using the term \"pack\" like \"pack()\" and \"unpack()\" are, so it\u0027s sort of breaking conventions, but I\u0027m not sure what to suggest as a better name.\n\nI\u0027m also tempted to suggest replacing both of these with lambdas, since they do so little work, but it might make more sense to move the list(map()) bits into this as well, since that ends up being duplicated repeatedly as well.","commit_id":"7caccacf6c81241fea25174dfb09eecd4a6c5690"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc594aadc8610912a487483d9b111be97a347b9d","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        \"\"\"Validate a project-scoped federated payload."},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"        :param token_string: a string representing the token"},{"line_number":631,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and a"},{"line_number":632,"context_line":"                 dictionary containing federated information such as the the"},{"line_number":633,"context_line":"                 identity provider ID, the protocol ID, the federated domain ID"},{"line_number":634,"context_line":"                 and group IDs"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_293ca492","line":631,"updated":"2015-08-03 18:11:19.000000000","message":"nit: missing project id in the return doc string.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        \"\"\"Validate a project-scoped federated payload."},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"        :param token_string: a string representing the token"},{"line_number":631,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and a"},{"line_number":632,"context_line":"                 dictionary containing federated information such as the the"},{"line_number":633,"context_line":"                 identity provider ID, the protocol ID, the federated domain ID"},{"line_number":634,"context_line":"                 and group IDs"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_08cf4a57","line":631,"in_reply_to":"1a4dcd0f_293ca492","updated":"2015-08-04 08:11:13.000000000","message":"i have redone lots of the code.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45710acce9c02771e970bbf9b4e8df22b1bbff49","unresolved":false,"context_lines":[{"line_number":648,"context_line":"                federated_info)"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"class FederatedDomainScopedPayload(FederatedPayload):"},{"line_number":652,"context_line":"    version \u003d 6"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a2268614","line":651,"updated":"2015-08-03 21:47:50.000000000","message":"lots of copy-pasting, suggest provide a base class or functions and override for the difference.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":648,"context_line":"                federated_info)"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"class FederatedDomainScopedPayload(FederatedPayload):"},{"line_number":652,"context_line":"    version \u003d 6"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b4e232d4","line":651,"in_reply_to":"1a4dcd0f_a2268614","updated":"2015-08-04 08:11:13.000000000","message":"ok","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fc594aadc8610912a487483d9b111be97a347b9d","unresolved":false,"context_lines":[{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        :param token_string: a string representing the token"},{"line_number":690,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and"},{"line_number":691,"context_line":"                 a dictionary containing federated information such as the the"},{"line_number":692,"context_line":"                 group IDs, the identity provider ID, the protocol ID, and the"},{"line_number":693,"context_line":"                 federated domain ID"},{"line_number":694,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_495570c4","line":691,"updated":"2015-08-03 18:11:19.000000000","message":"nit: same comment as above, but w.r.t. the domain id that the token is being scoped to.","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cabe1cccf9c99ec7a0b0fc706ed8b519030a41fc","unresolved":false,"context_lines":[{"line_number":688,"context_line":""},{"line_number":689,"context_line":"        :param token_string: a string representing the token"},{"line_number":690,"context_line":"        :return: a tuple containing the user_id, auth methods, audit_ids, and"},{"line_number":691,"context_line":"                 a dictionary containing federated information such as the the"},{"line_number":692,"context_line":"                 group IDs, the identity provider ID, the protocol ID, and the"},{"line_number":693,"context_line":"                 federated domain ID"},{"line_number":694,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_08f66a8f","line":691,"in_reply_to":"1a4dcd0f_495570c4","updated":"2015-08-04 08:11:13.000000000","message":"i ve removed lots of the code","commit_id":"48bf2d23885695c290151b9fe587a7edd1e413af"}]}
