)]}'
{"keystone/auth/plugins/oauth1.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec2e4f70c851f0c8a3b218c59e999ac6bf93ec9","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def authenticate(self, context, auth_info, auth_context):"},{"line_number":37,"context_line":"        \"\"\"Turn a signed request with an access key into a keystone token.\"\"\""},{"line_number":38,"context_line":"        headers \u003d context[\u0027headers\u0027]"},{"line_number":39,"context_line":"        oauth_headers \u003d oauth.get_oauth_headers(headers)"},{"line_number":40,"context_line":"        access_token_id \u003d oauth_headers.get(\u0027oauth_token\u0027)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FRnk%3D","line":38,"updated":"2014-01-15 15:49:55.000000000","message":"ahh, headers are already called here too!","commit_id":"09d9cdc20458f5b06d2e9bd03cfc1e2b1020e3ce"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"480b9453331ef756b5dd84def41acc3c9fab64cf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            realms\u003dNone"},{"line_number":67,"context_line":"        )"},{"line_number":68,"context_line":"        if not result:"},{"line_number":69,"context_line":"            msg \u003d _(\"Could not validate the access token\")"},{"line_number":70,"context_line":"            raise exception.Unauthorized(msg)"},{"line_number":71,"context_line":"        auth_context[\u0027user_id\u0027] \u003d acc_token[\u0027authorizing_user_id\u0027]"},{"line_number":72,"context_line":"        auth_context[\u0027access_token_id\u0027] \u003d access_token_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FMW0%3D","line":69,"updated":"2014-01-16 15:46:16.000000000","message":"Use single quotes instead of double quotes when possible","commit_id":"efde820e2f664751a3e4d01dc35507383c59b1e9"}],"keystone/contrib/oauth1/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4db0cfc34ce22b28ba95d0e996ead0e98dd1b581","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def create_request_token(self, consumer_id, project_id, token_duration,"},{"line_number":166,"context_line":"                             request_token_id\u003duuid.uuid4().hex,"},{"line_number":167,"context_line":"                             request_token_secret\u003duuid.uuid4().hex):"},{"line_number":168,"context_line":"        expiry_date \u003d None"},{"line_number":169,"context_line":"        if token_duration:"},{"line_number":170,"context_line":"            now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FMTs%3D","line":167,"updated":"2014-01-16 15:45:22.000000000","message":"-2: these are only evaluated once, so the same request_token_secret will always be used until keystone is restarted","commit_id":"efde820e2f664751a3e4d01dc35507383c59b1e9"}],"keystone/contrib/oauth1/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2d94b9bf65f5afded7b537deddffacdd9570f73c","unresolved":false,"context_lines":[{"line_number":370,"context_line":"#            http_method\u003d\u0027POST\u0027,"},{"line_number":371,"context_line":"#            body\u003dcontext[\u0027query_string\u0027],"},{"line_number":372,"context_line":"#            headers\u003dcontext[\u0027headers\u0027],"},{"line_number":373,"context_line":"#            credentials\u003d{\u0027requested_project_id\u0027: requested_project_id})"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        request_token_duration \u003d CONF.oauth1.request_token_duration"},{"line_number":376,"context_line":"        token_ref \u003d self.oauth_api.create_request_token(consumer_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAT3%2F%2Fwhc%3D","line":373,"updated":"2014-01-02 08:50:11.000000000","message":"You can take a look at how I am calling the endpoints here:\nhttps://review.openstack.org/#/c/60820/2/keystoneclient/v3/contrib/oauth1/request_tokens.py\n\nOne thing I\u0027m a bit confused about it how to add in the extra \u0027requested_project_id\u0027 header in the client side, an issue you will run into when updating the tests too. \n\nIf we don\u0027t end up adding the project id as an extra header, then you can remove the entire credentials part here","commit_id":"fd074d4c240fb696220fcad694b636aa87d62d72"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"69f170327b100b42d9ee7eb4889827b34ce7e871","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        url \u003d oauth1.rebuild_url(context[\u0027path\u0027])"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        validator \u003d OAuthValidator()"},{"line_number":183,"context_line":"        req_headers \u003d {\u0027Requested-Project-Id\u0027: requested_project_id}"},{"line_number":184,"context_line":"        req_headers.update(context[\u0027headers\u0027])"},{"line_number":185,"context_line":"        request_verifier \u003d oauth1.RTokenEndpoint("},{"line_number":186,"context_line":"            request_validator\u003dvalidator,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2FWo8%3D","line":183,"updated":"2014-01-14 18:16:18.000000000","message":"@steve: as mentioned earlier I am leaving requested_project_id out of the signing process.","commit_id":"c82ba608cb63b475addcfba1914f4bc1a7eec04d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a1d1085172101c8cce6a2a70c0b5f4d30d457686","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    collection_name \u003d \u0027not_used\u0027"},{"line_number":166,"context_line":"    member_name \u003d \u0027not_used\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def create_request_token(self, context):"},{"line_number":169,"context_line":"        headers \u003d context[\u0027headers\u0027]"},{"line_number":170,"context_line":"        oauth_headers \u003d oauth1.get_oauth_headers(headers)"},{"line_number":171,"context_line":"        consumer_id \u003d oauth_headers.get(\u0027oauth_consumer_key\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FR%2BI%3D","line":168,"updated":"2014-01-15 14:56:03.000000000","message":"as a heads up, the headers from context are already called here, so no need to call them again @ line 184. \n\nor remove this line.","commit_id":"3704474e59d5e3c0439d9452a93551a708cf6c18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a1d1085172101c8cce6a2a70c0b5f4d30d457686","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        return response"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def create_access_token(self, context):"},{"line_number":219,"context_line":"        headers \u003d context[\u0027headers\u0027]"},{"line_number":220,"context_line":"        oauth_headers \u003d oauth1.get_oauth_headers(headers)"},{"line_number":221,"context_line":"        consumer_id \u003d oauth_headers.get(\u0027oauth_consumer_key\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FR88%3D","line":218,"updated":"2014-01-15 14:56:03.000000000","message":"also, again here, and line 256","commit_id":"3704474e59d5e3c0439d9452a93551a708cf6c18"}],"keystone/contrib/oauth1/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27e8f379559637e44f6af051c90173bb04a13a9c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"AccessTokenEndpoint \u003d oauth1.AccessTokenEndpoint"},{"line_number":50,"context_line":"ResourceEndpoint \u003d oauth1.ResourceEndpoint"},{"line_number":51,"context_line":"AuthorizationEndpoint \u003d oauth1.AuthorizationEndpoint"},{"line_number":52,"context_line":"hmac_sha1 \u003d signature"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"RTokenEndpoint \u003d oauth1.RequestTokenEndpoint"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fd4o%3D","line":52,"updated":"2014-01-13 15:50:46.000000000","message":"i can\u0027t tell if this is used anywhere, it should be capitalized though.","commit_id":"3277efb3ccddfd72e8d11b87c7af9693417f834a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27e8f379559637e44f6af051c90173bb04a13a9c","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"def extract_non_oauth_params(query_string):"},{"line_number":141,"context_line":"    params \u003d extract_params(query_string)"},{"line_number":142,"context_line":"    return dict([(k, v) for k, v in params if not k.startswith(\u0027oauth_\u0027)])    "},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"@dependency.provider(\u0027oauth_api\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fd4U%3D","line":142,"updated":"2014-01-13 15:50:46.000000000","message":"whitespace","commit_id":"3277efb3ccddfd72e8d11b87c7af9693417f834a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a1d1085172101c8cce6a2a70c0b5f4d30d457686","unresolved":false,"context_lines":[{"line_number":38,"context_line":"ResourceEndpoint \u003d oauth1.ResourceEndpoint"},{"line_number":39,"context_line":"AuthorizationEndpoint \u003d oauth1.AuthorizationEndpoint"},{"line_number":40,"context_line":"SIG_HMAC \u003d oauth1.SIGNATURE_HMAC"},{"line_number":41,"context_line":"RTokenEndpoint \u003d oauth1.RequestTokenEndpoint"},{"line_number":42,"context_line":"oRequest \u003d oauthlib.common.Request"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F%2FR8o%3D","line":41,"updated":"2014-01-15 14:56:03.000000000","message":"I\u0027m being picky, but can we call this RequestTokenEndpoint instead of RTokenEndpoint?","commit_id":"3704474e59d5e3c0439d9452a93551a708cf6c18"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec2e4f70c851f0c8a3b218c59e999ac6bf93ec9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"AccessTokenEndpoint \u003d oauth1.AccessTokenEndpoint"},{"line_number":38,"context_line":"ResourceEndpoint \u003d oauth1.ResourceEndpoint"},{"line_number":39,"context_line":"AuthorizationEndpoint \u003d oauth1.AuthorizationEndpoint"},{"line_number":40,"context_line":"SIG_HMAC \u003d oauth1.SIGNATURE_HMAC"},{"line_number":41,"context_line":"RequestTokenEndpoint \u003d oauth1.RequestTokenEndpoint"},{"line_number":42,"context_line":"oRequest \u003d oauthlib.common.Request"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FRoQ%3D","line":40,"updated":"2014-01-15 15:49:55.000000000","message":"is this used at all?","commit_id":"09d9cdc20458f5b06d2e9bd03cfc1e2b1020e3ce"}],"keystone/contrib/oauth1/validator.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7de0154eb2c196c6d4e430f8e023643a0321d4c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystone.openstack.common import log"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"METHOD_NAME \u003d \u0027oauth_validator\u0027"},{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FL5o%3D","line":25,"updated":"2014-01-16 17:03:28.000000000","message":"I don\u0027t see this used anywhere.  Is it needed?","commit_id":"71bd9f8fe67e5828cafa289faf556d7675dcaa32"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7de0154eb2c196c6d4e430f8e023643a0321d4c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def invalidate_request_token(self, client_key, request_token, request):"},{"line_number":97,"context_line":"        # this method is invoked when an access token is generated out of a"},{"line_number":98,"context_line":"        # request token, to make sure that request token cannot be consumed"},{"line_number":99,"context_line":"        # anymore. This is done somewhere else, so we do nothing here."},{"line_number":100,"context_line":"        pass"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def validate_client_key(self, client_key, request):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FL6Y%3D","line":99,"updated":"2014-01-16 17:03:28.000000000","message":"Can we add a comment about where this happens?  Feels like we should know this for security auditing purposes.","commit_id":"71bd9f8fe67e5828cafa289faf556d7675dcaa32"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a7de0154eb2c196c6d4e430f8e023643a0321d4c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    def verify_realms(self, token, realms, request):"},{"line_number":157,"context_line":"        return True"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    # the following save_XXX methods are called to create tokens. I chose to"},{"line_number":160,"context_line":"    # keep the original logic, but comments show how that could be"},{"line_number":161,"context_line":"    # implemented."},{"line_number":162,"context_line":"    def save_access_token(self, token, request):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FL58%3D","line":159,"updated":"2014-01-16 17:03:28.000000000","message":"Do we really not need the implementations below?","commit_id":"71bd9f8fe67e5828cafa289faf556d7675dcaa32"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"4f8ea54d0fb2fa2bb146141f290a9764340626a0","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    # The following save_XXX methods are called to create tokens. I chose to"},{"line_number":160,"context_line":"    # keep the original logic, but the comments below show how that could be"},{"line_number":161,"context_line":"    # implemented. The real implementation logic is in the backend."},{"line_number":162,"context_line":"    def save_access_token(self, token, request):"},{"line_number":163,"context_line":"        pass"},{"line_number":164,"context_line":"#        token_duration \u003d CONF.oauth1.request_token_duration"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FLOg%3D","line":161,"updated":"2014-01-16 18:15:33.000000000","message":"Shouldn\u0027t those comments be removed?","commit_id":"c66c307496f515cbb50a0e5d6ee1cd07d75ea63a"}],"keystone/tests/test_v3_oauth1.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"27e8f379559637e44f6af051c90173bb04a13a9c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                                                      **kw)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _create_request_token(self, consumer, project_id):"},{"line_number":69,"context_line":"        params \u003d {\u0027requested_project_id\u0027: project_id,"},{"line_number":70,"context_line":"                  \u0027oauth_callback\u0027: \"oob\"}"},{"line_number":71,"context_line":"        headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027}"},{"line_number":72,"context_line":"        url \u003d \u0027/OS-OAUTH1/request_token\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fd6s%3D","line":69,"updated":"2014-01-13 15:50:46.000000000","message":"I feel, that when you switch the using oauthlib in the tests, then the hack on the server side will likely be removed. I think there is a bug in the way the signing of extra non-oauth params is done (using the old lib).\n\nTo help you get started on the test port ... \n\n\n client \u003d oauth1.Client(consumer_key, client_secret\u003dconsumer_secret, signature_method\u003doauth1.SIGNATURE_HMAC)\n endpoint \u003d \u0027/OS-OAUTH1/request_token\u0027\n headers \u003d {\u0027requested_project_id\u0027: project_id}\n url, headers, body \u003d client.sign(self.base_url + endpoint, http_method\u003d\u0027POST\u0027, headers\u003dheaders)\n\nYou can get rid of the _oauth_request() function now, i think","commit_id":"3277efb3ccddfd72e8d11b87c7af9693417f834a"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d26698ef74ae72788e70007b370d585df304d359","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        consumer \u003d oauth1.Consumer(consumer_id, \"bad_secret\")"},{"line_number":465,"context_line":"        url, headers \u003d self._create_request_token(consumer,"},{"line_number":466,"context_line":"                                                  self.project_id)"},{"line_number":467,"context_line":"        self.post(url, headers\u003dheaders, expected_status\u003d401)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_bad_request_token_key(self):"},{"line_number":470,"context_line":"        consumer \u003d self._create_single_consumer()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2FfmU%3D","line":467,"updated":"2014-01-13 10:58:08.000000000","message":"Any reason why providing an incorrect secret was handled as a server-side error (500) before this ?","commit_id":"3277efb3ccddfd72e8d11b87c7af9693417f834a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"651f978b170ecf10306fcffa9c2392d222f12dfe","unresolved":false,"context_lines":[{"line_number":464,"context_line":"        consumer \u003d oauth1.Consumer(consumer_id, \"bad_secret\")"},{"line_number":465,"context_line":"        url, headers \u003d self._create_request_token(consumer,"},{"line_number":466,"context_line":"                                                  self.project_id)"},{"line_number":467,"context_line":"        self.post(url, headers\u003dheaders, expected_status\u003d401)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"    def test_bad_request_token_key(self):"},{"line_number":470,"context_line":"        consumer \u003d self._create_single_consumer()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2Fdqo%3D","line":467,"in_reply_to":"AAAAUH%2F%2FfmU%3D","updated":"2014-01-13 16:23:04.000000000","message":"Because with the old library the _check_signature method would have raised a RuntimeError https://github.com/simplegeo/python-oauth2/blob/master/oauth2/__init__.py#L767\n\nand \n\nhttps://github.com/simplegeo/python-oauth2/blob/master/oauth2/__init__.py#L57","commit_id":"3277efb3ccddfd72e8d11b87c7af9693417f834a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"96dac63f69f150ff4eef51ac6ed169d4b2be4048","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        endpoint \u003d \u0027/OS-OAUTH1/request_token\u0027"},{"line_number":66,"context_line":"        client \u003d oauth1.Client(consumer[\u0027key\u0027],"},{"line_number":67,"context_line":"                               client_secret\u003dconsumer[\u0027secret\u0027],"},{"line_number":68,"context_line":"                               signature_method\u003doauth1.SIG_HMAC,"},{"line_number":69,"context_line":"                               callback_uri\u003d\"oob\")"},{"line_number":70,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":71,"context_line":"        url, headers, body \u003d client.sign(self.base_url + endpoint,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FQV8%3D","line":68,"updated":"2014-01-16 04:48:46.000000000","message":"i believe HMAC is defaulted if unspecified, no big deal","commit_id":"9586aa6261556a0ccbd1aa70382d1f4a30556591"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"96dac63f69f150ff4eef51ac6ed169d4b2be4048","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                               client_secret\u003dconsumer[\u0027secret\u0027],"},{"line_number":68,"context_line":"                               signature_method\u003doauth1.SIG_HMAC,"},{"line_number":69,"context_line":"                               callback_uri\u003d\"oob\")"},{"line_number":70,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":71,"context_line":"        url, headers, body \u003d client.sign(self.base_url + endpoint,"},{"line_number":72,"context_line":"                                         http_method\u003d\u0027POST\u0027,"},{"line_number":73,"context_line":"                                         headers\u003dheaders)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FPE0%3D","line":70,"updated":"2014-01-16 04:48:46.000000000","message":"headers is also called at line 64, not sure you need that one, I believe a signed POST request will automagically add the application/json part.","commit_id":"9586aa6261556a0ccbd1aa70382d1f4a30556591"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"96dac63f69f150ff4eef51ac6ed169d4b2be4048","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        headers \u003d {\u0027requested_project_id\u0027: project_id}"},{"line_number":71,"context_line":"        url, headers, body \u003d client.sign(self.base_url + endpoint,"},{"line_number":72,"context_line":"                                         http_method\u003d\u0027POST\u0027,"},{"line_number":73,"context_line":"                                         headers\u003dheaders)"},{"line_number":74,"context_line":"        headers.update({\u0027requested_project_id\u0027: project_id})"},{"line_number":75,"context_line":"        return endpoint, headers"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2FPEs%3D","line":73,"updated":"2014-01-16 04:48:46.000000000","message":"secondly, you are in-fact including the requested_project_id in the headers to sign.","commit_id":"9586aa6261556a0ccbd1aa70382d1f4a30556591"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"8bd847ac29909c8243cfde2edef4071d28d4414a","unresolved":false,"context_lines":[{"line_number":446,"context_line":"    def test_bad_consumer_secret(self):"},{"line_number":447,"context_line":"        consumer \u003d self._create_single_consumer()"},{"line_number":448,"context_line":"        consumer_id \u003d consumer.get(\u0027id\u0027)"},{"line_number":449,"context_line":"        consumer \u003d {\u0027key\u0027: consumer_id, \u0027secret\u0027: \"bad_secret\"}"},{"line_number":450,"context_line":"        url, headers \u003d self._create_request_token(consumer,"},{"line_number":451,"context_line":"                                                  self.project_id)"},{"line_number":452,"context_line":"        self.post(url, headers\u003dheaders, expected_status\u003d401)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2FMJE%3D","line":449,"updated":"2014-01-16 16:10:48.000000000","message":"double quotes and change to uuid4","commit_id":"bc488416d52315d05f92e5d02cbdabdcd2f62226"}]}
