)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f07f735609364ae2faf9a53cd021150cb32fcfc9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Arvind Tiwari \u003carvind.tiwari@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-10-08 15:20:40 -0600"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Need enhancement over bug fix1186059"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bug fix : 1233874"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATH%2F%2F27c%3D","line":7,"updated":"2013-10-08 21:42:41.000000000","message":"Can this be something move descriptive like: \"Adds domain id to policy_dict\" or whatever makes sense to you.  In a second paragraph you could mentions bug 1186059.","commit_id":"1380ada5fd17b1e100d9c930d5aac3f3d9690caa"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f07f735609364ae2faf9a53cd021150cb32fcfc9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Need enhancement over bug fix1186059"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Bug fix : 1233874"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I855ec8ff4899ba3797a2e2bb23945ab4b23d2bea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATH%2F%2F27I%3D","line":9,"updated":"2013-10-08 21:42:41.000000000","message":"How about \u0027Fixes-Bug: #1233874\u0027?","commit_id":"1380ada5fd17b1e100d9c930d5aac3f3d9690caa"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e7b8feaa4604c9050bad056c7d3d9551a4a6b285","unresolved":false,"context_lines":[{"line_number":10,"context_line":"APIs due to lack of domain_id in policy_dict for API target"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Closes-Bug: 1233874"},{"line_number":13,"context_line":"and"},{"line_number":14,"context_line":"Closes-Bug: 1251048"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I855ec8ff4899ba3797a2e2bb23945ab4b23d2bea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"AAAATn%2F9kC0%3D","line":13,"updated":"2013-12-10 07:50:20.000000000","message":"Remove the \"and\" it isn\u0027t needed","commit_id":"5fcf4cd1929701454d1ac1f1623566547facbe95"}],"etc/policy.v3cloudsample.json":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a12531a16a718f343cf61988a5ad2cc767f43f79","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":4,"id":"AAAATH%2F%2FdYg%3D","line":7,"updated":"2013-10-15 22:01:14.000000000","message":"what\u0027s the difference between admin in the case and \u0027cloud_admin\u0027 in line 3? They look pretty much the same. Can we consolidate the two?","commit_id":"cbbedf44249ac00566cc0459e493c16f2d5c5162"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6bd1d7eb7de3efe2ef8ca93013274e2cd7682a6","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":4,"id":"AAAATH%2F%2FdPA%3D","line":7,"in_reply_to":"AAAATH%2F%2FdRs%3D","updated":"2013-10-15 22:38:34.000000000","message":"yeah, looks like they are different. One is for system domain and the other is for local domain.","commit_id":"cbbedf44249ac00566cc0459e493c16f2d5c5162"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8e072a6da787ea7588c9aa020f668bdcd67f7e2d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":4,"id":"AAAATH%2F%2FdRs%3D","line":7,"in_reply_to":"AAAATH%2F%2FdYg%3D","updated":"2013-10-15 22:31:00.000000000","message":"\"domain_id:admin_domain_id\" is the difference.","commit_id":"cbbedf44249ac00566cc0459e493c16f2d5c5162"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"03d4451e80315f073caabc4032cf15cc7fb01791","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FSF8%3D","line":7,"updated":"2013-11-11 18:47:26.000000000","message":"this is really a user domain. Should it be\n\n\"domain_id:%(target.entity.user.domain_id)s\"","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8c58bc517e526f0c673742761e4db018b7656b99","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FI3A%3D","line":7,"in_reply_to":"AAAATn%2F%2FJxY%3D","updated":"2013-11-13 23:01:48.000000000","message":"Created new bug 1251048 for this and fixed it by setting following in auth controller\n\ncollection_name \u003d \u0027auths\u0027\nmember_name \u003d \u0027auth\u0027\n\nlooks OK?","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f9832ee3bf6093a8ee783d3fdd111a18d6aadd1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FJxY%3D","line":7,"in_reply_to":"AAAATn%2F%2FKiw%3D","updated":"2013-11-13 17:32:10.000000000","message":"...and I think I have worked this out...in the code we are calling the protection() wrappers from within a v3 class but have not set up the member_name attribute (which should be set to \u0027auth\" I would suggest)...and in the light of it not being set you get \u0027entity\u0027...yuk...we should fix that","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0b50ec7fdc96c080353e5b46d2ca95d58478bf26","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FKiw%3D","line":7,"in_reply_to":"AAAATn%2F%2FSF8%3D","updated":"2013-11-13 14:19:45.000000000","message":"I\u0027m not entirely sure what \"entity\" is here - how it is set and how it is checked?","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8c58bc517e526f0c673742761e4db018b7656b99","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": [[\"role:service\"]],"},{"line_number":5,"context_line":"    \"service_or_admin\": [[\"rule:admin_required\"], [\"rule:service_role\"]],"},{"line_number":6,"context_line":"    \"owner\" : [[\"user_id:%(user_id)s\"], [\"user_id:%(target.entity.user_id)s\"]],"},{"line_number":7,"context_line":"    \"admin_or_owner\": [[\"rule:admin_required\",\"domain_id:%(target.entity.domain_id)s\"], [\"rule:owner\"]],"},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": [[\"rule:admin_required\"], [\"rule:cloud_admin\"]],"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAATn%2F%2FI3Q%3D","line":7,"in_reply_to":"AAAATn%2F%2FSF8%3D","updated":"2013-11-13 23:01:48.000000000","message":"fixed","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dd7daaeb8f5bcab73e4f58160dbcf0601b436904","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    \"cloud_admin\": \"rule:admin_required and domain_id:admin_domain_id\","},{"line_number":4,"context_line":"    \"service_role\": \"role:service\","},{"line_number":5,"context_line":"    \"service_or_admin\": \"rule:admin_required or rule:service_role\","},{"line_number":6,"context_line":"    \"owner\" : \"user_id:%(user_id)s or user_id:%(target.auth.user.id)s\","},{"line_number":7,"context_line":"    \"admin_or_owner\": \"(rule:admin_required and domain_id:%(target.auth.user.domain.id)s) or rule:owner\","},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": \"rule:admin_required or rule:cloud_admin\","},{"line_number":9,"context_line":""}],"source_content_type":"application/json","patch_set":11,"id":"AAAATn%2F%2B%2FeE%3D","line":6,"updated":"2013-11-16 04:19:34.000000000","message":"Why did you need to change from entity to auth?","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"333f4321a1391226eec47ee71380e3d8e903a5ea","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    \"cloud_admin\": \"rule:admin_required and domain_id:admin_domain_id\","},{"line_number":4,"context_line":"    \"service_role\": \"role:service\","},{"line_number":5,"context_line":"    \"service_or_admin\": \"rule:admin_required or rule:service_role\","},{"line_number":6,"context_line":"    \"owner\" : \"user_id:%(user_id)s or user_id:%(target.auth.user.id)s\","},{"line_number":7,"context_line":"    \"admin_or_owner\": \"(rule:admin_required and domain_id:%(target.auth.user.domain.id)s) or rule:owner\","},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": \"rule:admin_required or rule:cloud_admin\","},{"line_number":9,"context_line":""}],"source_content_type":"application/json","patch_set":11,"id":"AAAATn%2F%2B6jA%3D","line":6,"in_reply_to":"AAAATn%2F%2B%2FeE%3D","updated":"2013-11-18 16:57:14.000000000","message":"I think Henry has explained the need.\n\nThanks Henry.","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6169b903a46817954974e217a5b64973b2717935","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    \"cloud_admin\": \"rule:admin_required and domain_id:admin_domain_id\","},{"line_number":4,"context_line":"    \"service_role\": \"role:service\","},{"line_number":5,"context_line":"    \"service_or_admin\": \"rule:admin_required or rule:service_role\","},{"line_number":6,"context_line":"    \"owner\" : \"user_id:%(user_id)s or user_id:%(target.auth.user.id)s\","},{"line_number":7,"context_line":"    \"admin_or_owner\": \"(rule:admin_required and domain_id:%(target.auth.user.domain.id)s) or rule:owner\","},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": \"rule:admin_required or rule:cloud_admin\","},{"line_number":9,"context_line":""}],"source_content_type":"application/json","patch_set":11,"id":"AAAATn%2F%2B%2FQk%3D","line":6,"in_reply_to":"AAAATn%2F%2B%2FeE%3D","updated":"2013-11-16 09:24:02.000000000","message":"there was a separate bug, fixed by this patch, where we were not specifying the member_name as part of a V3 controller (in this case auth) that was calling the protection wrappers.  In the absence of that, you got the generic \u0027entity\u0027 stuffed into the target","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"41a705919a819c79ac6fd6de709a3066a8ef5a14","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": \"role:service\","},{"line_number":5,"context_line":"    \"service_or_admin\": \"rule:admin_required or rule:service_role\","},{"line_number":6,"context_line":"    \"owner\" : \"user_id:%(user_id)s or user_id:%(target.auth.user_id)s\","},{"line_number":7,"context_line":"    \"admin_or_owner\": \"(rule:admin_required and domain_id:%(target.auth.user.domain.id)s) or rule:owner\","},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": \"rule:admin_required or rule:cloud_admin\","},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":13,"id":"AAAATn%2F%2B3bs%3D","line":7,"updated":"2013-11-19 07:13:29.000000000","message":"Why is this target.auth.user.domain.id as opposed to just target.user.domain_id ?  Is the difference between these two documented somewhere?","commit_id":"e76ea6ad4b82d7123163cc92b5c5824fd8a27960"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"6d78b9f5df3667a472b85d105fe842776d622ede","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    \"service_role\": \"role:service\","},{"line_number":5,"context_line":"    \"service_or_admin\": \"rule:admin_required or rule:service_role\","},{"line_number":6,"context_line":"    \"owner\" : \"user_id:%(user_id)s or user_id:%(target.auth.user_id)s\","},{"line_number":7,"context_line":"    \"admin_or_owner\": \"(rule:admin_required and domain_id:%(target.auth.user.domain.id)s) or rule:owner\","},{"line_number":8,"context_line":"    \"admin_or_cloud_admin\": \"rule:admin_required or rule:cloud_admin\","},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"default\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":13,"id":"AAAATn%2F%2B1T4%3D","line":7,"in_reply_to":"AAAATn%2F%2B3bs%3D","updated":"2013-11-19 15:49:11.000000000","message":"Please look at Henry\u0027s comment in \nhttps://review.openstack.org/#/c/50488/7/keystone/common/controller.py","commit_id":"e76ea6ad4b82d7123163cc92b5c5824fd8a27960"}],"keystone/auth/controllers.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"631c43a206e869641bf50ef55b0d4cdb336aa9ca","unresolved":false,"context_lines":[{"line_number":275,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":276,"context_line":"class Auth(controller.V3Controller):"},{"line_number":277,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":278,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":281,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FDFw%3D","line":278,"updated":"2013-11-15 06:54:14.000000000","message":"may want to drop a note here indicating that Auth have no collections. We are merely using them to facilitate policy decisions.","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"3cda23d20aa49b80d78b0f2970fe1c8b3f9939f9","unresolved":false,"context_lines":[{"line_number":275,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":276,"context_line":"class Auth(controller.V3Controller):"},{"line_number":277,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":278,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":281,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FAlo%3D","line":278,"in_reply_to":"AAAATn%2F%2FDFw%3D","updated":"2013-11-15 19:02:53.000000000","message":"Good idea, fix is no the way.","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dd7daaeb8f5bcab73e4f58160dbcf0601b436904","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    # NOTE(atiwari): There are no Auth collections"},{"line_number":278,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":279,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":280,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":281,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, *args, **kw):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2Fdo%3D","line":280,"updated":"2013-11-16 04:19:34.000000000","message":"So you need to have a much better comment here. Please explain in more detail regarding why and how  the policy stuff breaks without these put here. Henry Nash covered this in his comment on an earlier patch so please expand upon his explanation.  If you don\u0027t do this we will all forget why this is here in about 3 months :-)","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"333f4321a1391226eec47ee71380e3d8e903a5ea","unresolved":false,"context_lines":[{"line_number":277,"context_line":"    # NOTE(atiwari): There are no Auth collections"},{"line_number":278,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":279,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":280,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":281,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def __init__(self, *args, **kw):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B6Xc%3D","line":280,"in_reply_to":"AAAATn%2F%2B%2Fdo%3D","updated":"2013-11-18 16:57:14.000000000","message":"Sure, let me try in next patch","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"41a705919a819c79ac6fd6de709a3066a8ef5a14","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    # In the absence of these attributes, default \u0027entity\u0027"},{"line_number":282,"context_line":"    # string will be used to represent the target which is"},{"line_number":283,"context_line":"    # generic. Policy can be defined using \u0027entity\u0027 but it"},{"line_number":284,"context_line":"    # would not reflect exact entity is in context."},{"line_number":285,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":286,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":287,"context_line":"    collection_name \u003d \u0027auths\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2B3c4%3D","line":284,"updated":"2013-11-19 07:13:29.000000000","message":"Typo on this line. Perhaps it should be \"would not reflect the exact entity that is in context.\"   ???","commit_id":"e76ea6ad4b82d7123163cc92b5c5824fd8a27960"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"6d78b9f5df3667a472b85d105fe842776d622ede","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    # In the absence of these attributes, default \u0027entity\u0027"},{"line_number":282,"context_line":"    # string will be used to represent the target which is"},{"line_number":283,"context_line":"    # generic. Policy can be defined using \u0027entity\u0027 but it"},{"line_number":284,"context_line":"    # would not reflect exact entity is in context."},{"line_number":285,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":286,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":287,"context_line":"    collection_name \u003d \u0027auths\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATn%2F%2B1Us%3D","line":284,"in_reply_to":"AAAATn%2F%2B3c4%3D","updated":"2013-11-19 15:49:11.000000000","message":"will fix it","commit_id":"e76ea6ad4b82d7123163cc92b5c5824fd8a27960"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fa3e3a944d10cc12c5da6df740757c53206a2a2a","unresolved":false,"context_lines":[{"line_number":275,"context_line":"class Auth(controller.V3Controller):"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    # Note(atiwari): From V3 auth controller code we are"},{"line_number":278,"context_line":"    # calling protection() wrappers, but we are not"},{"line_number":279,"context_line":"    # setting up the member_name and  collection_name"},{"line_number":280,"context_line":"    # attributes of auth controller code."},{"line_number":281,"context_line":"    # In the absence of these attributes, default \u0027entity\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2B0PA%3D","line":278,"updated":"2013-11-19 19:16:42.000000000","message":"Sorry to raise a nit, but in general we don\u0027t (in code comments) refer to code how it used to be (that\u0027s what git is for).  So perhaps this should say something like: \n\n\" From V3 auth controller code we are calling protection() wrappers, so we need to setup the member_name and  collection_name….\"","commit_id":"84ca3a7973acebcf552b27b52420a990e44d5771"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"a2cff8fe10598543d6c78f6df8cb4db884c514d6","unresolved":false,"context_lines":[{"line_number":275,"context_line":"class Auth(controller.V3Controller):"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    # Note(atiwari): From V3 auth controller code we are"},{"line_number":278,"context_line":"    # calling protection() wrappers, but we are not"},{"line_number":279,"context_line":"    # setting up the member_name and  collection_name"},{"line_number":280,"context_line":"    # attributes of auth controller code."},{"line_number":281,"context_line":"    # In the absence of these attributes, default \u0027entity\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAATn%2F%2BzvA%3D","line":278,"in_reply_to":"AAAATn%2F%2B0PA%3D","updated":"2013-11-19 21:34:13.000000000","message":"Np, I will fix it","commit_id":"84ca3a7973acebcf552b27b52420a990e44d5771"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"523f6ff77772611c00153576d5cc3d82682dabac","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":286,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":287,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":288,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":291,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9%2FqQ%3D","line":288,"updated":"2013-12-03 17:09:46.000000000","message":"why not tokens and token -- the actual resource this controller is working with?","commit_id":"f9312f4b49855c9523a05db0c95b36cefb963903"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"6045775efc804148bc69a8546b25f042fe54f672","unresolved":false,"context_lines":[{"line_number":285,"context_line":"    # We are defining collection_name \u003d \u0027auths\u0027 and"},{"line_number":286,"context_line":"    # member_name \u003d \u0027auth\u0027 to facilitate policy decisions."},{"line_number":287,"context_line":"    collection_name \u003d \u0027auths\u0027"},{"line_number":288,"context_line":"    member_name \u003d \u0027auth\u0027"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":291,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATn%2F9%2FbE%3D","line":288,"in_reply_to":"AAAATn%2F9%2FqQ%3D","updated":"2013-12-03 17:50:14.000000000","message":"We picked this name based on Henry\u0027s comment, which is based on resource name \"Auth\". We do not have token resource\n\nLet me know if you want ti to be \"token and tokens\"","commit_id":"f9312f4b49855c9523a05db0c95b36cefb963903"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9461f13afcab115fdba81e6dd6d7fa29899b2730","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@dependency.requires(\u0027identity_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":279,"context_line":"class Auth(controller.V3Controller):"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    # Note(atiwari): From V3 auth controller code we are"},{"line_number":282,"context_line":"    # calling protection() wrappers, so we need to setup"},{"line_number":283,"context_line":"    # the member_name and  collection_name attributes of"},{"line_number":284,"context_line":"    # auth controller code."}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9tlM%3D","line":281,"updated":"2013-12-06 21:35:31.000000000","message":"Great comment!!!  With this comment it was very easy for me to go check the V3Controller class and see what is going on here with collection_name and member_name","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"28bad8b71fc0b32c49bc4877a209363988a4c55c","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@dependency.requires(\u0027identity_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":279,"context_line":"class Auth(controller.V3Controller):"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    # Note(atiwari): From V3 auth controller code we are"},{"line_number":282,"context_line":"    # calling protection() wrappers, so we need to setup"},{"line_number":283,"context_line":"    # the member_name and  collection_name attributes of"},{"line_number":284,"context_line":"    # auth controller code."}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9m%2F0%3D","line":281,"in_reply_to":"AAAATn%2F9niI%3D","updated":"2013-12-09 17:34:12.000000000","message":"No, he\u0027s complimenting you. :)","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"502a990156d0237b5a71e0d9f931749cd662f165","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@dependency.requires(\u0027identity_api\u0027, \u0027token_provider_api\u0027)"},{"line_number":279,"context_line":"class Auth(controller.V3Controller):"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    # Note(atiwari): From V3 auth controller code we are"},{"line_number":282,"context_line":"    # calling protection() wrappers, so we need to setup"},{"line_number":283,"context_line":"    # the member_name and  collection_name attributes of"},{"line_number":284,"context_line":"    # auth controller code."}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9niI%3D","line":281,"in_reply_to":"AAAATn%2F9tlM%3D","updated":"2013-12-09 16:13:55.000000000","message":"Brad, do you want me to do something here?","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"}],"keystone/common/controller.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"03d4451e80315f073caabc4032cf15cc7fb01791","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user_id\u0027] \u003d ("},{"line_number":151,"context_line":"                        token_ref[\u0027user_id\u0027])"},{"line_number":152,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":153,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name]["},{"line_number":154,"context_line":"                            \u0027domain_id\u0027] \u003d (token_ref[\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027])"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"                # Add in the kwargs, which means that any entity provided as a"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FSFc%3D","line":153,"updated":"2013-11-11 18:47:26.000000000","message":"This is really the user domain. Should it be\n\npolicy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027domain_id\u0027] \u003d ...","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8c58bc517e526f0c673742761e4db018b7656b99","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user_id\u0027] \u003d ("},{"line_number":151,"context_line":"                        token_ref[\u0027user_id\u0027])"},{"line_number":152,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":153,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name]["},{"line_number":154,"context_line":"                            \u0027domain_id\u0027] \u003d (token_ref[\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027])"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"                # Add in the kwargs, which means that any entity provided as a"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FI3o%3D","line":153,"in_reply_to":"AAAATn%2F%2FJxk%3D","updated":"2013-11-13 23:01:48.000000000","message":"Fixed in patch #6\n\nused structure policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027domain_id\u0027] hope that is OK?","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2f9832ee3bf6093a8ee783d3fdd111a18d6aadd1","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user_id\u0027] \u003d ("},{"line_number":151,"context_line":"                        token_ref[\u0027user_id\u0027])"},{"line_number":152,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":153,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name]["},{"line_number":154,"context_line":"                            \u0027domain_id\u0027] \u003d (token_ref[\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027])"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"                # Add in the kwargs, which means that any entity provided as a"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FJxk%3D","line":153,"in_reply_to":"AAAATn%2F%2FSFc%3D","updated":"2013-11-13 17:32:10.000000000","message":"...it\u0027s a bit odd this anyway, we are kind of creating a target representation for the token...(i think this whole block only applies to Auth APIs - a comment would have been good!)....so either we create a new representation, or we provide the structure in the token...the later would mean this should be:\n\npolicy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d","commit_id":"63977ac1803a9559095d71d0531d2b5253edf42c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"17b9e3e1c613eb9847182eafcacd8c8587d89c05","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":143,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":146,"context_line":"                    token_ref \u003d self.token_api.get_token("},{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FAQg%3D","line":145,"updated":"2013-11-15 20:43:04.000000000","message":"As an aside, I think that the contents of this whole block should be in a member method in Auth which would be called using get_member_from_driver (just like we do to get the target of other member types: user, group etc.). I appreciate might consider such a change outside of the scope of this patch.","commit_id":"6a435e6c307709f9833b55f97a4f3bce2f260702"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"08d488574943d9fea3fb8ea287531b652f713ffd","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":143,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":146,"context_line":"                    token_ref \u003d self.token_api.get_token("},{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FAOE%3D","line":145,"in_reply_to":"AAAATn%2F%2FAQg%3D","updated":"2013-11-15 21:13:01.000000000","message":"I think I don\u0027t have to do anything here?","commit_id":"6a435e6c307709f9833b55f97a4f3bce2f260702"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"17b9e3e1c613eb9847182eafcacd8c8587d89c05","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":153,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":154,"context_line":"                            \u0027user\u0027, {})"},{"line_number":155,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027]["},{"line_number":156,"context_line":"                            \u0027domain_id\u0027] \u003d (token_ref[\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027])"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"                # Add in the kwargs, which means that any entity provided as a"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FAQU%3D","line":155,"updated":"2013-11-15 20:43:04.000000000","message":"I\u0027m still a little unclear as to why you are mapping this to user.domain_id as opposed to user.domain.id. We could do either of course, but I would have thought we would want to create a target representation that mirrors the structure of the token (otherwise how would policy writers know what the target structure is?)","commit_id":"6a435e6c307709f9833b55f97a4f3bce2f260702"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"08d488574943d9fea3fb8ea287531b652f713ffd","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":153,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":154,"context_line":"                            \u0027user\u0027, {})"},{"line_number":155,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027]["},{"line_number":156,"context_line":"                            \u0027domain_id\u0027] \u003d (token_ref[\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027])"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"                # Add in the kwargs, which means that any entity provided as a"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2FAOA%3D","line":155,"in_reply_to":"AAAATn%2F%2FAQU%3D","updated":"2013-11-15 21:13:01.000000000","message":"Now I got your point. Let me fix it","commit_id":"6a435e6c307709f9833b55f97a4f3bce2f260702"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6169b903a46817954974e217a5b64973b2717935","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":143,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":146,"context_line":"                    token_ref \u003d self.token_api.get_token("},{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2FQY%3D","line":145,"updated":"2013-11-16 09:24:02.000000000","message":"I really think this all belongs in a member method inside v3 Auth.  However, I agree moving it isn\u0027t really part of this patch…but perhaps you could add a comment with a TODO that this should be done.  I\u0027m happy for you to assign it to me, i.e. TODO (henry-nash):.","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"333f4321a1391226eec47ee71380e3d8e903a5ea","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":143,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":146,"context_line":"                    token_ref \u003d self.token_api.get_token("},{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B6Ys%3D","line":145,"in_reply_to":"AAAATn%2F%2B%2FQY%3D","updated":"2013-11-18 16:57:14.000000000","message":"Sure","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6169b903a46817954974e217a5b64973b2717935","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"},{"line_number":149,"context_line":"                    policy_dict[\u0027target\u0027].setdefault(self.member_name, {})"},{"line_number":150,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":151,"context_line":"                        \u0027user\u0027, {})"},{"line_number":152,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027id\u0027] \u003d ("},{"line_number":153,"context_line":"                        token_ref[\u0027user_id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2FQM%3D","line":150,"updated":"2013-11-16 09:24:02.000000000","message":"ahh. not sure you should change this though….I think we should just reflect what is in the token (which I agree is not very well structured, but it is what it is).  So just user_id is correct here, since that\u0027s what is in the token.  I agree that having [user_id] and [user][domain][id] appears to use conflicting styles, but that\u0027s what we have in the token.  I\u0027m assuming the token also contains [user][id] as well as [user_id]?  If so, it would perhaps be good to also put [user][id] into the representation (as well as [user_id]) and then we could slowly depreciate referring to user_id in the policy files.","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"333f4321a1391226eec47ee71380e3d8e903a5ea","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                        context[\u0027subject_token_id\u0027])"},{"line_number":148,"context_line":"                    policy_dict.setdefault(\u0027target\u0027, {})"},{"line_number":149,"context_line":"                    policy_dict[\u0027target\u0027].setdefault(self.member_name, {})"},{"line_number":150,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":151,"context_line":"                        \u0027user\u0027, {})"},{"line_number":152,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027id\u0027] \u003d ("},{"line_number":153,"context_line":"                        token_ref[\u0027user_id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B6XU%3D","line":150,"in_reply_to":"AAAATn%2F%2B%2FQM%3D","updated":"2013-11-18 16:57:14.000000000","message":"I will fix it.","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"dd7daaeb8f5bcab73e4f58160dbcf0601b436904","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                        \u0027user\u0027, {})"},{"line_number":152,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027id\u0027] \u003d ("},{"line_number":153,"context_line":"                        token_ref[\u0027user_id\u0027])"},{"line_number":154,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":155,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":156,"context_line":"                            \u0027user\u0027, {})"},{"line_number":157,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name]["}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B%2Fdw%3D","line":154,"updated":"2013-11-16 04:19:34.000000000","message":"What does the following section of code accomplish?","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"333f4321a1391226eec47ee71380e3d8e903a5ea","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                        \u0027user\u0027, {})"},{"line_number":152,"context_line":"                    policy_dict[\u0027target\u0027][self.member_name][\u0027user\u0027][\u0027id\u0027] \u003d ("},{"line_number":153,"context_line":"                        token_ref[\u0027user_id\u0027])"},{"line_number":154,"context_line":"                    if \u0027domain\u0027 in token_ref[\u0027user\u0027]:"},{"line_number":155,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name].setdefault("},{"line_number":156,"context_line":"                            \u0027user\u0027, {})"},{"line_number":157,"context_line":"                        policy_dict[\u0027target\u0027][self.member_name]["}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F%2B6Xk%3D","line":154,"in_reply_to":"AAAATn%2F%2B%2Fdw%3D","updated":"2013-11-18 16:57:14.000000000","message":"The code from 145 - 153 is adding user_id of the subject token in context.\nCode from 154 - 161 is adding domain_id of the subject token in context.\nWe are doing it so that policy can be defined on token_api scoped to user and domain_id of user. As we are doing in line # 7 and #8 of policy.v3cloudsample.json","commit_id":"0ae281929bd5e983367c91daf1156fd24b974aa3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5a48385593f83905d9f4a0fec4cec3e3c360a52f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":148,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"                # TODO(henry-nash): Move this entire code to a member"},{"line_number":151,"context_line":"                # method inside v3 Auth"},{"line_number":152,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":153,"context_line":"                    token_ref \u003d self.token_api.get_token("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9HzI%3D","line":150,"updated":"2013-12-16 16:14:25.000000000","message":"why putting henry-nash\u0027s name here?","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"96f7db3d9579b8e2e6774369be749d7fd8aad9fa","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                        ref \u003d self.get_member_from_driver(kwargs[key])"},{"line_number":148,"context_line":"                        policy_dict[\u0027target\u0027] \u003d {self.member_name: ref}"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"                # TODO(henry-nash): Move this entire code to a member"},{"line_number":151,"context_line":"                # method inside v3 Auth"},{"line_number":152,"context_line":"                if context.get(\u0027subject_token_id\u0027) is not None:"},{"line_number":153,"context_line":"                    token_ref \u003d self.token_api.get_token("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FZQ%3D","line":150,"in_reply_to":"AAAATn%2F9HzI%3D","updated":"2013-12-16 23:30:33.000000000","message":"Henry asked for it\nhttps://review.openstack.org/#/c/50488/11/keystone/common/controller.py","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"631c43a206e869641bf50ef55b0d4cdb336aa9ca","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            body\u003dself.build_authentication_request("},{"line_number":490,"context_line":"                user_id\u003dself.userNormalA[\u0027id\u0027],"},{"line_number":491,"context_line":"                password\u003dself.userNormalA[\u0027password\u0027],"},{"line_number":492,"context_line":"                user_domain_id\u003dself.domainA[\u0027id\u0027]))"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        user_token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":495,"context_line":"        self.assertNotEmpty(user_token)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FDGo%3D","line":492,"updated":"2013-11-15 06:54:14.000000000","message":"no need for user_domain_id as you are using user_id","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"3cda23d20aa49b80d78b0f2970fe1c8b3f9939f9","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            body\u003dself.build_authentication_request("},{"line_number":490,"context_line":"                user_id\u003dself.userNormalA[\u0027id\u0027],"},{"line_number":491,"context_line":"                password\u003dself.userNormalA[\u0027password\u0027],"},{"line_number":492,"context_line":"                user_domain_id\u003dself.domainA[\u0027id\u0027]))"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        user_token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":495,"context_line":"        self.assertNotEmpty(user_token)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FAmc%3D","line":492,"in_reply_to":"AAAATn%2F%2FDGo%3D","updated":"2013-11-15 19:02:53.000000000","message":"I need domain scoped token for this test.","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"631c43a206e869641bf50ef55b0d4cdb336aa9ca","unresolved":false,"context_lines":[{"line_number":506,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403,"},{"line_number":507,"context_line":"                  token\u003dadminB_token)"},{"line_number":508,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403,"},{"line_number":509,"context_line":"                    token\u003dadminB_token)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"class TestTokenRevoking(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FDGQ%3D","line":509,"updated":"2013-11-15 06:54:14.000000000","message":"is there a positive test case where userAdminA can remove userNormalA\u0027s token?","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"3cda23d20aa49b80d78b0f2970fe1c8b3f9939f9","unresolved":false,"context_lines":[{"line_number":506,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403,"},{"line_number":507,"context_line":"                  token\u003dadminB_token)"},{"line_number":508,"context_line":"        self.delete(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403,"},{"line_number":509,"context_line":"                    token\u003dadminB_token)"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"class TestTokenRevoking(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FAlw%3D","line":509,"in_reply_to":"AAAATn%2F%2FDGQ%3D","updated":"2013-11-15 19:02:53.000000000","message":"test \"test_admin_revokes_user_token\" line # 450 covering use case.","commit_id":"0cdfc18f1130374c8309a0fc14e5aeaa5fbcd9df"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"9461f13afcab115fdba81e6dd6d7fa29899b2730","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":482,"context_line":"                  token\u003dadminA_token)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def test_adminB_revokes_userA_token(self):"},{"line_number":485,"context_line":"        r \u003d self.post("},{"line_number":486,"context_line":"            \u0027/auth/tokens\u0027,"},{"line_number":487,"context_line":"            body\u003dself.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9tUU%3D","line":484,"updated":"2013-12-06 21:35:31.000000000","message":"So you are testing to make sure that policy is enforced and that adminB gets a 403 (forbidden) when trying to revoke the token of a user from a different domain.  So you really should rename this test something like test_adminB_fails_revoking_userA_token or add a comment saying what this test actually does","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a3f4b67ef32e9f799152e3b4f5d80a0b7eee3f68","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":482,"context_line":"                  token\u003dadminA_token)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def test_adminB_revokes_userA_token(self):"},{"line_number":485,"context_line":"        r \u003d self.post("},{"line_number":486,"context_line":"            \u0027/auth/tokens\u0027,"},{"line_number":487,"context_line":"            body\u003dself.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9s%2FM%3D","line":484,"in_reply_to":"AAAATn%2F9tUU%3D","updated":"2013-12-06 23:10:38.000000000","message":"++ The casual reader of this code won\u0027t understand why the API is returning 403s.","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"502a990156d0237b5a71e0d9f931749cd662f165","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":482,"context_line":"                  token\u003dadminA_token)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def test_adminB_revokes_userA_token(self):"},{"line_number":485,"context_line":"        r \u003d self.post("},{"line_number":486,"context_line":"            \u0027/auth/tokens\u0027,"},{"line_number":487,"context_line":"            body\u003dself.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F9ni8%3D","line":484,"in_reply_to":"AAAATn%2F9tUU%3D","updated":"2013-12-09 16:13:55.000000000","message":"I will do that","commit_id":"56f82283850032fb8b821c3d0df9f34a26b3a33b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dbbc20f938cbb2d134bb9d4d905751416b40da4f","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":482,"context_line":"                  token\u003dadminA_token)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def test_adminB_fails_revoking_userA_token(self):"},{"line_number":485,"context_line":"        r \u003d self.post("},{"line_number":486,"context_line":"            \u0027/auth/tokens\u0027,"},{"line_number":487,"context_line":"            body\u003dself.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAATn%2F9lsU%3D","line":484,"updated":"2013-12-09 22:10:42.000000000","message":"test_domain_admin_unable_to_revoke_token_for_user_in_different_domain(self):\n\nlong name but more intuitive perhaps","commit_id":"5fcf4cd1929701454d1ac1f1623566547facbe95"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5a48385593f83905d9f4a0fec4cec3e3c360a52f","unresolved":false,"context_lines":[{"line_number":391,"context_line":"                                         domain_id\u003dself.domainA[\u0027id\u0027])"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # DomainB setup"},{"line_number":394,"context_line":"        self.domainB \u003d self.new_domain_ref()"},{"line_number":395,"context_line":"        self.assignment_api.create_domain(self.domainB[\u0027id\u0027], self.domainB)"},{"line_number":396,"context_line":"        self.userAdminB \u003d self.new_user_ref(domain_id\u003dself.domainB[\u0027id\u0027])"},{"line_number":397,"context_line":"        self.userAdminB[\u0027password\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Hwc%3D","line":394,"updated":"2013-12-16 16:14:25.000000000","message":"since domainB is only used in test_adminB_fails_revoking_userA_token, suggest move creating it to there.","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"96f7db3d9579b8e2e6774369be749d7fd8aad9fa","unresolved":false,"context_lines":[{"line_number":391,"context_line":"                                         domain_id\u003dself.domainA[\u0027id\u0027])"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        # DomainB setup"},{"line_number":394,"context_line":"        self.domainB \u003d self.new_domain_ref()"},{"line_number":395,"context_line":"        self.assignment_api.create_domain(self.domainB[\u0027id\u0027], self.domainB)"},{"line_number":396,"context_line":"        self.userAdminB \u003d self.new_user_ref(domain_id\u003dself.domainB[\u0027id\u0027])"},{"line_number":397,"context_line":"        self.userAdminB[\u0027password\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSM%3D","line":394,"in_reply_to":"AAAATn%2F9Hwc%3D","updated":"2013-12-16 23:30:33.000000000","message":"done","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5a48385593f83905d9f4a0fec4cec3e3c360a52f","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # valid X-Auth-Token and invalid X-Subject-Token (404)"},{"line_number":445,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":446,"context_line":"                  token\u003dadminA_token)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    def test_admin_revokes_user_token(self):"},{"line_number":449,"context_line":"        r \u003d self.post("},{"line_number":450,"context_line":"            \u0027/auth/tokens\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9HwA%3D","line":447,"updated":"2013-12-16 16:14:25.000000000","message":"change the name of this test so it\u0027s clear why it\u0027s different than the new test: test_adminA_revokes_userA_token .","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"96f7db3d9579b8e2e6774369be749d7fd8aad9fa","unresolved":false,"context_lines":[{"line_number":444,"context_line":"        # valid X-Auth-Token and invalid X-Subject-Token (404)"},{"line_number":445,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404,"},{"line_number":446,"context_line":"                  token\u003dadminA_token)"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    def test_admin_revokes_user_token(self):"},{"line_number":449,"context_line":"        r \u003d self.post("},{"line_number":450,"context_line":"            \u0027/auth/tokens\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSc%3D","line":447,"in_reply_to":"AAAATn%2F9HwA%3D","updated":"2013-12-16 23:30:33.000000000","message":"sure","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5a48385593f83905d9f4a0fec4cec3e3c360a52f","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                user_domain_id\u003dself.domainA[\u0027id\u0027]))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        user_token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":493,"context_line":"        self.assertNotEmpty(user_token)"},{"line_number":494,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: user_token}"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9HvM%3D","line":493,"updated":"2013-12-16 16:14:25.000000000","message":"why would user_token be empty? We\u0027ve already tested this 3 times.","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"96f7db3d9579b8e2e6774369be749d7fd8aad9fa","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                user_domain_id\u003dself.domainA[\u0027id\u0027]))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"        user_token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":493,"context_line":"        self.assertNotEmpty(user_token)"},{"line_number":494,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: user_token}"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSg%3D","line":493,"in_reply_to":"AAAATn%2F9HvM%3D","updated":"2013-12-16 23:30:33.000000000","message":"good catch, actually a copy paste effect.\nwill fix","commit_id":"0f109c9299bab925e4617425c6d8d3f0869f335d"}]}
