def post_job_data( project, uri, data, status=None, expect_errors=False): # Since the uri is passed in it's not generated by the # treeherder request or collection and is missing the protocol # and host. Add those missing elements here. uri = 'http://localhost{0}'.format(uri) # Set the credentials OAuthLoaderMixin.set_credentials( SampleData.get_credentials() ) credentials = OAuthLoaderMixin.get_credentials(project) tr = TreeherderRequest( protocol='http', host='localhost', project=project, oauth_key=credentials['consumer_key'], oauth_secret=credentials['consumer_secret'] ) signed_uri = tr.get_signed_uri( json.dumps(data), uri ) response = TestApp(application).post_json( str(signed_uri), params=data, status=status, expect_errors=expect_errors ) return response
def post_collection( project, th_collection, status=None, expect_errors=False, consumer_key=None, consumer_secret=None): # Set the credentials OAuthLoaderMixin.set_credentials( SampleData.get_credentials() ) credentials = OAuthLoaderMixin.get_credentials(project) # The only time the credentials should be overridden are when # a client needs to test authentication failure confirmation if consumer_key: credentials['consumer_key'] = consumer_key if consumer_secret: credentials['consumer_secret'] = consumer_secret tr = TreeherderRequest( protocol='http', host='localhost', project=project, oauth_key=credentials['consumer_key'], oauth_secret=credentials['consumer_secret'] ) signed_uri = tr.get_signed_uri( th_collection.to_json(), tr.get_uri(th_collection) ) response = TestApp(application).post_json( str(signed_uri), params=th_collection.get_collection_data(), status=status ) return response
def _post_json_data(url, data): th_collection = data[jm.project] OAuthLoaderMixin.set_credentials( SampleData.get_credentials() ) credentials = OAuthLoaderMixin.get_credentials(jm.project) tr = TreeherderRequest( protocol='http', host='localhost', project=jm.project, oauth_key=credentials['consumer_key'], oauth_secret=credentials['consumer_secret'] ) signed_uri = tr.get_signed_uri( th_collection.to_json(), tr.get_uri(th_collection) ) response = TestApp(application).post_json( str(signed_uri), params=th_collection.get_collection_data() ) response.getcode = lambda: response.status_int return response
def wrap_oauth(cls, *args, **kwargs): # First argument must be request object request = args[0] # Get the project keyword argumet project = kwargs.get('project', None) # Get the project credentials project_credentials = OAuthLoaderMixin.get_credentials(project) if not project_credentials: msg = { 'response':"invalid_request", 'message':"project, {0}, has no OAuth credentials".format(project) } return Response(msg, 500) parameters = OAuthLoaderMixin.get_parameters(request.QUERY_PARAMS) oauth_body_hash = parameters.get('oauth_body_hash', None) oauth_signature = parameters.get('oauth_signature', None) oauth_consumer_key = parameters.get('oauth_consumer_key', None) oauth_token = parameters.get('oauth_token', None) if not oauth_body_hash or not oauth_signature or not oauth_consumer_key: msg = { 'response':"invalid_request", 'message':"Required oauth parameters not provided in the uri" } return Response(msg, 500) if oauth_consumer_key != project_credentials['consumer_key']: msg = { 'response':"access_denied", 'message':"oauth_consumer_key does not match project, {0}, credentials".format(project) } return Response(msg, 403) scheme = 'http' if 'https' in request.build_absolute_uri(): scheme = 'https' uri = '{0}://{1}{2}'.format( scheme, request.get_host(), request.path ) #Construct the OAuth request based on the django request object req_obj = oauth.Request( method=request.method, url=uri, parameters=parameters, body=json.dumps(request.DATA), ) server = oauth.Server() token = oauth.Token(key='', secret='') #Get the consumer object cons_obj = oauth.Consumer( oauth_consumer_key, project_credentials['consumer_secret'] ) #Set the signature method server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1()) try: #verify oauth django request and consumer object match server.verify_request(req_obj, cons_obj, oauth_token) except oauth.Error: msg = { 'response':"invalid_client", 'message':"Client authentication failed for project, {0}".format(project) } return Response(msg, 403) return func(request, *args, **kwargs)