)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"40bcefc6c7ecf02fcd4984fe0b349fc9fd9bc148","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Guang Yee \u003cguang.yee@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-06-24 23:53:39 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Pluggable Token Provider (Part 1)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Abstract token provider backend to make token provider pluggable. It enables"},{"line_number":10,"context_line":"deployers to customize token management to add their own capabilities."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2Fmq0%3D","line":7,"updated":"2013-06-26 21:31:43.000000000","message":"commits are self-contained changes to the repo... a partial change doesn\u0027t make any sense. remove the \"part 1\" and use the one line summary to describe, in one line, what\u0027s being changed. the first line of the next paragraph looks like a good starting point for a better one line summary","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Guang Yee \u003cguang.yee@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-06-24 23:53:39 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Pluggable Token Provider (Part 1)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Abstract token provider backend to make token provider pluggable. It enables"},{"line_number":10,"context_line":"deployers to customize token management to add their own capabilities."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2FmgE%3D","line":7,"in_reply_to":"AAAAPn%2F%2Fmq0%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"40bcefc6c7ecf02fcd4984fe0b349fc9fd9bc148","unresolved":false,"context_lines":[{"line_number":17,"context_line":"section of the Keystone configuration file."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Note: This is one of the redos of https://review.openstack.org/#/c/29021"},{"line_number":20,"context_line":"as it was too big and we need to submit the review in smaller chunks."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partially implemented blueprint pluggable-token-format. V2 token provider implementation will be in part 2."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2FmrM%3D","line":20,"updated":"2013-06-26 21:31:43.000000000","message":"remove; this is irrelevant post-merge","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"section of the Keystone configuration file."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Note: This is one of the redos of https://review.openstack.org/#/c/29021"},{"line_number":20,"context_line":"as it was too big and we need to submit the review in smaller chunks."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partially implemented blueprint pluggable-token-format. V2 token provider implementation will be in part 2."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2Fmf8%3D","line":20,"in_reply_to":"AAAAPn%2F%2FmrM%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"40bcefc6c7ecf02fcd4984fe0b349fc9fd9bc148","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Note: This is one of the redos of https://review.openstack.org/#/c/29021"},{"line_number":20,"context_line":"as it was too big and we need to submit the review in smaller chunks."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partially implemented blueprint pluggable-token-format. V2 token provider implementation will be in part 2."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This patch also fixes bug 1186061."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2FmrI%3D","line":22,"updated":"2013-06-26 21:31:43.000000000","message":"remove the reference to \"part 2\"","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Note: This is one of the redos of https://review.openstack.org/#/c/29021"},{"line_number":20,"context_line":"as it was too big and we need to submit the review in smaller chunks."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Partially implemented blueprint pluggable-token-format. V2 token provider implementation will be in part 2."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"This patch also fixes bug 1186061."},{"line_number":25,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAPn%2F%2Fmf4%3D","line":22,"in_reply_to":"AAAAPn%2F%2FmrI%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"}],"doc/source/configuration.rst":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"447b0f6992d21bb31c6424f93c962a69e5b29e79","unresolved":false,"context_lines":[{"line_number":154,"context_line":"Keystone supports customizable token provider and it is"},{"line_number":155,"context_line":"specified in the ``[token]`` section of the configuration file."},{"line_number":156,"context_line":"Keystone provides a default provider which supports both UUID and"},{"line_number":157,"context_line":"PKI tokens. However, u sers may register their own token provider"},{"line_number":158,"context_line":"by configuring the following property."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``provider`` - token provider driver. Defaults to"}],"source_content_type":"text/x-rst","patch_set":1,"id":"AAAAPn%2F%2FztM%3D","line":157,"updated":"2013-06-20 19:29:52.000000000","message":"extra space in \u0027u sers\u0027","commit_id":"4fb3150482c5fb1c52bf07235f3e84b8585978e4"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"7a6a2485b13bef6a5f7426238baee9f1dff0a531","unresolved":false,"context_lines":[{"line_number":148,"context_line":"authentication to be successful. Furthermore, all the plugins invoked must"},{"line_number":149,"context_line":"agree on the ``user_id`` in the ``auth_context``."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Token Provider"},{"line_number":152,"context_line":"--------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F8U4%3D","line":151,"updated":"2013-07-08 19:50:10.000000000","message":"OK so you made the token provider pluggable but there is only one example.  So if I am going to create my own provider, where is it recommended that I put my code?  Since you don\u0027t provide an extra example of a very simple template plugin (and only provide the production level plugin), I have to guess regarding where to put and how to structure my new token provider plugin.  Ideally it would be great to have a dummy sample plugin that had a trivial implementation and well commented that would provide folks a template on how to create their own plugin. Assuming that is too much work an alternative would be to recommend where new Token Provide plugins should be placed in the code structure and to explicitly point out that the interface they need to implement is in the Token Provider Driver class.","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"501e6db52567442ca793feddc332a4bcd3bd8d86","unresolved":false,"context_lines":[{"line_number":148,"context_line":"authentication to be successful. Furthermore, all the plugins invoked must"},{"line_number":149,"context_line":"agree on the ``user_id`` in the ``auth_context``."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Token Provider"},{"line_number":152,"context_line":"--------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F6Dk%3D","line":151,"in_reply_to":"AAAAP3%2F%2F7hg%3D","updated":"2013-07-09 12:57:51.000000000","message":"I was thinking that a very simple token provider that just did basic uuid tokens with in-memory storage (a big dictionary)  to clearly illustrate what methods need to be implemented with lots of annotation. Might be best for someone other than gyee to try and write this.   What if we just open up this requirement as a bug and I\u0027ll take ownership of writing this sample?","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"authentication to be successful. Furthermore, all the plugins invoked must"},{"line_number":149,"context_line":"agree on the ``user_id`` in the ``auth_context``."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Token Provider"},{"line_number":152,"context_line":"--------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F7hg%3D","line":151,"in_reply_to":"AAAAP3%2F%2F8Eg%3D","updated":"2013-07-09 00:31:29.000000000","message":"what \"trivial\" implementation do you have in mind? Provider interface is documented in keystone/token/provider.py. I can add some more color if they are unclear.","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":148,"context_line":"authentication to be successful. Furthermore, all the plugins invoked must"},{"line_number":149,"context_line":"agree on the ``user_id`` in the ``auth_context``."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Token Provider"},{"line_number":152,"context_line":"--------------"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F8Eg%3D","line":151,"in_reply_to":"AAAAP3%2F%2F8U4%3D","updated":"2013-07-08 21:02:36.000000000","message":"\"So if I am going to create my own provider, where is it recommended that I put my code?\" in your own package\n\n\"I have to guess regarding where to put and how to structure my new token provider plugin\" agree, the interface should be documented, with a trivial implementation","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"specified in the ``[token]`` section of the configuration file."},{"line_number":156,"context_line":"Keystone provides a default provider which supports both UUID and"},{"line_number":157,"context_line":"PKI tokens. However, users may register their own token provider"},{"line_number":158,"context_line":"by configuring the following property."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``provider`` - token provider driver. Defaults to"},{"line_number":161,"context_line":"                 ``keystone.token.providers.keystone.Provider``"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F8Ew%3D","line":158,"updated":"2013-07-08 21:02:36.000000000","message":"use all 79 chars","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"specified in the ``[token]`` section of the configuration file."},{"line_number":156,"context_line":"Keystone provides a default provider which supports both UUID and"},{"line_number":157,"context_line":"PKI tokens. However, users may register their own token provider"},{"line_number":158,"context_line":"by configuring the following property."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``provider`` - token provider driver. Defaults to"},{"line_number":161,"context_line":"                 ``keystone.token.providers.keystone.Provider``"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F7h8%3D","line":158,"in_reply_to":"AAAAP3%2F%2F8Ew%3D","updated":"2013-07-09 00:31:29.000000000","message":"Done","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":158,"context_line":"by configuring the following property."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``provider`` - token provider driver. Defaults to"},{"line_number":161,"context_line":"                 ``keystone.token.providers.keystone.Provider``"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Certificates for PKI"},{"line_number":164,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F8Eo%3D","line":161,"updated":"2013-07-08 21:02:36.000000000","message":"why is this randomly indented? this isn\u0027t python","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":158,"context_line":"by configuring the following property."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``provider`` - token provider driver. Defaults to"},{"line_number":161,"context_line":"                 ``keystone.token.providers.keystone.Provider``"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Certificates for PKI"},{"line_number":164,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":14,"id":"AAAAP3%2F%2F7h4%3D","line":161,"in_reply_to":"AAAAP3%2F%2F8Eo%3D","updated":"2013-07-09 00:31:29.000000000","message":"Done","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b26c2033ff0c4cb23eef750418ab96bee554d27","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is specified in the"},{"line_number":155,"context_line":"``[token]`` section of the configuration file. Keystone provides a default"},{"line_number":156,"context_line":"provider which supports both UUID and PKI tokens. However, users may register"},{"line_number":157,"context_line":"their own token provider by configuring the following property."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* ``provider`` - token provider driver. Defaults to ``keystone.token.providers.keystone.Provider``"}],"source_content_type":"text/x-rst","patch_set":15,"id":"AAAAP3%2F%2F53g%3D","line":156,"updated":"2013-07-09 14:10:37.000000000","message":"I thought the goal was to implement a UUID \"provider\" and a PKI \"provider\"","commit_id":"352838ffa6f29356572c5e942b4532d0753bac8b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8b26c2033ff0c4cb23eef750418ab96bee554d27","unresolved":false,"context_lines":[{"line_number":156,"context_line":"provider which supports both UUID and PKI tokens. However, users may register"},{"line_number":157,"context_line":"their own token provider by configuring the following property."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* ``provider`` - token provider driver. Defaults to ``keystone.token.providers.keystone.Provider``"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Certificates for PKI"},{"line_number":162,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":15,"id":"AAAAP3%2F%2F54M%3D","line":159,"updated":"2013-07-09 14:10:37.000000000","message":"79 char","commit_id":"352838ffa6f29356572c5e942b4532d0753bac8b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is specified in the"},{"line_number":155,"context_line":"``[token]`` section of the configuration file. Keystone provides a default"},{"line_number":156,"context_line":"provider which supports both UUID and PKI tokens. However, users may register"},{"line_number":157,"context_line":"their own token provider by configuring the following property."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* ``provider`` - token provider driver. Defaults to"}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAAP3%2F%2F1ms%3D","line":156,"updated":"2013-07-10 17:09:25.000000000","message":"revise to reflect multiple providers","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Keystone supports customizable token provider and it is specified in the"},{"line_number":155,"context_line":"``[token]`` section of the configuration file. Keystone provides a default"},{"line_number":156,"context_line":"provider which supports both UUID and PKI tokens. However, users may register"},{"line_number":157,"context_line":"their own token provider by configuring the following property."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* ``provider`` - token provider driver. Defaults to"}],"source_content_type":"text/x-rst","patch_set":16,"id":"AAAAP3%2F%2F1Wk%3D","line":156,"in_reply_to":"AAAAP3%2F%2F1ms%3D","updated":"2013-07-10 17:35:32.000000000","message":"good catch!","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":154,"context_line":"Keystone supports customizable token provider and it is specified in the"},{"line_number":155,"context_line":"``[token]`` section of the configuration file. Keystone provides both UUID and"},{"line_number":156,"context_line":"PKI token providers, with PKI token provider enabled as default. However, users"},{"line_number":157,"context_line":"may register their own token provider by configuring the following property."},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"* ``provider`` - token provider driver. Defaults to"},{"line_number":160,"context_line":"  ``keystone.token.providers.pki.Provider``"}],"source_content_type":"text/x-rst","patch_set":19,"id":"AAAAP3%2F%2FyFI%3D","line":157,"updated":"2013-07-11 15:13:25.000000000","message":"nice","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":122,"context_line":"# Note the distinction between \"driver\" and \"provider\". Token \"driver\" simply"},{"line_number":123,"context_line":"# provides token CRUD. On the other hand, token \"provider\" provides token"},{"line_number":124,"context_line":"# operation management, such as generating tokens to be persisted by the"},{"line_number":125,"context_line":"# driver."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"}],"source_content_type":"application/octet-stream","patch_set":2,"id":"AAAAPn%2F%2Fwx8%3D","line":125,"updated":"2013-06-21 21:56:50.000000000","message":"suggest change this note and add the docs for each before the option, like\n\n # Provides token CRUD.\n # driver \u003d keystone.token.backends.sql.Token\n\n # Provides token operation management, such as generating\n # tokens to be persisted by the driver.\n # provider \u003d keystone.token.providers.keystone_provider.Provider","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"# template_file \u003d default_catalog.templates"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[token]"},{"line_number":122,"context_line":"# Prvides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAPn%2F%2FvxM%3D","line":122,"updated":"2013-06-22 23:10:55.000000000","message":"Typo , correct it","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":119,"context_line":"# template_file \u003d default_catalog.templates"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[token]"},{"line_number":122,"context_line":"# Prvides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAPn%2F%2FvrQ%3D","line":122,"in_reply_to":"AAAAPn%2F%2FvxM%3D","updated":"2013-06-23 04:10:16.000000000","message":"good catch!","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"# Prvides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"},{"line_number":126,"context_line":"# tokens to be persisted by the driver, validating tokens,"},{"line_number":127,"context_line":"# and revoking tokens."},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAPn%2F%2FvxI%3D","line":125,"updated":"2013-06-22 23:10:55.000000000","message":"Type in management","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":122,"context_line":"# Prvides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"},{"line_number":126,"context_line":"# tokens to be persisted by the driver, validating tokens,"},{"line_number":127,"context_line":"# and revoking tokens."},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAPn%2F%2FvrM%3D","line":125,"in_reply_to":"AAAAPn%2F%2FvxI%3D","updated":"2013-06-23 04:10:16.000000000","message":"not sure if I understand this comment","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"27eae183655790622dcf2314942d6d5ba3fa0462","unresolved":false,"context_lines":[{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"},{"line_number":126,"context_line":"# tokens to be persisted by the driver, validating tokens,"},{"line_number":127,"context_line":"# and revoking tokens."},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"},{"line_number":129,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":4,"id":"AAAAPn%2F%2Fvb4%3D","line":126,"updated":"2013-06-23 15:36:33.000000000","message":"Sorry my mistake. Ignore it. I thought there was a typo","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"# template_file \u003d default_catalog.templates"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[token]"},{"line_number":122,"context_line":"# Provides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAPn%2F%2FpPg%3D","line":122,"updated":"2013-06-26 02:44:58.000000000","message":"CRUD -\u003e Persistence or Backing store.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":119,"context_line":"# template_file \u003d default_catalog.templates"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[token]"},{"line_number":122,"context_line":"# Provides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAPn%2F%2Fmuw%3D","line":122,"in_reply_to":"AAAAPn%2F%2FpPg%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"# Provides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"},{"line_number":126,"context_line":"# tokens to be persisted by the driver, validating tokens,"},{"line_number":127,"context_line":"# and revoking tokens."},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAPn%2F%2FpPc%3D","line":125,"updated":"2013-06-26 02:44:58.000000000","message":"So this looks like the builder pattern to me.  The provider is the director, and probably should not be pluggable, but then the builder it self should be replaceable.  I don\u0027t think that what we have here will harm anything, Just that we made the pluggable object too large.  But we can fix that in a future release.\n\n\"Controls the token construction, validation, and revocation operations.\"  Is clearer.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"# Provides token CRUD."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Provides token operation management, such as generating"},{"line_number":126,"context_line":"# tokens to be persisted by the driver, validating tokens,"},{"line_number":127,"context_line":"# and revoking tokens."},{"line_number":128,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"}],"source_content_type":"application/octet-stream","patch_set":9,"id":"AAAAPn%2F%2Fmuo%3D","line":125,"in_reply_to":"AAAAPn%2F%2FpPc%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8dd97499d6a7c0303ab5887916a2816dd1d520d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"# template_file \u003d default_catalog.templates"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"[token]"},{"line_number":122,"context_line":"# Provides token persistence or backend store."},{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Controls the token construction, validation, and revocation operations."}],"source_content_type":"application/octet-stream","patch_set":11,"id":"AAAAPn%2F%2Fgek%3D","line":122,"updated":"2013-06-28 21:11:46.000000000","message":"Provides token persistence","commit_id":"639930eac56b0dc568085bef52d37572b8b5ab3a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Controls the token construction, validation, and revocation operations."},{"line_number":126,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"# Amount of time a token should remain valid (in seconds)"},{"line_number":129,"context_line":"# expiration \u003d 86400"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAAP3%2F%2F8D8%3D","line":126,"updated":"2013-07-08 21:02:36.000000000","message":"keystone_provider? it\u0027s already in keystone\u0027s namespace... and doesn\u0027t match the actual package naming you used.. regardless, nesting \u0027keystone\u0027 in there is not helpful or useful as a descriptive name","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":123,"context_line":"# driver \u003d keystone.token.backends.sql.Token"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"# Controls the token construction, validation, and revocation operations."},{"line_number":126,"context_line":"# provider \u003d keystone.token.providers.keystone_provider.Provider"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"# Amount of time a token should remain valid (in seconds)"},{"line_number":129,"context_line":"# expiration \u003d 86400"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAAP3%2F%2F8BA%3D","line":126,"in_reply_to":"AAAAP3%2F%2F8D8%3D","updated":"2013-07-09 00:31:29.000000000","message":"Sorry, it should be\n\nprovider \u003d keystone.token.providers.keystone.Provider","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"}],"keystone/auth/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":289,"context_line":"            self.authenticate(context, auth_info, auth_context)"},{"line_number":290,"context_line":"            self._check_and_set_default_scoping(context, auth_info,"},{"line_number":291,"context_line":"                                                auth_context)"},{"line_number":292,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":293,"context_line":"            method_names \u003d auth_info.get_method_names()"},{"line_number":294,"context_line":"            method_names +\u003d auth_context.get(\u0027method_names\u0027, [])"},{"line_number":295,"context_line":"            # make sure the list is unique"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwxg%3D","line":292,"updated":"2013-06-21 21:56:50.000000000","message":"why does this need to change? should it be in token_provider_api.issue_token()? (this refers to why lines 290-291 turned into 292-296.)","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    def check_token(self, context):"},{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":384,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    @controller.protected"},{"line_number":387,"context_line":"    def revoke_token(self, context):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwxE%3D","line":384,"updated":"2013-06-21 21:56:50.000000000","message":"this used to turn every problem into Unauthorized (e.g., rather than a 500)... was there a security reason for doing this?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"21c39a2a4442afcf61163f40566d3b5c1bd2f93f","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    @controller.protected"},{"line_number":392,"context_line":"    def validate_token(self, context):"},{"line_number":393,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":394,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":395,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":396,"context_line":"            context,"},{"line_number":397,"context_line":"            token_id\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw3o%3D","line":394,"updated":"2013-06-21 19:52:41.000000000","message":"Does v3 still have belongsTo?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85a9a50d79655c8627cf68f8608c7fff3cfe494e","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    @controller.protected"},{"line_number":392,"context_line":"    def validate_token(self, context):"},{"line_number":393,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":394,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":395,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":396,"context_line":"            context,"},{"line_number":397,"context_line":"            token_id\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw0s%3D","line":394,"in_reply_to":"AAAAPn%2F%2Fw3o%3D","updated":"2013-06-21 20:06:41.000000000","message":"yes","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"21c39a2a4442afcf61163f40566d3b5c1bd2f93f","unresolved":false,"context_lines":[{"line_number":406,"context_line":"#FIXME(gyee): not sure if it belongs here or keystone.common. Park it here"},{"line_number":407,"context_line":"# for now."},{"line_number":408,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":409,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    Stash token ID into the X-Auth-Token header."},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw4w%3D","line":409,"updated":"2013-06-21 19:52:41.000000000","message":"Really no clue what this method is doing here? So I may be totally wrong  totally wrong on this\n   1) Why does validate token even need to return 201 Created (OK, u are calling from multiple places)\n   2) Why is content-type determined here?\n   2) This method is used by post and GET. Vary parameter makes sense only in case of GET. We are blindly adding vary to everything","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85a9a50d79655c8627cf68f8608c7fff3cfe494e","unresolved":false,"context_lines":[{"line_number":406,"context_line":"#FIXME(gyee): not sure if it belongs here or keystone.common. Park it here"},{"line_number":407,"context_line":"# for now."},{"line_number":408,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":409,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    Stash token ID into the X-Auth-Token header."},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw0w%3D","line":409,"in_reply_to":"AAAAPn%2F%2Fw4w%3D","updated":"2013-06-21 20:06:41.000000000","message":"1) validate token is returning 200 as created\u003dFalse by default. authenticate_for_token() set created\u003dTrue to return a 201\n2) Because we need to create a legitimate HTTP response. Content and its type will get translated correctly in the middleware, depending on the request. See https://github.com/openstack/keystone/blob/master/keystone/middleware/core.py#L144\n3) in v3, create token and validate token returns the exact same thing, different only in status (201 versus 200).","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.trust_api \u003d trust.Manager()"},{"line_number":60,"context_line":"        self.context \u003d context"},{"line_number":61,"context_line":"        self.auth \u003d auth"},{"line_number":62,"context_line":"        self._scope_data \u003d (None, None, None)"},{"line_number":63,"context_line":"        # self._scope_data is (domain_id, project_id, trust_ref)"},{"line_number":64,"context_line":"        # project scope: (None, project_id, None)"},{"line_number":65,"context_line":"        # domain scope: (domain_id, None, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvxE%3D","line":62,"updated":"2013-06-22 23:10:55.000000000","message":"Whys is it trust_ref instead of trust_id","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.trust_api \u003d trust.Manager()"},{"line_number":60,"context_line":"        self.context \u003d context"},{"line_number":61,"context_line":"        self.auth \u003d auth"},{"line_number":62,"context_line":"        self._scope_data \u003d (None, None, None)"},{"line_number":63,"context_line":"        # self._scope_data is (domain_id, project_id, trust_ref)"},{"line_number":64,"context_line":"        # project scope: (None, project_id, None)"},{"line_number":65,"context_line":"        # domain scope: (domain_id, None, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvrI%3D","line":62,"in_reply_to":"AAAAPn%2F%2FvxE%3D","updated":"2013-06-23 04:10:16.000000000","message":"trust was implemented by another patch. I rather not change the functionality here.","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                                                auth_context)"},{"line_number":292,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":293,"context_line":"            method_names \u003d auth_info.get_method_names()"},{"line_number":294,"context_line":"            method_names +\u003d auth_context.get(\u0027method_names\u0027, [])"},{"line_number":295,"context_line":"            # make sure the list is unique"},{"line_number":296,"context_line":"            method_names \u003d list(set(method_names))"},{"line_number":297,"context_line":"            (token_id, token_data) \u003d self.token_provider_api.issue_token("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvw8%3D","line":294,"updated":"2013-06-22 23:10:55.000000000","message":"What does the line \nmethod_names +\u003d auth_context.get(\u0027method_names\u0027, []) does","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                                                auth_context)"},{"line_number":292,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":293,"context_line":"            method_names \u003d auth_info.get_method_names()"},{"line_number":294,"context_line":"            method_names +\u003d auth_context.get(\u0027method_names\u0027, [])"},{"line_number":295,"context_line":"            # make sure the list is unique"},{"line_number":296,"context_line":"            method_names \u003d list(set(method_names))"},{"line_number":297,"context_line":"            (token_id, token_data) \u003d self.token_provider_api.issue_token("}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvrE%3D","line":294,"in_reply_to":"AAAAPn%2F%2Fvw8%3D","updated":"2013-06-23 04:10:16.000000000","message":"it aggregates any additional method names from the plugins","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":396,"context_line":"            context,"},{"line_number":397,"context_line":"            token_id\u003dtoken_id,"},{"line_number":398,"context_line":"            belongs_to\u003dbelongs_to)"},{"line_number":399,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvw4%3D","line":398,"updated":"2013-06-22 23:10:55.000000000","message":"identity-api  doesn\u0027t have \"belongsTo\"   Please fix identity-api or remove belongsTo","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"27eae183655790622dcf2314942d6d5ba3fa0462","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":396,"context_line":"            context,"},{"line_number":397,"context_line":"            token_id\u003dtoken_id,"},{"line_number":398,"context_line":"            belongs_to\u003dbelongs_to)"},{"line_number":399,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fva8%3D","line":398,"in_reply_to":"AAAAPn%2F%2FvrA%3D","updated":"2013-06-23 15:36:33.000000000","message":"I will file a defect for this","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":396,"context_line":"            context,"},{"line_number":397,"context_line":"            token_id\u003dtoken_id,"},{"line_number":398,"context_line":"            belongs_to\u003dbelongs_to)"},{"line_number":399,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvrA%3D","line":398,"in_reply_to":"AAAAPn%2F%2Fvw4%3D","updated":"2013-06-23 04:10:16.000000000","message":"belongs_to was implemented by the original code. I am simply preserving the functionality. Please file a separate bug if it needs to be corrected at the API level.","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":413,"context_line":"    \"\"\""},{"line_number":414,"context_line":"    headers \u003d [(\u0027X-Subject-Token\u0027, token_id)]"},{"line_number":415,"context_line":"    headers.append((\u0027Vary\u0027, \u0027X-Auth-Token\u0027))"},{"line_number":416,"context_line":"    headers.append((\u0027Content-Type\u0027, \u0027application/json\u0027))"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    if created:"},{"line_number":419,"context_line":"        status \u003d (201, \u0027Created\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvw0%3D","line":416,"updated":"2013-06-22 23:10:55.000000000","message":"If the top layer ( pipeline)  is going to determine  \"Content-Type\", we don\u0027t need \"\nContent-Type here","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":413,"context_line":"    \"\"\""},{"line_number":414,"context_line":"    headers \u003d [(\u0027X-Subject-Token\u0027, token_id)]"},{"line_number":415,"context_line":"    headers.append((\u0027Vary\u0027, \u0027X-Auth-Token\u0027))"},{"line_number":416,"context_line":"    headers.append((\u0027Content-Type\u0027, \u0027application/json\u0027))"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    if created:"},{"line_number":419,"context_line":"        status \u003d (201, \u0027Created\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvq8%3D","line":416,"in_reply_to":"AAAAPn%2F%2Fvw0%3D","updated":"2013-06-23 04:10:16.000000000","message":"middleware needs to know the existing content type in order to translate it correctly I think. This code was inspired by render_response()\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/wsgi.py#L515\n\nI do think you have a good point here. Internally, Keystone is operating on JSON data so in theory content-type should be provided by middleware.\n\nPerhaps we need a file a bug for enhancement?","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"27eae183655790622dcf2314942d6d5ba3fa0462","unresolved":false,"context_lines":[{"line_number":414,"context_line":"    headers \u003d [(\u0027X-Subject-Token\u0027, token_id)]"},{"line_number":415,"context_line":"    headers.append((\u0027Vary\u0027, \u0027X-Auth-Token\u0027))"},{"line_number":416,"context_line":"    headers.append((\u0027Content-Type\u0027, \u0027application/json\u0027))"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    if created:"},{"line_number":419,"context_line":"        status \u003d (201, \u0027Created\u0027)"},{"line_number":420,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvbw%3D","line":417,"updated":"2013-06-23 15:36:33.000000000","message":"If you look at   https://github.com/openstack/keystone/blob/master/keystone/common/wsgi.py#L515\n\nrender exception doesn\u0027t have Content-Type.  Also response is determined by \"Accept\"  So top level layer is going to convert the response based on \"Accept\"","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    def _get_token_ref(self, context, token_id, belongs_to\u003dNone):"},{"line_number":367,"context_line":"        token_ref \u003d self.token_api.get_token(context\u003dcontext,"},{"line_number":368,"context_line":"                                             token_id\u003dtoken_id)"},{"line_number":369,"context_line":"        if cms.is_ans1_token(token_id):"},{"line_number":370,"context_line":"            verified_token \u003d cms.cms_verify(cms.token_to_cms(token_id),"},{"line_number":371,"context_line":"                                            CONF.signing.certfile,"},{"line_number":372,"context_line":"                                            CONF.signing.ca_certs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpPM%3D","side":"PARENT","line":369,"updated":"2013-06-26 02:44:58.000000000","message":"Where did this check end up?  I guess you are just always reading the values our of the database.  Which is sufficient.","commit_id":"95cf4704d2cd86f5162eac4c4abca1aa890c471c"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":366,"context_line":"    def _get_token_ref(self, context, token_id, belongs_to\u003dNone):"},{"line_number":367,"context_line":"        token_ref \u003d self.token_api.get_token(context\u003dcontext,"},{"line_number":368,"context_line":"                                             token_id\u003dtoken_id)"},{"line_number":369,"context_line":"        if cms.is_ans1_token(token_id):"},{"line_number":370,"context_line":"            verified_token \u003d cms.cms_verify(cms.token_to_cms(token_id),"},{"line_number":371,"context_line":"                                            CONF.signing.certfile,"},{"line_number":372,"context_line":"                                            CONF.signing.ca_certs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmt8%3D","side":"PARENT","line":369,"in_reply_to":"AAAAPn%2F%2FpPM%3D","updated":"2013-06-26 22:29:15.000000000","message":"right, we are check 1) if token exist, and 2) is it a valid PKI token","commit_id":"95cf4704d2cd86f5162eac4c4abca1aa890c471c"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        self._scope_data \u003d (domain_id, project_id, trust)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":278,"context_line":"class Auth(controller.V3Controller):"},{"line_number":279,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":280,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpPU%3D","line":277,"updated":"2013-06-26 02:44:58.000000000","message":"Does this really need api on the end of it?   requires token_provider seems cleaner.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        self._scope_data \u003d (domain_id, project_id, trust)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"@dependency.requires(\u0027token_provider_api\u0027)"},{"line_number":278,"context_line":"class Auth(controller.V3Controller):"},{"line_number":279,"context_line":"    def __init__(self, *args, **kw):"},{"line_number":280,"context_line":"        super(Auth, self).__init__(*args, **kw)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmuU%3D","line":277,"in_reply_to":"AAAAPn%2F%2FpPU%3D","updated":"2013-06-26 22:29:15.000000000","message":"I am following the existing pattern. It is really an interface so I think token_provider_api should be fine.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"#FIXME(gyee): not sure if it belongs here or keystone.common. Park it here"},{"line_number":407,"context_line":"# for now."},{"line_number":408,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":409,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    Stash token ID into the X-Auth-Token header."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpPQ%3D","line":408,"updated":"2013-06-26 02:44:58.000000000","message":"Controllers typically do not know much, if anything about HTTP.  This belongs in middleware.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":405,"context_line":""},{"line_number":406,"context_line":"#FIXME(gyee): not sure if it belongs here or keystone.common. Park it here"},{"line_number":407,"context_line":"# for now."},{"line_number":408,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":409,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    Stash token ID into the X-Auth-Token header."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmtY%3D","line":408,"in_reply_to":"AAAAPn%2F%2FpPQ%3D","updated":"2013-06-26 22:29:15.000000000","message":"Middleware is certainly possible. But I think it should be done in a separate patch though.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8dd97499d6a7c0303ab5887916a2816dd1d520d","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    def check_token(self, context):"},{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":384,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    @controller.protected"},{"line_number":387,"context_line":"    def revoke_token(self, context):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2FgjA%3D","line":384,"updated":"2013-06-28 21:11:46.000000000","message":"Remove context from all of the api calls.","commit_id":"639930eac56b0dc568085bef52d37572b8b5ab3a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":372,"context_line":"    @controller.protected"},{"line_number":373,"context_line":"    def check_token(self, context):"},{"line_number":374,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":375,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":376,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8CU%3D","line":375,"updated":"2013-07-08 21:02:36.000000000","message":"v2 garbage","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":372,"context_line":"    @controller.protected"},{"line_number":373,"context_line":"    def check_token(self, context):"},{"line_number":374,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":375,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":376,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7gE%3D","line":375,"in_reply_to":"AAAAP3%2F%2F8CU%3D","updated":"2013-07-09 00:31:29.000000000","message":"Done","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":383,"context_line":"    @controller.protected"},{"line_number":384,"context_line":"    def validate_token(self, context):"},{"line_number":385,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":386,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":387,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":388,"context_line":"            context,"},{"line_number":389,"context_line":"            token_id\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8Co%3D","line":386,"updated":"2013-07-08 21:02:36.000000000","message":"this is garbage from v2 and isn\u0027t in the v3 spec... remove it from the v3 implementation","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":383,"context_line":"    @controller.protected"},{"line_number":384,"context_line":"    def validate_token(self, context):"},{"line_number":385,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":386,"context_line":"        belongs_to \u003d context[\u0027query_string\u0027].get(\u0027belongsTo\u0027)"},{"line_number":387,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":388,"context_line":"            context,"},{"line_number":389,"context_line":"            token_id\u003dtoken_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7gA%3D","line":386,"in_reply_to":"AAAAP3%2F%2F8Co%3D","updated":"2013-07-09 00:31:29.000000000","message":"Done","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":400,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":401,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    Stash token ID into the X-Auth-Token header."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    \"\"\""},{"line_number":406,"context_line":"    headers \u003d [(\u0027X-Subject-Token\u0027, token_id)]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8DI%3D","line":403,"updated":"2013-07-08 21:02:36.000000000","message":"docs conflict with implementation\n\nwhy not just call the keystone.common method with an X-Subject-Token instead of copy/pasting code around?","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":400,"context_line":"def render_token_data_response(token_id, token_data, created\u003dFalse):"},{"line_number":401,"context_line":"    \"\"\"Render token data HTTP response."},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    Stash token ID into the X-Auth-Token header."},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"    \"\"\""},{"line_number":406,"context_line":"    headers \u003d [(\u0027X-Subject-Token\u0027, token_id)]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7f8%3D","line":403,"in_reply_to":"AAAAP3%2F%2F8DI%3D","updated":"2013-07-09 00:31:29.000000000","message":"Good catch!","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                                              created\u003dTrue)"},{"line_number":299,"context_line":"        except exception.SecurityError:"},{"line_number":300,"context_line":"            raise"},{"line_number":301,"context_line":"        except Exception as e:"},{"line_number":302,"context_line":"            LOG.exception(_(\u0027Failed to issue token for user\u0027))"},{"line_number":303,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx84%3D","line":301,"updated":"2013-07-11 15:34:11.000000000","message":"I\u0027d really like to know what you\u0027re catching here?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                                              created\u003dTrue)"},{"line_number":299,"context_line":"        except exception.SecurityError:"},{"line_number":300,"context_line":"            raise"},{"line_number":301,"context_line":"        except Exception as e:"},{"line_number":302,"context_line":"            LOG.exception(_(\u0027Failed to issue token for user\u0027))"},{"line_number":303,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fwi8%3D","line":301,"in_reply_to":"AAAAP3%2F%2Fw5w%3D","updated":"2013-07-12 00:05:53.000000000","message":"k, let it raise baby! :)","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                                              created\u003dTrue)"},{"line_number":299,"context_line":"        except exception.SecurityError:"},{"line_number":300,"context_line":"            raise"},{"line_number":301,"context_line":"        except Exception as e:"},{"line_number":302,"context_line":"            LOG.exception(_(\u0027Failed to issue token for user\u0027))"},{"line_number":303,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw5w%3D","line":301,"in_reply_to":"AAAAP3%2F%2Fx1s%3D","updated":"2013-07-11 19:59:04.000000000","message":"the interface should document the exceptions it\u0027s expected to raise. anything else is a 500 because the provider is broken","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":298,"context_line":"                                              created\u003dTrue)"},{"line_number":299,"context_line":"        except exception.SecurityError:"},{"line_number":300,"context_line":"            raise"},{"line_number":301,"context_line":"        except Exception as e:"},{"line_number":302,"context_line":"            LOG.exception(_(\u0027Failed to issue token for user\u0027))"},{"line_number":303,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx1s%3D","line":301,"in_reply_to":"AAAAP3%2F%2Fx84%3D","updated":"2013-07-11 17:54:01.000000000","message":"Since token providers are pluggable and can be 3rd customized providers, they may not play nice. All I am doing here is just to log any errors coming from the provider.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":370,"context_line":"    @controller.protected"},{"line_number":371,"context_line":"    def check_token(self, context):"},{"line_number":372,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":373,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to\u003dNone)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    @controller.protected"},{"line_number":376,"context_line":"    def revoke_token(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx%2BA%3D","line":373,"updated":"2013-07-11 15:34:11.000000000","message":"what\u0027s up with the belongs_to\u003dNone ? remove it","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":370,"context_line":"    @controller.protected"},{"line_number":371,"context_line":"    def check_token(self, context):"},{"line_number":372,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":373,"context_line":"        self.token_provider_api.check_token(context, token_id, belongs_to\u003dNone)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    @controller.protected"},{"line_number":376,"context_line":"    def revoke_token(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxt8%3D","line":373,"in_reply_to":"AAAAP3%2F%2Fx%2BA%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    @controller.protected"},{"line_number":376,"context_line":"    def revoke_token(self, context):"},{"line_number":377,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":378,"context_line":"        return self.token_provider_api.revoke_token(context, token_id)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @controller.protected"},{"line_number":381,"context_line":"    def validate_token(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx9g%3D","line":378,"updated":"2013-07-11 15:34:11.000000000","message":"remove context","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    @controller.protected"},{"line_number":376,"context_line":"    def revoke_token(self, context):"},{"line_number":377,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":378,"context_line":"        return self.token_provider_api.revoke_token(context, token_id)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    @controller.protected"},{"line_number":381,"context_line":"    def validate_token(self, context):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxpc%3D","line":378,"in_reply_to":"AAAAP3%2F%2Fx9g%3D","updated":"2013-07-11 17:54:01.000000000","message":"Yeah, the patch started when context was still being passed into all the backends.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    def validate_token(self, context):"},{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx9Y%3D","line":384,"updated":"2013-07-11 15:34:11.000000000","message":"remove context","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    def validate_token(self, context):"},{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxjI%3D","line":384,"in_reply_to":"AAAAP3%2F%2Fx9Y%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":388,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx9U%3D","line":385,"updated":"2013-07-11 15:34:11.000000000","message":"don\u0027t use kwargs here","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        token_id \u003d context.get(\u0027subject_token_id\u0027)"},{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":388,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxjE%3D","line":385,"in_reply_to":"AAAAP3%2F%2Fx9U%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx9Q%3D","line":386,"updated":"2013-07-11 15:34:11.000000000","message":"remove","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        token_data \u003d self.token_provider_api.validate_token("},{"line_number":384,"context_line":"            context,"},{"line_number":385,"context_line":"            token_id\u003dtoken_id,"},{"line_number":386,"context_line":"            belongs_to\u003dNone)"},{"line_number":387,"context_line":"        return render_token_data_response(token_id, token_data)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxi8%3D","line":386,"in_reply_to":"AAAAP3%2F%2Fx9Q%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              created\u003dTrue)"},{"line_number":302,"context_line":"        except AssertionError:"},{"line_number":303,"context_line":"            # authentication failed because of invalid username or password"},{"line_number":304,"context_line":"            msg \u003d _(\u0027Failed to authentication user\u0027)"},{"line_number":305,"context_line":"            LOG.exception(msg)"},{"line_number":306,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":307,"context_line":"        except exception.TrustNotFound as e:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Ftfc%3D","line":304,"updated":"2013-07-12 16:15:49.000000000","message":"authenticate?","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                                              created\u003dTrue)"},{"line_number":302,"context_line":"        except AssertionError:"},{"line_number":303,"context_line":"            # authentication failed because of invalid username or password"},{"line_number":304,"context_line":"            msg \u003d _(\u0027Failed to authentication user\u0027)"},{"line_number":305,"context_line":"            LOG.exception(msg)"},{"line_number":306,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":307,"context_line":"        except exception.TrustNotFound as e:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fs34%3D","line":304,"in_reply_to":"AAAAP3%2F%2Ftfc%3D","updated":"2013-07-12 19:37:25.000000000","message":"good catch!","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        except AssertionError:"},{"line_number":303,"context_line":"            # authentication failed because of invalid username or password"},{"line_number":304,"context_line":"            msg \u003d _(\u0027Failed to authentication user\u0027)"},{"line_number":305,"context_line":"            LOG.exception(msg)"},{"line_number":306,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":307,"context_line":"        except exception.TrustNotFound as e:"},{"line_number":308,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Ftfo%3D","line":305,"updated":"2013-07-12 16:15:49.000000000","message":"why on earth are you logging an exception?! what is expected to raise an assertion error?","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        except AssertionError:"},{"line_number":303,"context_line":"            # authentication failed because of invalid username or password"},{"line_number":304,"context_line":"            msg \u003d _(\u0027Failed to authentication user\u0027)"},{"line_number":305,"context_line":"            LOG.exception(msg)"},{"line_number":306,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":307,"context_line":"        except exception.TrustNotFound as e:"},{"line_number":308,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fs3w%3D","line":305,"in_reply_to":"AAAAP3%2F%2Ftfo%3D","updated":"2013-07-12 19:37:25.000000000","message":"yeah you\u0027re right, that stuff should be in the plugin","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"}],"keystone/common/config.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    register_str("},{"line_number":413,"context_line":"        \u0027provider\u0027,"},{"line_number":414,"context_line":"        group\u003d\u0027token\u0027,"},{"line_number":415,"context_line":"        default\u003d\u0027keystone.token.providers.keystone_provider.Provider\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpOs%3D","line":415,"updated":"2013-06-26 02:44:58.000000000","message":"keystone.token.providers.keystone.Provider","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":412,"context_line":"    register_str("},{"line_number":413,"context_line":"        \u0027provider\u0027,"},{"line_number":414,"context_line":"        group\u003d\u0027token\u0027,"},{"line_number":415,"context_line":"        default\u003d\u0027keystone.token.providers.keystone_provider.Provider\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fms8%3D","line":415,"in_reply_to":"AAAAPn%2F%2FpOs%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    register_str("},{"line_number":416,"context_line":"        \u0027provider\u0027,"},{"line_number":417,"context_line":"        group\u003d\u0027token\u0027,"},{"line_number":418,"context_line":"        default\u003d\u0027keystone.token.providers.keystone.Provider\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8CQ%3D","line":418,"updated":"2013-07-08 21:02:36.000000000","message":"why all the namespacing? if there\u0027s only one \"provider\" then what  are the two extra packages for?","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    register_str("},{"line_number":416,"context_line":"        \u0027provider\u0027,"},{"line_number":417,"context_line":"        group\u003d\u0027token\u0027,"},{"line_number":418,"context_line":"        default\u003d\u0027keystone.token.providers.keystone.Provider\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7fs%3D","line":418,"in_reply_to":"AAAAP3%2F%2F8CQ%3D","updated":"2013-07-09 00:31:29.000000000","message":"We are anticipating more providers down the road. The \"providers\" dir structure is setup similar to \"backends\" dir structure.","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"}],"keystone/common/sql/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                            if config.CONF.signing.token_format \u003d\u003d \u0027PKI\u0027 and \\"},{"line_number":86,"context_line":"                                    self.__tablename__ \u003d\u003d \u0027token\u0027 and \\"},{"line_number":87,"context_line":"                                    k \u003d\u003d \u0027id\u0027:"},{"line_number":88,"context_line":"                                continue"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"                            raise exception.StringLengthExceeded("},{"line_number":91,"context_line":"                                string\u003dv, type\u003dk, length\u003dcolumn.type.length)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyE0%3D","side":"PARENT","line":88,"updated":"2013-07-11 15:13:25.000000000","message":"nice","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"}],"keystone/service.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpO8%3D","line":31,"updated":"2013-06-26 02:44:58.000000000","message":"why can\u0027t you just do token.provider and drop this import?","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmrg%3D","line":31,"in_reply_to":"AAAAPn%2F%2FpO8%3D","updated":"2013-06-26 22:29:15.000000000","message":"what\u0027s the difference? this one is pretty self-explanatory.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    policy_api\u003dpolicy.Manager(),"},{"line_number":44,"context_line":"    token_api\u003dtoken.Manager(),"},{"line_number":45,"context_line":"    trust_api\u003dtrust.Manager(),"},{"line_number":46,"context_line":"    token_provider_api\u003dtoken_provider.Manager())"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"@logging.fail_gracefully"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8B8%3D","line":46,"updated":"2013-07-08 21:02:36.000000000","message":"why does anything outside the token_api need to reference this?","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    policy_api\u003dpolicy.Manager(),"},{"line_number":44,"context_line":"    token_api\u003dtoken.Manager(),"},{"line_number":45,"context_line":"    trust_api\u003dtrust.Manager(),"},{"line_number":46,"context_line":"    token_provider_api\u003dtoken_provider.Manager())"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"@logging.fail_gracefully"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7fg%3D","line":46,"in_reply_to":"AAAAP3%2F%2F8B8%3D","updated":"2013-07-09 00:31:29.000000000","message":"It is also referenced in contrib/ec2","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1ls%3D","line":31,"updated":"2013-07-10 17:09:25.000000000","message":"this is ugly","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1V8%3D","line":31,"in_reply_to":"AAAAP3%2F%2F1ls%3D","updated":"2013-07-10 17:35:32.000000000","message":"Is there a better way to do this?","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyEo%3D","line":31,"updated":"2013-07-11 15:13:25.000000000","message":"see previous review about importing provider into token/__init__.py","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw5o%3D","line":31,"in_reply_to":"AAAAP3%2F%2Fxio%3D","updated":"2013-07-11 19:59:04.000000000","message":"no you don\u0027t, reference it as token.provider.Manager externally","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from keystone import policy"},{"line_number":29,"context_line":"from keystone import routers"},{"line_number":30,"context_line":"from keystone import token"},{"line_number":31,"context_line":"from keystone.token import provider as token_provider"},{"line_number":32,"context_line":"from keystone import trust"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxio%3D","line":31,"in_reply_to":"AAAAP3%2F%2FyEo%3D","updated":"2013-07-11 17:54:01.000000000","message":"That\u0027ll work, but I\u0027ll have to rename provider.Manager to provider.ProviderManager to avoid name clash with core.Manager","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"}],"keystone/test.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1lc%3D","line":229,"updated":"2013-07-10 17:09:25.000000000","message":"why is a \"provider\" suddenly a \"backend\"? indicative of a confused architecture...","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1Ws%3D","line":229,"in_reply_to":"AAAAP3%2F%2F1lc%3D","updated":"2013-07-10 17:35:32.000000000","message":"provider is implemented with the same mechanism as backend drivers\n\nI suppose I can create a separate load_token_provider() if that\u0027s why it takes?","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyEQ%3D","line":229,"updated":"2013-07-11 15:13:25.000000000","message":"it\u0027s not a backend, why is it here?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FwjE%3D","line":229,"in_reply_to":"AAAAP3%2F%2Fw5c%3D","updated":"2013-07-12 00:05:53.000000000","message":"k, I\u0027ll move it out of load_backends() to avoid confusion","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw5c%3D","line":229,"in_reply_to":"AAAAP3%2F%2Fxuc%3D","updated":"2013-07-11 19:59:04.000000000","message":"i don\u0027t have an alternative suggestion, i\u0027m just red flagging confusing architecture","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    def load_backends(self):"},{"line_number":227,"context_line":"        \"\"\"Initializes each manager and assigns them to an attribute.\"\"\""},{"line_number":228,"context_line":"        for manager in [assignment, catalog, credential, identity, policy,"},{"line_number":229,"context_line":"                        token, trust, token_provider]:"},{"line_number":230,"context_line":"            manager_name \u003d \u0027%s_api\u0027 % manager.__name__.split(\u0027.\u0027)[-1]"},{"line_number":231,"context_line":"            setattr(self, manager_name, manager.Manager())"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxuc%3D","line":229,"in_reply_to":"AAAAP3%2F%2FyEQ%3D","updated":"2013-07-11 17:54:01.000000000","message":"because token_provider is implement using the same mechanism as backends. I need a way to make it available for the tests. If this is not the appropriate place, perhaps I can move it up to the setUp() method? Any other suggestion?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"}],"keystone/token/__init__.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.token import controllers"},{"line_number":19,"context_line":"from keystone.token.core import *"},{"line_number":20,"context_line":"from keystone.token import provider"},{"line_number":21,"context_line":"from keystone.token import routers"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Ftgk%3D","line":20,"updated":"2013-07-12 16:15:49.000000000","message":"cool","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        if token_id is None:"},{"line_number":42,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":43,"context_line":"        session \u003d self.get_session()"},{"line_number":44,"context_line":"        token_ref \u003d session.query(TokenModel).get(token.unique_id(token_id))"},{"line_number":45,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":46,"context_line":"        if not token_ref or not token_ref.valid:"},{"line_number":47,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyEA%3D","side":"PARENT","line":44,"updated":"2013-07-11 15:13:25.000000000","message":"i like that we can drop all these","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"}],"keystone/token/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        return self.driver.create_token(unique_id(token_id), data_copy)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def delete_token(self, token_id):"},{"line_number":127,"context_line":"        return self.driver.delete_token(unique_id(token_id))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyDw%3D","line":127,"updated":"2013-07-11 15:13:25.000000000","message":"nice refactor; if nothing outside this class needs unique_id anymore, then it should be made to be a \"private\" method of this manager class, e.g. _unique_id()","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        return self.driver.create_token(unique_id(token_id), data_copy)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def delete_token(self, token_id):"},{"line_number":127,"context_line":"        return self.driver.delete_token(unique_id(token_id))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FwXI%3D","line":127,"in_reply_to":"AAAAP3%2F%2Fw44%3D","updated":"2013-07-12 00:05:53.000000000","message":"Done, removed all of them","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        return self.driver.create_token(unique_id(token_id), data_copy)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def delete_token(self, token_id):"},{"line_number":127,"context_line":"        return self.driver.delete_token(unique_id(token_id))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw44%3D","line":127,"in_reply_to":"AAAAP3%2F%2Fxdg%3D","updated":"2013-07-11 19:59:04.000000000","message":"i thought you removed that from all the test code?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        return self.driver.create_token(unique_id(token_id), data_copy)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def delete_token(self, token_id):"},{"line_number":127,"context_line":"        return self.driver.delete_token(unique_id(token_id))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxdg%3D","line":127,"in_reply_to":"AAAAP3%2F%2FyDw%3D","updated":"2013-07-11 17:54:01.000000000","message":"the test code make use of unique_id() so I\u0027ll leave it as is for now","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f2ca8f9b5d3408f2d65ae85f2c28bd73cb00cd05","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return cms.cms_hash_token(token_id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def get_token(self, token_id):"},{"line_number":118,"context_line":"        return self.driver.get_token(self._unique_id(token_id))"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def create_token(self, token_id, data):"},{"line_number":121,"context_line":"        data_copy \u003d copy.deepcopy(data)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2FrUc%3D","line":118,"updated":"2013-07-13 21:37:15.000000000","message":"Nice to have pulled this up to here!","commit_id":"c238ace30981877e5991874c5b193ea7d5107419"}],"keystone/token/provider.py":[{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"21c39a2a4442afcf61163f40566d3b5c1bd2f93f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        raise exception.NotImplemented()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def issue_token(self, user_id, method_names, version\u003d\u0027v3.0\u0027,"},{"line_number":67,"context_line":"                    expires_at\u003dNone,"},{"line_number":68,"context_line":"                    project_id\u003dNone, domain_id\u003dNone,"},{"line_number":69,"context_line":"                    auth_context\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw7g%3D","line":66,"updated":"2013-06-21 19:52:41.000000000","message":"What happened to other scopes such us \"trust\"? (OK, saw that it is stuffed in kwargs)\n\nCan\u0027t this be generalized to  ScopeType and ScopleTypeId so that it is easy to add some other scope.  Assuming trust is approved to be part of core, then are you  going to move trust from kwargs","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85a9a50d79655c8627cf68f8608c7fff3cfe494e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        raise exception.NotImplemented()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def issue_token(self, user_id, method_names, version\u003d\u0027v3.0\u0027,"},{"line_number":67,"context_line":"                    expires_at\u003dNone,"},{"line_number":68,"context_line":"                    project_id\u003dNone, domain_id\u003dNone,"},{"line_number":69,"context_line":"                    auth_context\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw0o%3D","line":66,"in_reply_to":"AAAAPn%2F%2Fw7g%3D","updated":"2013-06-21 20:06:41.000000000","message":"trust is part of metadata for now. I am sure we\u0027ll have to make some tweaks once it becomes core.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :param kwargs: other information to assist token creation"},{"line_number":87,"context_line":"        :type kwargs: free from keyword arguments"},{"line_number":88,"context_line":"        :returns: (token_id, token_data)"},{"line_number":89,"context_line":"        :raises: keystone.exception.TokenNotFound"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwwI%3D","line":89,"updated":"2013-06-21 21:56:50.000000000","message":"seems like an odd error to raise, since not looking up a token. Suggest raise a new exception that describes the problem better.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        raise exception.NotImplemented()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def validate_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":101,"context_line":"                       version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":102,"context_line":"        \"\"\"Validate the given token and return the token data."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        Must raise Unauthorized exception if unable to validate token."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FUjk%3D","line":101,"updated":"2013-07-04 02:11:08.000000000","message":"what do you as see the need for kwargs here? I would think that everything could be specified and the implementation does not use it.","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f4a243cc22c95dbde6df2e31e81e7296b750a1b8","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        raise exception.NotImplemented()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def validate_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":101,"context_line":"                       version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":102,"context_line":"        \"\"\"Validate the given token and return the token data."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        Must raise Unauthorized exception if unable to validate token."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2F%2Bwo%3D","line":101,"in_reply_to":"AAAAPn%2F%2FUjk%3D","updated":"2013-07-08 06:15:49.000000000","message":"I was thinking kwargs would provide the flexibility where token providers are invoke by 3rd party extensions (i.e. stuff in keystone/contrib/) and additional parameters are needed. For example, if and when we decided to have an extension to bind a given token to an service or endpoint, we may pass in service ID or endpoint IDs in addition to belongs_to","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        raise exception.NotImplemented()"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def check_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":123,"context_line":"                    version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":124,"context_line":"        \"\"\"Check the validity of the given V3 token."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        Must raise Unauthorized exception if  unable to check token."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FUjU%3D","line":123,"updated":"2013-07-04 02:11:08.000000000","message":"same re kwargs","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"defaa8885675a3888c9b61d219e533fefb02233d","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":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F8CE%3D","line":1,"updated":"2013-07-08 21:02:36.000000000","message":"there\u0027s a provider module and providers package? please fix","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"349a45ff908af02f3f51155aef5fdd659695af1c","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":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2F7fY%3D","line":1,"in_reply_to":"AAAAP3%2F%2F8CE%3D","updated":"2013-07-09 00:31:29.000000000","message":"Provider is the interface, similar to core.py.","commit_id":"5254f5657198f9654ded8e9672131f918568fdc0"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        raise exception.NotImplemented()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def issue_token(self, context, version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":76,"context_line":"        \"\"\"Issue a V3 token."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        For V3 tokens, \u0027user_id\u0027, \u0027method_names\u0027, must present in kwargs."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx8o%3D","line":75,"updated":"2013-07-11 15:34:11.000000000","message":"be explicit about *what* kwargs. i don\u0027t find it acceptable that an interface definition can\u0027t be explicit about what it expects...","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        \"\"\""},{"line_number":73,"context_line":"        raise exception.NotImplemented()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def issue_token(self, context, version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":76,"context_line":"        \"\"\"Issue a V3 token."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        For V3 tokens, \u0027user_id\u0027, \u0027method_names\u0027, must present in kwargs."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxbY%3D","line":75,"in_reply_to":"AAAAP3%2F%2Fx8o%3D","updated":"2013-07-11 17:54:01.000000000","message":"this interface is for both V2 and V3. I orginally have all the parameters list. Some of them are optional, depending on the version of the token to issue. Brant suggested putting all of them into kwargs in one of the earlier reviews. I though having them as kwargs is more flexible too.\n\nI can go back to the original params list if that\u0027s we it takes. I am fine either way.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        plugins."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        :param context: request context"},{"line_number":85,"context_line":"        :type context: dictionary"},{"line_number":86,"context_line":"        :param version: version of the token to be issued"},{"line_number":87,"context_line":"        :type version: string"},{"line_number":88,"context_line":"        :param kwargs: information needed for token creation. Parameters"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx8s%3D","line":85,"updated":"2013-07-11 15:34:11.000000000","message":"i don\u0027t see any of the uuid provider methods actually utilizing context (and they shouldn\u0027t, anyway) ... remove context from the entire interface","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        plugins."},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        :param context: request context"},{"line_number":85,"context_line":"        :type context: dictionary"},{"line_number":86,"context_line":"        :param version: version of the token to be issued"},{"line_number":87,"context_line":"        :type version: string"},{"line_number":88,"context_line":"        :param kwargs: information needed for token creation. Parameters"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxdQ%3D","line":85,"in_reply_to":"AAAAP3%2F%2Fx8s%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        raise exception.NotImplemented()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def validate_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":110,"context_line":"                       version\u003d\u0027v3.0\u0027):"},{"line_number":111,"context_line":"        \"\"\"Validate the given token and return the token data."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        Must raise Unauthorized exception if unable to validate token."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx8M%3D","line":110,"updated":"2013-07-11 15:34:11.000000000","message":"i\u0027d really like to stop using default arguments and kwargs in driver interfaces. if the signature can\u0027t be explicit about what it\u0027s doing, then it just leads to broken drivers and bugs.\n\nthe version also shouldn\u0027t appear here at all. HTTP API version is a view/controller concern, not one addressed by the backend","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        raise exception.NotImplemented()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def validate_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":110,"context_line":"                       version\u003d\u0027v3.0\u0027):"},{"line_number":111,"context_line":"        \"\"\"Validate the given token and return the token data."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        Must raise Unauthorized exception if unable to validate token."}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxc0%3D","line":110,"in_reply_to":"AAAAP3%2F%2Fx8M%3D","updated":"2013-07-11 17:54:01.000000000","message":"belongs_to is optional as this interface is for both v2 and v3.\n\nThis interface is for both V2 and V3 tokens. The version parameter dictates which token version to issue.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # CONF.signing.token_format agrees with CONF.token.provider."},{"line_number":53,"context_line":"        # This code will be removed in the subsequent patch to implement"},{"line_number":54,"context_line":"        # V2 token provider. That patch will remove CONF.signing.token_format"},{"line_number":55,"context_line":"        # altogether."},{"line_number":56,"context_line":"        if (CONF.signing.token_format \u003d\u003d \u0027PKI\u0027 and"},{"line_number":57,"context_line":"                not CONF.token.provider.endswith(\u0027pki.Provider\u0027)):"},{"line_number":58,"context_line":"            raise ValueError(\u0027token_format conflicts with token provider\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Ftho%3D","line":55,"updated":"2013-07-12 16:15:49.000000000","message":"backwards compatibility for existing configurations needs to be maintained for grizzly+2","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        # CONF.signing.token_format agrees with CONF.token.provider."},{"line_number":53,"context_line":"        # This code will be removed in the subsequent patch to implement"},{"line_number":54,"context_line":"        # V2 token provider. That patch will remove CONF.signing.token_format"},{"line_number":55,"context_line":"        # altogether."},{"line_number":56,"context_line":"        if (CONF.signing.token_format \u003d\u003d \u0027PKI\u0027 and"},{"line_number":57,"context_line":"                not CONF.token.provider.endswith(\u0027pki.Provider\u0027)):"},{"line_number":58,"context_line":"            raise ValueError(\u0027token_format conflicts with token provider\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fs2g%3D","line":55,"in_reply_to":"AAAAP3%2F%2Ftho%3D","updated":"2013-07-12 19:37:25.000000000","message":"k, I\u0027ll update the comment","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                       may be different depending on token version."},{"line_number":90,"context_line":"        :type kwargs: dictionary"},{"line_number":91,"context_line":"        :returns: (token_id, token_data)"},{"line_number":92,"context_line":"        :raises: Exception if unable to issue token"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FtdU%3D","line":92,"updated":"2013-07-12 16:15:49.000000000","message":"what exception? this is useless","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                       may be different depending on token version."},{"line_number":90,"context_line":"        :type kwargs: dictionary"},{"line_number":91,"context_line":"        :returns: (token_id, token_data)"},{"line_number":92,"context_line":"        :raises: Exception if unable to issue token"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fs2M%3D","line":92,"in_reply_to":"AAAAP3%2F%2FtdU%3D","updated":"2013-07-12 19:37:25.000000000","message":"I was thinking database exceptions, etc. Maybe better to let them bubble up instead.","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        :param token_id: identity of the token"},{"line_number":101,"context_line":"        :type token_id: string"},{"line_number":102,"context_line":"        :returns: None."},{"line_number":103,"context_line":"        :raises: Exception if unable to revoke token"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        raise exception.NotImplemented()"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FtdQ%3D","line":103,"updated":"2013-07-12 16:15:49.000000000","message":"useless","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"}],"keystone/token/providers/keystone.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8dd97499d6a7c0303ab5887916a2816dd1d520d","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id):"},{"line_number":65,"context_line":"        if \u0027domain\u0027 in token_data or \u0027project\u0027 in token_data:"},{"line_number":66,"context_line":"            # scope already exist, no need to pupulate it again"},{"line_number":67,"context_line":"            return"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAPn%2F%2Fggo%3D","line":66,"updated":"2013-06-28 21:11:46.000000000","message":"typo","commit_id":"639930eac56b0dc568085bef52d37572b8b5ab3a"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","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":"\"\"\"UUID Token Provider\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from __future__ import absolute_import"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FUj8%3D","line":17,"updated":"2013-07-04 02:11:08.000000000","message":"It\u0027s not just UUID","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f4a243cc22c95dbde6df2e31e81e7296b750a1b8","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":"\"\"\"UUID Token Provider\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from __future__ import absolute_import"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2F%2BxM%3D","line":17,"in_reply_to":"AAAAPn%2F%2FUj8%3D","updated":"2013-07-08 06:15:49.000000000","message":"good catch!","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"59a2fd092ba05e9134813f38210d9db1ca3fde15","unresolved":false,"context_lines":[{"line_number":42,"context_line":"@dependency.requires(\u0027catalog_api\u0027, \u0027identity_api\u0027)"},{"line_number":43,"context_line":"class V3TokenDataHelper(object):"},{"line_number":44,"context_line":"    \"\"\"Token data helper.\"\"\""},{"line_number":45,"context_line":"    def __init__(self):"},{"line_number":46,"context_line":"        if CONF.trust.enabled:"},{"line_number":47,"context_line":"            self.trust_api \u003d trust.Manager()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FcPY%3D","line":45,"updated":"2013-07-01 21:22:12.000000000","message":"Can\u0027t you think of another name for this file? We already have keystone.py which is httpd file\n\u0027","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f4a243cc22c95dbde6df2e31e81e7296b750a1b8","unresolved":false,"context_lines":[{"line_number":42,"context_line":"@dependency.requires(\u0027catalog_api\u0027, \u0027identity_api\u0027)"},{"line_number":43,"context_line":"class V3TokenDataHelper(object):"},{"line_number":44,"context_line":"    \"\"\"Token data helper.\"\"\""},{"line_number":45,"context_line":"    def __init__(self):"},{"line_number":46,"context_line":"        if CONF.trust.enabled:"},{"line_number":47,"context_line":"            self.trust_api \u003d trust.Manager()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2F%2BxQ%3D","line":45,"in_reply_to":"AAAAPn%2F%2FUhE%3D","updated":"2013-07-08 06:15:49.000000000","message":"I tend to agree with ayoung that UUID and PKI are just different mechanism, not different providers in the sense that the token data are the same for both","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","unresolved":false,"context_lines":[{"line_number":42,"context_line":"@dependency.requires(\u0027catalog_api\u0027, \u0027identity_api\u0027)"},{"line_number":43,"context_line":"class V3TokenDataHelper(object):"},{"line_number":44,"context_line":"    \"\"\"Token data helper.\"\"\""},{"line_number":45,"context_line":"    def __init__(self):"},{"line_number":46,"context_line":"        if CONF.trust.enabled:"},{"line_number":47,"context_line":"            self.trust_api \u003d trust.Manager()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FUhE%3D","line":45,"in_reply_to":"AAAAPn%2F%2FcPY%3D","updated":"2013-07-04 02:11:08.000000000","message":"it won\u0027t matter when the UUID / PKI splt happends","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return token_id"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def _issue_v3_token(self, **kwargs):"},{"line_number":242,"context_line":"        user_id \u003d kwargs.get(\u0027user_id\u0027)"},{"line_number":243,"context_line":"        method_names \u003d kwargs.get(\u0027method_names\u0027)"},{"line_number":244,"context_line":"        expires_at \u003d kwargs.get(\u0027expires_at\u0027)"},{"line_number":245,"context_line":"        project_id \u003d kwargs.get(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FbrA%3D","line":242,"updated":"2013-07-04 02:11:08.000000000","message":"why not just have them all as named parameters \u003dNone?","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f4a243cc22c95dbde6df2e31e81e7296b750a1b8","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        return token_id"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def _issue_v3_token(self, **kwargs):"},{"line_number":242,"context_line":"        user_id \u003d kwargs.get(\u0027user_id\u0027)"},{"line_number":243,"context_line":"        method_names \u003d kwargs.get(\u0027method_names\u0027)"},{"line_number":244,"context_line":"        expires_at \u003d kwargs.get(\u0027expires_at\u0027)"},{"line_number":245,"context_line":"        project_id \u003d kwargs.get(\u0027project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2F%2BxU%3D","line":242,"in_reply_to":"AAAAPn%2F%2FbrA%3D","updated":"2013-07-08 06:15:49.000000000","message":"I want to use kwargs here so to make this class easier to extend","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"9baf648c0074025b0e525ddc9eacc344a3567810","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def check_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":357,"context_line":"                    version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":358,"context_line":"        try:"},{"line_number":359,"context_line":"            self._verify_token(token_id, belongs_to\u003dbelongs_to)"},{"line_number":360,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPn%2F%2FUjw%3D","line":357,"updated":"2013-07-04 02:11:08.000000000","message":"version is ignored","commit_id":"e78c333af1358500955f1762316b99698ee209c1"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f4a243cc22c95dbde6df2e31e81e7296b750a1b8","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def check_token(self, context, token_id, belongs_to\u003dNone,"},{"line_number":357,"context_line":"                    version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":358,"context_line":"        try:"},{"line_number":359,"context_line":"            self._verify_token(token_id, belongs_to\u003dbelongs_to)"},{"line_number":360,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2F%2Bxc%3D","line":357,"in_reply_to":"AAAAPn%2F%2FUjw%3D","updated":"2013-07-08 06:15:49.000000000","message":"version is used in V2 token provider. This interface is shared by all versions.","commit_id":"e78c333af1358500955f1762316b99698ee209c1"}],"keystone/token/providers/keystone_provider.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        return {\u0027id\u0027: domain_ref[\u0027id\u0027], \u0027name\u0027: domain_ref[\u0027name\u0027]}"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def _populate_scope(self, token_data, domain_id, project_id):"},{"line_number":53,"context_line":"        if \u0027domain\u0027 in token_data or \u0027project\u0027 in token_data:"},{"line_number":54,"context_line":"            return"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwtw%3D","line":53,"updated":"2013-06-21 21:56:50.000000000","message":"suggest add a comment why this method doesn\u0027t need to do anything in this case.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"21c39a2a4442afcf61163f40566d3b5c1bd2f93f","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if domain_id:"},{"line_number":57,"context_line":"            token_data[\u0027domain\u0027] \u003d self._get_filtered_domain(domain_id)"},{"line_number":58,"context_line":"        if project_id:"},{"line_number":59,"context_line":"            project_ref \u003d self.identity_api.get_project("},{"line_number":60,"context_line":"                self.context, project_id)"},{"line_number":61,"context_line":"            filtered_project \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw68%3D","line":58,"updated":"2013-06-21 19:52:41.000000000","message":"To make it consistent, this should have been re factored as\n_get_filtered_project","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85a9a50d79655c8627cf68f8608c7fff3cfe494e","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        if domain_id:"},{"line_number":57,"context_line":"            token_data[\u0027domain\u0027] \u003d self._get_filtered_domain(domain_id)"},{"line_number":58,"context_line":"        if project_id:"},{"line_number":59,"context_line":"            project_ref \u003d self.identity_api.get_project("},{"line_number":60,"context_line":"                self.context, project_id)"},{"line_number":61,"context_line":"            filtered_project \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw0Y%3D","line":58,"in_reply_to":"AAAAPn%2F%2Fw68%3D","updated":"2013-06-21 20:06:41.000000000","message":"good idea!","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"21c39a2a4442afcf61163f40566d3b5c1bd2f93f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            token_data[\u0027project\u0027] \u003d filtered_project"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _get_project_roles_for_user(self, user_id, project_id):"},{"line_number":69,"context_line":"        roles \u003d self.identity_api.get_roles_for_user_and_project("},{"line_number":70,"context_line":"            self.context, user_id, project_id)"},{"line_number":71,"context_line":"        roles_ref \u003d []"},{"line_number":72,"context_line":"        for role_id in roles:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw24%3D","line":69,"updated":"2013-06-21 19:52:41.000000000","message":"Just curious, is this going to be simple roles, inherited roles , or effective roles","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"85a9a50d79655c8627cf68f8608c7fff3cfe494e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            token_data[\u0027project\u0027] \u003d filtered_project"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _get_project_roles_for_user(self, user_id, project_id):"},{"line_number":69,"context_line":"        roles \u003d self.identity_api.get_roles_for_user_and_project("},{"line_number":70,"context_line":"            self.context, user_id, project_id)"},{"line_number":71,"context_line":"        roles_ref \u003d []"},{"line_number":72,"context_line":"        for role_id in roles:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fw0Q%3D","line":69,"in_reply_to":"AAAAPn%2F%2Fw24%3D","updated":"2013-06-21 20:06:41.000000000","message":"should be all the effective roles","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def _get_project_roles_for_user(self, user_id, project_id):"},{"line_number":69,"context_line":"        roles \u003d self.identity_api.get_roles_for_user_and_project("},{"line_number":70,"context_line":"            self.context, user_id, project_id)"},{"line_number":71,"context_line":"        roles_ref \u003d []"},{"line_number":72,"context_line":"        for role_id in roles:"},{"line_number":73,"context_line":"            role_ref \u003d self.identity_api.get_role(self.context, role_id)"},{"line_number":74,"context_line":"            role_ref.setdefault(\u0027project_id\u0027, project_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fws0%3D","line":71,"updated":"2013-06-21 21:56:50.000000000","message":"suggest change name of variable to role_refs","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            role_ref \u003d self.identity_api.get_role(self.context, role_id)"},{"line_number":74,"context_line":"            role_ref.setdefault(\u0027project_id\u0027, project_id)"},{"line_number":75,"context_line":"            roles_ref.append(role_ref)"},{"line_number":76,"context_line":"        # user have no project roles, therefore access denied"},{"line_number":77,"context_line":"        if len(roles_ref) \u003d\u003d 0:"},{"line_number":78,"context_line":"            msg \u003d _(\u0027User have no access to project\u0027)"},{"line_number":79,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwtA%3D","line":76,"updated":"2013-06-21 21:56:50.000000000","message":"change \"have\" to \"has\"","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            role_ref.setdefault(\u0027project_id\u0027, project_id)"},{"line_number":75,"context_line":"            roles_ref.append(role_ref)"},{"line_number":76,"context_line":"        # user have no project roles, therefore access denied"},{"line_number":77,"context_line":"        if len(roles_ref) \u003d\u003d 0:"},{"line_number":78,"context_line":"            msg \u003d _(\u0027User have no access to project\u0027)"},{"line_number":79,"context_line":"            LOG.debug(msg)"},{"line_number":80,"context_line":"            raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fws8%3D","line":77,"updated":"2013-06-21 21:56:50.000000000","message":"could use \"if not roles_ref\"\n\nalso, could move this test up to before line 71, and check for empty roles\n\nalso, I\u0027d prefer it if the caller enforced this, so move this check to the caller instead.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":75,"context_line":"            roles_ref.append(role_ref)"},{"line_number":76,"context_line":"        # user have no project roles, therefore access denied"},{"line_number":77,"context_line":"        if len(roles_ref) \u003d\u003d 0:"},{"line_number":78,"context_line":"            msg \u003d _(\u0027User have no access to project\u0027)"},{"line_number":79,"context_line":"            LOG.debug(msg)"},{"line_number":80,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":81,"context_line":"        return roles_ref"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwvg%3D","line":78,"updated":"2013-06-21 21:56:50.000000000","message":"suggest \"User %(user)s doesn\u0027t have access to project %(project)s\"","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":81,"context_line":"        return roles_ref"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _get_domain_roles_for_user(self, user_id, domain_id):"},{"line_number":84,"context_line":"        roles \u003d self.identity_api.get_roles_for_user_and_domain("},{"line_number":85,"context_line":"            self.context, user_id, domain_id)"},{"line_number":86,"context_line":"        roles_ref \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwr4%3D","line":83,"updated":"2013-06-21 21:56:50.000000000","message":"Similar comments here as had in _get_project_roles_for_user(), indicating that there\u0027s duplicated code.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":96,"context_line":"        return roles_ref"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _get_roles_for_user(self, user_id, domain_id, project_id):"},{"line_number":99,"context_line":"        roles \u003d []"},{"line_number":100,"context_line":"        if domain_id:"},{"line_number":101,"context_line":"            roles \u003d self._get_domain_roles_for_user(user_id, domain_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwrY%3D","line":98,"updated":"2013-06-21 21:56:50.000000000","message":"wondering if this method should assert that one of domain_id or project_id is not None.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _populate_user(self, token_data, user_id, domain_id, project_id,"},{"line_number":107,"context_line":"                       trust):"},{"line_number":108,"context_line":"        if \u0027user\u0027 in token_data:"},{"line_number":109,"context_line":"            return"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        user_ref \u003d self.identity_api.get_user(self.context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwrM%3D","line":108,"updated":"2013-06-21 21:56:50.000000000","message":"add a comment explaining why this method can do nothing  in this case.\n\nshould this be skipped in case need to set trust info?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                raise exception.Forbidden()"},{"line_number":118,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":119,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":120,"context_line":"            token_data[\u0027OS-TRUST:trust\u0027] \u003d ("},{"line_number":121,"context_line":"                {"},{"line_number":122,"context_line":"                    \u0027id\u0027: trust[\u0027id\u0027],"},{"line_number":123,"context_line":"                    \u0027trustor_user\u0027: {\u0027id\u0027: trust[\u0027trustor_user_id\u0027]},"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwps%3D","line":120,"updated":"2013-06-21 21:56:50.000000000","message":"should this have been skipped if \u0027OS-TRUST:trust\u0027 in token_data ?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _populate_roles(self, token_data, user_id, domain_id, project_id,"},{"line_number":134,"context_line":"                        trust):"},{"line_number":135,"context_line":"        if \u0027roles\u0027 in token_data:"},{"line_number":136,"context_line":"            return"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        if CONF.trust.enabled and trust:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwpg%3D","line":135,"updated":"2013-06-21 21:56:50.000000000","message":"add a comment explaining why this method can do nothing in this case.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            token_user_id \u003d trust[\u0027trustor_user_id\u0027]"},{"line_number":140,"context_line":"            token_project_id \u003d trust[\u0027project_id\u0027]"},{"line_number":141,"context_line":"            #trusts do not support domains yet"},{"line_number":142,"context_line":"            token_domain_id \u003d None"},{"line_number":143,"context_line":"        else:"},{"line_number":144,"context_line":"            token_user_id \u003d user_id"},{"line_number":145,"context_line":"            token_project_id \u003d project_id"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwpE%3D","line":142,"updated":"2013-06-21 21:56:50.000000000","message":"use the default domain?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            token_project_id \u003d project_id"},{"line_number":146,"context_line":"            token_domain_id \u003d domain_id"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        if token_domain_id or token_project_id:"},{"line_number":149,"context_line":"            roles \u003d self._get_roles_for_user(token_user_id,"},{"line_number":150,"context_line":"                                             token_domain_id,"},{"line_number":151,"context_line":"                                             token_project_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwow%3D","line":148,"updated":"2013-06-21 21:56:50.000000000","message":"suggest change to not (token_domain_id or token_project_id) and return right away so reviewers don\u0027t have to check for the else.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            if CONF.trust.enabled and trust:"},{"line_number":154,"context_line":"                for trust_role in trust[\u0027roles\u0027]:"},{"line_number":155,"context_line":"                    match_roles \u003d [x for x in roles"},{"line_number":156,"context_line":"                                   if x[\u0027id\u0027] \u003d\u003d trust_role[\u0027id\u0027]]"},{"line_number":157,"context_line":"                    if match_roles:"},{"line_number":158,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":159,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwoE%3D","line":156,"updated":"2013-06-21 21:56:50.000000000","message":"is this just looking to see if the user roles are match the trust roles? suggest move it into a function named so that it says what it\u0027s doing.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                for role in roles:"},{"line_number":163,"context_line":"                    filtered_roles.append({\u0027id\u0027: role[\u0027id\u0027],"},{"line_number":164,"context_line":"                                           \u0027name\u0027: role[\u0027name\u0027]})"},{"line_number":165,"context_line":"            token_data[\u0027roles\u0027] \u003d filtered_roles"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _populate_service_catalog(self, token_data, user_id,"},{"line_number":168,"context_line":"                                  domain_id, project_id, trust):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwoU%3D","line":165,"updated":"2013-06-21 21:56:50.000000000","message":"this seems like a good place to check that the user has no roles.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _populate_service_catalog(self, token_data, user_id,"},{"line_number":168,"context_line":"                                  domain_id, project_id, trust):"},{"line_number":169,"context_line":"        if \u0027catalog\u0027 in token_data:"},{"line_number":170,"context_line":"            return"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        if CONF.trust.enabled and trust:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwpc%3D","line":169,"updated":"2013-06-21 21:56:50.000000000","message":"add a comment explaining why this method can do nothing in this case.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        if project_id or domain_id:"},{"line_number":175,"context_line":"            try:"},{"line_number":176,"context_line":"                service_catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":177,"context_line":"                    self.context, user_id, project_id)"},{"line_number":178,"context_line":"            # TODO(ayoung): KVS backend needs a sample implementation"},{"line_number":179,"context_line":"            except exception.NotImplemented:"},{"line_number":180,"context_line":"                service_catalog \u003d {}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwn8%3D","line":177,"updated":"2013-06-21 21:56:50.000000000","message":"what does this do if project_id is None? Seems like it would generate a catalog that has None for any %(tenant_id)s. Just a comment to myself... not sure what this is supposed to do.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        # We\u0027ve probably already written these to the token"},{"line_number":200,"context_line":"        for x in (\u0027roles\u0027, \u0027user\u0027, \u0027catalog\u0027, \u0027project\u0027, \u0027domain\u0027):"},{"line_number":201,"context_line":"            if token and x in token:"},{"line_number":202,"context_line":"                token_data[x] \u003d token[x]"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        if CONF.trust.enabled and trust:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwvM%3D","line":201,"updated":"2013-06-21 21:56:50.000000000","message":"suggest move \"if token\" part outside of loop since it\u0027s not changing.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        self._populate_roles(token_data, user_id, domain_id, project_id, trust)"},{"line_number":211,"context_line":"        self._populate_service_catalog(token_data, user_id, domain_id,"},{"line_number":212,"context_line":"                                       project_id, trust)"},{"line_number":213,"context_line":"        self._populate_token(token_data, expires, trust)"},{"line_number":214,"context_line":"        return {\u0027token\u0027: token_data}"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwvE%3D","line":213,"updated":"2013-06-21 21:56:50.000000000","message":"suggest use named arguments for named parameters, in case someone changes the order.\n\n self._populate_token(token_data, expires\u003dexpires, trust\u003dtrust)","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                        expires_at\u003dNone,"},{"line_number":254,"context_line":"                        project_id\u003dNone, domain_id\u003dNone,"},{"line_number":255,"context_line":"                        auth_context\u003dNone, **kwargs):"},{"line_number":256,"context_line":"        token_data_helper \u003d V3TokenDataHelper(None)"},{"line_number":257,"context_line":"        trust \u003d kwargs.get(\u0027trust\u0027)"},{"line_number":258,"context_line":"        metadata_ref \u003d kwargs.get(\u0027metadata_ref\u0027)"},{"line_number":259,"context_line":"        #FIXME(gyee): for V2, trust is stashed in metadata_ref"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwl4%3D","line":256,"updated":"2013-06-21 21:56:50.000000000","message":"provide a name for the None argument so reviewers know what it is.\n\n context \u003d None\n token_data_helper \u003d V3TokenDataHelper(context)","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        token_data_helper \u003d V3TokenDataHelper(None)"},{"line_number":257,"context_line":"        trust \u003d kwargs.get(\u0027trust\u0027)"},{"line_number":258,"context_line":"        metadata_ref \u003d kwargs.get(\u0027metadata_ref\u0027)"},{"line_number":259,"context_line":"        #FIXME(gyee): for V2, trust is stashed in metadata_ref"},{"line_number":260,"context_line":"        if not trust and metadata_ref and \u0027trust_id\u0027 in metadata_ref:"},{"line_number":261,"context_line":"            trust \u003d self.trust_api.get_trust(None, metadata_ref[\u0027trust_id\u0027])"},{"line_number":262,"context_line":"        token_data \u003d token_data_helper.get_token_data("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwmo%3D","line":259,"updated":"2013-06-21 21:56:50.000000000","message":"Should take care of FIXMEs in new code.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        metadata_ref \u003d kwargs.get(\u0027metadata_ref\u0027)"},{"line_number":259,"context_line":"        #FIXME(gyee): for V2, trust is stashed in metadata_ref"},{"line_number":260,"context_line":"        if not trust and metadata_ref and \u0027trust_id\u0027 in metadata_ref:"},{"line_number":261,"context_line":"            trust \u003d self.trust_api.get_trust(None, metadata_ref[\u0027trust_id\u0027])"},{"line_number":262,"context_line":"        token_data \u003d token_data_helper.get_token_data("},{"line_number":263,"context_line":"            user_id,"},{"line_number":264,"context_line":"            method_names,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwls%3D","line":261,"updated":"2013-06-21 21:56:50.000000000","message":"should ensure CONF.trust.enabled before calling this, otherwise would get an error.\n\nAlso, provide the name of the None parameter so I don\u0027t have to go looking for it.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                        metadata\u003dmetadata_ref,"},{"line_number":295,"context_line":"                        token_data\u003dtoken_data,"},{"line_number":296,"context_line":"                        trust_id\u003dtrust[\u0027id\u0027] if trust else None)"},{"line_number":297,"context_line":"            self.token_api.create_token(None, token_id, data)"},{"line_number":298,"context_line":"        except Exception as e:"},{"line_number":299,"context_line":"            LOG.exception(_(\u0027Failed to issue V3 token\u0027))"},{"line_number":300,"context_line":"            # an identical token may have been created already."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwlY%3D","line":297,"updated":"2013-06-21 21:56:50.000000000","message":"Provide a name for the None parameter.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":296,"context_line":"                        trust_id\u003dtrust[\u0027id\u0027] if trust else None)"},{"line_number":297,"context_line":"            self.token_api.create_token(None, token_id, data)"},{"line_number":298,"context_line":"        except Exception as e:"},{"line_number":299,"context_line":"            LOG.exception(_(\u0027Failed to issue V3 token\u0027))"},{"line_number":300,"context_line":"            # an identical token may have been created already."},{"line_number":301,"context_line":"            # if so, return the token_data as it is also identical"},{"line_number":302,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwlQ%3D","line":299,"updated":"2013-06-21 21:56:50.000000000","message":"should an exception be logged if it\u0027s not really an error?","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":300,"context_line":"            # an identical token may have been created already."},{"line_number":301,"context_line":"            # if so, return the token_data as it is also identical"},{"line_number":302,"context_line":"            try:"},{"line_number":303,"context_line":"                self.token_api.get_token(None,"},{"line_number":304,"context_line":"                                         token_id\u003dtoken_id)"},{"line_number":305,"context_line":"            except exception.TokenNotFound:"},{"line_number":306,"context_line":"                raise e"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwlU%3D","line":303,"updated":"2013-06-21 21:56:50.000000000","message":"provide a name for the None parameter","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                self.token_api.get_token(None,"},{"line_number":304,"context_line":"                                         token_id\u003dtoken_id)"},{"line_number":305,"context_line":"            except exception.TokenNotFound:"},{"line_number":306,"context_line":"                raise e"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        return (token_id, token_data)"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwk4%3D","line":306,"updated":"2013-06-21 21:56:50.000000000","message":"see https://review.openstack.org/#/c/33614/","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    def issue_token(self, user_id, method_names, version\u003d\u0027v3.0\u0027,"},{"line_number":311,"context_line":"                    expires_at\u003dNone,"},{"line_number":312,"context_line":"                    project_id\u003dNone, domain_id\u003dNone,"},{"line_number":313,"context_line":"                    auth_context\u003dNone, **kwargs):"},{"line_number":314,"context_line":"        if version \u003d\u003d token_provider.V3:"},{"line_number":315,"context_line":"            return self._issue_v3_token(user_id, method_names,"},{"line_number":316,"context_line":"                                        expires_at\u003dexpires_at,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwk0%3D","line":313,"updated":"2013-06-21 21:56:50.000000000","message":"suggest remove all but version and use **kwargs for the rest, since this fn doesn\u0027t use expires_at etc, just passes it on.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                project_ref \u003d token_ref.get(\u0027tenant\u0027)"},{"line_number":351,"context_line":"                if project_ref:"},{"line_number":352,"context_line":"                    project_id \u003d project_ref[\u0027id\u0027]"},{"line_number":353,"context_line":"                token_data_helper \u003d V3TokenDataHelper(None)"},{"line_number":354,"context_line":"                token_data \u003d token_data_helper.get_token_data("},{"line_number":355,"context_line":"                    user_id\u003dtoken_ref[\u0027user\u0027][\u0027id\u0027],"},{"line_number":356,"context_line":"                    method_names\u003d[\u0027password\u0027, \u0027token\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Fwkc%3D","line":353,"updated":"2013-06-21 21:56:50.000000000","message":"Give a name to the None paratmeter.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                    domain_id\u003dNone,"},{"line_number":359,"context_line":"                    project_id\u003dproject_id,"},{"line_number":360,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027],"},{"line_number":361,"context_line":"                    trust\u003dNone)"},{"line_number":362,"context_line":"            return token_data"},{"line_number":363,"context_line":"        except Exception as e:"},{"line_number":364,"context_line":"            LOG.exception(_(\u0027Failed to validate token\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwkY%3D","line":361,"updated":"2013-06-21 21:56:50.000000000","message":"there\u0027s a mismatch between the parameters that are kwargs and those that aren\u0027t, also if the kwarg has the same default then leave it out.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c37930604fe85ac265b00b43d78e2f8401e26e15","unresolved":false,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    def check_token(self, token_id, belongs_to\u003dNone, **kwargs):"},{"line_number":376,"context_line":"        try:"},{"line_number":377,"context_line":"            self._verify_token(token_id, belongs_to)"},{"line_number":378,"context_line":"        except Exception as e:"},{"line_number":379,"context_line":"            LOG.exception(_(\u0027Failed to verify token\u0027))"},{"line_number":380,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FwkU%3D","line":377,"updated":"2013-06-21 21:56:50.000000000","message":"use a named argument for named parameter (belongs_to\u003dbelongs_to) in case someone changes the arguments.","commit_id":"914b7a06cacaf86c96cdce3554ce62c39d9bb047"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        roles_ref \u003d []"},{"line_number":86,"context_line":"        for role_id in roles:"},{"line_number":87,"context_line":"            role_ref \u003d self.identity_api.get_role(self.context, role_id)"},{"line_number":88,"context_line":"            role_ref.setdefault(\u0027domain_id\u0027, domain_id)"},{"line_number":89,"context_line":"            roles_ref.append(role_ref)"},{"line_number":90,"context_line":"        return roles_ref"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvwo%3D","line":88,"updated":"2013-06-22 23:10:55.000000000","message":"Where is  role_ref.setdefault(\"domainId\" ... ) used?  I don\u0027t see it used anywhere in code","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"27eae183655790622dcf2314942d6d5ba3fa0462","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        roles_ref \u003d []"},{"line_number":86,"context_line":"        for role_id in roles:"},{"line_number":87,"context_line":"            role_ref \u003d self.identity_api.get_role(self.context, role_id)"},{"line_number":88,"context_line":"            role_ref.setdefault(\u0027domain_id\u0027, domain_id)"},{"line_number":89,"context_line":"            roles_ref.append(role_ref)"},{"line_number":90,"context_line":"        return roles_ref"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvbY%3D","line":88,"in_reply_to":"AAAAPn%2F%2Fvqw%3D","updated":"2013-06-23 15:36:33.000000000","message":"Look at line 158, you are just using id and name, Also what is the naming convention used here?  roles , roles_ref.\n\nThe same comment is also applicable to _get_project_roles_for_user","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        roles_ref \u003d []"},{"line_number":86,"context_line":"        for role_id in roles:"},{"line_number":87,"context_line":"            role_ref \u003d self.identity_api.get_role(self.context, role_id)"},{"line_number":88,"context_line":"            role_ref.setdefault(\u0027domain_id\u0027, domain_id)"},{"line_number":89,"context_line":"            roles_ref.append(role_ref)"},{"line_number":90,"context_line":"        return roles_ref"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvqw%3D","line":88,"in_reply_to":"AAAAPn%2F%2Fvwo%3D","updated":"2013-06-23 04:10:16.000000000","message":"for domain-scoped tokens, domain-assigned roles have domain_id in them. See V3 spec.","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"eeb6909efe051727cd632470b680ada2a56aed1e","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                token_data_helper \u003d V3TokenDataHelper(context)"},{"line_number":369,"context_line":"                token_data \u003d token_data_helper.get_token_data("},{"line_number":370,"context_line":"                    token_ref[\u0027user\u0027][\u0027id\u0027],"},{"line_number":371,"context_line":"                    [\u0027password\u0027, \u0027token\u0027],"},{"line_number":372,"context_line":"                    {},"},{"line_number":373,"context_line":"                    project_id\u003dproject_id,"},{"line_number":374,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvwk%3D","line":371,"updated":"2013-06-22 23:10:55.000000000","message":"Why are we passing the method names [ password, token]","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"27eae183655790622dcf2314942d6d5ba3fa0462","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                token_data_helper \u003d V3TokenDataHelper(context)"},{"line_number":369,"context_line":"                token_data \u003d token_data_helper.get_token_data("},{"line_number":370,"context_line":"                    token_ref[\u0027user\u0027][\u0027id\u0027],"},{"line_number":371,"context_line":"                    [\u0027password\u0027, \u0027token\u0027],"},{"line_number":372,"context_line":"                    {},"},{"line_number":373,"context_line":"                    project_id\u003dproject_id,"},{"line_number":374,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FvbE%3D","line":371,"in_reply_to":"AAAAPn%2F%2Fvq0%3D","updated":"2013-06-23 15:36:33.000000000","message":"My question is more towards, don\u0027t we want to have some where \"allowed methods\" and use that every where, instead of hardcoding.\n\nWhat will have happen if you add a new method \"accessKey\" , \"myCustomMethod\"?\n\nRemember, this is plug-in architecture. If you add a new plug-in you don\u0027t want to change the provider code","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cdf5cc9b053a66954df47f988054d5c7757b8009","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                token_data_helper \u003d V3TokenDataHelper(context)"},{"line_number":369,"context_line":"                token_data \u003d token_data_helper.get_token_data("},{"line_number":370,"context_line":"                    token_ref[\u0027user\u0027][\u0027id\u0027],"},{"line_number":371,"context_line":"                    [\u0027password\u0027, \u0027token\u0027],"},{"line_number":372,"context_line":"                    {},"},{"line_number":373,"context_line":"                    project_id\u003dproject_id,"},{"line_number":374,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fvq0%3D","line":371,"in_reply_to":"AAAAPn%2F%2Fvwk%3D","updated":"2013-06-23 04:10:16.000000000","message":"because we are reconstructing V3 token from V2 data. Only password and token methods are supported in V2 and we can tell the difference from V2 data itself.","commit_id":"7a30816eedd79671fa9d4fd2bc812a3baa1a3563"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"eecc0d5175dd4b44f6121f2c74205dc613e24f5d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            if CONF.trust.enabled and trust:"},{"line_number":133,"context_line":"                for trust_role in trust[\u0027roles\u0027]:"},{"line_number":134,"context_line":"                    match_roles \u003d [x for x in roles"},{"line_number":135,"context_line":"                                   if x[\u0027id\u0027] \u003d\u003d trust_role[\u0027id\u0027]]"},{"line_number":136,"context_line":"                    if match_roles:"},{"line_number":137,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":138,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtK0%3D","line":135,"updated":"2013-06-24 21:25:50.000000000","message":"Can we use a name to represent a variable x may be role","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e59d6d31c1574aff82263abf3d10252dd80600f3","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            if CONF.trust.enabled and trust:"},{"line_number":133,"context_line":"                for trust_role in trust[\u0027roles\u0027]:"},{"line_number":134,"context_line":"                    match_roles \u003d [x for x in roles"},{"line_number":135,"context_line":"                                   if x[\u0027id\u0027] \u003d\u003d trust_role[\u0027id\u0027]]"},{"line_number":136,"context_line":"                    if match_roles:"},{"line_number":137,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":138,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtE0%3D","line":135,"in_reply_to":"AAAAPn%2F%2FtK0%3D","updated":"2013-06-24 21:46:49.000000000","message":"I would rather not touch the trust functionality here. If necessary, it needs to be done in a separate patch.","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"eecc0d5175dd4b44f6121f2c74205dc613e24f5d","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        if token:"},{"line_number":193,"context_line":"            for x in (\u0027roles\u0027, \u0027user\u0027, \u0027catalog\u0027, \u0027project\u0027, \u0027domain\u0027):"},{"line_number":194,"context_line":"                if x in token:"},{"line_number":195,"context_line":"                    token_data[x] \u003d token[x]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        if CONF.trust.enabled and trust:"},{"line_number":198,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtKQ%3D","line":195,"updated":"2013-06-24 21:25:50.000000000","message":"can we give a name to x may be key?","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e59d6d31c1574aff82263abf3d10252dd80600f3","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        if token:"},{"line_number":193,"context_line":"            for x in (\u0027roles\u0027, \u0027user\u0027, \u0027catalog\u0027, \u0027project\u0027, \u0027domain\u0027):"},{"line_number":194,"context_line":"                if x in token:"},{"line_number":195,"context_line":"                    token_data[x] \u003d token[x]"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        if CONF.trust.enabled and trust:"},{"line_number":198,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtEo%3D","line":195,"in_reply_to":"AAAAPn%2F%2FtKQ%3D","updated":"2013-06-24 21:46:49.000000000","message":"code is pretty self-explanatory","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"718fa4ab269eb931e7dbcda074580973f92ba6f0","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                        domain_id\u003ddomain_id,"},{"line_number":315,"context_line":"                                        auth_context\u003dauth_context,"},{"line_number":316,"context_line":"                                        **kwargs)"},{"line_number":317,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def _verify_token(self, token_id, belongs_to\u003dNone):"},{"line_number":320,"context_line":"        \"\"\"Verify the given token and return the token_ref.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fspo%3D","line":317,"updated":"2013-06-25 00:36:06.000000000","message":"How v2 call is supported here? Is it going to return token response in v3 or v2 format for v2 create token request?","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ccac46692eee4167f87b8ffaa27bd9c16566e826","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                                        domain_id\u003ddomain_id,"},{"line_number":315,"context_line":"                                        auth_context\u003dauth_context,"},{"line_number":316,"context_line":"                                        **kwargs)"},{"line_number":317,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def _verify_token(self, token_id, belongs_to\u003dNone):"},{"line_number":320,"context_line":"        \"\"\"Verify the given token and return the token_ref.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FsoY%3D","line":317,"in_reply_to":"AAAAPn%2F%2Fspo%3D","updated":"2013-06-25 00:43:15.000000000","message":"V2 token provider will be implemented in a separate patch","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"eecc0d5175dd4b44f6121f2c74205dc613e24f5d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        \"\"\"Verify the given token and return the token_ref.\"\"\""},{"line_number":321,"context_line":"        token_ref \u003d self.token_api.get_token(None,"},{"line_number":322,"context_line":"                                             token_id\u003dtoken_id)"},{"line_number":323,"context_line":"        assert token_ref"},{"line_number":324,"context_line":"        if belongs_to:"},{"line_number":325,"context_line":"            assert token_ref[\u0027tenant\u0027][\u0027id\u0027] \u003d\u003d belongs_to"},{"line_number":326,"context_line":"        return token_ref"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtJE%3D","line":323,"updated":"2013-06-24 21:25:50.000000000","message":"is it work validating the token version? V3.0 or something else?","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e59d6d31c1574aff82263abf3d10252dd80600f3","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        \"\"\"Verify the given token and return the token_ref.\"\"\""},{"line_number":321,"context_line":"        token_ref \u003d self.token_api.get_token(None,"},{"line_number":322,"context_line":"                                             token_id\u003dtoken_id)"},{"line_number":323,"context_line":"        assert token_ref"},{"line_number":324,"context_line":"        if belongs_to:"},{"line_number":325,"context_line":"            assert token_ref[\u0027tenant\u0027][\u0027id\u0027] \u003d\u003d belongs_to"},{"line_number":326,"context_line":"        return token_ref"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FtEU%3D","line":323,"in_reply_to":"AAAAPn%2F%2FtJE%3D","updated":"2013-06-24 21:46:49.000000000","message":"token_ref is used by both v2 and v3","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1091,"name":"Arun Kant","email":"arukant@cisco.com","username":"arunkant-uws"},"change_message_id":"718fa4ab269eb931e7dbcda074580973f92ba6f0","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            # their own implementation to suit their needs."},{"line_number":342,"context_line":"            token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":343,"context_line":"            if not token_data or \u0027token\u0027 not in token_data:"},{"line_number":344,"context_line":"                # token ref is created by V2 API"},{"line_number":345,"context_line":"                project_id \u003d None"},{"line_number":346,"context_line":"                project_ref \u003d token_ref.get(\u0027tenant\u0027)"},{"line_number":347,"context_line":"                if project_ref:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fso0%3D","line":344,"updated":"2013-06-25 00:36:06.000000000","message":"In case of v2 token, looks like cached token strategy is not used as its populating token again. Why is it different from v3 as this will make v2 validate token relatively expensive?","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ccac46692eee4167f87b8ffaa27bd9c16566e826","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            # their own implementation to suit their needs."},{"line_number":342,"context_line":"            token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":343,"context_line":"            if not token_data or \u0027token\u0027 not in token_data:"},{"line_number":344,"context_line":"                # token ref is created by V2 API"},{"line_number":345,"context_line":"                project_id \u003d None"},{"line_number":346,"context_line":"                project_ref \u003d token_ref.get(\u0027tenant\u0027)"},{"line_number":347,"context_line":"                if project_ref:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FsoU%3D","line":344,"in_reply_to":"AAAAPn%2F%2Fso0%3D","updated":"2013-06-25 00:43:15.000000000","message":"token data was never cached by v2. V2 implementation only cache some data in token_ref. But we can certainly revisit that issue in a separate patch. I am all for caching v2 token data as well.","commit_id":"8e5ba07ec1e0158b724139ab1fde98758c6d41b7"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","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 2013 OpenStack LLC"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpOk%3D","line":1,"updated":"2013-06-26 02:44:58.000000000","message":"rename this file keystone if you can.  You might need to do: \n\nfrom __future__ import absolute_import","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","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 2013 OpenStack LLC"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmhw%3D","line":1,"in_reply_to":"AAAAPn%2F%2FpOk%3D","updated":"2013-06-26 22:29:15.000000000","message":"good idea!","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _populate_user(self, token_data, user_id, domain_id, project_id,"},{"line_number":84,"context_line":"                       trust):"},{"line_number":85,"context_line":"        if \u0027user\u0027 in token_data:"},{"line_number":86,"context_line":"            # no need to repopulae user if it already exist"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        user_ref \u003d self.identity_api.get_user(self.context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpQs%3D","line":86,"updated":"2013-06-26 02:44:58.000000000","message":"nit: 2 typos.  repopulae  -\u003e repopulate\nexist -\u003e exists","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _populate_user(self, token_data, user_id, domain_id, project_id,"},{"line_number":84,"context_line":"                       trust):"},{"line_number":85,"context_line":"        if \u0027user\u0027 in token_data:"},{"line_number":86,"context_line":"            # no need to repopulae user if it already exist"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        user_ref \u003d self.identity_api.get_user(self.context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmhg%3D","line":86,"in_reply_to":"AAAAPn%2F%2FpQs%3D","updated":"2013-06-26 22:29:15.000000000","message":"nice catch!","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # TODO(ayoung): Enforce Endpoints for trust"},{"line_number":175,"context_line":"            token_data[\u0027catalog\u0027] \u003d service_catalog"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _populate_token(self, token_data, expires\u003dNone, trust\u003dNone):"},{"line_number":178,"context_line":"        if not expires:"},{"line_number":179,"context_line":"            expires \u003d token.default_expire_time()"},{"line_number":180,"context_line":"        if not isinstance(expires, basestring):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpPk%3D","line":177,"updated":"2013-06-26 02:44:58.000000000","message":"Probably misnamed.  populate_token_times?","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # TODO(ayoung): Enforce Endpoints for trust"},{"line_number":175,"context_line":"            token_data[\u0027catalog\u0027] \u003d service_catalog"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _populate_token(self, token_data, expires\u003dNone, trust\u003dNone):"},{"line_number":178,"context_line":"        if not expires:"},{"line_number":179,"context_line":"            expires \u003d token.default_expire_time()"},{"line_number":180,"context_line":"        if not isinstance(expires, basestring):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmhQ%3D","line":177,"in_reply_to":"AAAAPn%2F%2FpPk%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":199,"context_line":"                raise exception.Forbidden()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"},{"line_number":202,"context_line":"        self._populate_user(token_data, user_id, domain_id, project_id, trust)"},{"line_number":203,"context_line":"        self._populate_roles(token_data, user_id, domain_id, project_id, trust)"},{"line_number":204,"context_line":"        self._populate_service_catalog(token_data, user_id, domain_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpPs%3D","line":201,"updated":"2013-06-26 02:44:58.000000000","message":"I am not sure that these should be _ functions.  It seems to me that a template pattern is in effect here, and someone overriding the provider should plan on overriding one of these methods.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":198,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":199,"context_line":"                raise exception.Forbidden()"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"},{"line_number":202,"context_line":"        self._populate_user(token_data, user_id, domain_id, project_id, trust)"},{"line_number":203,"context_line":"        self._populate_roles(token_data, user_id, domain_id, project_id, trust)"},{"line_number":204,"context_line":"        self._populate_service_catalog(token_data, user_id, domain_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmhE%3D","line":201,"in_reply_to":"AAAAPn%2F%2FpPs%3D","updated":"2013-06-26 22:29:15.000000000","message":"you can override _ functions I think.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":226,"context_line":"        # TODO(gyee): would it be nice if we can tell the token version from"},{"line_number":227,"context_line":"        # the token_id?"},{"line_number":228,"context_line":"        if CONF.signing.token_format \u003d\u003d \u0027UUID\u0027:"},{"line_number":229,"context_line":"            token_id \u003d uuid.uuid4().hex"},{"line_number":230,"context_line":"        elif CONF.signing.token_format \u003d\u003d \u0027PKI\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpP8%3D","line":227,"updated":"2013-06-26 02:44:58.000000000","message":"We can.  If we get the full token, and not the hash of it, the token ID starts with MII.  So use: https://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/common/cms.py#L78\n\nOf course, we have a duplicated version in Keystone/common/cms.py due to how we run our unit tests.  We need to fix that, but not in this patch.  \n\nI don;\u0027t think that applies here, though.  So please remove this comment.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":226,"context_line":"        # TODO(gyee): would it be nice if we can tell the token version from"},{"line_number":227,"context_line":"        # the token_id?"},{"line_number":228,"context_line":"        if CONF.signing.token_format \u003d\u003d \u0027UUID\u0027:"},{"line_number":229,"context_line":"            token_id \u003d uuid.uuid4().hex"},{"line_number":230,"context_line":"        elif CONF.signing.token_format \u003d\u003d \u0027PKI\u0027:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmhA%3D","line":227,"in_reply_to":"AAAAPn%2F%2FpP8%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        token_data_helper \u003d V3TokenDataHelper(context)"},{"line_number":255,"context_line":"        trust \u003d kwargs.get(\u0027trust\u0027)"},{"line_number":256,"context_line":"        metadata_ref \u003d kwargs.get(\u0027metadata_ref\u0027)"},{"line_number":257,"context_line":"        #FIXME(gyee): for V2, trust is stashed in metadata_ref"},{"line_number":258,"context_line":"        if (CONF.trust.enabled and not trust and metadata_ref and"},{"line_number":259,"context_line":"                \u0027trust_id\u0027 in metadata_ref):"},{"line_number":260,"context_line":"            trust \u003d self.trust_api.get_trust(context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpQE%3D","line":257,"updated":"2013-06-26 02:44:58.000000000","message":"Not going to be changes.  Leave the comment, but remove the FIXME","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        token_data_helper \u003d V3TokenDataHelper(context)"},{"line_number":255,"context_line":"        trust \u003d kwargs.get(\u0027trust\u0027)"},{"line_number":256,"context_line":"        metadata_ref \u003d kwargs.get(\u0027metadata_ref\u0027)"},{"line_number":257,"context_line":"        #FIXME(gyee): for V2, trust is stashed in metadata_ref"},{"line_number":258,"context_line":"        if (CONF.trust.enabled and not trust and metadata_ref and"},{"line_number":259,"context_line":"                \u0027trust_id\u0027 in metadata_ref):"},{"line_number":260,"context_line":"            trust \u003d self.trust_api.get_trust(context,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmg4%3D","line":257,"in_reply_to":"AAAAPn%2F%2FpQE%3D","updated":"2013-06-26 22:29:15.000000000","message":"k","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    def _validate_v3_token(self, token_id, belongs_to\u003dNone, **kwargs):"},{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            token_ref \u003d self._verify_token(token_id, belongs_to)"},{"line_number":329,"context_line":"            # FIXME(gyee): performance or correctness? Should we return the"},{"line_number":330,"context_line":"            # cached token or reconstruct it? Obviously if we are going with"},{"line_number":331,"context_line":"            # the cached token, any role, project, or domain name changes"},{"line_number":332,"context_line":"            # will not be reflected. One may argue that with PKI tokens,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpQY%3D","line":329,"updated":"2013-06-26 02:44:58.000000000","message":"Correctness should be that the token is stored in the database.  A different provider could implement a different strategy.  So, I think this fixme can go away, and instead should clearly state:  \n\nWe have the rule that revocation events removes the token.  If a token is in the backing store, it is still valid.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    def _validate_v3_token(self, token_id, belongs_to\u003dNone, **kwargs):"},{"line_number":327,"context_line":"        try:"},{"line_number":328,"context_line":"            token_ref \u003d self._verify_token(token_id, belongs_to)"},{"line_number":329,"context_line":"            # FIXME(gyee): performance or correctness? Should we return the"},{"line_number":330,"context_line":"            # cached token or reconstruct it? Obviously if we are going with"},{"line_number":331,"context_line":"            # the cached token, any role, project, or domain name changes"},{"line_number":332,"context_line":"            # will not be reflected. One may argue that with PKI tokens,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2Fmgc%3D","line":329,"in_reply_to":"AAAAPn%2F%2FpQY%3D","updated":"2013-06-26 22:29:15.000000000","message":"Right, but role name or project name changes does invalidate the token. That\u0027s what I was trying to convey.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7970f0586dcd161657456d711b1e09242d87a06a","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                                           **kwargs)"},{"line_number":364,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def check_token(self, token_id, belongs_to\u003dNone, version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":367,"context_line":"        try:"},{"line_number":368,"context_line":"            self._verify_token(token_id, belongs_to\u003dbelongs_to)"},{"line_number":369,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FpQM%3D","line":366,"updated":"2013-06-26 02:44:58.000000000","message":"There really should be a better set of names  to distinguish between validate and check.  I know what you mean, and I find it confusing.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a1599fac7bd8f838612e267398e472ba4a03b2a5","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                                           **kwargs)"},{"line_number":364,"context_line":"        raise token_provider.UnsupportedTokenVersionException"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def check_token(self, token_id, belongs_to\u003dNone, version\u003d\u0027v3.0\u0027, **kwargs):"},{"line_number":367,"context_line":"        try:"},{"line_number":368,"context_line":"            self._verify_token(token_id, belongs_to\u003dbelongs_to)"},{"line_number":369,"context_line":"        except Exception as e:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2FmgM%3D","line":366,"in_reply_to":"AAAAPn%2F%2FpQM%3D","updated":"2013-06-26 22:29:15.000000000","message":"I was following the same naming convention as before. Check token does not return token data.","commit_id":"a607df33adb4d75572c986f3b9183f0099605975"}],"keystone/token/providers/pki.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"0176d6ebd2b6a2058a921070eb29fee89df98c44","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Provider(uuid.Provider):"},{"line_number":35,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            token_id \u003d cms.cms_sign_token(json.dumps(token_data),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F3N4%3D","line":34,"updated":"2013-07-10 07:49:42.000000000","message":"I\u0027ve been overruled before on this but this is ugly. In no OO sense is a PKI token a refinement or subclass of a uuid token. They should either share a base class or share util functions.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Provider(uuid.Provider):"},{"line_number":35,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            token_id \u003d cms.cms_sign_token(json.dumps(token_data),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1Vw%3D","line":34,"in_reply_to":"AAAAP3%2F%2F1k0%3D","updated":"2013-07-10 17:35:32.000000000","message":"so both UUID and PKI provider extend the same abstract class only to override _get_token_id()? Not sure what we gain by doing that.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"77de3a62010c64e7e70379e5389fb118f4a35216","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Provider(uuid.Provider):"},{"line_number":35,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            token_id \u003d cms.cms_sign_token(json.dumps(token_data),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1lg%3D","line":34,"in_reply_to":"AAAAP3%2F%2F1q4%3D","updated":"2013-07-10 16:24:42.000000000","message":"I\u0027m actually OK with this just due to the historical precedent.  UUID vs PKI is not a great naming convention anyway, and so what we really have here is \"primary key\"  versus \"signed document\"  but the \"signed docuemtn\" approach uses the primary key approach.  and extends it with PKI document signing.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Provider(uuid.Provider):"},{"line_number":35,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            token_id \u003d cms.cms_sign_token(json.dumps(token_data),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1k0%3D","line":34,"in_reply_to":"AAAAP3%2F%2F1q4%3D","updated":"2013-07-10 17:09:25.000000000","message":"then have them extend the same abstract base class","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2b55b0986de139952f1dfd9c87090f7f9fb4f313","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class Provider(uuid.Provider):"},{"line_number":35,"context_line":"    def _get_token_id(self, token_data):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            token_id \u003d cms.cms_sign_token(json.dumps(token_data),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1q4%3D","line":34,"in_reply_to":"AAAAP3%2F%2F3N4%3D","updated":"2013-07-10 16:10:23.000000000","message":"Only difference between a PKI and UUID token is the way the token ID is generated. Therefore it make sense to have PKI provider subclass UUID class. UUID is a base class.\n\nV3TokenDataHelper is the utility class to put together the token data prior to signing. To make it easier for you, I\u0027ll move the V3TokenDataHelper to __init__() so you can extend it to add the Kerberos data.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"}],"keystone/token/providers/uuid.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"@dependency.requires(\u0027token_api\u0027, \u0027identity_api\u0027)"},{"line_number":206,"context_line":"class Provider(token_provider.Driver):"},{"line_number":207,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":208,"context_line":"        super(Provider, self).__init__(*args, **kwargs)"},{"line_number":209,"context_line":"        if CONF.trust.enabled:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1lA%3D","line":206,"updated":"2013-07-10 17:09:25.000000000","message":"why is a \"provider\" a \"driver\"?","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"@dependency.requires(\u0027token_api\u0027, \u0027identity_api\u0027)"},{"line_number":206,"context_line":"class Provider(token_provider.Driver):"},{"line_number":207,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":208,"context_line":"        super(Provider, self).__init__(*args, **kwargs)"},{"line_number":209,"context_line":"        if CONF.trust.enabled:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1Vg%3D","line":206,"in_reply_to":"AAAAP3%2F%2F1lA%3D","updated":"2013-07-10 17:35:32.000000000","message":"because it is using the same driver mechanism","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Keystone UUID Token Provider\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from __future__ import absolute_import"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx4w%3D","line":19,"updated":"2013-07-11 15:44:57.000000000","message":".. why?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Keystone UUID Token Provider\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from __future__ import absolute_import"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxbE%3D","line":19,"in_reply_to":"AAAAP3%2F%2Fx4w%3D","updated":"2013-07-11 17:54:01.000000000","message":"to avoid name clashing. see line 22 \"import uuid\"","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Keystone UUID Token Provider\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from __future__ import absolute_import"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import sys"},{"line_number":22,"context_line":"import uuid"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw3k%3D","line":19,"in_reply_to":"AAAAP3%2F%2FxbE%3D","updated":"2013-07-11 19:59:04.000000000","message":"it tries to implicitly import itself, otherwise? happy to keep it, i just didn\u0027t see a reason for it at first glance","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":88,"context_line":"                                trust[\u0027trustor_user_id\u0027]))"},{"line_number":89,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"},{"line_number":90,"context_line":"                raise exception.Forbidden()"},{"line_number":91,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":92,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":93,"context_line":"            token_data[\u0027OS-TRUST:trust\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx4c%3D","line":90,"updated":"2013-07-11 15:44:57.000000000","message":"it\u0027s okay (and desirable) to include a message explaining why the forbidden is being raised. it\u0027ll only be exposed to the API if keystone is running in debug mode\n\n  raise exception.Forbidden(_(\u0027Trustor is disabled.\u0027))","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            trustor_user_ref \u003d (self.identity_api.get_user("},{"line_number":88,"context_line":"                                trust[\u0027trustor_user_id\u0027]))"},{"line_number":89,"context_line":"            if not trustor_user_ref[\u0027enabled\u0027]:"},{"line_number":90,"context_line":"                raise exception.Forbidden()"},{"line_number":91,"context_line":"            if trust[\u0027impersonation\u0027]:"},{"line_number":92,"context_line":"                user_ref \u003d trustor_user_ref"},{"line_number":93,"context_line":"            token_data[\u0027OS-TRUST:trust\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fxa4%3D","line":90,"in_reply_to":"AAAAP3%2F%2Fx4c%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    if match_roles:"},{"line_number":132,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":133,"context_line":"                    else:"},{"line_number":134,"context_line":"                        raise exception.Forbidden()"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                for role in roles:"},{"line_number":137,"context_line":"                    filtered_roles.append({\u0027id\u0027: role[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx4U%3D","line":134,"updated":"2013-07-11 15:44:57.000000000","message":"see above","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                    if match_roles:"},{"line_number":132,"context_line":"                        filtered_roles.append(match_roles[0])"},{"line_number":133,"context_line":"                    else:"},{"line_number":134,"context_line":"                        raise exception.Forbidden()"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                for role in roles:"},{"line_number":137,"context_line":"                    filtered_roles.append({\u0027id\u0027: role[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZ8%3D","line":134,"in_reply_to":"AAAAP3%2F%2Fx4U%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # user has no project or domain roles, therefore access denied"},{"line_number":141,"context_line":"            if not filtered_roles:"},{"line_number":142,"context_line":"                if token_project_id:"},{"line_number":143,"context_line":"                    msg \u003d \u0027User have %s no access to project %s\u0027 % ("},{"line_number":144,"context_line":"                        user_id, token_project_id)"},{"line_number":145,"context_line":"                else:"},{"line_number":146,"context_line":"                    msg \u003d \u0027User have %s no access to domain %s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx4I%3D","line":143,"updated":"2013-07-11 15:44:57.000000000","message":"i18n","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            # user has no project or domain roles, therefore access denied"},{"line_number":141,"context_line":"            if not filtered_roles:"},{"line_number":142,"context_line":"                if token_project_id:"},{"line_number":143,"context_line":"                    msg \u003d \u0027User have %s no access to project %s\u0027 % ("},{"line_number":144,"context_line":"                        user_id, token_project_id)"},{"line_number":145,"context_line":"                else:"},{"line_number":146,"context_line":"                    msg \u003d \u0027User have %s no access to domain %s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZ4%3D","line":143,"in_reply_to":"AAAAP3%2F%2Fx4I%3D","updated":"2013-07-11 17:54:01.000000000","message":"Good catch!","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                    msg \u003d \u0027User have %s no access to project %s\u0027 % ("},{"line_number":144,"context_line":"                        user_id, token_project_id)"},{"line_number":145,"context_line":"                else:"},{"line_number":146,"context_line":"                    msg \u003d \u0027User have %s no access to domain %s\u0027 % ("},{"line_number":147,"context_line":"                        user_id, token_domain_id)"},{"line_number":148,"context_line":"                LOG.debug(msg)"},{"line_number":149,"context_line":"                raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx4A%3D","line":146,"updated":"2013-07-11 15:44:57.000000000","message":"i18n","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                    msg \u003d \u0027User have %s no access to project %s\u0027 % ("},{"line_number":144,"context_line":"                        user_id, token_project_id)"},{"line_number":145,"context_line":"                else:"},{"line_number":146,"context_line":"                    msg \u003d \u0027User have %s no access to domain %s\u0027 % ("},{"line_number":147,"context_line":"                        user_id, token_domain_id)"},{"line_number":148,"context_line":"                LOG.debug(msg)"},{"line_number":149,"context_line":"                raise exception.Unauthorized(msg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZ0%3D","line":146,"in_reply_to":"AAAAP3%2F%2Fx4A%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if CONF.trust.enabled and trust:"},{"line_number":193,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":194,"context_line":"                raise exception.Forbidden()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"},{"line_number":197,"context_line":"        self._populate_user(token_data, user_id, domain_id, project_id, trust)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx38%3D","line":194,"updated":"2013-07-11 15:44:57.000000000","message":"see above","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        if CONF.trust.enabled and trust:"},{"line_number":193,"context_line":"            if user_id !\u003d trust[\u0027trustee_user_id\u0027]:"},{"line_number":194,"context_line":"                raise exception.Forbidden()"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        self._populate_scope(token_data, domain_id, project_id)"},{"line_number":197,"context_line":"        self._populate_user(token_data, user_id, domain_id, project_id, trust)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZs%3D","line":194,"in_reply_to":"AAAAP3%2F%2Fx38%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    project_id\u003dproject_id,"},{"line_number":323,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"},{"line_number":324,"context_line":"            return token_data"},{"line_number":325,"context_line":"        except Exception as e:"},{"line_number":326,"context_line":"            LOG.exception(_(\u0027Failed to validate token\u0027))"},{"line_number":327,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx3s%3D","line":325,"updated":"2013-07-11 15:44:57.000000000","message":"what are you catching? be more specific","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    project_id\u003dproject_id,"},{"line_number":323,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"},{"line_number":324,"context_line":"            return token_data"},{"line_number":325,"context_line":"        except Exception as e:"},{"line_number":326,"context_line":"            LOG.exception(_(\u0027Failed to validate token\u0027))"},{"line_number":327,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FwHU%3D","line":325,"in_reply_to":"AAAAP3%2F%2Fw3Y%3D","updated":"2013-07-12 00:05:53.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    project_id\u003dproject_id,"},{"line_number":323,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"},{"line_number":324,"context_line":"            return token_data"},{"line_number":325,"context_line":"        except Exception as e:"},{"line_number":326,"context_line":"            LOG.exception(_(\u0027Failed to validate token\u0027))"},{"line_number":327,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZY%3D","line":325,"in_reply_to":"AAAAP3%2F%2Fx3s%3D","updated":"2013-07-11 17:54:01.000000000","message":"any unexpected errors from validation so client will see a 401 instead of 500","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    project_id\u003dproject_id,"},{"line_number":323,"context_line":"                    expires\u003dtoken_ref[\u0027expires\u0027])"},{"line_number":324,"context_line":"            return token_data"},{"line_number":325,"context_line":"        except Exception as e:"},{"line_number":326,"context_line":"            LOG.exception(_(\u0027Failed to validate token\u0027))"},{"line_number":327,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":328,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw3Y%3D","line":325,"in_reply_to":"AAAAP3%2F%2FxZY%3D","updated":"2013-07-11 19:59:04.000000000","message":"unexpected errors should be 500\u0027s because something unexpected its broken","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                self._verify_token(token_id)"},{"line_number":340,"context_line":"            else:"},{"line_number":341,"context_line":"                raise token_provider.UnsupportedTokenVersionException()"},{"line_number":342,"context_line":"        except Exception as e:"},{"line_number":343,"context_line":"            LOG.exception(_(\u0027Failed to verify token\u0027))"},{"line_number":344,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx3o%3D","line":342,"updated":"2013-07-11 15:44:57.000000000","message":"what are you catching? be more specific","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                self._verify_token(token_id)"},{"line_number":340,"context_line":"            else:"},{"line_number":341,"context_line":"                raise token_provider.UnsupportedTokenVersionException()"},{"line_number":342,"context_line":"        except Exception as e:"},{"line_number":343,"context_line":"            LOG.exception(_(\u0027Failed to verify token\u0027))"},{"line_number":344,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FwHQ%3D","line":342,"in_reply_to":"AAAAP3%2F%2Fw3U%3D","updated":"2013-07-12 00:05:53.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                self._verify_token(token_id)"},{"line_number":340,"context_line":"            else:"},{"line_number":341,"context_line":"                raise token_provider.UnsupportedTokenVersionException()"},{"line_number":342,"context_line":"        except Exception as e:"},{"line_number":343,"context_line":"            LOG.exception(_(\u0027Failed to verify token\u0027))"},{"line_number":344,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZU%3D","line":342,"in_reply_to":"AAAAP3%2F%2Fx3o%3D","updated":"2013-07-11 17:54:01.000000000","message":"any unexpected errors from validation so client will see a 401 instead of 500","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                self._verify_token(token_id)"},{"line_number":340,"context_line":"            else:"},{"line_number":341,"context_line":"                raise token_provider.UnsupportedTokenVersionException()"},{"line_number":342,"context_line":"        except Exception as e:"},{"line_number":343,"context_line":"            LOG.exception(_(\u0027Failed to verify token\u0027))"},{"line_number":344,"context_line":"            raise exception.Unauthorized(e)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw3U%3D","line":342,"in_reply_to":"AAAAP3%2F%2FxZU%3D","updated":"2013-07-11 19:59:04.000000000","message":"see above","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f2ca8f9b5d3408f2d65ae85f2c28bd73cb00cd05","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        assert token_ref"},{"line_number":298,"context_line":"        if belongs_to:"},{"line_number":299,"context_line":"            assert token_ref[\u0027tenant\u0027][\u0027id\u0027] \u003d\u003d belongs_to"},{"line_number":300,"context_line":"        return token_ref"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def revoke_token(self, token_id):"},{"line_number":303,"context_line":"        self.token_api.delete_token(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAP3%2F%2FrUo%3D","line":300,"updated":"2013-07-13 21:37:15.000000000","message":"do we ever use the ref returned?  I couldn\u0027t see it...","commit_id":"c238ace30981877e5991874c5b193ea7d5107419"}],"tests/test_auth.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        self.assertEqual(original_expiration, r[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027])"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    def test_maintain_uuid_token_expiration(self):"},{"line_number":785,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":786,"context_line":"        self._maintain_token_expiration()"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyDE%3D","side":"PARENT","line":785,"updated":"2013-07-11 15:13:25.000000000","message":"-2; this looks like you\u0027re suppressing a regression for a security vulnerability by having it test PKI instead of UUID... please explain","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"766d171748fd670d0628631cad435aacb16ba3a7","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        self.assertEqual(original_expiration, r[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027])"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    def test_maintain_uuid_token_expiration(self):"},{"line_number":785,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":786,"context_line":"        self._maintain_token_expiration()"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FwHM%3D","side":"PARENT","line":785,"in_reply_to":"AAAAP3%2F%2Fw24%3D","updated":"2013-07-12 00:05:53.000000000","message":"token_format will be removed as we will be using provider.\n\nI\u0027ll move this test to TestUUIDTokenAPIs and TestPKITokenAPIs in the v2 token patch.","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        self.assertEqual(original_expiration, r[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027])"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    def test_maintain_uuid_token_expiration(self):"},{"line_number":785,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":786,"context_line":"        self._maintain_token_expiration()"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw24%3D","side":"PARENT","line":785,"in_reply_to":"AAAAP3%2F%2Fx9E%3D","updated":"2013-07-11 19:59:04.000000000","message":"this class used to have a test for uuid and one for pki... any reason you can\u0027t add that back? i\u0027d rather be safe to prevent regressions","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        self.assertEqual(original_expiration, r[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027])"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    def test_maintain_uuid_token_expiration(self):"},{"line_number":785,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":786,"context_line":"        self._maintain_token_expiration()"},{"line_number":787,"context_line":""},{"line_number":788,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx9E%3D","side":"PARENT","line":785,"in_reply_to":"AAAAP3%2F%2FyDE%3D","updated":"2013-07-11 17:54:01.000000000","message":"the mechanism for setting expiration at token creation is exactly the same for both UUID and PKI tokens. For rescope tokens, expiration should be maintained regardless of token format.","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            \u0027token\u0027: {\u0027id\u0027: trust_token}"},{"line_number":663,"context_line":"        }}"},{"line_number":664,"context_line":"        self.assertRaises("},{"line_number":665,"context_line":"            exception.Forbidden,"},{"line_number":666,"context_line":"            self.auth_v3_controller.authenticate_for_token,"},{"line_number":667,"context_line":"            {}, v3_token_data)"},{"line_number":668,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FtjY%3D","line":665,"updated":"2013-07-12 16:15:49.000000000","message":"i\u0027m not clear on why this should change to forbidden?","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"63d2b2934d9eb5b5bfb528fb3f393b70673c2cfe","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            \u0027token\u0027: {\u0027id\u0027: trust_token}"},{"line_number":663,"context_line":"        }}"},{"line_number":664,"context_line":"        self.assertRaises("},{"line_number":665,"context_line":"            exception.Forbidden,"},{"line_number":666,"context_line":"            self.auth_v3_controller.authenticate_for_token,"},{"line_number":667,"context_line":"            {}, v3_token_data)"},{"line_number":668,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FswU%3D","line":665,"in_reply_to":"AAAAP3%2F%2Fs04%3D","updated":"2013-07-12 19:55:34.000000000","message":"Yes, Forbidden more closely meets the intention here:\nThe request was a valid request, but the server is refusing to respond to it.[2] Unlike a 401 Unauthorized response, authenticating will make no difference.[2] On servers where authentication is required, this commonly means that the provided credentials were successfully authenticated but that the credentials still do not grant the client permission to access the resource (e.g. a recognized user attempting to access restricted content).","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            \u0027token\u0027: {\u0027id\u0027: trust_token}"},{"line_number":663,"context_line":"        }}"},{"line_number":664,"context_line":"        self.assertRaises("},{"line_number":665,"context_line":"            exception.Forbidden,"},{"line_number":666,"context_line":"            self.auth_v3_controller.authenticate_for_token,"},{"line_number":667,"context_line":"            {}, v3_token_data)"},{"line_number":668,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fs04%3D","line":665,"in_reply_to":"AAAAP3%2F%2FtjY%3D","updated":"2013-07-12 19:37:25.000000000","message":"This should\u0027ve been a 403 when attempting to rescope a trust token. 401 implies user have no permission. 403 implies the operation is not allowed.","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"}],"tests/test_token_provider.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"SAMPLE_V2_TOKEN \u003d {"},{"line_number":24,"context_line":"    \"access\": {"},{"line_number":25,"context_line":"        \"metadata\": {"},{"line_number":26,"context_line":"            \"is_admin\": 0,"},{"line_number":27,"context_line":"            \"roles\": ["},{"line_number":28,"context_line":"                \"9fe2ff9ee4384b1894a90878d3e92bab\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx7g%3D","line":25,"updated":"2013-07-11 15:34:11.000000000","message":"there\u0027s an open bug against this garbage being included in the token... REMOVE","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"SAMPLE_V2_TOKEN \u003d {"},{"line_number":24,"context_line":"    \"access\": {"},{"line_number":25,"context_line":"        \"metadata\": {"},{"line_number":26,"context_line":"            \"is_admin\": 0,"},{"line_number":27,"context_line":"            \"roles\": ["},{"line_number":28,"context_line":"                \"9fe2ff9ee4384b1894a90878d3e92bab\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxZI%3D","line":25,"in_reply_to":"AAAAP3%2F%2Fx7g%3D","updated":"2013-07-11 17:54:01.000000000","message":"Oh, its about time. I was wonder about the same thing when I refactoring the code.\n\nI would be thrill to get rid of it. :)","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                    }"},{"line_number":283,"context_line":"                ],"},{"line_number":284,"context_line":"                \"id\": \"b08c9c7d4ef543eba5eeb766f72e5aa1\","},{"line_number":285,"context_line":"                \"type\": \"ec2\","},{"line_number":286,"context_line":"            },"},{"line_number":287,"context_line":"            {"},{"line_number":288,"context_line":"                \"endpoints\": ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx60%3D","line":285,"updated":"2013-07-11 15:44:57.000000000","message":"no service name?","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                    }"},{"line_number":283,"context_line":"                ],"},{"line_number":284,"context_line":"                \"id\": \"b08c9c7d4ef543eba5eeb766f72e5aa1\","},{"line_number":285,"context_line":"                \"type\": \"ec2\","},{"line_number":286,"context_line":"            },"},{"line_number":287,"context_line":"            {"},{"line_number":288,"context_line":"                \"endpoints\": ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxYY%3D","line":285,"in_reply_to":"AAAAP3%2F%2Fx60%3D","updated":"2013-07-11 17:54:01.000000000","message":"I was wondering about the same thing. Service name wasn\u0027t in the original v3 spec. But the service catalog has since been taken out of the spec and its now a placeholder. :)\n\nBut yeah, I agree, we should have service name.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                    {"},{"line_number":290,"context_line":"                        \"id\": \"077d82df25304abeac2294004441db5a\","},{"line_number":291,"context_line":"                        \"interface\": \"admin\","},{"line_number":292,"context_line":"                        \"legacy_endpoint_id\": \"8d3f3b\","},{"line_number":293,"context_line":"                        \"region\": \"RegionOne\","},{"line_number":294,"context_line":"                        \"url\": \"http://localhost:8776/v1/01257\""},{"line_number":295,"context_line":"                    },"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx7A%3D","line":292,"updated":"2013-07-11 15:44:57.000000000","message":"open bug against this, REMOVE. this is NOT part of the API","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":289,"context_line":"                    {"},{"line_number":290,"context_line":"                        \"id\": \"077d82df25304abeac2294004441db5a\","},{"line_number":291,"context_line":"                        \"interface\": \"admin\","},{"line_number":292,"context_line":"                        \"legacy_endpoint_id\": \"8d3f3b\","},{"line_number":293,"context_line":"                        \"region\": \"RegionOne\","},{"line_number":294,"context_line":"                        \"url\": \"http://localhost:8776/v1/01257\""},{"line_number":295,"context_line":"                    },"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxYE%3D","line":292,"in_reply_to":"AAAAP3%2F%2Fx7A%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            }"},{"line_number":314,"context_line":"        ],"},{"line_number":315,"context_line":"        \"expires_at\": \"2013-05-22T00:02:43.941430Z\","},{"line_number":316,"context_line":"        \"extras\": {},"},{"line_number":317,"context_line":"        \"issued_at\": \"2013-05-21T00:02:43.941473Z\","},{"line_number":318,"context_line":"        \"methods\": ["},{"line_number":319,"context_line":"            \"password\""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx7Q%3D","line":316,"updated":"2013-07-11 15:34:11.000000000","message":"GARBAGE, REMOVE","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            }"},{"line_number":314,"context_line":"        ],"},{"line_number":315,"context_line":"        \"expires_at\": \"2013-05-22T00:02:43.941430Z\","},{"line_number":316,"context_line":"        \"extras\": {},"},{"line_number":317,"context_line":"        \"issued_at\": \"2013-05-21T00:02:43.941473Z\","},{"line_number":318,"context_line":"        \"methods\": ["},{"line_number":319,"context_line":"            \"password\""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxYA%3D","line":316,"in_reply_to":"AAAAP3%2F%2Fx7Q%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            \"id\": \"f19ddbe2c53c46f189fe66d0a7a9c9ce\","},{"line_number":345,"context_line":"            \"name\": \"nova\""},{"line_number":346,"context_line":"        },"},{"line_number":347,"context_line":"        \"id\": \"ce4fc2d36eea4cc9a36e666ac2f1029a\","},{"line_number":348,"context_line":"        \"metadata\": {"},{"line_number":349,"context_line":"            \"is_admin\": 0,"},{"line_number":350,"context_line":"            \"roles\": ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx7U%3D","line":347,"updated":"2013-07-11 15:34:11.000000000","message":"there\u0027s no ID","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            \"id\": \"f19ddbe2c53c46f189fe66d0a7a9c9ce\","},{"line_number":345,"context_line":"            \"name\": \"nova\""},{"line_number":346,"context_line":"        },"},{"line_number":347,"context_line":"        \"id\": \"ce4fc2d36eea4cc9a36e666ac2f1029a\","},{"line_number":348,"context_line":"        \"metadata\": {"},{"line_number":349,"context_line":"            \"is_admin\": 0,"},{"line_number":350,"context_line":"            \"roles\": ["}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxXk%3D","line":347,"in_reply_to":"AAAAP3%2F%2Fx7U%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            \"name\": \"nova\""},{"line_number":346,"context_line":"        },"},{"line_number":347,"context_line":"        \"id\": \"ce4fc2d36eea4cc9a36e666ac2f1029a\","},{"line_number":348,"context_line":"        \"metadata\": {"},{"line_number":349,"context_line":"            \"is_admin\": 0,"},{"line_number":350,"context_line":"            \"roles\": ["},{"line_number":351,"context_line":"                \"9fe2ff9ee4384b1894a90878d3e92bab\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx7Y%3D","line":348,"updated":"2013-07-11 15:34:11.000000000","message":"open bug against this garbage, REMOVE","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            \"name\": \"nova\""},{"line_number":346,"context_line":"        },"},{"line_number":347,"context_line":"        \"id\": \"ce4fc2d36eea4cc9a36e666ac2f1029a\","},{"line_number":348,"context_line":"        \"metadata\": {"},{"line_number":349,"context_line":"            \"is_admin\": 0,"},{"line_number":350,"context_line":"            \"roles\": ["},{"line_number":351,"context_line":"                \"9fe2ff9ee4384b1894a90878d3e92bab\","}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxXg%3D","line":348,"in_reply_to":"AAAAP3%2F%2Fx7Y%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"}],"tests/test_uuid_token_provider.conf":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":2,"context_line":"token_format \u003d UUID"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[token]"},{"line_number":5,"context_line":"provider \u003d keystone.token.providers.uuid.Provider"}],"source_content_type":"text/plain","patch_set":16,"id":"AAAAP3%2F%2F1kM%3D","line":5,"updated":"2013-07-10 17:09:25.000000000","message":"i hope you\u0027re checking somewhere this kind of redundant configuration doesn\u0027t conflict.\n\nan existing config file that opts for token_format \u003d UUID will suddenly be broken when the default token \"provider\" is for PKI","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":2,"context_line":"token_format \u003d UUID"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"[token]"},{"line_number":5,"context_line":"provider \u003d keystone.token.providers.uuid.Provider"}],"source_content_type":"text/plain","patch_set":16,"id":"AAAAP3%2F%2F1U4%3D","line":5,"in_reply_to":"AAAAP3%2F%2F1kM%3D","updated":"2013-07-10 17:35:32.000000000","message":"I would like to get rid of token_format altogether. Only place still needs it is in the SQL code where the token ID is larger then the database column allows. We made an exception for that. But we should be storing the hash of the token ID for PKI tokens.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"}],"tests/test_v3.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class RestfulTestCase(test_content_types.RestfulTestCase):"},{"line_number":26,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":27,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1js%3D","line":26,"updated":"2013-07-10 17:09:25.000000000","message":"NO. i really doubt this behaves the way you expect. do not initialize to an empty list. and why is it plural?","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class RestfulTestCase(test_content_types.RestfulTestCase):"},{"line_number":26,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":27,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1UQ%3D","line":26,"in_reply_to":"AAAAP3%2F%2F1js%3D","updated":"2013-07-10 17:35:32.000000000","message":"it basically allows additional overrides from its child classes. Is there a better way to do this? I basically want to test different token providers.","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"32aaf395644e72e743b88ca11df36bdbcda742f9","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        load_sample_data should be set to false."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        Child class can provide additional config overrides via configs"},{"line_number":34,"context_line":"        parameter."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        self.config(["}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1kI%3D","line":34,"updated":"2013-07-10 17:09:25.000000000","message":"what does that mean?","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"16ddb8f297107cc21aeda570f57c39571ffb4910","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        load_sample_data should be set to false."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        Child class can provide additional config overrides via configs"},{"line_number":34,"context_line":"        parameter."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        self.config(["}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAP3%2F%2F1UM%3D","line":34,"in_reply_to":"AAAAP3%2F%2F1kI%3D","updated":"2013-07-10 17:35:32.000000000","message":"allowing subclasses to have addition config overrides","commit_id":"e34e216a8fc63383deccb687dc63e14bb797a8d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class RestfulTestCase(test_content_types.RestfulTestCase):"},{"line_number":26,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":27,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyCM%3D","line":26,"updated":"2013-07-11 15:13:25.000000000","message":"-2; see a previous review and DO NOT use use object references as default arguments\n\nthis whole architecture is just dumb though. perhaps expose the list of configuration files and allow child classes to manipulate it directly","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class RestfulTestCase(test_content_types.RestfulTestCase):"},{"line_number":26,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":27,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw2U%3D","line":26,"in_reply_to":"AAAAP3%2F%2FxW4%3D","updated":"2013-07-11 19:59:04.000000000","message":"self.config() might be designed the way you want already... i swear we do something similar to this in another test suite","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class RestfulTestCase(test_content_types.RestfulTestCase):"},{"line_number":26,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":27,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxW4%3D","line":26,"in_reply_to":"AAAAP3%2F%2FyCM%3D","updated":"2013-07-11 17:54:01.000000000","message":"let me think this one over. Basically, we need a way to switch different providers.","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def config_files(self):"},{"line_number":33,"context_line":"        return self._config_file_list"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":36,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FtkU%3D","line":35,"updated":"2013-07-12 16:15:49.000000000","message":"remove","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def config_files(self):"},{"line_number":33,"context_line":"        return self._config_file_list"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self, load_sample_data\u003dTrue, configs\u003d[]):"},{"line_number":36,"context_line":"        \"\"\"Setup for v3 Restful Test Cases."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        If a child class wants to create their own sample data"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fszk%3D","line":35,"in_reply_to":"AAAAP3%2F%2FtkU%3D","updated":"2013-07-12 19:37:25.000000000","message":"Done","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e6623cc46c719f8ee73967b7b3ec8879afd7e00f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        load_sample_data should be set to false."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        Child class can provide additional config overrides via configs"},{"line_number":43,"context_line":"        parameter."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        \"\"\""},{"line_number":46,"context_line":"        self.config(self.config_files())"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2FtkM%3D","line":43,"updated":"2013-07-12 16:15:49.000000000","message":"remove","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"636eb435981559c912e501bde5d194c1eb915b01","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        load_sample_data should be set to false."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        Child class can provide additional config overrides via configs"},{"line_number":43,"context_line":"        parameter."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        \"\"\""},{"line_number":46,"context_line":"        self.config(self.config_files())"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAP3%2F%2Fszc%3D","line":43,"in_reply_to":"AAAAP3%2F%2FtkM%3D","updated":"2013-07-12 19:37:25.000000000","message":"Done","commit_id":"9ed190a528953e90fcbb7d992620569585f08c6b"}],"tests/test_v3_auth.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b80b2df2c30b9f9657c201bfea38524905f251e5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        token_data \u003d resp.result"},{"line_number":121,"context_line":"        token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":122,"context_line":"        self.assertIn(\u0027expires_at\u0027, token_data[\u0027token\u0027])"},{"line_number":123,"context_line":"        if CONF.signing.token_format \u003d\u003d \u0027PKI\u0027:"},{"line_number":124,"context_line":"            expected_token_id \u003d cms.cms_sign_token(json.dumps(token_data),"},{"line_number":125,"context_line":"                                                   CONF.signing.certfile,"},{"line_number":126,"context_line":"                                                   CONF.signing.keyfile)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAP3%2F%2F0so%3D","line":123,"updated":"2013-07-10 21:25:49.000000000","message":"why is there an conf based \"if\" in the test?  You should control for this.  BOth options should be exercised explicitly.","commit_id":"4f9706dcaa2dc455abd8a7e1217692dbb8bb29a2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                                  expected_status\u003d401)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_v3_v2_intermix_domain_scoped_token_failed(self):"},{"line_number":144,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":145,"context_line":"        # grant the domain role to user"},{"line_number":146,"context_line":"        path \u003d \u0027/domains/%s/users/%s/roles/%s\u0027 % ("},{"line_number":147,"context_line":"            self.domain[\u0027id\u0027], self.user[\u0027id\u0027], self.role[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx%2Fc%3D","side":"PARENT","line":144,"updated":"2013-07-11 15:34:11.000000000","message":"same concern again... this looks like your\u0027e suddenly testing PKI tokens instead","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                                  expected_status\u003d401)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_v3_v2_intermix_domain_scoped_token_failed(self):"},{"line_number":144,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":145,"context_line":"        # grant the domain role to user"},{"line_number":146,"context_line":"        path \u003d \u0027/domains/%s/users/%s/roles/%s\u0027 % ("},{"line_number":147,"context_line":"            self.domain[\u0027id\u0027], self.user[\u0027id\u0027], self.role[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxXM%3D","side":"PARENT","line":144,"in_reply_to":"AAAAP3%2F%2Fx%2Fc%3D","updated":"2013-07-11 17:54:01.000000000","message":"I have separate tests for UUID and PKI tokens\n\nSee TestUUIDTokenAPIs and TestPKITokenAPIs","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        self.assertIn(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027][-1],"},{"line_number":298,"context_line":"                      token_data[\u0027token\u0027][\u0027expires_at\u0027])"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_v2_v3_unscoped_pki_token_intermix(self):"},{"line_number":301,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027PKI\u0027)"},{"line_number":302,"context_line":"        body \u003d {"},{"line_number":303,"context_line":"            \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx58%3D","side":"PARENT","line":300,"updated":"2013-07-11 15:44:57.000000000","message":"why are you removing test coverage?","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        self.assertIn(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027][-1],"},{"line_number":298,"context_line":"                      token_data[\u0027token\u0027][\u0027expires_at\u0027])"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_v2_v3_unscoped_pki_token_intermix(self):"},{"line_number":301,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027PKI\u0027)"},{"line_number":302,"context_line":"        body \u003d {"},{"line_number":303,"context_line":"            \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxXA%3D","side":"PARENT","line":300,"in_reply_to":"AAAAP3%2F%2Fx58%3D","updated":"2013-07-11 17:54:01.000000000","message":"I am actually adding test coverage. See TestUUIDTokenAPIs and TestPKITokenAPIs.","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"92ba7695e3c9d1dbf81abea73e907413e31f8945","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        self.assertIn(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027][-1],"},{"line_number":298,"context_line":"                      token_data[\u0027token\u0027][\u0027expires_at\u0027])"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_v2_v3_unscoped_pki_token_intermix(self):"},{"line_number":301,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027PKI\u0027)"},{"line_number":302,"context_line":"        body \u003d {"},{"line_number":303,"context_line":"            \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fw08%3D","side":"PARENT","line":300,"in_reply_to":"AAAAP3%2F%2FxXA%3D","updated":"2013-07-11 19:59:04.000000000","message":"ah, i didn\u0027t see this as a refactor. cool!","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0bc34860c20690accc1e8efc8370a8998271bb6","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        self.assertIn(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027][-1],"},{"line_number":322,"context_line":"                      token_data[\u0027token\u0027][\u0027expires_at\u0027])"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_v2_v3_uuid_token_intermix(self):"},{"line_number":325,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":326,"context_line":"        body \u003d {"},{"line_number":327,"context_line":"            \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx54%3D","side":"PARENT","line":324,"updated":"2013-07-11 15:44:57.000000000","message":"why are you removing test coverage?","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        self.assertIn(v2_token_data[\u0027access\u0027][\u0027token\u0027][\u0027expires\u0027][-1],"},{"line_number":322,"context_line":"                      token_data[\u0027token\u0027][\u0027expires_at\u0027])"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def test_v2_v3_uuid_token_intermix(self):"},{"line_number":325,"context_line":"        self.opt_in_group(\u0027signing\u0027, token_format\u003d\u0027UUID\u0027)"},{"line_number":326,"context_line":"        body \u003d {"},{"line_number":327,"context_line":"            \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxW8%3D","side":"PARENT","line":324,"in_reply_to":"AAAAP3%2F%2Fx54%3D","updated":"2013-07-11 17:54:01.000000000","message":"I am actually adding test coverage. See TestUUIDTokenAPIs and TestPKITokenAPIs.","commit_id":"63f962ff59d1f0698ba446a6b00db72a3ed8a929"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"50860f0ee1936d036d9ed53afe0661ae3b81005f","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"class TestPKITokenAPIs(test_v3.RestfulTestCase):"},{"line_number":101,"context_line":"    def setUp(self, configs\u003d[test.testsdir(\u0027test_pki_token_provider.conf\u0027)]):"},{"line_number":102,"context_line":"        super(TestPKITokenAPIs, self).setUp(configs\u003dconfigs)"},{"line_number":103,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":104,"context_line":"            username\u003dself.user[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyAk%3D","line":101,"updated":"2013-07-11 15:13:25.000000000","message":"-2; DO NOT DO","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":122,"context_line":"        self.assertIn(\u0027expires_at\u0027, token_data[\u0027token\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # make sure the token_id agrees"},{"line_number":125,"context_line":"        expected_token_id \u003d cms.cms_sign_token(json.dumps(token_data),"},{"line_number":126,"context_line":"                                               CONF.signing.certfile,"},{"line_number":127,"context_line":"                                               CONF.signing.keyfile)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FyAA%3D","line":124,"updated":"2013-07-11 15:34:11.000000000","message":"this is redundant with the code. don\u0027t bother commenting unless you\u0027re explaining *why* the code does something","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":122,"context_line":"        self.assertIn(\u0027expires_at\u0027, token_data[\u0027token\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # make sure the token_id agrees"},{"line_number":125,"context_line":"        expected_token_id \u003d cms.cms_sign_token(json.dumps(token_data),"},{"line_number":126,"context_line":"                                               CONF.signing.certfile,"},{"line_number":127,"context_line":"                                               CONF.signing.keyfile)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxWc%3D","line":124,"in_reply_to":"AAAAP3%2F%2FyAA%3D","updated":"2013-07-11 17:54:01.000000000","message":"Done","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"80d1d42616e76c9d65042299716747404aa92915","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":139,"context_line":"            password\u003dself.user[\u0027password\u0027])"},{"line_number":140,"context_line":"        resp \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":141,"context_line":"        token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # now validate the v3 token with v2 API"},{"line_number":144,"context_line":"        path \u003d \u0027/v2.0/tokens/%s\u0027 % (token_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fx%2Fs%3D","line":141,"updated":"2013-07-11 15:34:11.000000000","message":"all these changes to add _id seem superfluous and debatable. the header is not called X-Subject-Token-Id for a reason... it\u0027s not an identifier from the client\u0027s perspective","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a2398873f9ca9568dca64d2f088fbcf591f5039e","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":139,"context_line":"            password\u003dself.user[\u0027password\u0027])"},{"line_number":140,"context_line":"        resp \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":141,"context_line":"        token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # now validate the v3 token with v2 API"},{"line_number":144,"context_line":"        path \u003d \u0027/v2.0/tokens/%s\u0027 % (token_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2FxWs%3D","line":141,"in_reply_to":"AAAAP3%2F%2Fx%2Fs%3D","updated":"2013-07-11 17:54:01.000000000","message":"I can undo this change. Not worth fighting this battle. :)","commit_id":"dbd85a461f4ff5d71649b9f60763ace3b8017c92"}]}
