)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"eac0b19889587c6c9ca7e1ac2f8d9f30b651d1c2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Adding support for to create request and access tokens,"},{"line_number":10,"context_line":"and authorize request tokens. Also adding basic CRUD for"},{"line_number":11,"context_line":"consumer entities."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9137e3426c82c73855ae0e50317cfd6477195318"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAUH%2F98B8%3D","line":12,"updated":"2014-01-31 21:39:31.000000000","message":"linked a blueprint","commit_id":"a3e0aef6b61516992382eb68ac7940d3aa5acfcf"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add request/access token and consumer support for keystoneclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adding support for to create request and access tokens,"},{"line_number":10,"context_line":"and authorize request tokens. Also adding basic CRUD for"},{"line_number":11,"context_line":"consumer entities."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAVn%2F%2FsCQ%3D","line":9,"updated":"2014-03-04 17:35:47.000000000","message":"Suggest either removing \u0027for\u0027 for rewriting as \u0027for creating request\u0027","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03d676da5bd8d4adb56fdb07438dbdab5f1c8276","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add request/access token and consumer support for keystoneclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adding support for to create request and access tokens,"},{"line_number":10,"context_line":"and authorize request tokens. Also adding basic CRUD for"},{"line_number":11,"context_line":"consumer entities."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAVn%2F%2FrIo%3D","line":9,"in_reply_to":"AAAAVn%2F%2FsCQ%3D","updated":"2014-03-04 18:42:02.000000000","message":"oops, i\u0027ll do that latter.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"}],"keystoneclient/tests/v3/test_oauth1.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7d7a33a9041678ea53cf1118c17e646b637d64b2","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import httpretty"},{"line_number":17,"context_line":"import oauthlib.oauth1 as oauth1"},{"line_number":18,"context_line":"import uuid"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystoneclient.tests.v3 import utils"},{"line_number":21,"context_line":"from keystoneclient.v3.contrib.oauth1 import access_tokens"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F99B0%3D","line":18,"updated":"2014-01-31 18:16:17.000000000","message":"uuid is actually stdlib","commit_id":"a3e0aef6b61516992382eb68ac7940d3aa5acfcf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"eac0b19889587c6c9ca7e1ac2f8d9f30b651d1c2","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import httpretty"},{"line_number":17,"context_line":"import oauthlib.oauth1 as oauth1"},{"line_number":18,"context_line":"import uuid"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystoneclient.tests.v3 import utils"},{"line_number":21,"context_line":"from keystoneclient.v3.contrib.oauth1 import access_tokens"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F98CM%3D","line":18,"in_reply_to":"AAAAUH%2F99B0%3D","updated":"2014-01-31 21:39:31.000000000","message":"Done","commit_id":"a3e0aef6b61516992382eb68ac7940d3aa5acfcf"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        return kwargs"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @httpretty.activate"},{"line_number":41,"context_line":"    def test_no_description(self, **kwargs):"},{"line_number":42,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":43,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":44,"context_line":"                                 \u0027id\u0027: consumer_id}}"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2Fr7Y%3D","line":41,"updated":"2014-03-04 17:35:47.000000000","message":"Is this just testing that description is optional? Maybe rename to to test_description_is_optional or something like that. I like it when test names are more about the why than the what.\n\nWhat it do description key is set at all? there should probably be a test to show the expected behavior.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6b3c37af160866fee7ccd7772096053910d2dd4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        return kwargs"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @httpretty.activate"},{"line_number":41,"context_line":"    def test_no_description(self, **kwargs):"},{"line_number":42,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":43,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":44,"context_line":"                                 \u0027id\u0027: consumer_id}}"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FqPw%3D","line":41,"in_reply_to":"AAAAVn%2F%2Fr7Y%3D","updated":"2014-03-04 20:08:32.000000000","message":"I think this is meant to say what happens when description is set? \n\nThe CRUD tests should be test automagically because it extends utils.CrudTests, and I have new_ref specified with description.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _validate_oauth_headers(self, auth_header, client):"},{"line_number":70,"context_line":"        parameters \u003d {}"},{"line_number":71,"context_line":"        if auth_header[:6] \u003d\u003d \u0027OAuth \u0027:"},{"line_number":72,"context_line":"            auth_header \u003d auth_header[6:]"},{"line_number":73,"context_line":"            header_params \u003d client.get_oauth_params()"},{"line_number":74,"context_line":"            parameters \u003d dict(header_params)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2Fr5k%3D","line":71,"updated":"2014-03-04 17:35:47.000000000","message":"Is there any reason you don\u0027t fail if this is not true? Seems like a mangled header would get by this check.\n\nnit: startswith may read cleaner","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03d676da5bd8d4adb56fdb07438dbdab5f1c8276","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _validate_oauth_headers(self, auth_header, client):"},{"line_number":70,"context_line":"        parameters \u003d {}"},{"line_number":71,"context_line":"        if auth_header[:6] \u003d\u003d \u0027OAuth \u0027:"},{"line_number":72,"context_line":"            auth_header \u003d auth_header[6:]"},{"line_number":73,"context_line":"            header_params \u003d client.get_oauth_params()"},{"line_number":74,"context_line":"            parameters \u003d dict(header_params)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FrC0%3D","line":71,"in_reply_to":"AAAAVn%2F%2Fr5k%3D","updated":"2014-03-04 18:42:02.000000000","message":"I like both suggestions!","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6b3c37af160866fee7ccd7772096053910d2dd4","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _validate_oauth_headers(self, auth_header, client):"},{"line_number":70,"context_line":"        parameters \u003d {}"},{"line_number":71,"context_line":"        if auth_header[:6] \u003d\u003d \u0027OAuth \u0027:"},{"line_number":72,"context_line":"            auth_header \u003d auth_header[6:]"},{"line_number":73,"context_line":"            header_params \u003d client.get_oauth_params()"},{"line_number":74,"context_line":"            parameters \u003d dict(header_params)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FqKo%3D","line":71,"in_reply_to":"AAAAVn%2F%2FrC0%3D","updated":"2014-03-04 20:08:32.000000000","message":"i got rid of the conditional, it should fail the assert if it doesn\u0027t start with \u0027OAuth \u0027","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0134b174eda775f504f697dc869b633ad18e7d4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertRaises("},{"line_number":122,"context_line":"            exceptions.ValidationError,"},{"line_number":123,"context_line":"            self.manager.authorize,"},{"line_number":124,"context_line":"            request_token\u003duuid.uuid4().hex)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @httpretty.activate"},{"line_number":127,"context_line":"    def test_create_request_token(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2F3C4%3D","line":124,"updated":"2014-03-03 19:09:20.000000000","message":"should \u0027roles\u003dNone\u0027 be passed in here or will that not matter?","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"77ea2ccbe191df130dc4e98593bb5e07a6a3f197","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertRaises("},{"line_number":122,"context_line":"            exceptions.ValidationError,"},{"line_number":123,"context_line":"            self.manager.authorize,"},{"line_number":124,"context_line":"            request_token\u003duuid.uuid4().hex)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @httpretty.activate"},{"line_number":127,"context_line":"    def test_create_request_token(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2F26c%3D","line":124,"in_reply_to":"AAAAVn%2F%2F3C4%3D","updated":"2014-03-03 19:12:17.000000000","message":"It shouldn\u0027t matter, as it defaults to None in the authorize call.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2b82067c5a76c2e2d12837598f3ca87ff34bd05e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.assertEqual(parameters[\u0027oauth_version\u0027], \u00271.0\u0027)"},{"line_number":77,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_nonce\u0027])"},{"line_number":78,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_timestamp\u0027])"},{"line_number":79,"context_line":"        self.assertIsNotNone(parameters[\u0027oauth_signature_method\u0027])"},{"line_number":80,"context_line":"        return parameters"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fo%2B4%3D","line":79,"updated":"2014-03-04 22:58:58.000000000","message":"this is repeated unnecessarily","commit_id":"9986c695ce536708c6fe615e0c31f2d4fa13c1e1"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ef4f380d532285c40526ade55abcf2c4460174e4","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @httpretty.activate"},{"line_number":40,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":41,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":42,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":43,"context_line":"                                 \u0027id\u0027: consumer_id}}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self.stub_url(httpretty.POST,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F6wo%3D","line":42,"updated":"2014-03-12 23:37:52.000000000","message":"is None the same as missing?","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9420001b21508486f519cdf51338282bc347b4d0","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    @httpretty.activate"},{"line_number":40,"context_line":"    def test_description_is_optional(self, **kwargs):"},{"line_number":41,"context_line":"        consumer_id \u003d uuid.uuid4().hex"},{"line_number":42,"context_line":"        resp_ref \u003d {\u0027consumer\u0027: {\u0027description\u0027: None,"},{"line_number":43,"context_line":"                                 \u0027id\u0027: consumer_id}}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self.stub_url(httpretty.POST,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F5UI%3D","line":42,"in_reply_to":"AAAAWH%2F%2F6wo%3D","updated":"2014-03-13 04:23:41.000000000","message":"I believe so, description is an optional argument, so it will default to None on the server side. \n\nhttps://github.com/openstack/keystone/blob/master/keystone/contrib/oauth1/backends/sql.py#L108","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ef4f380d532285c40526ade55abcf2c4460174e4","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":135,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":136,"context_line":"                           callback_uri\u003d\"oob\")"},{"line_number":137,"context_line":"        self._validate_oauth_headers(req_headers[\u0027Authorization\u0027], oc)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"class AccessTokenTests(TokenTests):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F6vc%3D","line":137,"updated":"2014-03-12 23:37:52.000000000","message":"we\u0027re testing here that the output from two oauth1.Client calls is the same - i understand why but is there a way that the generated value is static that you can test against some stored data?","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9420001b21508486f519cdf51338282bc347b4d0","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        oc \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":135,"context_line":"                           signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":136,"context_line":"                           callback_uri\u003d\"oob\")"},{"line_number":137,"context_line":"        self._validate_oauth_headers(req_headers[\u0027Authorization\u0027], oc)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"class AccessTokenTests(TokenTests):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F5S8%3D","line":137,"in_reply_to":"AAAAWH%2F%2F6vc%3D","updated":"2014-03-13 04:23:41.000000000","message":"That is exactly what\u0027s going on. The only way I can think of making this static would be to add the Authorization headers to the stub_url part. Not sure if that\u0027s possible at the moment. Is there any reason you\u0027re against this way? \n\nThere might be some issues with some of the more trickier parts of the oauth headers (like nonce and signature).","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"}],"keystoneclient/v3/client.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7d7a33a9041678ea53cf1118c17e646b637d64b2","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient import exceptions"},{"line_number":19,"context_line":"from keystoneclient import httpclient"},{"line_number":20,"context_line":"from keystoneclient.openstack.common import jsonutils"},{"line_number":21,"context_line":"from keystoneclient.v3.contrib.oauth1 import core as oauth1"},{"line_number":22,"context_line":"from keystoneclient.v3.contrib import trusts"},{"line_number":23,"context_line":"from keystoneclient.v3 import credentials"},{"line_number":24,"context_line":"from keystoneclient.v3 import domains"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F99BQ%3D","line":21,"updated":"2014-01-31 18:16:17.000000000","message":"from keystoneclient.v3.contrib import oauth1\n\nand use the package __init__ to expose everything in oauth1.core","commit_id":"a3e0aef6b61516992382eb68ac7940d3aa5acfcf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"eac0b19889587c6c9ca7e1ac2f8d9f30b651d1c2","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient import exceptions"},{"line_number":19,"context_line":"from keystoneclient import httpclient"},{"line_number":20,"context_line":"from keystoneclient.openstack.common import jsonutils"},{"line_number":21,"context_line":"from keystoneclient.v3.contrib.oauth1 import core as oauth1"},{"line_number":22,"context_line":"from keystoneclient.v3.contrib import trusts"},{"line_number":23,"context_line":"from keystoneclient.v3 import credentials"},{"line_number":24,"context_line":"from keystoneclient.v3 import domains"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F98CQ%3D","line":21,"in_reply_to":"AAAAUH%2F99BQ%3D","updated":"2014-01-31 21:39:31.000000000","message":"Done","commit_id":"a3e0aef6b61516992382eb68ac7940d3aa5acfcf"}],"keystoneclient/v3/contrib/oauth1/__init__.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from keystoneclient.v3.contrib.oauth1.core import *  # flake8: noqa"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FsAk%3D","line":13,"updated":"2014-03-04 17:35:47.000000000","message":"2 spaces! you get bonus points for that.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"}],"keystoneclient/v3/contrib/oauth1/access_tokens.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from __future__ import unicode_literals"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import oauthlib.oauth1 as oauth1"},{"line_number":19,"context_line":"import urlparse"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystoneclient import base"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zwM%3D","line":19,"updated":"2013-12-20 04:43:01.000000000","message":"pretty sure this needs to come from six for py3","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dcbd803e4cb396ceb765f9f1a64aaba1899a77bd","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from __future__ import unicode_literals"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import oauthlib.oauth1 as oauth1"},{"line_number":19,"context_line":"import urlparse"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from keystoneclient import base"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vQU%3D","line":19,"in_reply_to":"AAAATn%2F8zwM%3D","updated":"2013-12-20 21:51:53.000000000","message":"Done","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":40,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":41,"context_line":"                                         http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":45,"context_line":"        key \u003d credentials.get(\u0027oauth_token\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zvo%3D","line":42,"updated":"2013-12-20 04:43:01.000000000","message":"ah! i hate this P.O.S! Surely it makes sense that you can pass headers through the create() and other functions.\n\nI\u0027m sure you\u0027ve tested this but don\u0027t you need to do something with body from above?","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a5e68858a8e0f57da6e5baa45279f6546255bf20","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":40,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":41,"context_line":"                                         http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":45,"context_line":"        key \u003d credentials.get(\u0027oauth_token\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8u1M%3D","line":42,"in_reply_to":"AAAATn%2F8vF0%3D","updated":"2013-12-20 22:31:57.000000000","message":"I looked into using crudManagers create, and in the end, it doe call self.client.post, but i don\u0027t think you can pass header through it?","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dcbd803e4cb396ceb765f9f1a64aaba1899a77bd","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":40,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":41,"context_line":"                                         http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":45,"context_line":"        key \u003d credentials.get(\u0027oauth_token\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vF0%3D","line":42,"in_reply_to":"AAAATn%2F8zvo%3D","updated":"2013-12-20 21:51:53.000000000","message":"I didn\u0027t pass this through create() because it does the build_url bit, and goes to _create() at the client level which is apparently deprecated, in favor of post(). So i went right to post, but i\u0027ll take a second look at the build_url, maybe I can use it after all.\n\n2nd point - body from line 40? after the sign? no. the oauth parts are all in the headers.","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            expires \u003d credentials.get(\u0027oauth_expires_at\u0027)[0]"},{"line_number":52,"context_line":"            access_token[\u0027expires\u0027] \u003d expires"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        return access_token"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def authenticate(self, consumer_key, consumer_secret, access_key,"},{"line_number":57,"context_line":"                     access_secret):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8ztc%3D","line":54,"updated":"2013-12-20 04:43:01.000000000","message":"this should be returning an AccessToken object (they appear to have id\u0027s - we\u0027ll have to figure out how to change the other auto generated paths)","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ddea40c0077923c9f0159697b0d3f9ebc7a75431","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            expires \u003d credentials.get(\u0027oauth_expires_at\u0027)[0]"},{"line_number":52,"context_line":"            access_token[\u0027expires\u0027] \u003d expires"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        return access_token"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def authenticate(self, consumer_key, consumer_secret, access_key,"},{"line_number":57,"context_line":"                     access_secret):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8sr0%3D","line":54,"in_reply_to":"AAAATn%2F8ztc%3D","updated":"2013-12-31 05:42:18.000000000","message":"Done","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        keystone_token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":69,"context_line":"        keystone_token \u003d body.get(\u0027token\u0027)"},{"line_number":70,"context_line":"        keystone_token[\u0027X-Subject-Token\u0027] \u003d keystone_token_id"},{"line_number":71,"context_line":"        return keystone_token"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zuk%3D","line":71,"updated":"2013-12-20 04:43:01.000000000","message":"can we hold off on this until we\u0027ve got some form of auth plugins figured out? I think it makes more sense there. \n\nI probably need to talk to you a bit more to figure out what the restrictions on oauth are (how long does it last - can we auto refresh with oauth) and how you pass an oauth token around to authenticate a client.\n\nAt the very least you should look here at returning an AccessInfo object.","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b011ab6cce7a2b5b864734cf2d06b89da7cf98f1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        keystone_token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":69,"context_line":"        keystone_token \u003d body.get(\u0027token\u0027)"},{"line_number":70,"context_line":"        keystone_token[\u0027X-Subject-Token\u0027] \u003d keystone_token_id"},{"line_number":71,"context_line":"        return keystone_token"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vBk%3D","line":71,"in_reply_to":"AAAATn%2F8vFg%3D","updated":"2013-12-20 21:58:12.000000000","message":"Nope, you meant AccessInfo, looking into that now","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dcbd803e4cb396ceb765f9f1a64aaba1899a77bd","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        keystone_token_id \u003d resp.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":69,"context_line":"        keystone_token \u003d body.get(\u0027token\u0027)"},{"line_number":70,"context_line":"        keystone_token[\u0027X-Subject-Token\u0027] \u003d keystone_token_id"},{"line_number":71,"context_line":"        return keystone_token"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vFg%3D","line":71,"in_reply_to":"AAAATn%2F8zuk%3D","updated":"2013-12-20 21:51:53.000000000","message":"Hmm, it would make sense there, but i\u0027d rather not hold anything up.\n\nNo refreshing either token, once a request token is used to get an access token, it\u0027s deleted. \nYou can use the access token to get keystone tokens as often as you like, until the expiration time hits, (decided in the servers .conf file)\n\nDo you mean an AccessToken object?","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c0134b174eda775f504f697dc869b633ad18e7d4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def create(self, consumer_key\u003dNone, consumer_secret\u003dNone,"},{"line_number":33,"context_line":"               request_key\u003dNone, request_secret\u003dNone, verifier\u003dNone):"},{"line_number":34,"context_line":"        if not consumer_key or not consumer_secret:"},{"line_number":35,"context_line":"            msg \u003d \u0027Missing consumer key or secret\u0027"},{"line_number":36,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":37,"context_line":"        if not request_key or not request_secret:"},{"line_number":38,"context_line":"            msg \u003d \u0027Missing request key or secret\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2F29Q%3D","line":35,"updated":"2014-03-03 19:09:20.000000000","message":"do these message have to be wrapped? \n\n    msg \u003d _(\u0027Missing consumer key or secret\u0027)","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9441d7ff02f9b0811b0172537e5282fd5e15507a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def create(self, consumer_key\u003dNone, consumer_secret\u003dNone,"},{"line_number":33,"context_line":"               request_key\u003dNone, request_secret\u003dNone, verifier\u003dNone):"},{"line_number":34,"context_line":"        if not consumer_key or not consumer_secret:"},{"line_number":35,"context_line":"            msg \u003d \u0027Missing consumer key or secret\u0027"},{"line_number":36,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":37,"context_line":"        if not request_key or not request_secret:"},{"line_number":38,"context_line":"            msg \u003d \u0027Missing request key or secret\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2F25Q%3D","line":35,"in_reply_to":"AAAAVn%2F%2F26E%3D","updated":"2014-03-03 19:13:39.000000000","message":"Cool, good to know. Thanks!","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"77ea2ccbe191df130dc4e98593bb5e07a6a3f197","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def create(self, consumer_key\u003dNone, consumer_secret\u003dNone,"},{"line_number":33,"context_line":"               request_key\u003dNone, request_secret\u003dNone, verifier\u003dNone):"},{"line_number":34,"context_line":"        if not consumer_key or not consumer_secret:"},{"line_number":35,"context_line":"            msg \u003d \u0027Missing consumer key or secret\u0027"},{"line_number":36,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":37,"context_line":"        if not request_key or not request_secret:"},{"line_number":38,"context_line":"            msg \u003d \u0027Missing request key or secret\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2F26E%3D","line":35,"in_reply_to":"AAAAVn%2F%2F29Q%3D","updated":"2014-03-03 19:12:17.000000000","message":"I thought the current status was that we don\u0027t do translation for client side stuff.","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c2391a105e21cf460705330228a9e01d5ed429be","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":40,"context_line":"        if not verifier:"},{"line_number":41,"context_line":"            msg \u003d \u0027Specify an OAuth verifier code\u0027"},{"line_number":42,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # sign the request using oauthlib"},{"line_number":45,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVn%2F%2Fbj4%3D","line":42,"updated":"2014-03-06 04:54:50.000000000","message":"why can\u0027t all these just be required vars?","commit_id":"0cc0c164d11331abf044ca70fb7b9617921b0264"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4b46bdd0d41893ab3f238f71427dc38847cf581e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":40,"context_line":"        if not verifier:"},{"line_number":41,"context_line":"            msg \u003d \u0027Specify an OAuth verifier code\u0027"},{"line_number":42,"context_line":"            raise exceptions.ValidationError(msg)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        # sign the request using oauthlib"},{"line_number":45,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVn%2F%2FbYE%3D","line":42,"in_reply_to":"AAAAVn%2F%2Fbj4%3D","updated":"2014-03-06 05:52:51.000000000","message":"Done","commit_id":"0cc0c164d11331abf044ca70fb7b9617921b0264"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6afe91311ae9be67e8666fd7880ce5c8112d1ec1","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from __future__ import absolute_import"},{"line_number":15,"context_line":"from __future__ import unicode_literals"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import oauthlib.oauth1 as oauth1"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2ByEo%3D","line":14,"updated":"2014-03-12 07:24:50.000000000","message":"Is absolute_import required? I\u0027m not seeing how this impacts anything in this code.","commit_id":"2e01d0446562ec2e33f6c2dba4b007d45475229e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb567da120ea169f0c477c2ebb8eab555d098782","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from __future__ import absolute_import"},{"line_number":15,"context_line":"from __future__ import unicode_literals"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import oauthlib.oauth1 as oauth1"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAWH%2F%2F8yY%3D","line":14,"in_reply_to":"AAAAVn%2F%2ByEo%3D","updated":"2014-03-12 18:27:20.000000000","message":"let me take a look at this","commit_id":"2e01d0446562ec2e33f6c2dba4b007d45475229e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6afe91311ae9be67e8666fd7880ce5c8112d1ec1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"               request_secret, verifier):"},{"line_number":33,"context_line":"        # sign the request using oauthlib"},{"line_number":34,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":35,"context_line":"        client \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":36,"context_line":"                               resource_owner_key\u003drequest_key,"},{"line_number":37,"context_line":"                               resource_owner_secret\u003drequest_secret,"},{"line_number":38,"context_line":"                               signature_method\u003doauth1.SIGNATURE_HMAC,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2ByDk%3D","line":35,"updated":"2014-03-12 07:24:50.000000000","message":"NIT: I\u0027d prefer this being named \"oauth_client\" vs \"client\" just because you have self.client as well.","commit_id":"2e01d0446562ec2e33f6c2dba4b007d45475229e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bb567da120ea169f0c477c2ebb8eab555d098782","unresolved":false,"context_lines":[{"line_number":32,"context_line":"               request_secret, verifier):"},{"line_number":33,"context_line":"        # sign the request using oauthlib"},{"line_number":34,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/access_token\u0027"},{"line_number":35,"context_line":"        client \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret,"},{"line_number":36,"context_line":"                               resource_owner_key\u003drequest_key,"},{"line_number":37,"context_line":"                               resource_owner_secret\u003drequest_secret,"},{"line_number":38,"context_line":"                               signature_method\u003doauth1.SIGNATURE_HMAC,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAWH%2F%2F8xU%3D","line":35,"in_reply_to":"AAAAVn%2F%2ByDk%3D","updated":"2014-03-12 18:27:20.000000000","message":"ah right, i changed it to \u0027oc\u0027 here, for the same reason: https://review.openstack.org/#/c/77977/7/keystoneclient/auth/identity/v3.py\n\nI can do the same here if i wind up with a new patch","commit_id":"2e01d0446562ec2e33f6c2dba4b007d45475229e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ef4f380d532285c40526ade55abcf2c4460174e4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                                     resource_owner_secret\u003drequest_secret,"},{"line_number":38,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":39,"context_line":"                                     verifier\u003dverifier)"},{"line_number":40,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":41,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # actually send the request"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F6tc%3D","line":40,"updated":"2014-03-12 23:37:52.000000000","message":"do you want auth_url here or management_url?\n\nhave a look at the _cs_request function on the client that adds the token - it will probably send you to the management url.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"93862de1bb551c558ed8e76b5384cb7a4e197959","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                                     resource_owner_secret\u003drequest_secret,"},{"line_number":38,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":39,"context_line":"                                     verifier\u003dverifier)"},{"line_number":40,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":41,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # actually send the request"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F4ao%3D","line":40,"in_reply_to":"AAAAWH%2F%2F5SY%3D","updated":"2014-03-13 06:51:20.000000000","message":"If I change this to mangement_url, then the signature verification fails because the port is wrong. On the server side, it\u0027s looking for public_endpoint, which would be 5000, and the management_url gives it 35357. \n\nThat being said, some tweaking might be required if https://review.openstack.org/#/c/78068/6 lands.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9420001b21508486f519cdf51338282bc347b4d0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                                     resource_owner_secret\u003drequest_secret,"},{"line_number":38,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":39,"context_line":"                                     verifier\u003dverifier)"},{"line_number":40,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":41,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # actually send the request"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F5SY%3D","line":40,"in_reply_to":"AAAAWH%2F%2F6tc%3D","updated":"2014-03-13 04:23:41.000000000","message":"I\u0027ll double check this. On the server side, it has to match:\n\n(CONF.public_endpoint % CONF) + \"v3\" + \u0027/OS-OAUTH1/access_token\u0027","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"58cdbcbcfae8cdae5ea2c78de8e44cd607b11228","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        credentials \u003d urlparse.parse_qs(body)"},{"line_number":50,"context_line":"        key \u003d credentials[\u0027oauth_token\u0027][0]"},{"line_number":51,"context_line":"        secret \u003d credentials[\u0027oauth_token_secret\u0027][0]"},{"line_number":52,"context_line":"        access_token \u003d {\u0027access_key\u0027: key, \u0027id\u0027: key,"},{"line_number":53,"context_line":"                        \u0027access_secret\u0027: secret}"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        if credentials.get(\u0027oauth_expires_at\u0027):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F4ZQ%3D","line":52,"updated":"2014-03-13 06:53:09.000000000","message":"nit, i should probably change this to just key, and secret instead of access_key and access_secret. It\u0027s already an access_token object after all.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ef4f380d532285c40526ade55abcf2c4460174e4","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":57,"context_line":"            access_token[\u0027expires\u0027] \u003d expires"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        return self.resource_class(self, access_token)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F6uU%3D","line":59,"updated":"2014-03-12 23:37:52.000000000","message":"by inheriting base.CrudManager you also get a get(), list(), head() etc method. \n\nI realize that we have other managers that don\u0027t support these operations and still have the public method,  just thought you should know.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9420001b21508486f519cdf51338282bc347b4d0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            expires \u003d credentials[\u0027oauth_expires_at\u0027][0]"},{"line_number":57,"context_line":"            access_token[\u0027expires\u0027] \u003d expires"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        return self.resource_class(self, access_token)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F5SU%3D","line":59,"in_reply_to":"AAAAWH%2F%2F6uU%3D","updated":"2014-03-13 04:23:41.000000000","message":"Thanks for the heads up.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"}],"keystoneclient/v3/contrib/oauth1/consumers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    key \u003d \u0027consumer\u0027"},{"line_number":32,"context_line":"    base_url \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def create(self, description\u003dNone, **kwargs):"},{"line_number":35,"context_line":"        return super(ConsumerManager, self).create("},{"line_number":36,"context_line":"            description\u003ddescription,"},{"line_number":37,"context_line":"            **kwargs)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FrxY%3D","line":34,"updated":"2014-03-04 17:35:47.000000000","message":"I don\u0027t know what the convention is in the client, but it seems like it would be useful to spell out the keyword args instead or just accepting kwargs. Is there something higher update check these kwargs against a known list?","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03d676da5bd8d4adb56fdb07438dbdab5f1c8276","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    key \u003d \u0027consumer\u0027"},{"line_number":32,"context_line":"    base_url \u003d \u0027/OS-OAUTH1\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def create(self, description\u003dNone, **kwargs):"},{"line_number":35,"context_line":"        return super(ConsumerManager, self).create("},{"line_number":36,"context_line":"            description\u003ddescription,"},{"line_number":37,"context_line":"            **kwargs)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FrAw%3D","line":34,"in_reply_to":"AAAAVn%2F%2FrxY%3D","updated":"2014-03-04 18:42:02.000000000","message":"I believe this is the normal convention:\n\nhttps://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v3/roles.py#L75\n\nand\n\nhttps://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v3/contrib/trusts.py#L38","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"16158a82d8e09dcdc4a5048b207b4f37a5ad2c20","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        return super(ConsumerManager, self).get("},{"line_number":41,"context_line":"            consumer_id\u003dbase.getid(consumer))"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def update(self, consumer, description\u003dNone, **kwargs):"},{"line_number":44,"context_line":"        return super(ConsumerManager, self).update("},{"line_number":45,"context_line":"            consumer_id\u003dbase.getid(consumer),"},{"line_number":46,"context_line":"            description\u003ddescription,"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVn%2F%2FrxM%3D","line":43,"updated":"2014-03-04 17:35:47.000000000","message":"Same as above","commit_id":"26a83f7baa7e540d2135982439886f64ea7f72e7"}],"keystoneclient/v3/contrib/oauth1/request_tokens.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class RequestToken(base.Resource):"},{"line_number":25,"context_line":"    pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RequestTokenManager(base.CrudManager):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zsM%3D","line":25,"updated":"2013-12-20 04:43:01.000000000","message":"ideally we add a function here:\n\ndef authorize(self, role_ids): \n    self.manager.authorize(self, role_ids)","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ddea40c0077923c9f0159697b0d3f9ebc7a75431","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class RequestToken(base.Resource):"},{"line_number":25,"context_line":"    pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class RequestTokenManager(base.CrudManager):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8sr4%3D","line":25,"in_reply_to":"AAAATn%2F8zsM%3D","updated":"2013-12-31 05:42:18.000000000","message":"Done","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":35,"context_line":"        body \u003d {}"},{"line_number":36,"context_line":"        role_list \u003d list()"},{"line_number":37,"context_line":"        for role_id in role_ids.split():"},{"line_number":38,"context_line":"            obj \u003d {}"},{"line_number":39,"context_line":"            obj[\u0027id\u0027] \u003d role_id"},{"line_number":40,"context_line":"            role_list.append(obj)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zsU%3D","line":37,"updated":"2013-12-20 04:43:01.000000000","message":"split? why don\u0027t you take an actual list of possible role objects then obj[\u0027id\u0027] \u003d base.getid(role)","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dcbd803e4cb396ceb765f9f1a64aaba1899a77bd","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/authorize/%s\u0027 % (request_id)"},{"line_number":35,"context_line":"        body \u003d {}"},{"line_number":36,"context_line":"        role_list \u003d list()"},{"line_number":37,"context_line":"        for role_id in role_ids.split():"},{"line_number":38,"context_line":"            obj \u003d {}"},{"line_number":39,"context_line":"            obj[\u0027id\u0027] \u003d role_id"},{"line_number":40,"context_line":"            role_list.append(obj)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vFA%3D","line":37,"in_reply_to":"AAAATn%2F8zsU%3D","updated":"2013-12-20 21:51:53.000000000","message":"sure, i can do that.","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for role_id in role_ids.split():"},{"line_number":38,"context_line":"            obj \u003d {}"},{"line_number":39,"context_line":"            obj[\u0027id\u0027] \u003d role_id"},{"line_number":40,"context_line":"            role_list.append(obj)"},{"line_number":41,"context_line":"        body[\u0027roles\u0027] \u003d role_list"},{"line_number":42,"context_line":"        return self._put(endpoint, body, \"token\")"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zsQ%3D","line":40,"updated":"2013-12-20 04:43:01.000000000","message":"also this whole thing looks like:\n\nbody \u003d { \u0027roles\u0027: [ {\u0027id\u0027: r_id} for r_id in role_ids.split()] }\n\nor \n\nbody \u003d { \u0027roles\u0027: [ {\u0027id\u0027: base.getid(r_id)} for r_id in role_ids] }","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dcbd803e4cb396ceb765f9f1a64aaba1899a77bd","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for role_id in role_ids.split():"},{"line_number":38,"context_line":"            obj \u003d {}"},{"line_number":39,"context_line":"            obj[\u0027id\u0027] \u003d role_id"},{"line_number":40,"context_line":"            role_list.append(obj)"},{"line_number":41,"context_line":"        body[\u0027roles\u0027] \u003d role_list"},{"line_number":42,"context_line":"        return self._put(endpoint, body, \"token\")"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8vEs%3D","line":40,"in_reply_to":"AAAATn%2F8zsQ%3D","updated":"2013-12-20 21:51:53.000000000","message":"it looks like that because it is, i\u0027ll change it to your optimized version.","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"75328413caf0d3a728d79aa51b061974bfd6a15d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            expires \u003d credentials.get(\u0027oauth_expires_at\u0027)[0]"},{"line_number":62,"context_line":"            request_token[\u0027expires\u0027] \u003d expires"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        return request_token"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8zsc%3D","line":64,"updated":"2013-12-20 04:43:01.000000000","message":"return RequestToken object","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ddea40c0077923c9f0159697b0d3f9ebc7a75431","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            expires \u003d credentials.get(\u0027oauth_expires_at\u0027)[0]"},{"line_number":62,"context_line":"            request_token[\u0027expires\u0027] \u003d expires"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        return request_token"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8sr8%3D","line":64,"in_reply_to":"AAAATn%2F8zsc%3D","updated":"2013-12-31 05:42:18.000000000","message":"Done","commit_id":"1e6bb872551ceb65f1accbb8a7a1257cb1be66fc"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8f948c46be2bad7bc7ffb5b2df5c27e214b63ef2","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":44,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":45,"context_line":"                                         http_method\u003d\u0027POST\u0027,"},{"line_number":46,"context_line":"                                         headers\u003dheaders)"},{"line_number":47,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        credentials \u003d urlparse.parse_qs(body)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fd3s%3D","line":46,"updated":"2014-01-13 15:57:12.000000000","message":"If you do it that way, the requested_project_id doesn\u0027t get used to generate the signature, as we\u0027d like it to be for extra security, since only headers starting with \"OAuth\" are taken into account.\nThe requested project id should either be passed as a url query string or as body entity, at least when generating the signature, since you don\u0027t seem to pass body generated by client.sign() along later anyway.","commit_id":"eb126409d60888e179ad28ef6fe5e07b21e0609d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"19dc6514ae34d369328e4c86d3ba5332e1381df9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":44,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":45,"context_line":"                                         http_method\u003d\u0027POST\u0027,"},{"line_number":46,"context_line":"                                         headers\u003dheaders)"},{"line_number":47,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        credentials \u003d urlparse.parse_qs(body)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2Fdkk%3D","line":46,"in_reply_to":"AAAAUH%2F%2Fd3s%3D","updated":"2014-01-13 16:45:28.000000000","message":"i\u0027m not entirely convinced that the project_id needs to be used in the signature, seems like over-kill? \n\nIf we change it to url query string, then that is a bit more for the server side, but not much.","commit_id":"eb126409d60888e179ad28ef6fe5e07b21e0609d"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"ba69f9d9890e54db722facc681d7ac8843f84d99","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":44,"context_line":"        url, headers, body \u003d client.sign(self.client.auth_url + endpoint,"},{"line_number":45,"context_line":"                                         http_method\u003d\u0027POST\u0027,"},{"line_number":46,"context_line":"                                         headers\u003dheaders)"},{"line_number":47,"context_line":"        resp, body \u003d self.client.post(endpoint, headers\u003dheaders)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        credentials \u003d urlparse.parse_qs(body)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FdYE%3D","line":46,"in_reply_to":"AAAAUH%2F%2Fdkk%3D","updated":"2014-01-13 17:22:27.000000000","message":"I am fine with keeping it in the headers and leaving it out of the signing.","commit_id":"eb126409d60888e179ad28ef6fe5e07b21e0609d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c2391a105e21cf460705330228a9e01d5ed429be","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\"Manager class for manipulating Identity OAuth Request Tokens.\"\"\""},{"line_number":31,"context_line":"    resource_class \u003d RequestToken"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def authorize(self, request_token\u003dNone, roles\u003dNone):"},{"line_number":34,"context_line":"        if not request_token:"},{"line_number":35,"context_line":"            msg \u003d \u0027Missing request token key\u0027"},{"line_number":36,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVn%2F%2FbjE%3D","line":33,"updated":"2014-03-06 04:54:50.000000000","message":"can\u0027t these be required?","commit_id":"0cc0c164d11331abf044ca70fb7b9617921b0264"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4b46bdd0d41893ab3f238f71427dc38847cf581e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\"Manager class for manipulating Identity OAuth Request Tokens.\"\"\""},{"line_number":31,"context_line":"    resource_class \u003d RequestToken"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def authorize(self, request_token\u003dNone, roles\u003dNone):"},{"line_number":34,"context_line":"        if not request_token:"},{"line_number":35,"context_line":"            msg \u003d \u0027Missing request token key\u0027"},{"line_number":36,"context_line":"            raise exceptions.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVn%2F%2FbWg%3D","line":33,"in_reply_to":"AAAAVn%2F%2FbjE%3D","updated":"2014-03-06 05:52:51.000000000","message":"making these required args, and removing the malicious tests, since they seem rather pointless now","commit_id":"0cc0c164d11331abf044ca70fb7b9617921b0264"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6afe91311ae9be67e8666fd7880ce5c8112d1ec1","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":12,"context_line":"# limitations under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from __future__ import absolute_import"},{"line_number":15,"context_line":"from __future__ import unicode_literals"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import oauthlib.oauth1 as oauth1"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2ByEk%3D","line":14,"updated":"2014-03-12 07:24:50.000000000","message":"Again not sure if this is needed. Perhaps this is predating oauthlib","commit_id":"2e01d0446562ec2e33f6c2dba4b007d45475229e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"ef4f380d532285c40526ade55abcf2c4460174e4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                     client_secret\u003dconsumer_secret,"},{"line_number":43,"context_line":"                                     signature_method\u003doauth1.SIGNATURE_HMAC,"},{"line_number":44,"context_line":"                                     callback_uri\u003d\"oob\")"},{"line_number":45,"context_line":"        url \u003d self.client.auth_url + endpoint"},{"line_number":46,"context_line":"        url, headers, body \u003d oauth_client.sign(url, http_method\u003d\u0027POST\u0027,"},{"line_number":47,"context_line":"                                               headers\u003dheaders)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAWH%2F%2F6tM%3D","line":45,"updated":"2014-03-12 23:37:52.000000000","message":"again auth_url vs management_url - this seems like something you should be verify on the server side.","commit_id":"2e7bdb872e9660178451f71b35976a980f047300"}]}
