)]}'
{"etc/policy.json":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"identity:validate_token\": [[\"rule:admin_required\"]],"},{"line_number":71,"context_line":"    \"identity:revocation_list\": [[\"rule:admin_required\"]],"},{"line_number":72,"context_line":"    \"identity:revoke_token\": [[\"rule:admin_required\"], [\"user_id:%(user_id)s\"]],"},{"line_number":73,"context_line":"    "},{"line_number":74,"context_line":"    \"identity:create_trust\": [[\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":75,"context_line":"    \"identity:get_trust\": [[\"rule:admin_required\"], [\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":76,"context_line":"    \"identity:list_trusts\": [[\"@\"]],"}],"source_content_type":"application/json","patch_set":45,"id":"AAAANH%2F%2F%2FY8%3D","line":73,"updated":"2013-02-28 07:39:01.000000000","message":"Spaces at EOL","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \"identity:validate_token\": [[\"rule:admin_required\"]],"},{"line_number":71,"context_line":"    \"identity:revocation_list\": [[\"rule:admin_required\"]],"},{"line_number":72,"context_line":"    \"identity:revoke_token\": [[\"rule:admin_required\"], [\"user_id:%(user_id)s\"]],"},{"line_number":73,"context_line":"    "},{"line_number":74,"context_line":"    \"identity:create_trust\": [[\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":75,"context_line":"    \"identity:get_trust\": [[\"rule:admin_required\"], [\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":76,"context_line":"    \"identity:list_trusts\": [[\"@\"]],"}],"source_content_type":"application/json","patch_set":45,"id":"AAAANH%2F%2F%2BXQ%3D","line":73,"in_reply_to":"AAAANH%2F%2F%2FY8%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cbc7855a1e1850fca6b24fc48e1d166282723be6","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    \"identity:get_project\": [[\"rule:admin_required\"]],"},{"line_number":24,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"]],"},{"line_number":25,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"], [\"user_id:%(trustee_user_id)s\"], [\"user_id:%(trustor_user_id)s\"]],"},{"line_number":26,"context_line":"    \"identity:create_project\": [[\"rule:admin_required\"]],"},{"line_number":27,"context_line":"    \"identity:update_project\": [[\"rule:admin_required\"]],"},{"line_number":28,"context_line":"    \"identity:delete_project\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":51,"id":"AAAAN3%2F%2F%2FyI%3D","line":25,"updated":"2013-03-04 03:46:25.000000000","message":", [\"user_id:%(user_id)s\"]\n\nI would think user can still list projects with a regular token instead of a trust token.","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"93ce35760446f04b544e74d9ce76ae1dd1bdef90","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    \"identity:get_project\": [[\"rule:admin_required\"]],"},{"line_number":24,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"]],"},{"line_number":25,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"], [\"user_id:%(trustee_user_id)s\"], [\"user_id:%(trustor_user_id)s\"]],"},{"line_number":26,"context_line":"    \"identity:create_project\": [[\"rule:admin_required\"]],"},{"line_number":27,"context_line":"    \"identity:update_project\": [[\"rule:admin_required\"]],"},{"line_number":28,"context_line":"    \"identity:delete_project\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":51,"id":"AAAAN3%2F%2F%2FaQ%3D","line":25,"in_reply_to":"AAAAN3%2F%2F%2FyI%3D","updated":"2013-03-04 15:08:02.000000000","message":"Done","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cbc7855a1e1850fca6b24fc48e1d166282723be6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    \"identity:list_roles_for_trust\": [[\"@\"]],"},{"line_number":78,"context_line":"    \"identity:check_role_for_trust\": [[\"@\"]],"},{"line_number":79,"context_line":"    \"identity:get_role_for_trust\": [[\"@\"]],"},{"line_number":80,"context_line":"    \"identity:xxlist_trusts\": [[\"rule:admin_required\"],"},{"line_number":81,"context_line":"                             [\"user_id:%(trust.trustor_user_id)s\"],"},{"line_number":82,"context_line":"                             [\"user_id:%(trust.trustee_user_id)s\"]],"},{"line_number":83,"context_line":"    \"identity:delete_trust\": [[\"@\"]]"}],"source_content_type":"application/json","patch_set":51,"id":"AAAAN3%2F%2F%2FyE%3D","line":80,"updated":"2013-03-04 03:46:25.000000000","message":"xxlist_trusts? that intentional?","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"93ce35760446f04b544e74d9ce76ae1dd1bdef90","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    \"identity:list_roles_for_trust\": [[\"@\"]],"},{"line_number":78,"context_line":"    \"identity:check_role_for_trust\": [[\"@\"]],"},{"line_number":79,"context_line":"    \"identity:get_role_for_trust\": [[\"@\"]],"},{"line_number":80,"context_line":"    \"identity:xxlist_trusts\": [[\"rule:admin_required\"],"},{"line_number":81,"context_line":"                             [\"user_id:%(trust.trustor_user_id)s\"],"},{"line_number":82,"context_line":"                             [\"user_id:%(trust.trustee_user_id)s\"]],"},{"line_number":83,"context_line":"    \"identity:delete_trust\": [[\"@\"]]"}],"source_content_type":"application/json","patch_set":51,"id":"AAAAN3%2F%2F%2FSM%3D","line":80,"in_reply_to":"AAAAN3%2F%2F%2FyE%3D","updated":"2013-03-04 15:08:02.000000000","message":"Nope","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f637e8e6d88c0e3968c236513d14e27453033d5f","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    \"identity:get_project\": [[\"rule:admin_required\"]],"},{"line_number":23,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"]],"},{"line_number":24,"context_line":"    \"identity:list_user_projects\": [[\"rule:admin_required\"], [\"user_id:%(user_id)s\"]],"},{"line_number":25,"context_line":"    \"identity:create_project\": [[\"rule:admin_required\"]],"},{"line_number":26,"context_line":"    \"identity:update_project\": [[\"rule:admin_required\"]],"},{"line_number":27,"context_line":"    \"identity:delete_project\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8tg%3D","side":"PARENT","line":24,"updated":"2013-03-05 16:25:34.000000000","message":"you removed list_user_projects -- that\u0027s a valid entry","commit_id":"bab670290fe16c191591b94a9559b613de9b4033"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f637e8e6d88c0e3968c236513d14e27453033d5f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"admin_required\": [[\"role:admin\"], [\"is_admin:1\"]],"},{"line_number":3,"context_line":"\t\"owner\" : [[\"user_id:%(user_id)s\"]],"},{"line_number":4,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\"], [\"rule:owner\"]],"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8to%3D","line":3,"updated":"2013-03-05 16:25:34.000000000","message":"should be spaces, not a tab","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5c94ad52963119b5482f39f6bab56c4926f7705a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"admin_required\": [[\"role:admin\"], [\"is_admin:1\"]],"},{"line_number":3,"context_line":"\t\"owner\" : [[\"user_id:%(user_id)s\"]],"},{"line_number":4,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\"], [\"rule:owner\"]],"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8iM%3D","line":3,"in_reply_to":"AAAAN3%2F%2F8to%3D","updated":"2013-03-05 17:09:23.000000000","message":"Done","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f637e8e6d88c0e3968c236513d14e27453033d5f","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    \"identity:get_project\": [[\"rule:admin_required\"]],"},{"line_number":27,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"]],"},{"line_number":28,"context_line":"    \"identity:create_project\": [[\"rule:admin_or_owner\"]],"},{"line_number":29,"context_line":"    \"identity:update_project\": [[\"rule:admin_required\"]],"},{"line_number":30,"context_line":"    \"identity:delete_project\": [[\"rule:admin_required\"]],"},{"line_number":31,"context_line":""}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8s0%3D","line":28,"updated":"2013-03-05 16:25:34.000000000","message":"i don\u0027t understand this change -- what is the impact of allowing create project if user_id:%(user_id)s is true?","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5c94ad52963119b5482f39f6bab56c4926f7705a","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    \"identity:get_project\": [[\"rule:admin_required\"]],"},{"line_number":27,"context_line":"    \"identity:list_projects\": [[\"rule:admin_required\"]],"},{"line_number":28,"context_line":"    \"identity:create_project\": [[\"rule:admin_or_owner\"]],"},{"line_number":29,"context_line":"    \"identity:update_project\": [[\"rule:admin_required\"]],"},{"line_number":30,"context_line":"    \"identity:delete_project\": [[\"rule:admin_required\"]],"},{"line_number":31,"context_line":""}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8pg%3D","line":28,"in_reply_to":"AAAAN3%2F%2F8s0%3D","updated":"2013-03-05 17:09:23.000000000","message":"This is just an attempt to simplify the rule set.  It should be the same logic as before, just a common way to express it.\n\nRe-added list_user_projects","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f637e8e6d88c0e3968c236513d14e27453033d5f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    \"identity:create_trust\": [[\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":77,"context_line":"    \"identity:get_trust\": [[\"rule:admin_or_owner\"]],"},{"line_number":78,"context_line":"    \"identity:list_trusts\": [[\"@\"]],"},{"line_number":79,"context_line":"    \"identity:list_roles_for_trust\": [[\"@\"]],"},{"line_number":80,"context_line":"    \"identity:check_role_for_trust\": [[\"@\"]],"},{"line_number":81,"context_line":"    \"identity:get_role_for_trust\": [[\"@\"]],"}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8s4%3D","line":78,"updated":"2013-03-05 16:25:34.000000000","message":"what does @ do?","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5c94ad52963119b5482f39f6bab56c4926f7705a","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    \"identity:create_trust\": [[\"user_id:%(trust.trustor_user_id)s\"]],"},{"line_number":77,"context_line":"    \"identity:get_trust\": [[\"rule:admin_or_owner\"]],"},{"line_number":78,"context_line":"    \"identity:list_trusts\": [[\"@\"]],"},{"line_number":79,"context_line":"    \"identity:list_roles_for_trust\": [[\"@\"]],"},{"line_number":80,"context_line":"    \"identity:check_role_for_trust\": [[\"@\"]],"},{"line_number":81,"context_line":"    \"identity:get_role_for_trust\": [[\"@\"]],"}],"source_content_type":"application/json","patch_set":56,"id":"AAAAN3%2F%2F8pU%3D","line":78,"in_reply_to":"AAAAN3%2F%2F8s4%3D","updated":"2013-03-05 17:09:23.000000000","message":"It allows all.  There is insufficient data way to screen these, so it is done in code in the controller.  I want to have the place holder for screen them in place here.","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"}],"keystone/auth/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"35620b56593f790dcdfb9c66522d6017e655ccb9","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        if domain_id and trust:"},{"line_number":268,"context_line":"            msg \u003d _(\u0027Scoping to both domain and trust is not allowed\u0027)"},{"line_number":269,"context_line":"            raise ValueError(msg)"},{"line_number":270,"context_line":"        if proejct_id and trust:"},{"line_number":271,"context_line":"            msg \u003d _(\u0027Scoping to both project and trust is not allowed\u0027)"},{"line_number":272,"context_line":"            raise ValueError(msg)"},{"line_number":273,"context_line":"        self._scope_data \u003d (domain_id, project_id, trust)"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAM3%2F%2BmCY%3D","line":270,"updated":"2013-02-26 12:44:44.000000000","message":"typo on variable name","commit_id":"7194ce79d57e3edbebf63327c9a0bc6dc3a18790"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # if scoped, only to a project or domain, but not both"},{"line_number":180,"context_line":"        if (\u0027project\u0027 not in self.auth[\u0027scope\u0027] and"},{"line_number":181,"context_line":"                \u0027domain\u0027 not in self.auth[\u0027scope\u0027] and"},{"line_number":182,"context_line":"                \u0027trust\u0027 not in self.auth[\u0027scope\u0027]):"},{"line_number":183,"context_line":"            # neither domain or project provided"},{"line_number":184,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027project, domain,\u0027"},{"line_number":185,"context_line":"                                                      \u0027 or trust\u0027,"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk8Q%3D","line":182,"updated":"2013-02-26 23:36:22.000000000","message":"I would suggest changing this to something like\n\n    if sum([has_project, has_domain, has_trust]) !\u003d 1:","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                                                      \u0027 or trust\u0027,"},{"line_number":186,"context_line":"                                            target\u003d\u0027scope\u0027)"},{"line_number":187,"context_line":"        if (\u0027project\u0027 in self.auth[\u0027scope\u0027] and"},{"line_number":188,"context_line":"                \u0027domain\u0027 in self.auth[\u0027scope\u0027]):"},{"line_number":189,"context_line":"            # both domain and project provided"},{"line_number":190,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027project or domain\u0027,"},{"line_number":191,"context_line":"                                            target\u003d\u0027scope\u0027)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk8w%3D","line":188,"updated":"2013-02-26 23:36:22.000000000","message":"What if trust is provided with one of these?","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        if project_id and trust:"},{"line_number":271,"context_line":"            msg \u003d _(\u0027Scoping to both project and trust is not allowed\u0027)"},{"line_number":272,"context_line":"            raise ValueError(msg)"},{"line_number":273,"context_line":"        self._scope_data \u003d (domain_id, project_id, trust)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"class Auth(controller.V3Controller):"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk7k%3D","line":273,"updated":"2013-02-26 23:36:22.000000000","message":"Looks like self._scope_data can contain either ids or refs - is it intentional?","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cc142ac1feae1f1676ac399916db846811708f95","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        \"\"\" Validate and normalize scope data \"\"\""},{"line_number":176,"context_line":"        if \u0027scope\u0027 not in self.auth:"},{"line_number":177,"context_line":"            return"},{"line_number":178,"context_line":"        sum \u003d 0"},{"line_number":179,"context_line":"        for scoped in [\u0027project\u0027, \u0027domain\u0027, \u0027trust\u0027]:"},{"line_number":180,"context_line":"            if scoped in self.auth[\u0027scope\u0027]:"},{"line_number":181,"context_line":"                sum +\u003d 1"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkSI%3D","line":178,"updated":"2013-02-27 05:46:18.000000000","message":"Builtin method override. Why don\u0027t use sum() function? True \u003d\u003d 1","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5abddff4dab39d3dd0c431f09b99527f043360d9","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        \"\"\" Validate and normalize scope data \"\"\""},{"line_number":176,"context_line":"        if \u0027scope\u0027 not in self.auth:"},{"line_number":177,"context_line":"            return"},{"line_number":178,"context_line":"        sum \u003d 0"},{"line_number":179,"context_line":"        for scoped in [\u0027project\u0027, \u0027domain\u0027, \u0027trust\u0027]:"},{"line_number":180,"context_line":"            if scoped in self.auth[\u0027scope\u0027]:"},{"line_number":181,"context_line":"                sum +\u003d 1"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAANH%2F%2F%2Fh4%3D","line":178,"in_reply_to":"AAAAM3%2F%2BkSI%3D","updated":"2013-02-28 04:54:05.000000000","message":"Done","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cbc7855a1e1850fca6b24fc48e1d166282723be6","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        return project_ref"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _lookup_trust(self, trust_info):"},{"line_number":143,"context_line":"        trust_id \u003d trust_info[\u0027id\u0027]"},{"line_number":144,"context_line":"        if not trust_id:"},{"line_number":145,"context_line":"            return None"},{"line_number":146,"context_line":"        trust \u003d self.trust_api.get_trust(self.context, trust_id)"}],"source_content_type":"text/x-python","patch_set":51,"id":"AAAAN3%2F%2F%2FyA%3D","line":143,"updated":"2013-03-04 03:46:25.000000000","message":"trust_info.get(\u0027id\u0027)","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"613496df574d8419612b95c84c91a0fce7c0b8ff","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            LOG.exception(e)"},{"line_number":320,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":321,"context_line":"        #This token was created with a trust."},{"line_number":322,"context_line":"        #This token cannot be used to get another token"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _build_remote_user_auth_context(self, context, auth_info,"},{"line_number":325,"context_line":"                                        auth_context):"}],"source_content_type":"text/x-python","patch_set":56,"id":"AAAAN3%2F%2F9jw%3D","line":322,"updated":"2013-03-05 06:49:45.000000000","message":"Are these lines meant to refer to the function above or below?  Seems like we either need a line break or different indentation (depending on your answer)","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5c94ad52963119b5482f39f6bab56c4926f7705a","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            LOG.exception(e)"},{"line_number":320,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":321,"context_line":"        #This token was created with a trust."},{"line_number":322,"context_line":"        #This token cannot be used to get another token"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _build_remote_user_auth_context(self, context, auth_info,"},{"line_number":325,"context_line":"                                        auth_context):"}],"source_content_type":"text/x-python","patch_set":56,"id":"AAAAN3%2F%2F8gA%3D","line":322,"in_reply_to":"AAAAN3%2F%2F9jw%3D","updated":"2013-03-05 17:09:23.000000000","message":"Done.  Was moved elsewhere, and comment needs to go away","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # self._scope_data is (domain_id, project_id, trust_id)"},{"line_number":72,"context_line":"        # project scope: (None, project_id, None)"},{"line_number":73,"context_line":"        # domain scope: (domain_id, None, None)"},{"line_number":74,"context_line":"        # trust scope: (None, None, trust_id)"},{"line_number":75,"context_line":"        # unscoped: (None, None)"},{"line_number":76,"context_line":"        self._validate_and_normalize_auth_data()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Yw%3D","line":74,"updated":"2013-03-05 18:10:07.000000000","message":"looking at line 199 \u0026 201\n\n a) can also have (None, project_id, trust_ref)\n b) should it be trust_ref and not trust_id?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        # project scope: (None, project_id, None)"},{"line_number":73,"context_line":"        # domain scope: (domain_id, None, None)"},{"line_number":74,"context_line":"        # trust scope: (None, None, trust_id)"},{"line_number":75,"context_line":"        # unscoped: (None, None)"},{"line_number":76,"context_line":"        self._validate_and_normalize_auth_data()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _assert_project_is_enabled(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Z4%3D","line":75,"updated":"2013-03-05 18:10:07.000000000","message":"(None, None) -\u003e (None, None, None)","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        return project_ref"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def _lookup_trust(self, trust_info):"},{"line_number":143,"context_line":"        trust_id \u003d trust_info[\u0027id\u0027]"},{"line_number":144,"context_line":"        if not trust_id:"},{"line_number":145,"context_line":"            return None"},{"line_number":146,"context_line":"        trust \u003d self.trust_api.get_trust(self.context, trust_id)"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Z0%3D","line":143,"updated":"2013-03-05 18:10:07.000000000","message":"if trust_info is allowed to have \u0027id\u0027 set to None, seems like it should also be allowed to not have \u0027id\u0027 set at all. (trust_info.get(\u0027id\u0027))","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            return None"},{"line_number":146,"context_line":"        trust \u003d self.trust_api.get_trust(self.context, trust_id)"},{"line_number":147,"context_line":"        if not trust:"},{"line_number":148,"context_line":"            raise exception.NotFound()"},{"line_number":149,"context_line":"        return trust"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def lookup_user(self, user_info):"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Zs%3D","line":148,"updated":"2013-03-05 18:10:07.000000000","message":"should be TrustNotFound?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        :returns: (domain_id, project_id). If scope to a project,"},{"line_number":255,"context_line":"                  (None, project_id) will be returned. If scope to a domain,"},{"line_number":256,"context_line":"                  (domain_id, None) will be returned. If unscope,"},{"line_number":257,"context_line":"                  (None, None) will be returned."},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        \"\"\""},{"line_number":260,"context_line":"        return self._scope_data"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8YY%3D","line":257,"updated":"2013-03-05 18:10:07.000000000","message":"Need to update this documentation.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            msg \u003d _(\u0027Scoping to both domain and trust is not allowed\u0027)"},{"line_number":269,"context_line":"            raise ValueError(msg)"},{"line_number":270,"context_line":"        if project_id and trust:"},{"line_number":271,"context_line":"            msg \u003d _(\u0027Scoping to both project and trust is not allowed\u0027)"},{"line_number":272,"context_line":"            raise ValueError(msg)"},{"line_number":273,"context_line":"        self._scope_data \u003d (domain_id, project_id, trust)"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Yk%3D","line":271,"updated":"2013-03-05 18:10:07.000000000","message":"at line 199, sets both project and trust, why is it allowed there and not here?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        try:"},{"line_number":284,"context_line":"            auth_info \u003d AuthInfo(context, auth\u003dauth)"},{"line_number":285,"context_line":"            auth_context \u003d {\u0027extras\u0027: {}, \u0027method_names\u0027: []}"},{"line_number":286,"context_line":"            #TODO check for trust information in old token."},{"line_number":287,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":288,"context_line":"            self._check_and_set_default_scoping(context, auth_info,"},{"line_number":289,"context_line":"                                                auth_context)"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8YU%3D","line":286,"updated":"2013-03-05 18:10:07.000000000","message":"TODO(ayoung)","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":304,"context_line":"        if trust:"},{"line_number":305,"context_line":"            project_id \u003d trust[\u0027project_id\u0027]"},{"line_number":306,"context_line":"        if domain_id or project_id or trust:"},{"line_number":307,"context_line":"            # scope is specified"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8YM%3D","line":306,"updated":"2013-03-05 18:10:07.000000000","message":"do we need to check \"or trust\" since just set project_id in previous line?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # self._scope_data is (domain_id, project_id, trust_ref)"},{"line_number":72,"context_line":"        # project scope: (None, project_id, None)"},{"line_number":73,"context_line":"        # domain scope: (domain_id, None, None)"},{"line_number":74,"context_line":"        # trust scope: (None, None, trust_id)"},{"line_number":75,"context_line":"        # unscoped: (None, None, None)"},{"line_number":76,"context_line":"        self._validate_and_normalize_auth_data()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8H0%3D","line":74,"updated":"2013-03-05 20:40:20.000000000","message":"trust_id -\u003e trust_ref.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                            target\u003d\u0027trust\u0027)"},{"line_number":147,"context_line":"        trust \u003d self.trust_api.get_trust(self.context, trust_id)"},{"line_number":148,"context_line":"        if not trust:"},{"line_number":149,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":150,"context_line":"        return trust"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def lookup_user(self, user_info):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GA%3D","line":149,"updated":"2013-03-05 20:40:20.000000000","message":"\"trust_id\" -\u003e \"trust_id\u003dtrust_id\"","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/auth/methods/token.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c0fbf7a5d2dcb427e26fdd028bdc6693d39cf54d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            user_context[\u0027method_names\u0027].extend("},{"line_number":48,"context_line":"                token_ref[\u0027token_data\u0027][\u0027token\u0027][\u0027methods\u0027])"},{"line_number":49,"context_line":"            if \u0027trust\u0027 in token_ref[\u0027token_data\u0027]:"},{"line_number":50,"context_line":"                user_context[\u0027trust\u0027] \u003d token_ref[\u0027trust\u0027]"},{"line_number":51,"context_line":"        except AssertionError as e:"},{"line_number":52,"context_line":"            LOG.error(e)"},{"line_number":53,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkT8%3D","line":50,"updated":"2013-02-27 05:03:17.000000000","message":"if this is a trust token you may want to just raise Unauthorized as only use case for token auth is re-scoping. Trust token can\u0027t be used for re-scoping.","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5abddff4dab39d3dd0c431f09b99527f043360d9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            user_context[\u0027method_names\u0027].extend("},{"line_number":48,"context_line":"                token_ref[\u0027token_data\u0027][\u0027token\u0027][\u0027methods\u0027])"},{"line_number":49,"context_line":"            if \u0027trust\u0027 in token_ref[\u0027token_data\u0027]:"},{"line_number":50,"context_line":"                user_context[\u0027trust\u0027] \u003d token_ref[\u0027trust\u0027]"},{"line_number":51,"context_line":"        except AssertionError as e:"},{"line_number":52,"context_line":"            LOG.error(e)"},{"line_number":53,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAANH%2F%2F%2Fjg%3D","line":50,"in_reply_to":"AAAAM3%2F%2BkT8%3D","updated":"2013-02-28 04:54:05.000000000","message":"Done","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            user_context[\u0027method_names\u0027].extend("},{"line_number":50,"context_line":"                token_ref[\u0027token_data\u0027][\u0027token\u0027][\u0027methods\u0027])"},{"line_number":51,"context_line":"            if \u0027trust\u0027 in token_ref[\u0027token_data\u0027]:"},{"line_number":52,"context_line":"                raise exception.Forbidden(e)"},{"line_number":53,"context_line":"        except AssertionError as e:"},{"line_number":54,"context_line":"            LOG.error(e)"},{"line_number":55,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8HQ%3D","line":52,"updated":"2013-03-05 20:40:20.000000000","message":"e isn\u0027t available here.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/auth/token_factory.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                                                  domain_id)"},{"line_number":52,"context_line":"        return {\u0027id\u0027: domain_ref[\u0027id\u0027], \u0027name\u0027: domain_ref[\u0027name\u0027]}"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id, trust):"},{"line_number":55,"context_line":"        if domain_id:"},{"line_number":56,"context_line":"            token_data[\u0027domain\u0027] \u003d self._get_filtered_domain(domain_id)"},{"line_number":57,"context_line":"        if project_id:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk7U%3D","line":54,"updated":"2013-02-26 23:36:22.000000000","message":"trust is not used here. If it\u0027s intentional, it should be prefixed with underscore.","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"},{"line_number":113,"context_line":"                raise exception.Unauthorized()"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            token_data[\u0027trust\u0027] \u003d ("},{"line_number":116,"context_line":"                {"},{"line_number":117,"context_line":"                    \u0027id\u0027: trust[\u0027id\u0027],"},{"line_number":118,"context_line":"                    \u0027trustor_user_id\u0027: trust[\u0027trustor_user_id\u0027],"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk5M%3D","line":115,"updated":"2013-02-26 23:36:22.000000000","message":"Shouldn\u0027t this be added in _populate_scope or separate _populate_trust method?","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    \u0027trustee_user_id\u0027: trust[\u0027trustee_user_id\u0027]"},{"line_number":120,"context_line":"                })"},{"line_number":121,"context_line":"        if trust and trust[\u0027impersonation\u0027]:"},{"line_number":122,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":123,"context_line":"        else:"},{"line_number":124,"context_line":"            token_user_id \u003d user_id"},{"line_number":125,"context_line":"        user_ref \u003d self.identity_api.get_user(self.context,"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk44%3D","line":122,"updated":"2013-02-26 23:36:22.000000000","message":"And\n\n    user_ref \u003d trustor_user_ref","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                                                  expires\u003d"},{"line_number":255,"context_line":"                                                  auth_context.get(\u0027expires\u0027,"},{"line_number":256,"context_line":"                                                                   None),"},{"line_number":257,"context_line":"                                                  trust\u003dtrust)"},{"line_number":258,"context_line":"    if CONF.signing.token_format \u003d\u003d \u0027UUID\u0027:"},{"line_number":259,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":260,"context_line":"    elif CONF.signing.token_format \u003d\u003d \u0027PKI\u0027:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk4o%3D","line":257,"updated":"2013-02-26 23:36:22.000000000","message":"Why use keyword arguments?","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cc142ac1feae1f1676ac399916db846811708f95","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                })"},{"line_number":121,"context_line":"        if trust and trust[\u0027impersonation\u0027]:"},{"line_number":122,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":123,"context_line":"            user_ref \u003d self.identity_api.get_user(self.context,"},{"line_number":124,"context_line":"                                                  token_user_id)"},{"line_number":125,"context_line":"        else:"},{"line_number":126,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkSE%3D","line":123,"updated":"2013-02-27 05:46:18.000000000","message":"We already fetched it it the beginning of previous if: block.","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5abddff4dab39d3dd0c431f09b99527f043360d9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                })"},{"line_number":121,"context_line":"        if trust and trust[\u0027impersonation\u0027]:"},{"line_number":122,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":123,"context_line":"            user_ref \u003d self.identity_api.get_user(self.context,"},{"line_number":124,"context_line":"                                                  token_user_id)"},{"line_number":125,"context_line":"        else:"},{"line_number":126,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAANH%2F%2F%2Fi8%3D","line":123,"in_reply_to":"AAAAM3%2F%2BkSE%3D","updated":"2013-02-28 04:54:05.000000000","message":"Done","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    \u0027trustee_user_id\u0027: trust[\u0027trustee_user_id\u0027]"},{"line_number":120,"context_line":"                })"},{"line_number":121,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":122,"context_line":"                token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":123,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FaY%3D","line":122,"updated":"2013-02-28 07:39:01.000000000","message":"Looks like token_user_id is not used anymore.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    \u0027trustee_user_id\u0027: trust[\u0027trustee_user_id\u0027]"},{"line_number":120,"context_line":"                })"},{"line_number":121,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":122,"context_line":"                token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":123,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BXA%3D","line":122,"in_reply_to":"AAAANH%2F%2F%2FaY%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                                                  project_id,"},{"line_number":247,"context_line":"                                                  expires\u003d"},{"line_number":248,"context_line":"                                                  auth_context.get(\u0027expires\u0027,"},{"line_number":249,"context_line":"                                                                   None),"},{"line_number":250,"context_line":"                                                  trust\u003dtrust)"},{"line_number":251,"context_line":"    if CONF.signing.token_format \u003d\u003d \u0027UUID\u0027:"},{"line_number":252,"context_line":"        token_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FaM%3D","line":249,"updated":"2013-02-28 07:39:01.000000000","message":"I think, keyword arguments here lower readablilty.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"613496df574d8419612b95c84c91a0fce7c0b8ff","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if trust:"},{"line_number":132,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":133,"context_line":"            token_project_id \u003d trust[\u0027project_id\u0027]"},{"line_number":134,"context_line":"            #tokens do not support domains yet"},{"line_number":135,"context_line":"            token_domain_id \u003d None"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":56,"id":"AAAAN3%2F%2F9jQ%3D","line":134,"updated":"2013-03-05 06:49:45.000000000","message":"nit...but technically I think you mean \"trust tokens do not support domains yet\"","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5c94ad52963119b5482f39f6bab56c4926f7705a","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        if trust:"},{"line_number":132,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":133,"context_line":"            token_project_id \u003d trust[\u0027project_id\u0027]"},{"line_number":134,"context_line":"            #tokens do not support domains yet"},{"line_number":135,"context_line":"            token_domain_id \u003d None"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            token_user_id \u003d user_id"}],"source_content_type":"text/x-python","patch_set":56,"id":"AAAAN3%2F%2F8fY%3D","line":134,"in_reply_to":"AAAAN3%2F%2F9jQ%3D","updated":"2013-03-05 17:09:23.000000000","message":"Done","commit_id":"f4d1e5226910573923d2edfade20c23f3a1a3267"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user(self.context,"},{"line_number":111,"context_line":"                                trust[\u0027trustor_user_id\u0027]))"},{"line_number":112,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"},{"line_number":113,"context_line":"                raise exception.Unauthorized()"},{"line_number":114,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":115,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":116,"context_line":"            token_data[\u0027trust\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Xs%3D","line":113,"updated":"2013-03-05 18:10:07.000000000","message":"Should this be Unauthorized or 403 Forbidden? (Unauthorized means that the user needs to log in: http://tools.ietf.org/html/rfc2616#section-10.4.2)","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            token_project_id \u003d project_id"},{"line_number":139,"context_line":"            token_domain_id \u003d domain_id"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        if domain_id or token_project_id:"},{"line_number":142,"context_line":"            roles \u003d self._get_roles_for_user(token_user_id,"},{"line_number":143,"context_line":"                                             token_domain_id,"},{"line_number":144,"context_line":"                                             token_project_id)"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8XI%3D","line":141,"updated":"2013-03-05 18:10:07.000000000","message":"should domain_id be token_domain_id? I don\u0027t see domain_id used in here.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                                   if x[\u0027id\u0027] \u003d\u003d trust_role[\u0027id\u0027]]"},{"line_number":150,"context_line":"                    if match_roles:"},{"line_number":151,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":152,"context_line":"                    else:"},{"line_number":153,"context_line":"                        raise exception.Unauthorized()"},{"line_number":154,"context_line":"            else:"},{"line_number":155,"context_line":"                for role in roles:"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8W0%3D","line":152,"updated":"2013-03-05 18:10:07.000000000","message":"might be useful to log something here.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    if match_roles:"},{"line_number":151,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":152,"context_line":"                    else:"},{"line_number":153,"context_line":"                        raise exception.Unauthorized()"},{"line_number":154,"context_line":"            else:"},{"line_number":155,"context_line":"                for role in roles:"},{"line_number":156,"context_line":"                    filtered_roles.append({\u0027id\u0027: role[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8XE%3D","line":153,"updated":"2013-03-05 18:10:07.000000000","message":"Forbidden?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        token_data \u003d {\u0027methods\u0027: method_names,"},{"line_number":187,"context_line":"                      \u0027extras\u0027: extras}"},{"line_number":188,"context_line":"        if trust:"},{"line_number":189,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":190,"context_line":"                raise exception.Unauthorized()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Wk%3D","line":189,"updated":"2013-03-05 18:10:07.000000000","message":"collapse nested if into single if / and","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                      \u0027extras\u0027: extras}"},{"line_number":188,"context_line":"        if trust:"},{"line_number":189,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":190,"context_line":"                raise exception.Unauthorized()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"},{"line_number":193,"context_line":"        self._populate_user(token_data, user_id, domain_id, project_id, trust)"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Ws%3D","line":190,"updated":"2013-03-05 18:10:07.000000000","message":"Forbidden?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    try:"},{"line_number":265,"context_line":"        expiry \u003d token_data[\u0027token\u0027][\u0027expires_at\u0027]"},{"line_number":266,"context_line":"        if isinstance(expiry, basestring):"},{"line_number":267,"context_line":"            expiry \u003d timeutils.normalize_time(timeutils.parse_isotime(expiry))"},{"line_number":268,"context_line":"        role_ids \u003d []"},{"line_number":269,"context_line":"        if \u0027project\u0027 in token_data[\u0027token\u0027]:"},{"line_number":270,"context_line":"            # project-scoped token, fill in the v2 token data"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8WI%3D","line":267,"updated":"2013-03-05 18:10:07.000000000","message":"seems to be fixing an unrelated problem.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"}],"keystone/common/controller.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f898970afe7b91b732409284348e539bb9808a1","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            for role in token_data[\u0027roles\u0027]:"},{"line_number":51,"context_line":"                creds[\u0027roles\u0027].append(role[\u0027name\u0027])"},{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        #v2 Tokens"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            token_ref \u003d self.token_api.get_token("},{"line_number":56,"context_line":"                context\u003dcontext, token_id\u003dcontext[\u0027token_id\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2BoTE%3D","line":53,"updated":"2013-02-25 08:37:08.000000000","message":"Thanks!","commit_id":"9de6c9c4cffcf8878a4821433da8fe4ccb55745d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f898970afe7b91b732409284348e539bb9808a1","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    else:"},{"line_number":53,"context_line":"        #v2 Tokens"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            token_ref \u003d self.token_api.get_token("},{"line_number":56,"context_line":"                context\u003dcontext, token_id\u003dcontext[\u0027token_id\u0027])"},{"line_number":57,"context_line":"        except exception.TokenNotFound:"},{"line_number":58,"context_line":"            LOG.warning(_(\u0027RBAC: Invalid token\u0027))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2BoTA%3D","line":55,"updated":"2013-02-25 08:37:08.000000000","message":"I think we already did this check before we came into the if clause, so no need to repeat.","commit_id":"9de6c9c4cffcf8878a4821433da8fe4ccb55745d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f898970afe7b91b732409284348e539bb9808a1","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            creds[\u0027user_id\u0027] \u003d token_ref[\u0027user\u0027].get(\u0027id\u0027)"},{"line_number":63,"context_line":"        except AttributeError:"},{"line_number":64,"context_line":"            LOG.warning(_(\u0027RBAC: Invalid user\u0027))"},{"line_number":65,"context_line":"            raise exception.Unauthorized()"},{"line_number":66,"context_line":"        # NOTE(vish): this is pretty inefficient"},{"line_number":67,"context_line":"        creds[\u0027roles\u0027] \u003d [self.identity_api.get_role(context, role)[\u0027name\u0027]"},{"line_number":68,"context_line":"                          for role in creds.get(\u0027roles\u0027, [])]"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2BoS4%3D","line":65,"updated":"2013-02-25 08:37:08.000000000","message":"Do we not also need to add in any project_id that is present (that would be in the v2 token as a tenant_id)?","commit_id":"9de6c9c4cffcf8878a4821433da8fe4ccb55745d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    return creds"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def flatten(d, parent_key\u003d\u0027\u0027):"},{"line_number":72,"context_line":"    items \u003d []"},{"line_number":73,"context_line":"    for k, v in d.items():"},{"line_number":74,"context_line":"        new_key \u003d parent_key + \u0027.\u0027 + k if parent_key else k"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2Bnb8%3D","line":71,"updated":"2013-02-25 18:44:41.000000000","message":"To separate change","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    target[key] \u003d kwargs[key]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                self.policy_api.enforce(context, creds, action,"},{"line_number":140,"context_line":"                                        flatten(target))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"                LOG.debug(_(\u0027RBAC: Authorization granted\u0027))"},{"line_number":143,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2Bnb0%3D","line":140,"updated":"2013-02-25 18:44:41.000000000","message":"Until here.","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                    target[key] \u003d kwargs[key]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"                self.policy_api.enforce(context, creds, action,"},{"line_number":140,"context_line":"                                        flatten(target))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"                LOG.debug(_(\u0027RBAC: Authorization granted\u0027))"},{"line_number":143,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnT8%3D","line":140,"in_reply_to":"AAAAM3%2F%2Bnb0%3D","updated":"2013-02-25 20:47:45.000000000","message":"Done","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"}],"keystone/common/models.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    \"\"\""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    required_keys \u003d (\u0027id\u0027, \u0027trustor_user_id\u0027, \u0027trustee_user_id\u0027, \u0027project_id\u0027)"},{"line_number":163,"context_line":"    optional_keys \u003d tuple(\u0027expires_at\u0027)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk4Y%3D","line":163,"updated":"2013-02-26 23:36:22.000000000","message":"Looks better:\n\n    (\u0027expires_at\u0027,)","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"}],"keystone/common/sql/core.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            expire_on_commit\u003dexpire_on_commit)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def handle_conflicts(type\u003d\u0027object\u0027):"},{"line_number":267,"context_line":"    \"\"\"Converts IntegrityError into HTTP 409 Conflict.\"\"\""},{"line_number":268,"context_line":"    def decorator(method):"},{"line_number":269,"context_line":"        @functools.wraps(method)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnbU%3D","line":266,"updated":"2013-02-25 18:44:41.000000000","message":"Moving this method out should go to separate change.","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            expire_on_commit\u003dexpire_on_commit)"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"def handle_conflicts(type\u003d\u0027object\u0027):"},{"line_number":267,"context_line":"    \"\"\"Converts IntegrityError into HTTP 409 Conflict.\"\"\""},{"line_number":268,"context_line":"    def decorator(method):"},{"line_number":269,"context_line":"        @functools.wraps(method)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnNw%3D","line":266,"in_reply_to":"AAAAM3%2F%2BnbU%3D","updated":"2013-02-25 20:47:45.000000000","message":"Done","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"}],"keystone/common/sql/migrate_repo/versions/018_add_trust_tables.py":[{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"ff1acd24a4e12f31e4d74660442738a27d44716b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":35,"context_line":"        sql.Column(\u0027trustor\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse,),"},{"line_number":36,"context_line":"        sql.Column(\u0027trustee\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027tenant_id\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse,),"},{"line_number":38,"context_line":"        sql.Column(\"enabled\", sql.types.Boolean),"},{"line_number":39,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":40,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3Wk%3D","line":37,"updated":"2013-02-16 02:09:58.000000000","message":"might want to just make this project_id instead...","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"92c3e72d87da6318cb1d732a662a783a098a66c3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":35,"context_line":"        sql.Column(\u0027trustor\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse,),"},{"line_number":36,"context_line":"        sql.Column(\u0027trustee\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027tenant_id\u0027, sql.String(64), unique\u003dFalse, nullable\u003dFalse,),"},{"line_number":38,"context_line":"        sql.Column(\"enabled\", sql.types.Boolean),"},{"line_number":39,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":40,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3UI%3D","line":37,"in_reply_to":"AAAAM3%2F%2B3Wk%3D","updated":"2013-02-16 02:26:28.000000000","message":"Done","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        sql.Column(\u0027trustor_user_id\u0027,"},{"line_number":36,"context_line":"                   sql.String(64),"},{"line_number":37,"context_line":"                   unique\u003dFalse,"},{"line_number":38,"context_line":"                   nullable\u003dFalse,),"},{"line_number":39,"context_line":"        sql.Column(\u0027trustee_user_id\u0027,"},{"line_number":40,"context_line":"                   sql.String(64),"},{"line_number":41,"context_line":"                   unique\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxRw%3D","line":38,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to user table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        sql.Column(\u0027trustor_user_id\u0027,"},{"line_number":36,"context_line":"                   sql.String(64),"},{"line_number":37,"context_line":"                   unique\u003dFalse,"},{"line_number":38,"context_line":"                   nullable\u003dFalse,),"},{"line_number":39,"context_line":"        sql.Column(\u0027trustee_user_id\u0027,"},{"line_number":40,"context_line":"                   sql.String(64),"},{"line_number":41,"context_line":"                   unique\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Bw7U%3D","line":38,"in_reply_to":"AAAAM3%2F%2BxRw%3D","updated":"2013-02-19 21:48:50.000000000","message":"Nope, as ID might be in a different back end","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sql.Column(\u0027trustee_user_id\u0027,"},{"line_number":40,"context_line":"                   sql.String(64),"},{"line_number":41,"context_line":"                   unique\u003dFalse,"},{"line_number":42,"context_line":"                   nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxR0%3D","line":42,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to user table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                   nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.types.Boolean),"},{"line_number":47,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":48,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxSE%3D","line":45,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to project table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.types.Boolean),"},{"line_number":47,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":48,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":49,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxSo%3D","line":47,"updated":"2013-02-19 17:32:54.000000000","message":"We have expires here, but not in the model?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.types.Boolean),"},{"line_number":47,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":48,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":49,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Bw7M%3D","line":47,"in_reply_to":"AAAAM3%2F%2BxSo%3D","updated":"2013-02-19 21:48:50.000000000","message":"updated the model","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027trust_role\u0027,"},{"line_number":53,"context_line":"        meta,"},{"line_number":54,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":55,"context_line":"                   nullable\u003dFalse),"},{"line_number":56,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":57,"context_line":"                   nullable\u003dFalse),"},{"line_number":58,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxSY%3D","line":55,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to trust table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":55,"context_line":"                   nullable\u003dFalse),"},{"line_number":56,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":57,"context_line":"                   nullable\u003dFalse),"},{"line_number":58,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":59,"context_line":"    trust_role_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxSM%3D","line":57,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to roles table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \u0027trust_endpoint\u0027,"},{"line_number":63,"context_line":"        meta,"},{"line_number":64,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":65,"context_line":"                   nullable\u003dFalse),"},{"line_number":66,"context_line":"        sql.Column(\u0027endpoint_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":67,"context_line":"                   nullable\u003dFalse),"},{"line_number":68,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxRo%3D","line":65,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to trust table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":65,"context_line":"                   nullable\u003dFalse),"},{"line_number":66,"context_line":"        sql.Column(\u0027endpoint_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":67,"context_line":"                   nullable\u003dFalse),"},{"line_number":68,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":69,"context_line":"    trust_endpoint_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxRk%3D","line":67,"updated":"2013-02-19 17:32:54.000000000","message":"foreign key to endpoint table here?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d9221809ed8d33e32bdaf036167451303f188dcd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"impersonate\", sql.types.Boolean, nullable\u003dFalse),"},{"line_number":47,"context_line":"        sql.Column(\"deleted\", sql.types.Boolean, default\u003dFalse),"},{"line_number":48,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":49,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":50,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BnAo%3D","line":47,"updated":"2013-02-25 22:43:25.000000000","message":"change this to deleted_at, and then set it to the current timestamp when you delete","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"impersonate\", sql.types.Boolean, nullable\u003dFalse),"},{"line_number":47,"context_line":"        sql.Column(\"deleted\", sql.types.Boolean, default\u003dFalse),"},{"line_number":48,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":49,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":50,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2B8%3D","line":47,"in_reply_to":"AAAAM3%2F%2BnAo%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d9221809ed8d33e32bdaf036167451303f188dcd","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"impersonate\", sql.types.Boolean, nullable\u003dFalse),"},{"line_number":47,"context_line":"        sql.Column(\"deleted\", sql.types.Boolean, default\u003dFalse),"},{"line_number":48,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":49,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":50,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BnAg%3D","line":48,"updated":"2013-02-25 22:43:25.000000000","message":"expires_at?","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                   nullable\u003dFalse,),"},{"line_number":46,"context_line":"        sql.Column(\"impersonate\", sql.types.Boolean, nullable\u003dFalse),"},{"line_number":47,"context_line":"        sql.Column(\"deleted\", sql.types.Boolean, default\u003dFalse),"},{"line_number":48,"context_line":"        sql.Column(\"expires\", sql.types.DateTime, nullable\u003dTrue),"},{"line_number":49,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":50,"context_line":"    trust_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2B4%3D","line":48,"in_reply_to":"AAAAM3%2F%2BnAg%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"670c7308e0bf65961bd27408a611c031f6c98256","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                   nullable\u003dFalse),"},{"line_number":57,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":58,"context_line":"                   nullable\u003dFalse),"},{"line_number":59,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()))"},{"line_number":60,"context_line":"    trust_role_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAM3%2F%2Bl68%3D","line":59,"updated":"2013-02-26 14:58:36.000000000","message":"i don\u0027t think you need extra here? this will never have metadata","commit_id":"ec2b6fbf44bc17f1a5d5cdf3bbbd74f17d49eb82"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Vw%3D","line":3,"updated":"2013-03-05 18:10:07.000000000","message":"it\u0027s 2013.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        \u0027trust\u0027,"},{"line_number":33,"context_line":"        meta,"},{"line_number":34,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":35,"context_line":"        sql.Column(\u0027trustor_user_id\u0027,"},{"line_number":36,"context_line":"                   sql.String(64),"},{"line_number":37,"context_line":"                   unique\u003dFalse,"},{"line_number":38,"context_line":"                   nullable\u003dFalse,),"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8U8%3D","line":35,"updated":"2013-03-05 18:10:07.000000000","message":"is this a foreign key?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46be5cdbefc852aaee17533d2c98f6d30bec4217","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    trust_role_table \u003d sql.Table("},{"line_number":53,"context_line":"        \u0027trust_role\u0027,"},{"line_number":54,"context_line":"        meta,"},{"line_number":55,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":56,"context_line":"                   nullable\u003dFalse),"},{"line_number":57,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":58,"context_line":"                   nullable\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8U0%3D","line":55,"updated":"2013-03-05 18:10:07.000000000","message":"foreign key?","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        meta,"},{"line_number":34,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":35,"context_line":"        sql.Column(\u0027trustor_user_id\u0027,"},{"line_number":36,"context_line":"                   sql.String(64),"},{"line_number":37,"context_line":"                   unique\u003dFalse,"},{"line_number":38,"context_line":"                   nullable\u003dFalse,),"},{"line_number":39,"context_line":"        sql.Column(\u0027trustee_user_id\u0027,"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GY%3D","line":36,"updated":"2013-03-05 20:40:20.000000000","message":"ForiegnKey to user.id?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   unique\u003dFalse,"},{"line_number":38,"context_line":"                   nullable\u003dFalse,),"},{"line_number":39,"context_line":"        sql.Column(\u0027trustee_user_id\u0027,"},{"line_number":40,"context_line":"                   sql.String(64),"},{"line_number":41,"context_line":"                   unique\u003dFalse,"},{"line_number":42,"context_line":"                   nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GU%3D","line":40,"updated":"2013-03-05 20:40:20.000000000","message":"ForeignKey to user.id?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                   sql.String(64),"},{"line_number":41,"context_line":"                   unique\u003dFalse,"},{"line_number":42,"context_line":"                   nullable\u003dFalse),"},{"line_number":43,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":44,"context_line":"                   unique\u003dFalse,"},{"line_number":45,"context_line":"                   nullable\u003dTrue),"},{"line_number":46,"context_line":"        sql.Column(\"impersonation\", sql.types.Boolean, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GM%3D","line":43,"updated":"2013-03-05 20:40:20.000000000","message":"ForeignKey to project.id?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    trust_role_table \u003d sql.Table("},{"line_number":53,"context_line":"        \u0027trust_role\u0027,"},{"line_number":54,"context_line":"        meta,"},{"line_number":55,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":56,"context_line":"                   nullable\u003dFalse),"},{"line_number":57,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":58,"context_line":"                   nullable\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GI%3D","line":55,"updated":"2013-03-05 20:40:20.000000000","message":"ForiegnKey?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        meta,"},{"line_number":55,"context_line":"        sql.Column(\u0027trust_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":56,"context_line":"                   nullable\u003dFalse),"},{"line_number":57,"context_line":"        sql.Column(\u0027role_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":58,"context_line":"                   nullable\u003dFalse))"},{"line_number":59,"context_line":"    trust_role_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8GE%3D","line":57,"updated":"2013-03-05 20:40:20.000000000","message":"ForeignKey?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/common/wsgi.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ac349dd5688f3fe45aba61ad41c640f1bcb5d03e","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        except:"},{"line_number":352,"context_line":"            type_, value_, traceback_ \u003d sys.exc_info()"},{"line_number":353,"context_line":"            ex \u003d traceback.format_exception(type_, value_, traceback_)"},{"line_number":354,"context_line":"            raise value_"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"class Debug(Middleware):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FZ7E%3D","line":354,"updated":"2013-01-23 19:58:24.000000000","message":"not sure what your goal is here?","commit_id":"1ab16556c37458cdfba3bf0e1c6c018a0d999fa0"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"284601cc9545d3e5b95a902f6d0986e8eaf47d83","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        except:"},{"line_number":352,"context_line":"            type_, value_, traceback_ \u003d sys.exc_info()"},{"line_number":353,"context_line":"            ex \u003d traceback.format_exception(type_, value_, traceback_)"},{"line_number":354,"context_line":"            raise value_"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"class Debug(Middleware):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FXtE%3D","line":354,"in_reply_to":"AAAAM3%2F%2FZ7E%3D","updated":"2013-01-25 03:07:15.000000000","message":"Was done for debugging purposes, and will be removed prior to removing the WIP tag","commit_id":"1ab16556c37458cdfba3bf0e1c6c018a0d999fa0"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"ff1acd24a4e12f31e4d74660442738a27d44716b","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            return self.process_response(request, response)"},{"line_number":355,"context_line":"        except:"},{"line_number":356,"context_line":"            type_, value_, traceback_ \u003d sys.exc_info()"},{"line_number":357,"context_line":"            ex \u003d traceback.format_exception(type_, value_, traceback_)"},{"line_number":358,"context_line":"            raise value_"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3Wg%3D","line":357,"updated":"2013-02-16 02:09:58.000000000","message":"we\u0027re not doing anything with the formatted exception - did you intend to log it?","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"92c3e72d87da6318cb1d732a662a783a098a66c3","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            return self.process_response(request, response)"},{"line_number":355,"context_line":"        except:"},{"line_number":356,"context_line":"            type_, value_, traceback_ \u003d sys.exc_info()"},{"line_number":357,"context_line":"            ex \u003d traceback.format_exception(type_, value_, traceback_)"},{"line_number":358,"context_line":"            raise value_"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3To%3D","line":357,"in_reply_to":"AAAAM3%2F%2B3Wg%3D","updated":"2013-02-16 02:26:28.000000000","message":"No, this was vestige of tracking down a logging problem.  This should be reverted.","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import socket"},{"line_number":24,"context_line":"import sys"},{"line_number":25,"context_line":"import traceback"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import eventlet.wsgi"},{"line_number":28,"context_line":"import routes.middleware"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnbY%3D","line":25,"updated":"2013-02-25 18:44:41.000000000","message":"unused","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import socket"},{"line_number":24,"context_line":"import sys"},{"line_number":25,"context_line":"import traceback"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"import eventlet.wsgi"},{"line_number":28,"context_line":"import routes.middleware"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnNk%3D","line":25,"in_reply_to":"AAAAM3%2F%2BnbY%3D","updated":"2013-02-25 20:47:45.000000000","message":"Done","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                tenant_ref \u003d self.get_project(tenant_id)"},{"line_number":189,"context_line":"                metadata_ref \u003d self.get_metadata(user_id, tenant_id)"},{"line_number":190,"context_line":"                if needs_roles and \u0027roles\u0027 in metadata_ref:"},{"line_number":191,"context_line":"                    needs_roles \u003d len(metadata_ref[\u0027roles\u0027]) is 0"},{"line_number":192,"context_line":"            except exception.ProjectNotFound:"},{"line_number":193,"context_line":"                tenant_ref \u003d None"},{"line_number":194,"context_line":"                metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxQk%3D","line":191,"updated":"2013-02-19 17:32:54.000000000","message":"This whole block of code is rather ugly. We should just do get_project_roles_for_user() and raise an exception if user have no project roles.","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":188,"context_line":"                tenant_ref \u003d self.get_project(tenant_id)"},{"line_number":189,"context_line":"                metadata_ref \u003d self.get_metadata(user_id, tenant_id)"},{"line_number":190,"context_line":"                if needs_roles and \u0027roles\u0027 in metadata_ref:"},{"line_number":191,"context_line":"                    needs_roles \u003d len(metadata_ref[\u0027roles\u0027]) is 0"},{"line_number":192,"context_line":"            except exception.ProjectNotFound:"},{"line_number":193,"context_line":"                tenant_ref \u003d None"},{"line_number":194,"context_line":"                metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BwY4%3D","line":191,"in_reply_to":"AAAAM3%2F%2BxQk%3D","updated":"2013-02-19 21:48:50.000000000","message":"Done","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":419,"context_line":"            raise exception.RoleNotFound(message\u003dmsg)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    # CRUD"},{"line_number":422,"context_line":"    @sql.handle_conflicts(type\u003d\u0027project\u0027)"},{"line_number":423,"context_line":"    def create_project(self, tenant_id, tenant):"},{"line_number":424,"context_line":"        tenant[\u0027name\u0027] \u003d clean.project_name(tenant[\u0027name\u0027])"},{"line_number":425,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxQY%3D","line":422,"updated":"2013-02-19 17:32:54.000000000","message":"I wonder if we can monkey patch session and handle the conflicts there instead. Just a thought ...","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            # FIXME(gyee): this should really be"},{"line_number":194,"context_line":"            # get_roles_for_user_and_project() after the dusts settle"},{"line_number":195,"context_line":"            if tenant_id not in self.get_projects_for_user(user_id):"},{"line_number":196,"context_line":"                raise AssertionError(\u0027Invalid project\u0027)"},{"line_number":197,"context_line":"            try:"},{"line_number":198,"context_line":"                tenant_ref \u003d self.get_project(tenant_id)"},{"line_number":199,"context_line":"                metadata_ref \u003d self.get_metadata(user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnbQ%3D","line":196,"updated":"2013-02-25 18:44:41.000000000","message":"Project membership cleanup - to separate change.","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            # FIXME(gyee): this should really be"},{"line_number":194,"context_line":"            # get_roles_for_user_and_project() after the dusts settle"},{"line_number":195,"context_line":"            if tenant_id not in self.get_projects_for_user(user_id):"},{"line_number":196,"context_line":"                raise AssertionError(\u0027Invalid project\u0027)"},{"line_number":197,"context_line":"            try:"},{"line_number":198,"context_line":"                tenant_ref \u003d self.get_project(tenant_id)"},{"line_number":199,"context_line":"                metadata_ref \u003d self.get_metadata(user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnNg%3D","line":196,"in_reply_to":"AAAAM3%2F%2BnbQ%3D","updated":"2013-02-25 20:47:45.000000000","message":"managed to munge it in with the conflicts change.  But yep.","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            # FIXME(gyee): this should really be"},{"line_number":194,"context_line":"            # get_roles_for_user_and_project() after the dusts settle"},{"line_number":195,"context_line":"            if tenant_id not in self.get_projects_for_user(user_id):"},{"line_number":196,"context_line":"                raise AssertionError(\u0027Invalid project\u0027)"},{"line_number":197,"context_line":"            try:"},{"line_number":198,"context_line":"                tenant_ref \u003d self.get_project(tenant_id)"},{"line_number":199,"context_line":"                metadata_ref \u003d self.get_metadata(user_id, tenant_id)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk38%3D","line":196,"updated":"2013-02-26 23:36:22.000000000","message":"Can be separated too.","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"}],"keystone/identity/controllers.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"},{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee"},{"line_number":171,"context_line":"                         (context, user_id)):"},{"line_number":172,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":173,"context_line":"                                               trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2Bldo%3D","line":170,"updated":"2013-02-26 18:51:53.000000000","message":"Misleading newline","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"},{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee"},{"line_number":171,"context_line":"                         (context, user_id)):"},{"line_number":172,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":173,"context_line":"                                               trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlSo%3D","line":170,"in_reply_to":"AAAAM3%2F%2Bldo%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"},{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee(context, user_id)):"},{"line_number":171,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":172,"context_line":"                                               trust_id\u003dtrust_id)"},{"line_number":173,"context_line":"            for token in token_list:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk0w%3D","line":170,"updated":"2013-02-26 23:36:22.000000000","message":"Shouldn\u0027t we delete tokens for trusts issued by this user (where he is trustor), not for this user (where he is trustee)?","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":678,"context_line":"        refs \u003d self.identity_api.list_roles(context)"},{"line_number":679,"context_line":"        return RoleV3.wrap_collection(context, refs, filters)"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"#    @controller.filterprotected(\u0027name\u0027)"},{"line_number":682,"context_line":"    def list_roles_for_trust(self, context, trust_id):"},{"line_number":683,"context_line":"        trust \u003d self.trust_api.get_trust(context, trust_id)"},{"line_number":684,"context_line":"        return RoleV3.wrap_collection(context, trust[\u0027roles\u0027])"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk30%3D","line":681,"updated":"2013-02-26 23:36:22.000000000","message":"Either remove or uncomment","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"},{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee(context, user_id)):"},{"line_number":171,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":172,"context_line":"                                               trust_id\u003dtrust_id)"},{"line_number":173,"context_line":"            for token in token_list:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FaI%3D","line":170,"updated":"2013-02-28 07:39:01.000000000","message":"I\u0027ll repeat my earlier question here:\n\nShouldn\u0027t we delete tokens for trusts issued _by_ this user (where he is trustor), not _for_ this user (where he is trustee)?","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"},{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee(context, user_id)):"},{"line_number":171,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":172,"context_line":"                                               trust_id\u003dtrust_id)"},{"line_number":173,"context_line":"            for token in token_list:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BG0%3D","line":170,"in_reply_to":"AAAANH%2F%2F%2FaI%3D","updated":"2013-03-01 00:50:23.000000000","message":"Answered in an earlier review.  Only a trustee can create tokens from a trust.    Thus, we need to delete the tokens from the set of tokens for which a user is the trustee.  We don\u0027t invalidate trusts upon user changing their password.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return o"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def delete_tokens_for_user(token_api, trust_api, context, user_id, user):"},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        #First delete tokens that could get other tokens."},{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Fw%3D","line":164,"updated":"2013-03-05 20:40:20.000000000","message":"user parameter isn\u0027t used.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":169,"context_line":"        #now delete trust tokens"},{"line_number":170,"context_line":"        for trust_id in (trust_api.list_trusts_for_trustee(context, user_id)):"},{"line_number":171,"context_line":"            token_list \u003d token_api.list_tokens(context, userid,"},{"line_number":172,"context_line":"                                               trust_id\u003dtrust_id)"},{"line_number":173,"context_line":"            for token in token_list:"},{"line_number":174,"context_line":"                token_api.delete_token(context, token)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8F4%3D","line":171,"updated":"2013-03-05 20:40:20.000000000","message":"userid should be user_id","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    except exception.NotImplemented:"},{"line_number":176,"context_line":"        # The users status has been changed but tokens remain valid for"},{"line_number":177,"context_line":"        # backends that can\u0027t list tokens for users"},{"line_number":178,"context_line":"        LOG.warning(\u0027User %s status has changed, but existing tokens \u0027"},{"line_number":179,"context_line":"                    \u0027remain valid\u0027 % user_id)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Fs%3D","line":178,"updated":"2013-03-05 20:40:20.000000000","message":"wrap in _() for translation.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        roles \u003d self.identity_api.get_roles_for_user_and_project("},{"line_number":345,"context_line":"            context, user_id, tenant_id)"},{"line_number":346,"context_line":"        delete_tokens_for_user(self.token_api, self.trust_api, context,"},{"line_number":347,"context_line":"                               user_id, tenant_id)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    # COMPAT(diablo): CRUD extension"},{"line_number":350,"context_line":"    def get_role_refs(self, context, user_id):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Fc%3D","line":347,"updated":"2013-03-05 20:40:20.000000000","message":"the last argument to this function is user, not tenant_id.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/middleware/core.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            if not params_parsed:"},{"line_number":129,"context_line":"                params_parsed \u003d {}"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            params \u003d {}"},{"line_number":133,"context_line":"            for k, v in params_parsed.iteritems():"},{"line_number":134,"context_line":"                if k in (\u0027self\u0027, \u0027context\u0027):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnbA%3D","line":131,"updated":"2013-02-25 18:44:41.000000000","message":"To separate change","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            if not params_parsed:"},{"line_number":129,"context_line":"                params_parsed \u003d {}"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            params \u003d {}"},{"line_number":133,"context_line":"            for k, v in params_parsed.iteritems():"},{"line_number":134,"context_line":"                if k in (\u0027self\u0027, \u0027context\u0027):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnNM%3D","line":131,"in_reply_to":"AAAAM3%2F%2BnbA%3D","updated":"2013-02-25 20:47:45.000000000","message":"Done","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"}],"keystone/token/backends/kvs.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def create_token(self, token_id, data):"},{"line_number":44,"context_line":"        token_id \u003d token.unique_id(token_id)"},{"line_number":45,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":46,"context_line":"        if \u0027expires\u0027 not in data or not data_copy[\u0027expires\u0027]:"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data:"},{"line_number":49,"context_line":"            if data[\u0027trust_id\u0027] is None:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FYg%3D","line":46,"updated":"2013-02-28 07:39:01.000000000","message":"Simplify:\n\n   if not data.get(\u0027expires\u0027):","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def create_token(self, token_id, data):"},{"line_number":44,"context_line":"        token_id \u003d token.unique_id(token_id)"},{"line_number":45,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":46,"context_line":"        if \u0027expires\u0027 not in data or not data_copy[\u0027expires\u0027]:"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data:"},{"line_number":49,"context_line":"            if data[\u0027trust_id\u0027] is None:"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BWk%3D","line":46,"in_reply_to":"AAAANH%2F%2F%2FYg%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if \u0027expires\u0027 not in data or not data_copy[\u0027expires\u0027]:"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data:"},{"line_number":49,"context_line":"            if data[\u0027trust_id\u0027] is None:"},{"line_number":50,"context_line":"                data_copy.pop(\u0027trust_id\u0027)"},{"line_number":51,"context_line":"        self.db.set(\u0027token-%s\u0027 % token_id, data_copy)"},{"line_number":52,"context_line":"        return copy.deepcopy(data_copy)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FYo%3D","line":49,"updated":"2013-02-28 07:39:01.000000000","message":"Join two if:s or just\n\n    if data.get(\u0027trust_id\u0027) is None:","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"516f34a404f89ba418a3339d2f5cde67358525a8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if \u0027expires\u0027 not in data or not data_copy[\u0027expires\u0027]:"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data:"},{"line_number":49,"context_line":"            if data[\u0027trust_id\u0027] is None:"},{"line_number":50,"context_line":"                data_copy.pop(\u0027trust_id\u0027)"},{"line_number":51,"context_line":"        self.db.set(\u0027token-%s\u0027 % token_id, data_copy)"},{"line_number":52,"context_line":"        return copy.deepcopy(data_copy)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F9wI%3D","line":49,"in_reply_to":"AAAANH%2F%2F%2BWo%3D","updated":"2013-03-01 08:37:55.000000000","message":"You can do data.pop(\u0027trust_id\u0027, None), but it looks ugly, you\u0027re right. I still think that this looks better:\n\n    if \u0027trust_id\u0027 in data and data[\u0027trust_id\u0027] is None:","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if \u0027expires\u0027 not in data or not data_copy[\u0027expires\u0027]:"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data:"},{"line_number":49,"context_line":"            if data[\u0027trust_id\u0027] is None:"},{"line_number":50,"context_line":"                data_copy.pop(\u0027trust_id\u0027)"},{"line_number":51,"context_line":"        self.db.set(\u0027token-%s\u0027 % token_id, data_copy)"},{"line_number":52,"context_line":"        return copy.deepcopy(data_copy)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BWo%3D","line":49,"in_reply_to":"AAAANH%2F%2F%2FYo%3D","updated":"2013-03-01 00:50:23.000000000","message":"Not quite.  If the value is not present, we can\u0027t pop, as there is nothing to pop.  We only pop if it is present but is None","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if not data_copy.get(\u0027expires\u0027):"},{"line_number":47,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":48,"context_line":"        if \u0027trust_id\u0027 in data and data[\u0027trust_id\u0027] is None:"},{"line_number":49,"context_line":"                data_copy.pop(\u0027trust_id\u0027)"},{"line_number":50,"context_line":"        self.db.set(\u0027token-%s\u0027 % token_id, data_copy)"},{"line_number":51,"context_line":"        return copy.deepcopy(data_copy)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8FY%3D","line":49,"updated":"2013-03-05 20:40:20.000000000","message":"this is extra-indented.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/token/backends/memcache.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def create_token(self, token_id, data):"},{"line_number":65,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":66,"context_line":"        ptk \u003d self._prefix_token_id(token.unique_id(token_id))"},{"line_number":67,"context_line":"        if \u0027expires\u0027 not in data_copy or not data_copy[\u0027expires\u0027]:"},{"line_number":68,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":69,"context_line":"        kwargs \u003d {}"},{"line_number":70,"context_line":"        if data_copy[\u0027expires\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BldI%3D","line":67,"updated":"2013-02-26 18:51:53.000000000","message":"May be like this?\n\n    if not data_copy.get(\u0027expires\u0027):","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def create_token(self, token_id, data):"},{"line_number":65,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":66,"context_line":"        ptk \u003d self._prefix_token_id(token.unique_id(token_id))"},{"line_number":67,"context_line":"        if \u0027expires\u0027 not in data_copy or not data_copy[\u0027expires\u0027]:"},{"line_number":68,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":69,"context_line":"        kwargs \u003d {}"},{"line_number":70,"context_line":"        if data_copy[\u0027expires\u0027] is not None:"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRs%3D","line":67,"in_reply_to":"AAAAM3%2F%2BldI%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                trust \u003d token_ref_dict.get(\u0027trust\u0027)"},{"line_number":98,"context_line":"                if not trust:"},{"line_number":99,"context_line":"                    continue"},{"line_number":100,"context_line":"                if trust.get(\u0027id\u0027) !\u003d tenant_id:"},{"line_number":101,"context_line":"                    continue"},{"line_number":102,"context_line":"            tokens.append(token_ref[\u0027id\u0027])"},{"line_number":103,"context_line":"        return tokens"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxJ4%3D","line":100,"updated":"2013-02-19 17:32:54.000000000","message":"should this be \u0027project_id\u0027 instead?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                trust \u003d token_ref_dict.get(\u0027trust\u0027)"},{"line_number":98,"context_line":"                if not trust:"},{"line_number":99,"context_line":"                    continue"},{"line_number":100,"context_line":"                if trust.get(\u0027id\u0027) !\u003d tenant_id:"},{"line_number":101,"context_line":"                    continue"},{"line_number":102,"context_line":"            tokens.append(token_ref[\u0027id\u0027])"},{"line_number":103,"context_line":"        return tokens"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Bw60%3D","line":100,"in_reply_to":"AAAAM3%2F%2BxJ4%3D","updated":"2013-02-19 21:48:50.000000000","message":"Eventually, but changing tenant to project can potentiall break the v2 apis, so I had to use the old term.","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f898970afe7b91b732409284348e539bb9808a1","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            if not token_ref:"},{"line_number":72,"context_line":"                raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":73,"context_line":"            token_ref.valid \u003d False"},{"line_number":74,"context_line":"            session.flush()"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone):"},{"line_number":77,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2BoR8%3D","line":74,"updated":"2013-02-25 08:37:08.000000000","message":"As an aside, I think delete_token() just marks it as non longer valid.  Does anything actually physically delete the token...or are they kept around for auditing purposes?  If the later, do we describe somewhere in the docs some kind of periodic archiving to stop the DB growing continuously?  I raise this now since of course the same will be true for trusts that are deleted/deactivated/disabled","commit_id":"9de6c9c4cffcf8878a4821433da8fe4ccb55745d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cc142ac1feae1f1676ac399916db846811708f95","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def create_token(self, token_id, data):"},{"line_number":55,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":56,"context_line":"        if \u0027expires\u0027 not in data_copy or not data_copy[\u0027expires\u0027]:"},{"line_number":57,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":58,"context_line":"        token_ref \u003d TokenModel.from_dict(data_copy)"},{"line_number":59,"context_line":"        token_ref.id \u003d token.unique_id(token_id)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkR0%3D","line":56,"updated":"2013-02-27 05:46:18.000000000","message":"data_copy.get(\u0027expires\u0027)","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5abddff4dab39d3dd0c431f09b99527f043360d9","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def create_token(self, token_id, data):"},{"line_number":55,"context_line":"        data_copy \u003d copy.deepcopy(data)"},{"line_number":56,"context_line":"        if \u0027expires\u0027 not in data_copy or not data_copy[\u0027expires\u0027]:"},{"line_number":57,"context_line":"            data_copy[\u0027expires\u0027] \u003d token.default_expire_time()"},{"line_number":58,"context_line":"        token_ref \u003d TokenModel.from_dict(data_copy)"},{"line_number":59,"context_line":"        token_ref.id \u003d token.unique_id(token_id)"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAANH%2F%2F%2FiQ%3D","line":56,"in_reply_to":"AAAAM3%2F%2BkR0%3D","updated":"2013-02-28 04:54:05.000000000","message":"Done","commit_id":"e394389ef568905f869738b375aaaec588738171"}],"keystone/token/controllers.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        #A trust token cannot be used to get another token"},{"line_number":207,"context_line":"        if \u0027trustee\u0027 in old_token_ref[\u0027metadata\u0027]:"},{"line_number":208,"context_line":"            raise exception.Unauthorized()"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        user_ref \u003d old_token_ref[\u0027user\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxIU%3D","line":207,"updated":"2013-02-19 17:32:54.000000000","message":"Should this be \u0027trustee_user_id\u0027?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        #A trust token cannot be used to get another token"},{"line_number":207,"context_line":"        if \u0027trustee\u0027 in old_token_ref[\u0027metadata\u0027]:"},{"line_number":208,"context_line":"            raise exception.Unauthorized()"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        user_ref \u003d old_token_ref[\u0027user\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Bw6s%3D","line":207,"in_reply_to":"AAAAM3%2F%2BxIU%3D","updated":"2013-02-19 21:48:50.000000000","message":"Yes. Actually, it should be checking for trust.  Will change.","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry \u003d auth_info"},{"line_number":81,"context_line":"        trust_id \u003d None"},{"line_number":82,"context_line":"        if \u0027trust_id\u0027 in metadata_ref:"},{"line_number":83,"context_line":"            trust_id \u003d metadata_ref[\u0027trust_id\u0027]"},{"line_number":84,"context_line":"        user_ref \u003d self._filter_domain_id(user_ref)"},{"line_number":85,"context_line":"        if tenant_ref:"},{"line_number":86,"context_line":"            tenant_ref \u003d self._filter_domain_id(tenant_ref)"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BldA%3D","line":83,"updated":"2013-02-26 18:51:53.000000000","message":"trust_id \u003d metadata_ref.get(\u0027trust_id\u0027)","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry \u003d auth_info"},{"line_number":81,"context_line":"        trust_id \u003d None"},{"line_number":82,"context_line":"        if \u0027trust_id\u0027 in metadata_ref:"},{"line_number":83,"context_line":"            trust_id \u003d metadata_ref[\u0027trust_id\u0027]"},{"line_number":84,"context_line":"        user_ref \u003d self._filter_domain_id(user_ref)"},{"line_number":85,"context_line":"        if tenant_ref:"},{"line_number":86,"context_line":"            tenant_ref \u003d self._filter_domain_id(tenant_ref)"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlP8%3D","line":83,"in_reply_to":"AAAAM3%2F%2BldA%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry \u003d auth_info"},{"line_number":81,"context_line":"        trust_id \u003d None"},{"line_number":82,"context_line":"        if \u0027trust_id\u0027 in metadata_ref:"},{"line_number":83,"context_line":"            trust_id \u003d metadata_ref[\u0027trust_id\u0027]"},{"line_number":84,"context_line":"        user_ref \u003d self._filter_domain_id(user_ref)"},{"line_number":85,"context_line":"        if tenant_ref:"},{"line_number":86,"context_line":"            tenant_ref \u003d self._filter_domain_id(tenant_ref)"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRo%3D","line":83,"in_reply_to":"AAAAM3%2F%2BldA%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            if user_id !\u003d trust_ref[\u0027trustee_user_id\u0027]:"},{"line_number":184,"context_line":"                raise exception.Unauthorized()"},{"line_number":185,"context_line":"            if (\u0027expires\u0027 in trust_ref) and (trust_ref[\u0027expires\u0027]):"},{"line_number":186,"context_line":"                    expiry \u003d timeutils.parse_isotime(trust_ref[\u0027expires\u0027])"},{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2Blcs%3D","line":186,"updated":"2013-02-26 18:51:53.000000000","message":"Overindent","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            if user_id !\u003d trust_ref[\u0027trustee_user_id\u0027]:"},{"line_number":184,"context_line":"                raise exception.Unauthorized()"},{"line_number":185,"context_line":"            if (\u0027expires\u0027 in trust_ref) and (trust_ref[\u0027expires\u0027]):"},{"line_number":186,"context_line":"                    expiry \u003d timeutils.parse_isotime(trust_ref[\u0027expires\u0027])"},{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRk%3D","line":186,"in_reply_to":"AAAAM3%2F%2Blcs%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                    expiry \u003d timeutils.parse_isotime(trust_ref[\u0027expires\u0027])"},{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2Blcg%3D","line":189,"updated":"2013-02-26 18:51:53.000000000","message":"Obsolete line?","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                    expiry \u003d timeutils.parse_isotime(trust_ref[\u0027expires\u0027])"},{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRg%3D","line":189,"in_reply_to":"AAAAM3%2F%2Blcg%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":193,"context_line":"                                context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2Blb0%3D","line":190,"updated":"2013-02-26 18:51:53.000000000","message":"unused","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":188,"context_line":"                        raise exception.Unauthorized()"},{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":193,"context_line":"                                context\u003dcontext,"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRc%3D","line":190,"in_reply_to":"AAAAM3%2F%2Blb0%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":193,"context_line":"                                context\u003dcontext,"},{"line_number":194,"context_line":"                                user_id\u003dtrust_ref[\u0027trustor_user_id\u0027]))"},{"line_number":195,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlcU%3D","line":192,"updated":"2013-02-26 18:51:53.000000000","message":"Extra braces","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    trust_ref[\u0027expires\u0027]"},{"line_number":190,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":193,"context_line":"                                context\u003dcontext,"},{"line_number":194,"context_line":"                                user_id\u003dtrust_ref[\u0027trustor_user_id\u0027]))"},{"line_number":195,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlRM%3D","line":192,"in_reply_to":"AAAAM3%2F%2BlcU%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            tenant_id \u003d trust_ref[\u0027project_id\u0027]"},{"line_number":192,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":193,"context_line":"                                context\u003dcontext,"},{"line_number":194,"context_line":"                                user_id\u003dtrust_ref[\u0027trustor_user_id\u0027]))"},{"line_number":195,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"},{"line_number":196,"context_line":"                raise exception.Unauthorized()"},{"line_number":197,"context_line":"            trustee_user_ref \u003d (self.identity_api.get_user("}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2Blb8%3D","line":194,"updated":"2013-02-26 18:51:53.000000000","message":"Are keyword arguments necessary here?","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                               context, user_id, tenant_id))"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        expiry \u003d old_token_ref[\u0027expires\u0027]"},{"line_number":225,"context_line":"        trust \u003d None"},{"line_number":226,"context_line":"        if \u0027trust_id\u0027 in auth:"},{"line_number":227,"context_line":"            trust_id \u003d auth[\u0027trust_id\u0027]"},{"line_number":228,"context_line":"            trust_roles \u003d []"}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlaU%3D","line":225,"updated":"2013-02-26 18:51:53.000000000","message":"unused","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    context, auth)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry \u003d auth_info"},{"line_number":81,"context_line":"        trust_id \u003d None"},{"line_number":82,"context_line":"        trust_id \u003d metadata_ref.get(\u0027trust_id\u0027)"},{"line_number":83,"context_line":"        user_ref \u003d self._filter_domain_id(user_ref)"},{"line_number":84,"context_line":"        if tenant_ref:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk3U%3D","line":81,"updated":"2013-02-26 23:36:22.000000000","message":"noop","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                if expiry \u003c timeutils.parse_isotime(timeutils.isotime()):"},{"line_number":187,"context_line":"                    raise exception.Unauthorized()"},{"line_number":188,"context_line":"            user_id \u003d trust_ref[\u0027trustor_user_id\u0027]"},{"line_number":189,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":190,"context_line":"                                context\u003dcontext,"},{"line_number":191,"context_line":"                                user_id\u003dtrust_ref[\u0027trustor_user_id\u0027]))"},{"line_number":192,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk2Y%3D","line":189,"updated":"2013-02-26 23:36:22.000000000","message":"Extra braces are still here","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                               context, user_id, tenant_id))"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        expiry \u003d old_token_ref[\u0027expires\u0027]"},{"line_number":221,"context_line":"        trust \u003d None"},{"line_number":222,"context_line":"        if \u0027trust_id\u0027 in auth:"},{"line_number":223,"context_line":"            trust_id \u003d auth[\u0027trust_id\u0027]"},{"line_number":224,"context_line":"            trust_roles \u003d []"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk20%3D","line":221,"updated":"2013-02-26 23:36:22.000000000","message":"unused","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cbc7855a1e1850fca6b24fc48e1d166282723be6","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        user_ref \u003d old_token_ref[\u0027user\u0027]"},{"line_number":178,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":179,"context_line":"        if \u0027trust_id\u0027 in auth:"},{"line_number":180,"context_line":"            trust_ref \u003d self.trust_api.get_trust(context, auth[\u0027trust_id\u0027])"},{"line_number":181,"context_line":"            if trust_ref is None:"},{"line_number":182,"context_line":"                raise exception.Unauthorized()"}],"source_content_type":"text/x-python","patch_set":51,"id":"AAAAN3%2F%2F%2Fxs%3D","line":179,"updated":"2013-03-04 03:46:25.000000000","message":"What are these changes for? I thought we don\u0027t support trust API in V2.","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"93ce35760446f04b544e74d9ce76ae1dd1bdef90","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        user_ref \u003d old_token_ref[\u0027user\u0027]"},{"line_number":178,"context_line":"        user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":179,"context_line":"        if \u0027trust_id\u0027 in auth:"},{"line_number":180,"context_line":"            trust_ref \u003d self.trust_api.get_trust(context, auth[\u0027trust_id\u0027])"},{"line_number":181,"context_line":"            if trust_ref is None:"},{"line_number":182,"context_line":"                raise exception.Unauthorized()"}],"source_content_type":"text/x-python","patch_set":51,"id":"AAAAN3%2F%2F%2FRw%3D","line":179,"in_reply_to":"AAAAN3%2F%2F%2Fxs%3D","updated":"2013-03-04 15:08:02.000000000","message":"I had this working before theere was a v3 api.  There are unit tests for it.  I think that some services might not yet handle V3 tokens, so we will need this as an interim solution.","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d3ecb26eced724e5a63798ea724e8cfde74091d3","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        if \u0027trust_id\u0027 in auth:"},{"line_number":180,"context_line":"            trust_ref \u003d self.trust_api.get_trust(context, auth[\u0027trust_id\u0027])"},{"line_number":181,"context_line":"            if trust_ref is None:"},{"line_number":182,"context_line":"                raise exception.Unauthorized()"},{"line_number":183,"context_line":"            if user_id !\u003d trust_ref[\u0027trustee_user_id\u0027]:"},{"line_number":184,"context_line":"                raise exception.Unauthorized()"},{"line_number":185,"context_line":"            if (\u0027expires\u0027 in trust_ref) and (trust_ref[\u0027expires\u0027]):"}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8So%3D","line":182,"updated":"2013-03-05 18:49:03.000000000","message":"Forbidden ?\n\n(and the rest of these)","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        #A trust token cannot be used to get another token"},{"line_number":172,"context_line":"        if \u0027trust\u0027 in old_token_ref:"},{"line_number":173,"context_line":"            raise exception.Unauthorized()"},{"line_number":174,"context_line":"        if \u0027trust_id\u0027 in old_token_ref[\"metadata\"]:"},{"line_number":175,"context_line":"            raise exception.Forbidden()"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8FU%3D","line":173,"updated":"2013-03-05 20:40:20.000000000","message":"Forbidden?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        #A trust token cannot be used to get another token"},{"line_number":172,"context_line":"        if \u0027trust\u0027 in old_token_ref:"},{"line_number":173,"context_line":"            raise exception.Unauthorized()"},{"line_number":174,"context_line":"        if \u0027trust_id\u0027 in old_token_ref[\"metadata\"]:"},{"line_number":175,"context_line":"            raise exception.Forbidden()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        user_ref \u003d old_token_ref[\u0027user\u0027]"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8FQ%3D","line":174,"updated":"2013-03-05 20:40:20.000000000","message":"use single quotes","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                current_user_ref \u003d trustee_user_ref"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        else:"},{"line_number":205,"context_line":"            tenant_id \u003d self._get_project_id_from_auth(context, auth)"},{"line_number":206,"context_line":"            current_user_ref \u003d self.identity_api.get_user(context\u003dcontext,"},{"line_number":207,"context_line":"                                                          user_id\u003duser_id)"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8FA%3D","line":205,"updated":"2013-03-05 20:40:20.000000000","message":"this tenant_id is not used, and overwritten at line 209.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/token/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cbc7855a1e1850fca6b24fc48e1d166282723be6","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        raise exception.NotImplemented()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone):"},{"line_number":183,"context_line":"        \"\"\"Returns a list of current token_id\u0027s for a user"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        :param user_id: identity of the user"}],"source_content_type":"text/x-python","patch_set":51,"id":"AAAAN3%2F%2F%2Fxo%3D","line":182,"updated":"2013-03-04 03:46:25.000000000","message":"I thought we don\u0027t support trust tokens in V2.","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"93ce35760446f04b544e74d9ce76ae1dd1bdef90","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        \"\"\""},{"line_number":180,"context_line":"        raise exception.NotImplemented()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def list_tokens(self, user_id, tenant_id\u003dNone, trust_id\u003dNone):"},{"line_number":183,"context_line":"        \"\"\"Returns a list of current token_id\u0027s for a user"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        :param user_id: identity of the user"}],"source_content_type":"text/x-python","patch_set":51,"id":"AAAAN3%2F%2F%2FRo%3D","line":182,"in_reply_to":"AAAAN3%2F%2F%2Fxo%3D","updated":"2013-03-04 15:08:02.000000000","message":"We do, but regardless, we need it on the list function here.","commit_id":"b5dc6f80ad420ca7674200f427d6da843a851128"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d3ecb26eced724e5a63798ea724e8cfde74091d3","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \"\"\"Returns a list of current token_id\u0027s for a user"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        :param user_id: identity of the user"},{"line_number":186,"context_line":"        :type user_id: string"},{"line_number":187,"context_line":"        :returns: list of token_id\u0027s"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":57,"id":"AAAAN3%2F%2F8Sc%3D","line":186,"updated":"2013-03-05 18:49:03.000000000","message":"should this be param? also, document new parameters.","commit_id":"98a4a9599e74ed25a0e8f18947024245086bcbc9"}],"keystone/trust/__init__.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from keystone.trust.core import *"},{"line_number":18,"context_line":"from keystone.trust import controllers"},{"line_number":19,"context_line":"from keystone.trust import routers"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxH8%3D","line":17,"updated":"2013-02-19 17:32:54.000000000","message":"Note from heckj on my v3 token API review. He would like to see specific import instead of *.","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"41f84f40d73277af36f3d9955146fd3e65ce837a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from keystone.trust.core import *"},{"line_number":18,"context_line":"from keystone.trust import controllers"},{"line_number":19,"context_line":"from keystone.trust import routers"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2Bwag%3D","line":17,"in_reply_to":"AAAAM3%2F%2BxH8%3D","updated":"2013-02-19 21:48:50.000000000","message":"Done","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"}],"keystone/trust/backends/kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from keystone.common import kvs"},{"line_number":25,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":26,"context_line":"from keystone import exception"},{"line_number":27,"context_line":"from keystone import trust"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Eg%3D","line":25,"updated":"2013-03-05 20:40:20.000000000","message":"move to alphabetical order.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        trust_ref[\u0027roles\u0027] \u003d roles"},{"line_number":36,"context_line":"        if (trust_ref.get(\u0027expires_at\u0027) and"},{"line_number":37,"context_line":"                trust_ref[\u0027expires_at\u0027].tzinfo is not None):"},{"line_number":38,"context_line":"                    trust_ref[\u0027expires_at\u0027] \u003d (timeutils.normalize_time"},{"line_number":39,"context_line":"                                               (trust_ref[\u0027expires_at\u0027]))"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        self.db.set(\u0027trust-%s\u0027 % trust_id, trust_ref)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8EU%3D","line":38,"updated":"2013-03-05 20:40:20.000000000","message":"this is extra-indented.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":50,"context_line":"        return copy.deepcopy(trust_ref)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _filter_trust(selfself, ref):"},{"line_number":53,"context_line":"        if ref[\u0027deleted\u0027]:"},{"line_number":54,"context_line":"            return None"},{"line_number":55,"context_line":"        if ref.get(\u0027expires_at\u0027) and timeutils.utcnow() \u003e ref[\u0027expires_at\u0027]:"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8EQ%3D","line":52,"updated":"2013-03-05 20:40:20.000000000","message":"selfself-\u003e self","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        if ref[\u0027deleted\u0027]:"},{"line_number":54,"context_line":"            return None"},{"line_number":55,"context_line":"        if ref.get(\u0027expires_at\u0027) and timeutils.utcnow() \u003e ref[\u0027expires_at\u0027]:"},{"line_number":56,"context_line":"                return None"},{"line_number":57,"context_line":"        ref \u003d copy.deepcopy(ref)"},{"line_number":58,"context_line":"        return ref"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8EE%3D","line":56,"updated":"2013-03-05 20:40:20.000000000","message":"this is extra-indented.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def list_trusts_for_trustee(self, trustee_user_id):"},{"line_number":83,"context_line":"        trusts \u003d []"},{"line_number":84,"context_line":"        for trust in self.db.get(\u0027trustee-%s\u0027 % trustee_user_id, []):"},{"line_number":85,"context_line":"            trusts.append(self.get_trust(trust))"},{"line_number":86,"context_line":"        return trusts"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def list_trusts_for_trustor(self, trustor_user_id):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Ds%3D","line":85,"updated":"2013-03-05 20:40:20.000000000","message":"check for trust deleted?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/trust/backends/sql.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    __tablename__ \u003d \u0027trust_role\u0027"},{"line_number":44,"context_line":"    attributes \u003d [\u0027trust_id\u0027, \u0027role_id\u0027]"},{"line_number":45,"context_line":"    trust_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":46,"context_line":"    role_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":47,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxHE%3D","line":46,"updated":"2013-02-19 17:32:54.000000000","message":"no foreign key constraints?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    __tablename__ \u003d \u0027trust_endpoint\u0027"},{"line_number":52,"context_line":"    attributes \u003d [\u0027trust_id\u0027, \u0027endpoint_id\u0027]"},{"line_number":53,"context_line":"    trust_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":54,"context_line":"    endpoint_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, nullable\u003dFalse)"},{"line_number":55,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxG8%3D","line":54,"updated":"2013-02-19 17:32:54.000000000","message":"no foreign key constraints?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            trust_ref.id \u003d trust_id"},{"line_number":67,"context_line":"            trust_ref.trustor_user_id \u003d trustor_user_id"},{"line_number":68,"context_line":"            trust_ref.trustee_user_id \u003d trustee_user_id"},{"line_number":69,"context_line":"            trust_ref.project_id \u003d project"},{"line_number":70,"context_line":"            trust_ref.enabled \u003d True"},{"line_number":71,"context_line":"            trust_ref.expires \u003d expires"},{"line_number":72,"context_line":"            trust_ref.extra \u003d {}"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxGc%3D","line":69,"updated":"2013-02-19 17:32:54.000000000","message":"What happen when a project is deleted?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                trust_role.trust_id \u003d trust_id"},{"line_number":78,"context_line":"                trust_role.role_id \u003d role"},{"line_number":79,"context_line":"                added_roles.append(role)"},{"line_number":80,"context_line":"                session.add(trust_role)"},{"line_number":81,"context_line":"            added_endpoints \u003d []"},{"line_number":82,"context_line":"            for endpoint in endpoints:"},{"line_number":83,"context_line":"                trust_endpoint \u003d TrustEndpoint()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxGs%3D","line":80,"updated":"2013-02-19 17:32:54.000000000","message":"What happen if a role definition is deleted? Will DELETE /roles/{role_id} cleanup this table as well?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c55a5856a29e46c4a7b3ad54dc7c30c47eb4421f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                trust_endpoint.trust_id \u003d trust_id"},{"line_number":85,"context_line":"                trust_endpoint.endpoint_id \u003d endpoint"},{"line_number":86,"context_line":"                added_endpoints.append(endpoint)"},{"line_number":87,"context_line":"                session.add(trust_endpoint)"},{"line_number":88,"context_line":"            session.flush()"},{"line_number":89,"context_line":"        trust_dict \u003d trust_ref.to_dict()"},{"line_number":90,"context_line":"        trust_dict[\u0027roles\u0027] \u003d added_roles"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2BxGo%3D","line":87,"updated":"2013-02-19 17:32:54.000000000","message":"What happen when an endpoint is deleted?","commit_id":"bf7e02ab7053f501ab4eaa22da613ab43c77b2c9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6478e01556ce6ca4e910dfcee7c641a846d9888a","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def get_trust(self, trust_id):"},{"line_number":90,"context_line":"        session \u003d self.get_session()"},{"line_number":91,"context_line":"        ref \u003d (session.query(TrustModel)."},{"line_number":92,"context_line":"               filter(\"deleted_at is Null\")."},{"line_number":93,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":94,"context_line":"        if ref is None:"},{"line_number":95,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAM3%2F%2BmV8%3D","line":92,"updated":"2013-02-26 07:11:48.000000000","message":"The literal SQL seems to be the only way to test for a column being null and still make it through the PEP8 test.","commit_id":"7194ce79d57e3edbebf63327c9a0bc6dc3a18790"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"6c83fa9ebcb96b8b09782421781f4ea9c42b18dc","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def get_trust(self, trust_id):"},{"line_number":90,"context_line":"        session \u003d self.get_session()"},{"line_number":91,"context_line":"        ref \u003d (session.query(TrustModel)."},{"line_number":92,"context_line":"               filter(\"deleted_at is Null\")."},{"line_number":93,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":94,"context_line":"        if ref is None:"},{"line_number":95,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAM3%2F%2BmVU%3D","line":92,"in_reply_to":"AAAAM3%2F%2BmV8%3D","updated":"2013-02-26 07:24:51.000000000","message":"You can declare\n\n    NULL \u003d None\n\nand use\n\n    filter(TrustModel.deleted_at \u003d\u003d NULL)\n\nLooks cleaner this way.","commit_id":"7194ce79d57e3edbebf63327c9a0bc6dc3a18790"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"799dcfe0649e493092b4acd333765967f29fb2c5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    __tablename__ \u003d \u0027trust\u0027"},{"line_number":29,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027trustor_user_id\u0027, \u0027trustee_user_id\u0027,"},{"line_number":30,"context_line":"                  \u0027project_id\u0027, \u0027impersonation\u0027, \u0027expires_at\u0027,"},{"line_number":31,"context_line":"                  \u0027extra\u0027]"},{"line_number":32,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":33,"context_line":"    #user id Of owner"},{"line_number":34,"context_line":"    trustor_user_id \u003d sql.Column(sql.String(64), unique\u003dFalse, nullable\u003dFalse,)"}],"source_content_type":"text/x-python","patch_set":36,"id":"AAAAM3%2F%2BliU%3D","line":31,"updated":"2013-02-26 18:02:16.000000000","message":"remove \u0027extra\u0027","commit_id":"1fc7842c9412c43274507bec73a54518a3ca9647"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        for trust in (session.query(TrustModel)."},{"line_number":94,"context_line":"                      filter_by(deleted_at\u003dNone)):"},{"line_number":95,"context_line":"            trusts.append(trust)"},{"line_number":96,"context_line":"        session.flush()"},{"line_number":97,"context_line":"        return [trust_ref.to_dict() for trust_ref in trusts]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @sql.handle_conflicts(type\u003d\u0027trust\u0027)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk9Q%3D","line":96,"updated":"2013-02-26 23:36:22.000000000","message":"It looks like session.flush() is not required here. Other list_* methods don\u0027t use it and so doesn\u0027t have any loops or intermediate lists in them. I think, these methods should be just like the others.","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        session \u003d self.get_session()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        try:"},{"line_number":126,"context_line":"            session.begin()"},{"line_number":127,"context_line":"            trust_ref \u003d session.query(TrustModel).filter_by(id\u003dtrust_id).one()"},{"line_number":128,"context_line":"            trust_ref.deleted_at \u003d timeutils.utcnow()"},{"line_number":129,"context_line":"            session.commit()"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk9A%3D","line":126,"updated":"2013-02-26 23:36:22.000000000","message":"Use\n\n    with session.begin():\n\nand minimize try: block","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cc142ac1feae1f1676ac399916db846811708f95","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def list_trusts(self):"},{"line_number":91,"context_line":"        session \u003d self.get_session()"},{"line_number":92,"context_line":"        trusts \u003d []"},{"line_number":93,"context_line":"        for trust in (session.query(TrustModel)."},{"line_number":94,"context_line":"                      filter_by(deleted_at\u003dNone)):"},{"line_number":95,"context_line":"            trusts.append(trust)"},{"line_number":96,"context_line":"        return [trust_ref.to_dict() for trust_ref in trusts]"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkRk%3D","line":93,"updated":"2013-02-27 05:46:18.000000000","message":"This loop is unnecessary here and in two other list_trusts methods. You can just write:\n\n    trusts \u003d session.query(TrustModel).filter_by(deleted_at\u003dNone)","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5abddff4dab39d3dd0c431f09b99527f043360d9","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def list_trusts(self):"},{"line_number":91,"context_line":"        session \u003d self.get_session()"},{"line_number":92,"context_line":"        trusts \u003d []"},{"line_number":93,"context_line":"        for trust in (session.query(TrustModel)."},{"line_number":94,"context_line":"                      filter_by(deleted_at\u003dNone)):"},{"line_number":95,"context_line":"            trusts.append(trust)"},{"line_number":96,"context_line":"        return [trust_ref.to_dict() for trust_ref in trusts]"}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAANH%2F%2F%2FiY%3D","line":93,"in_reply_to":"AAAAM3%2F%2BkRk%3D","updated":"2013-02-28 04:54:05.000000000","message":"Done","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        trust_dict \u003d ref.to_dict()"},{"line_number":84,"context_line":"        if (\u0027expires_at\u0027 in trust_dict and"},{"line_number":85,"context_line":"                trust_dict[\u0027expires_at\u0027] is not None):"},{"line_number":86,"context_line":"                now \u003d timeutils.utcnow()"},{"line_number":87,"context_line":"                if  now \u003e trust_dict[\u0027expires_at\u0027]:"},{"line_number":88,"context_line":"                    return None"},{"line_number":89,"context_line":"                trust_dict[\u0027expires_at\u0027] \u003d timeutils.isotime("}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FaA%3D","line":86,"updated":"2013-02-28 07:39:01.000000000","message":"Bad indentation. PEP8 must catch this, it\u0027s not somehow...","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        trust_dict \u003d ref.to_dict()"},{"line_number":84,"context_line":"        if (\u0027expires_at\u0027 in trust_dict and"},{"line_number":85,"context_line":"                trust_dict[\u0027expires_at\u0027] is not None):"},{"line_number":86,"context_line":"                now \u003d timeutils.utcnow()"},{"line_number":87,"context_line":"                if  now \u003e trust_dict[\u0027expires_at\u0027]:"},{"line_number":88,"context_line":"                    return None"},{"line_number":89,"context_line":"                trust_dict[\u0027expires_at\u0027] \u003d timeutils.isotime("}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BV8%3D","line":86,"in_reply_to":"AAAANH%2F%2F%2FaA%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        session \u003d self.get_session()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            session.begin()"},{"line_number":123,"context_line":"            trust_ref \u003d session.query(TrustModel).filter_by(id\u003dtrust_id).one()"},{"line_number":124,"context_line":"            trust_ref.deleted_at \u003d timeutils.utcnow()"},{"line_number":125,"context_line":"            session.commit()"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FZw%3D","line":122,"updated":"2013-02-28 07:39:01.000000000","message":"Use with: statement here, just like in create_trust.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        session \u003d self.get_session()"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            session.begin()"},{"line_number":123,"context_line":"            trust_ref \u003d session.query(TrustModel).filter_by(id\u003dtrust_id).one()"},{"line_number":124,"context_line":"            trust_ref.deleted_at \u003d timeutils.utcnow()"},{"line_number":125,"context_line":"            session.commit()"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BVU%3D","line":122,"in_reply_to":"AAAANH%2F%2F%2FZw%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e4339d533b3e71168f8ebb77056659502b0ebc1b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        session \u003d self.get_session()"},{"line_number":119,"context_line":"        with session.begin():"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                trust_ref \u003d session.query(TrustModel).filter_by("},{"line_number":122,"context_line":"                    id\u003dtrust_id).one()"},{"line_number":123,"context_line":"            except sql.NotFound:"},{"line_number":124,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAANH%2F%2F9v8%3D","line":121,"updated":"2013-03-01 08:38:17.000000000","message":"Move .filter_by( to new line like in other places?","commit_id":"7e9a511c932d6e25dea222499147a826a649f201"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":26,"context_line":"                  \u0027project_id\u0027, \u0027impersonation\u0027, \u0027expires_at\u0027]"},{"line_number":27,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":28,"context_line":"    #user id Of owner"},{"line_number":29,"context_line":"    trustor_user_id \u003d sql.Column(sql.String(64), unique\u003dFalse, nullable\u003dFalse,)"},{"line_number":30,"context_line":"    #user_id of user allowed to consume this preauth"},{"line_number":31,"context_line":"    trustee_user_id \u003d sql.Column(sql.String(64), unique\u003dFalse, nullable\u003dFalse)"},{"line_number":32,"context_line":"    project_id \u003d sql.Column(sql.String(64), unique\u003dFalse, nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Dg%3D","line":29,"updated":"2013-03-05 20:40:20.000000000","message":"ForeignKey to user.id?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/trust/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0d3c0f4b7a507cfd59c3e308f8dc78cd84060c47","unresolved":false,"context_lines":[{"line_number":24,"context_line":"            return user_id"},{"line_number":25,"context_line":"        return None"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get(self, context, trust_id):"},{"line_number":28,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":29,"context_line":"        try:"},{"line_number":30,"context_line":"            trust \u003d self.trust_api.get_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAM3%2F%2Buqg%3D","line":27,"updated":"2013-02-20 16:01:59.000000000","message":"Should not all these calls be \"protected\" ?","commit_id":"d8e1dae33b8bde4e1c0e480fc60f17aec5523163"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1615387b0bb7538ea6f0893aae734fd95e903cd","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                trust,"},{"line_number":76,"context_line":"                                self.identity_api.list_roles(context))"},{"line_number":77,"context_line":"        except KeyError:"},{"line_number":78,"context_line":"            raise exception.ValidationError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        return TrustV3.wrap_member(context, new_trust)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAM3%2F%2Bms0%3D","line":78,"updated":"2013-02-26 01:21:10.000000000","message":"you can\u0027t raise a validation error without passing attribute and target -- validate each key you\u0027re looking for and raise an appropriate ValidationError about what you\u0027re expecting","commit_id":"b33475227b4c3b673675a67c47c78a2d65b839bc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5f0b5464a5e437fcbb834bca47afc72c06a4b72b","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                trust,"},{"line_number":76,"context_line":"                                self.identity_api.list_roles(context))"},{"line_number":77,"context_line":"        except KeyError:"},{"line_number":78,"context_line":"            raise exception.ValidationError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        return TrustV3.wrap_member(context, new_trust)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAM3%2F%2Bmd4%3D","line":78,"in_reply_to":"AAAAM3%2F%2Bms0%3D","updated":"2013-02-26 06:15:45.000000000","message":"Done","commit_id":"b33475227b4c3b673675a67c47c78a2d65b839bc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6e61ad573d331ce6aca606bf807b1d5b0b7ae3b6","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                trustor_user_id\u003dtrust[\u0027trustor_user_id\u0027],"},{"line_number":73,"context_line":"                trustee_user_id\u003dtrust[\u0027trustee_user_id\u0027],"},{"line_number":74,"context_line":"                impersonation\u003dtrust[\u0027impersonation\u0027],"},{"line_number":75,"context_line":"                project\u003dtrust[\u0027project\u0027],"},{"line_number":76,"context_line":"                roles\u003dtrust[\u0027roles\u0027],"},{"line_number":77,"context_line":"                expires_at\u003dexpires_at)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAM3%2F%2Bl%2Fc%3D","line":75,"updated":"2013-02-26 13:53:09.000000000","message":"Go ahead and make this project_id (flattened) -- see spec\n\nhttps://github.com/openstack/identity-api/blob/master/openstack-identity-api/src/markdown/identity-api-v3.md#trusts","commit_id":"1430d53639d1ae62e11b9625fccdf691fe86cfdd"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            raise exception.ForbiddenAction()"},{"line_number":77,"context_line":"        global_roles \u003d self.identity_api.list_roles(context)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if \u0027expires_at\u0027 in trust:"},{"line_number":80,"context_line":"            expires_at \u003d trust[\u0027expires_at\u0027]"},{"line_number":81,"context_line":"        else:"},{"line_number":82,"context_line":"            expires_at \u003d None"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk18%3D","line":79,"updated":"2013-02-26 23:36:22.000000000","message":"expires_at \u003d trust.get(\u0027expires_at\u0027)","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            calling_user_id \u003d self._get_user_id(context)"},{"line_number":111,"context_line":"            if user_id !\u003d calling_user_id:"},{"line_number":112,"context_line":"                raise exception.ForbiddenAction()"},{"line_number":113,"context_line":"            trusts \u003d (self.trust_api."},{"line_number":114,"context_line":"                      list_trusts_for_trustor(context, user_id))"},{"line_number":115,"context_line":"            trusts \u003d (self.trust_api."},{"line_number":116,"context_line":"                      list_trusts_for_trustee(context, user_id))"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bk0o%3D","line":113,"updated":"2013-02-26 23:36:22.000000000","message":"overridden by next line","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        trusts \u003d []"},{"line_number":139,"context_line":"        if not query:"},{"line_number":140,"context_line":"            self.assert_admin(context)"},{"line_number":141,"context_line":"            trusts \u003d trusts + self.trust_api.list_trusts(context)"},{"line_number":142,"context_line":"        if \u0027trustor_user_id\u0027 in query:"},{"line_number":143,"context_line":"            user_id \u003d query[\u0027trustor_user_id\u0027]"},{"line_number":144,"context_line":"            calling_user_id \u003d self._get_user_id(context)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FZs%3D","line":141,"updated":"2013-02-28 07:39:01.000000000","message":"Better:\n\n    trusts.extend(...)\n\nor\n\n    trusts +\u003d ...","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        trusts \u003d []"},{"line_number":139,"context_line":"        if not query:"},{"line_number":140,"context_line":"            self.assert_admin(context)"},{"line_number":141,"context_line":"            trusts \u003d trusts + self.trust_api.list_trusts(context)"},{"line_number":142,"context_line":"        if \u0027trustor_user_id\u0027 in query:"},{"line_number":143,"context_line":"            user_id \u003d query[\u0027trustor_user_id\u0027]"},{"line_number":144,"context_line":"            calling_user_id \u003d self._get_user_id(context)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BVQ%3D","line":141,"in_reply_to":"AAAANH%2F%2F%2FZs%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e4339d533b3e71168f8ebb77056659502b0ebc1b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            calling_user_id \u003d self._get_user_id(context)"},{"line_number":144,"context_line":"            if user_id !\u003d calling_user_id:"},{"line_number":145,"context_line":"                raise exception.ForbiddenAction()"},{"line_number":146,"context_line":"            trusts \u003d trusts + (self.trust_api."},{"line_number":147,"context_line":"                               list_trusts_for_trustor(context, user_id))"},{"line_number":148,"context_line":"        if \u0027trustee_user_id\u0027 in query:"},{"line_number":149,"context_line":"            user_id \u003d query[\u0027trustee_user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAANH%2F%2F9v4%3D","line":146,"updated":"2013-03-01 08:38:17.000000000","message":"The same here","commit_id":"7e9a511c932d6e25dea222499147a826a649f201"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"e4339d533b3e71168f8ebb77056659502b0ebc1b","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            calling_user_id \u003d self._get_user_id(context)"},{"line_number":151,"context_line":"            if user_id !\u003d calling_user_id:"},{"line_number":152,"context_line":"                raise exception.ForbiddenAction()"},{"line_number":153,"context_line":"            trusts \u003d trusts + (self.trust_api."},{"line_number":154,"context_line":"                               list_trusts_for_trustee(context, user_id))"},{"line_number":155,"context_line":"        global_roles \u003d self.identity_api.list_roles(context)"},{"line_number":156,"context_line":"        for trust in trusts:"}],"source_content_type":"text/x-python","patch_set":49,"id":"AAAANH%2F%2F9vw%3D","line":153,"updated":"2013-03-01 08:38:17.000000000","message":"and here. Sorry for not pointing this in the original comment.","commit_id":"7e9a511c932d6e25dea222499147a826a649f201"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    if (user_id !\u003d trust.get(\u0027trustor_user_id\u0027) and"},{"line_number":25,"context_line":"            user_id !\u003d trust.get(\u0027trustor_user_id\u0027) and"},{"line_number":26,"context_line":"            context[\u0027is_admin\u0027]):"},{"line_number":27,"context_line":"                raise exception.Forbidden()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _admin_trustor_only(context, trust, user_id):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8C0%3D","line":27,"updated":"2013-03-05 20:40:20.000000000","message":"this is extra-indented.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"@dependency.requires(\u0027identity_api\u0027, \u0027trust_api\u0027, \u0027token_api\u0027)"},{"line_number":36,"context_line":"class TrustV3(controller.V3Controller):"},{"line_number":37,"context_line":"    collection_name \u003d \"trusts\""},{"line_number":38,"context_line":"    member_name \u003d \"trust\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _get_user_id(self, context):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Ck%3D","line":37,"updated":"2013-03-05 20:40:20.000000000","message":"prefer \u0027 instead of \"","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def _get_user_id(self, context):"},{"line_number":41,"context_line":"        if \u0027token_id\u0027 in context:"},{"line_number":42,"context_line":"            token_id \u003d context[\u0027token_id\u0027]"},{"line_number":43,"context_line":"            token \u003d self.token_api.get_token(context, token_id)"},{"line_number":44,"context_line":"            user_id \u003d token[\u0027user\u0027][\u0027id\u0027]"},{"line_number":45,"context_line":"            return user_id"},{"line_number":46,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8CU%3D","line":43,"updated":"2013-03-05 20:40:20.000000000","message":"do we need to check here for token is None? (at line 51 check for trust is None, so I\u0027m wondering if token could be None, too.)","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":50,"context_line":"        trust \u003d self.trust_api.get_trust(context, trust_id)"},{"line_number":51,"context_line":"        if not trust:"},{"line_number":52,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":53,"context_line":"        _admin_trustor_trustee_only(context, trust, user_id)"},{"line_number":54,"context_line":"        if not trust:"},{"line_number":55,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8CQ%3D","line":52,"updated":"2013-03-05 20:40:20.000000000","message":"trust_id -\u003e \"trust_id\u003dtrust_id\"","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        if not trust:"},{"line_number":52,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":53,"context_line":"        _admin_trustor_trustee_only(context, trust, user_id)"},{"line_number":54,"context_line":"        if not trust:"},{"line_number":55,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":56,"context_line":"        if (user_id !\u003d trust[\u0027trustor_user_id\u0027] and"},{"line_number":57,"context_line":"                user_id !\u003d trust[\u0027trustee_user_id\u0027]):"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8CE%3D","line":54,"updated":"2013-03-05 20:40:20.000000000","message":"this was just checked at line 51.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                    trust_roles.append({\u0027id\u0027:"},{"line_number":100,"context_line":"                                        global_role_names[rolename][\u0027id\u0027]})"},{"line_number":101,"context_line":"                else:"},{"line_number":102,"context_line":"                    raise exception.RoleNotFound(\"role %s is not defined\" %"},{"line_number":103,"context_line":"                                                 rolename)"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                raise exception.ValidationError(attribute\u003d\u0027id or name\u0027,"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Bk%3D","line":102,"updated":"2013-03-05 20:40:20.000000000","message":"use _() for translation.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        return trust_roles"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @controller.protected"},{"line_number":110,"context_line":"    def create_trust(self, context, trust\u003dNone):"},{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        The user creating the trust must be trustor"},{"line_number":113,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8BY%3D","line":110,"updated":"2013-03-05 20:40:20.000000000","message":"why default trust to None, it\u0027s just going to raise ValidationError.","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    def delete_trust(self, context, trust_id):"},{"line_number":186,"context_line":"        trust \u003d self.trust_api.get_trust(context, trust_id)"},{"line_number":187,"context_line":"        if not trust:"},{"line_number":188,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":191,"context_line":"        _admin_trustor_only(context, trust, user_id)"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8A0%3D","line":188,"updated":"2013-03-05 20:40:20.000000000","message":"argument should be trust_id\u003dtrust_id","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    def list_roles_for_trust(self, context, trust_id):"},{"line_number":202,"context_line":"        trust \u003d self.get_trust(context, trust_id)[\u0027trust\u0027]"},{"line_number":203,"context_line":"        if not trust:"},{"line_number":204,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":205,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":206,"context_line":"        _admin_trustor_trustee_only(context, trust, user_id)"},{"line_number":207,"context_line":"        return {\u0027roles\u0027: trust[\u0027roles\u0027],"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8As%3D","line":204,"updated":"2013-03-05 20:40:20.000000000","message":"argument should be trust_id\u003dtrust_id","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        \"\"\"Checks if a role has been assigned to a trust.\"\"\""},{"line_number":213,"context_line":"        trust \u003d self.trust_api.get_trust(context, trust_id)"},{"line_number":214,"context_line":"        if not trust:"},{"line_number":215,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":216,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":217,"context_line":"        _admin_trustor_trustee_only(context, trust, user_id)"},{"line_number":218,"context_line":"        matching_roles \u003d [x for x in trust[\u0027roles\u0027]"}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F8Ak%3D","line":215,"updated":"2013-03-05 20:40:20.000000000","message":"trust_id\u003dtrust_id","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"keystone/trust/routers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c0de28effc0001b3eaff63db38e8732d45bdc017","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":"\"\"\"WSGI Routers for the Identity service.\"\"\""},{"line_number":17,"context_line":"from keystone.common import wsgi"},{"line_number":18,"context_line":"from keystone.trust import controllers"},{"line_number":19,"context_line":"from keystone.common import router"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"AAAAN3%2F%2F7%2F4%3D","line":17,"updated":"2013-03-05 20:40:20.000000000","message":"not used?","commit_id":"601eeb50b60a2e99041690fe19238202bc203503"}],"run_tests.sh":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":116,"context_line":"  ignore\u003d\"$ignore_scripts,$ignore_files,$ignore_dirs\""},{"line_number":117,"context_line":"  srcfiles\u003d\".\""},{"line_number":118,"context_line":"  # Just run PEP8 in current environment"},{"line_number":119,"context_line":"  ${wrapper} pep8  --repeat --show-pep8 --show-source \\"},{"line_number":120,"context_line":"    --exclude\u003d${ignore} ${srcfiles} | tee pep8.txt"},{"line_number":121,"context_line":"}"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-sh","patch_set":37,"id":"AAAAM3%2F%2BlY4%3D","line":119,"updated":"2013-02-26 18:51:53.000000000","message":"Irrelevant space :)","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":116,"context_line":"  ignore\u003d\"$ignore_scripts,$ignore_files,$ignore_dirs\""},{"line_number":117,"context_line":"  srcfiles\u003d\".\""},{"line_number":118,"context_line":"  # Just run PEP8 in current environment"},{"line_number":119,"context_line":"  ${wrapper} pep8  --repeat --show-pep8 --show-source \\"},{"line_number":120,"context_line":"    --exclude\u003d${ignore} ${srcfiles} | tee pep8.txt"},{"line_number":121,"context_line":"}"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-sh","patch_set":37,"id":"AAAAM3%2F%2BlQg%3D","line":119,"in_reply_to":"AAAAM3%2F%2BlY4%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"}],"tests/test_auth.py":[{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"ff1acd24a4e12f31e4d74660442738a27d44716b","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            exception.Unauthorized,"},{"line_number":538,"context_line":"            self.controller.authenticate, {}, request_body)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"    def test_token_from_trust_with_wrong_role_fails(self):"},{"line_number":541,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":542,"context_line":"            self.user_foo[\u0027id\u0027],"},{"line_number":543,"context_line":"            self.tenant_bar[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3Wc%3D","line":540,"updated":"2013-02-16 02:09:58.000000000","message":"does this imply that we need to purge (relevant) trusts on a role removal with a user from a project?","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"92c3e72d87da6318cb1d732a662a783a098a66c3","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            exception.Unauthorized,"},{"line_number":538,"context_line":"            self.controller.authenticate, {}, request_body)"},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"    def test_token_from_trust_with_wrong_role_fails(self):"},{"line_number":541,"context_line":"        self.identity_api.add_role_to_user_and_project("},{"line_number":542,"context_line":"            self.user_foo[\u0027id\u0027],"},{"line_number":543,"context_line":"            self.tenant_bar[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAM3%2F%2B3UU%3D","line":540,"in_reply_to":"AAAAM3%2F%2B3Wc%3D","updated":"2013-02-16 02:26:28.000000000","message":"Nope.  If a user loses a role, the attempt to create a token from the trust will fail.  I\u0027ll put in a specific unit test for that.","commit_id":"769119dfae69310574200b2b85c660a6c5b7a731"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if tenant_id is not None:"},{"line_number":54,"context_line":"        auth_json[\u0027tenantId\u0027] \u003d tenant_id"},{"line_number":55,"context_line":"    if trust_id is not None:"},{"line_number":56,"context_line":"        auth_json[\u0027trust\u0027] \u003d trust_id"},{"line_number":57,"context_line":"    return auth_json"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BnAY%3D","line":56,"updated":"2013-02-25 22:51:21.000000000","message":"trustId would make more sense in v2","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    if tenant_id is not None:"},{"line_number":54,"context_line":"        auth_json[\u0027tenantId\u0027] \u003d tenant_id"},{"line_number":55,"context_line":"    if trust_id is not None:"},{"line_number":56,"context_line":"        auth_json[\u0027trust\u0027] \u003d trust_id"},{"line_number":57,"context_line":"    return auth_json"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bmzc%3D","line":56,"in_reply_to":"AAAAM3%2F%2BnAY%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        self.sample_data \u003d {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":471,"context_line":"                            \u0027trustee_user_id\u0027: self.trustee[\u0027id\u0027],"},{"line_number":472,"context_line":"                            \u0027project\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":473,"context_line":"                            \u0027impersonate\u0027: \u0027True\u0027,"},{"line_number":474,"context_line":"                            \u0027roles\u0027: [self.role_browser[\u0027id\u0027]]}"},{"line_number":475,"context_line":"        self.create_trust()"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BnAI%3D","line":473,"updated":"2013-02-25 22:51:21.000000000","message":"this should be a boolean","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        self.sample_data \u003d {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":471,"context_line":"                            \u0027trustee_user_id\u0027: self.trustee[\u0027id\u0027],"},{"line_number":472,"context_line":"                            \u0027project\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":473,"context_line":"                            \u0027impersonate\u0027: \u0027True\u0027,"},{"line_number":474,"context_line":"                            \u0027roles\u0027: [self.role_browser[\u0027id\u0027]]}"},{"line_number":475,"context_line":"        self.create_trust()"},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bmpo%3D","line":473,"in_reply_to":"AAAAM3%2F%2BnAI%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.unscoped_token \u003d self.controller.authenticate({}, body_dict)"},{"line_number":482,"context_line":"        context \u003d {\u0027token_id\u0027: self.unscoped_token[\u0027access\u0027][\u0027token\u0027][\u0027id\u0027]}"},{"line_number":483,"context_line":"        if expiry:"},{"line_number":484,"context_line":"            self.sample_data[\u0027expires\u0027] \u003d expiry"},{"line_number":485,"context_line":"        self.sample_data[\u0027impersonate\u0027] \u003d impersonate"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        new_trust \u003d self.trust_controller.create_trust(context,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2F0%3D","line":484,"updated":"2013-02-25 22:51:21.000000000","message":"can you be consistent about expires / expiry / expires_at?","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.unscoped_token \u003d self.controller.authenticate({}, body_dict)"},{"line_number":482,"context_line":"        context \u003d {\u0027token_id\u0027: self.unscoped_token[\u0027access\u0027][\u0027token\u0027][\u0027id\u0027]}"},{"line_number":483,"context_line":"        if expiry:"},{"line_number":484,"context_line":"            self.sample_data[\u0027expires\u0027] \u003d expiry"},{"line_number":485,"context_line":"        self.sample_data[\u0027impersonate\u0027] \u003d impersonate"},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"        new_trust \u003d self.trust_controller.create_trust(context,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bmp0%3D","line":484,"in_reply_to":"AAAAM3%2F%2Bm%2F0%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                          [self.role_browser[\u0027id\u0027]])"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_create_trust_no_impersonate(self):"},{"line_number":520,"context_line":"        self.create_trust(expiry\u003dNone, impersonate\u003d\u0027False\u0027)"},{"line_number":521,"context_line":"        self.assertEquals(self.new_trust[\u0027trustor_user_id\u0027],"},{"line_number":522,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":523,"context_line":"        self.assertEquals(self.new_trust[\u0027trustee_user_id\u0027],"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2F8%3D","line":520,"updated":"2013-02-25 22:51:21.000000000","message":"boolean","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                          [self.role_browser[\u0027id\u0027]])"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_create_trust_no_impersonate(self):"},{"line_number":520,"context_line":"        self.create_trust(expiry\u003dNone, impersonate\u003d\u0027False\u0027)"},{"line_number":521,"context_line":"        self.assertEquals(self.new_trust[\u0027trustor_user_id\u0027],"},{"line_number":522,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":523,"context_line":"        self.assertEquals(self.new_trust[\u0027trustee_user_id\u0027],"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bmpg%3D","line":520,"in_reply_to":"AAAAM3%2F%2Bm%2F8%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":529,"context_line":"        self.assertEquals(token_user[\u0027id\u0027],"},{"line_number":530,"context_line":"                          self.new_trust[\u0027trustee_user_id\u0027])"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        #TODO Endpoints"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    def test_token_from_trust_wrong_user_fails(self):"},{"line_number":535,"context_line":"        new_trust \u003d self.create_trust()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2FU%3D","line":532,"updated":"2013-02-25 22:51:21.000000000","message":"could remove","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":529,"context_line":"        self.assertEquals(token_user[\u0027id\u0027],"},{"line_number":530,"context_line":"                          self.new_trust[\u0027trustee_user_id\u0027])"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        #TODO Endpoints"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    def test_token_from_trust_wrong_user_fails(self):"},{"line_number":535,"context_line":"        new_trust \u003d self.create_trust()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BmpU%3D","line":532,"in_reply_to":"AAAAM3%2F%2Bm%2FU%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"d74bab48d7a1ab161575fe6864334113385a9c57","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.load_backends()"},{"line_number":66,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.controller \u003d token.controllers.Auth()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def assertEqualTokens(self, a, b):"},{"line_number":71,"context_line":"        \"\"\"Assert that two tokens are equal."}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlYk%3D","line":68,"updated":"2013-02-26 18:51:53.000000000","message":"Cut out this rename to separate change?","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8e800212535d1c330ab5fbb4205f61b36921e4a7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.load_backends()"},{"line_number":66,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.controller \u003d token.controllers.Auth()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def assertEqualTokens(self, a, b):"},{"line_number":71,"context_line":"        \"\"\"Assert that two tokens are equal."}],"source_content_type":"text/x-python","patch_set":37,"id":"AAAAM3%2F%2BlLk%3D","line":68,"in_reply_to":"AAAAM3%2F%2BlYk%3D","updated":"2013-02-26 20:14:30.000000000","message":"Done","commit_id":"2b5a35d00740136deb54ec08bd3c4c1c9b7979eb"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c0fbf7a5d2dcb427e26fdd028bdc6693d39cf54d","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"import default_fixtures"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import default_fixtures"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"import default_fixtures"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"AAAAM3%2F%2BkT0%3D","line":28,"updated":"2013-02-27 05:03:17.000000000","message":"remove the extra import default_fixtures","commit_id":"e394389ef568905f869738b375aaaec588738171"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":525,"context_line":"        self.assertEquals(self.new_trust[\u0027trustee_user_id\u0027],"},{"line_number":526,"context_line":"                          self.trustee[\u0027id\u0027])"},{"line_number":527,"context_line":"        self.assertEquals(len(self.new_trust[\u0027roles\u0027]), 2)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_get_trust(self):"},{"line_number":530,"context_line":"        context \u003d {\u0027token_id\u0027: self.unscoped_token[\u0027access\u0027][\u0027token\u0027][\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FZQ%3D","line":527,"updated":"2013-02-28 07:39:01.000000000","message":"You should verify that it\u0027s our roles either with two assertIn or with assertEquals for sets like this:\n\n    self.assertEquals(set(self.new_trust[\u0027roles\u0027]),\n        {{\u0027id\u0027: self.role_browser[\u0027id\u0027]}, {\u0027id\u0027: self.role_member[\u0027id\u0027]}})","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":524,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":525,"context_line":"        self.assertEquals(self.new_trust[\u0027trustee_user_id\u0027],"},{"line_number":526,"context_line":"                          self.trustee[\u0027id\u0027])"},{"line_number":527,"context_line":"        self.assertEquals(len(self.new_trust[\u0027roles\u0027]), 2)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_get_trust(self):"},{"line_number":530,"context_line":"        context \u003d {\u0027token_id\u0027: self.unscoped_token[\u0027access\u0027][\u0027token\u0027][\u0027id\u0027]}"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BGc%3D","line":527,"in_reply_to":"AAAANH%2F%2F%2FZQ%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":535,"context_line":"        self.assertEquals(trust[\u0027trustee_user_id\u0027],"},{"line_number":536,"context_line":"                          self.trustee[\u0027id\u0027])"},{"line_number":537,"context_line":"        self.assertEquals(len(trust[\u0027roles\u0027]), 2)"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    def test_create_trust_no_impersonation(self):"},{"line_number":540,"context_line":"        self.create_trust(expiry\u003dNone, impersonation\u003d\u0027False\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FYM%3D","line":537,"updated":"2013-02-28 07:39:01.000000000","message":"The same here","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":534,"context_line":"                          self.trustor[\u0027id\u0027])"},{"line_number":535,"context_line":"        self.assertEquals(trust[\u0027trustee_user_id\u0027],"},{"line_number":536,"context_line":"                          self.trustee[\u0027id\u0027])"},{"line_number":537,"context_line":"        self.assertEquals(len(trust[\u0027roles\u0027]), 2)"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    def test_create_trust_no_impersonation(self):"},{"line_number":540,"context_line":"        self.create_trust(expiry\u003dNone, impersonation\u003d\u0027False\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BGY%3D","line":537,"in_reply_to":"AAAANH%2F%2F%2FYM%3D","updated":"2013-03-01 00:50:23.000000000","message":"Done","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":2055,"context_line":"        self.assertEquals(new_id, trust_data[\u0027id\u0027])"},{"line_number":2056,"context_line":"        self.assertEquals(self.trustee[\u0027id\u0027], trust_data[\u0027trustee_user_id\u0027])"},{"line_number":2057,"context_line":"        self.assertEquals(self.trustor[\u0027id\u0027], trust_data[\u0027trustor_user_id\u0027])"},{"line_number":2058,"context_line":"        self.assertEquals([\"r1\", \"r2\", \"r3\"], trust_data[\u0027roles\u0027])"},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"    def test_list_trust_by_trustee(self):"},{"line_number":2061,"context_line":"        for i in range(0, 10):"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2FA%3D","line":2058,"updated":"2013-02-25 22:51:21.000000000","message":"what is r1, r2, and r3? generate uuid\u0027s and test for them","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2fa60702dba7f559747d9a801ea281889f5dd2f1","unresolved":false,"context_lines":[{"line_number":2058,"context_line":"        self.assertEquals([\"r1\", \"r2\", \"r3\"], trust_data[\u0027roles\u0027])"},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"    def test_list_trust_by_trustee(self):"},{"line_number":2061,"context_line":"        for i in range(0, 10):"},{"line_number":2062,"context_line":"            trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":2063,"context_line":"        trusts \u003d self.trust_api.list_trusts_for_trustee(self.trustee)"},{"line_number":2064,"context_line":"        self.assertEqual(len(trusts), 10)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2Bm%2B0%3D","line":2061,"updated":"2013-02-25 22:51:21.000000000","message":"is 10 necessary? i think 3 would be sufficient throughout","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"76e65fedb7dd1fdb34a370a4ac7a9948bcf22143","unresolved":false,"context_lines":[{"line_number":2058,"context_line":"        self.assertEquals([\"r1\", \"r2\", \"r3\"], trust_data[\u0027roles\u0027])"},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"    def test_list_trust_by_trustee(self):"},{"line_number":2061,"context_line":"        for i in range(0, 10):"},{"line_number":2062,"context_line":"            trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":2063,"context_line":"        trusts \u003d self.trust_api.list_trusts_for_trustee(self.trustee)"},{"line_number":2064,"context_line":"        self.assertEqual(len(trusts), 10)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAM3%2F%2BmZI%3D","line":2061,"in_reply_to":"AAAAM3%2F%2Bm%2B0%3D","updated":"2013-02-26 06:16:30.000000000","message":"Done","commit_id":"2d5d4eaf635d01396af2500ef4a745c31fef4602"}],"tests/test_backend_sql.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self.assertEqual(arbitrary_value, ref[\u0027extra\u0027][arbitrary_key])"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"class SqlTrust(SqlTests, test_backend.TrustTests):"},{"line_number":229,"context_line":"    pass"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bkzw%3D","line":228,"updated":"2013-02-26 23:36:22.000000000","message":"SqlToken testcase should remain.","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"}],"tests/test_content_types.py":[{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9d69117df7c0f3aebfe19b6df17907529f1f1c9a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d100000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2Bnao%3D","line":93,"updated":"2013-02-25 18:44:41.000000000","message":"Are there any reason to boost timeout here?","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"244af3f4b015cc92400666bb07803b1a0b95179b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d100000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAM3%2F%2BnNI%3D","line":93,"in_reply_to":"AAAAM3%2F%2Bnao%3D","updated":"2013-02-25 20:47:45.000000000","message":"Only for debugging.  It will be reverted prior to final commit.","commit_id":"f0004a81abbe2ebc6d5888a829d79befc0910660"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"2cc54405789dd028580b88d1b8f0acb4c7025cab","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d1000000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":39,"id":"AAAAM3%2F%2Bkzo%3D","line":93,"updated":"2013-02-26 23:36:22.000000000","message":"Don\u0027t forget to revert this.","commit_id":"aed2f2260441b96e7a4f45a3a44f1ac62fce0489"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"9cf13504415da307a2aab7f5b6a55da91efbf1e1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d1000000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2FZA%3D","line":93,"updated":"2013-02-28 07:39:01.000000000","message":"I think, this can be reverted.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"516f34a404f89ba418a3339d2f5cde67358525a8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d1000000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F9vo%3D","line":93,"in_reply_to":"AAAANH%2F%2F%2BGI%3D","updated":"2013-03-01 08:37:55.000000000","message":"You can always keep it in you work dir :)","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"69836d7c8555961f4850c17f96eaa95c70bb398d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        # Initialize headers dictionary"},{"line_number":91,"context_line":"        headers \u003d {} if not headers else headers"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        connection \u003d httplib.HTTPConnection(host, port, timeout\u003d1000000)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Perform the request"},{"line_number":96,"context_line":"        connection.request(method, path, body, headers)"}],"source_content_type":"text/x-python","patch_set":45,"id":"AAAANH%2F%2F%2BGI%3D","line":93,"in_reply_to":"AAAANH%2F%2F%2FZA%3D","updated":"2013-03-01 00:50:23.000000000","message":"Not yet....I\u0027ll get it before I commit, but debugging without it is a pain.  I\u0027ll get before the final final.","commit_id":"1bb67e20ed31ec0d2a3310f79289a7be754a480d"}],"tests/test_v3_trust.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a3a91693673dee597f59ad876224840f6527ca3b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        self.password \u003d \u0027freeipa4all\u0027"},{"line_number":21,"context_line":"        self.auth_url \u003d \u0027/v2.0\u0027"},{"line_number":22,"context_line":"        self.admin_url \u003d \u0027/v2.0\u0027"},{"line_number":23,"context_line":"        self.admin_url_v3 \u003d \u0027/v3\u0027"},{"line_number":24,"context_line":"        self.url_template \u003d \"%(auth_url)s/%(resource)s\""},{"line_number":25,"context_line":"        self.headers \u003d {\u0027Content-type\u0027: \u0027application/json\u0027}"},{"line_number":26,"context_line":"        self.trustor \u003d self.create_user()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2BvYI%3D","line":23,"updated":"2013-02-20 06:07:39.000000000","message":"These will need to be /v3 after the token APIs landed.","commit_id":"f690941a4fe85d8d6d8066b13a32ef426e09d035"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a3a91693673dee597f59ad876224840f6527ca3b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                         headers\u003dheaders)"},{"line_number":118,"context_line":"        return r"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def create_domain(self):"},{"line_number":121,"context_line":"        domain \u003d self.new_domain_ref()"},{"line_number":122,"context_line":"        resource \u003d \u0027domains\u0027"},{"line_number":123,"context_line":"        data \u003d {\u0027domain\u0027: domain}"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2BvWk%3D","line":120,"updated":"2013-02-20 06:07:39.000000000","message":"just use self.identity_api.create_domain().","commit_id":"f690941a4fe85d8d6d8066b13a32ef426e09d035"}]}
