예제 #1
0
    def get_request_token(self):
        """
        Uses the request authentication link to get an oauth_token for
        requesting an access token
        """

        assert self.consumer_key, "need a valid consumer_key for this step"

        params = self.get_params()
        params += [('oauth_callback', self.callback)]

        request_token_url = self.authentication['oauth1']['request']
        request_token_url = self.add_params_sign("GET", request_token_url,
                                                 params)

        response = self.requester.get(request_token_url)
        self.logger.debug('get_request_token response: %s' % response.text)
        resp_content = parse_qs(response.text)

        try:
            self._request_token = resp_content['oauth_token'][0]
        except:
            raise UserWarning("Could not parse request_token in response from %s : %s" \
                % (repr(response.request.url), UrlUtils.beautify_response(response)))
        try:
            self.request_token_secret = resp_content['oauth_token_secret'][0]
        except:
            raise UserWarning("Could not parse request_token_secret in response from %s : %s" \
                % (repr(response.request.url), UrlUtils.beautify_response(response)))

        return self._request_token, self.request_token_secret
예제 #2
0
    def get_access_token(self, oauth_verifier=None):
        """ Uses the access authentication link to get an access token """

        if oauth_verifier is None:
            oauth_verifier = self.oauth_verifier
        assert oauth_verifier, "Need an oauth verifier to perform this step"
        assert self.request_token, "Need a valid request_token to perform this step"

        params = self.get_params()
        params += [('oauth_token', self.request_token),
                   ('oauth_verifier', self.oauth_verifier)]

        # params = OrderedDict()
        # params["oauth_consumer_key"] = self.consumer_key
        # params['oauth_token'] = self.request_token
        # params["oauth_timestamp"] = self.generate_timestamp()
        # params["oauth_nonce"] = self.generate_nonce()
        # params["oauth_signature_method"] = self.signature_method
        # params['oauth_verifier'] = oauth_verifier
        # params["oauth_callback"] = self.callback

        sign_key = self.get_sign_key(self.consumer_secret,
                                     self.request_token_secret)
        # sign_key = self.get_sign_key(None, self.request_token_secret)
        # print "request_token_secret:", self.request_token_secret

        # print "SIGNING WITH KEY:", repr(sign_key)

        access_token_url = self.authentication['oauth1']['access']
        access_token_url = self.add_params_sign("POST", access_token_url,
                                                params, sign_key)

        access_response = self.requester.post(access_token_url)

        assert \
            access_response.status_code == 200, \
            "Access request did not return 200, returned %s. HTML: %s" % (
                access_response.status_code,
                UrlUtils.beautify_response(access_response)
            )

        #
        access_response_queries = parse_qs(access_response.text)

        try:
            self._access_token = access_response_queries['oauth_token'][0]
            self.access_token_secret = access_response_queries[
                'oauth_token_secret'][0]
        except:
            raise UserWarning("Could not parse access_token or access_token_secret in response from %s : %s" \
                % (repr(access_response.request.url), UrlUtils.beautify_response(access_response)))

        return self._access_token, self.access_token_secret
예제 #3
0
    def get_request_token(self):
        """ Uses the request authentication link to get an oauth_token for requesting an access token """
        assert self.consumer_key, "need a valid consumer_key for this step"

        params = self.get_params()
        params += [('oauth_callback', self.callback)]
        # params = OrderedDict()
        # params["oauth_consumer_key"] = self.consumer_key
        # params["oauth_timestamp"] = self.generate_timestamp()
        # params["oauth_nonce"] = self.generate_nonce()
        # params["oauth_signature_method"] = self.signature_method
        # params["oauth_callback"] = self.callback
        # params["oauth_version"] = self.oauth_version

        request_token_url = self.authentication['oauth1']['request']
        request_token_url = self.add_params_sign("GET", request_token_url,
                                                 params)

        response = self.requester.get(request_token_url)
        resp_content = parse_qs(response.text)

        try:
            self._request_token = resp_content['oauth_token'][0]
            self.request_token_secret = resp_content['oauth_token_secret'][0]
        except:
            raise UserWarning("Could not parse request_token or request_token_secret in response from %s : %s" \
                % (repr(response.request.url), UrlUtils.beautify_response(response)))

        return self._request_token, self.request_token_secret
예제 #4
0
    def get_access_token(self, oauth_verifier=None):
        """ Uses the access authentication link to get an access token """

        if oauth_verifier is None:
            oauth_verifier = self.oauth_verifier
        assert oauth_verifier, "Need an oauth verifier to perform this step"
        assert self.request_token, "Need a valid request_token to perform this step"

        params = self.get_params()
        params += [('oauth_token', self.request_token),
                   ('oauth_verifier', self.oauth_verifier)]

        sign_key = self.get_sign_key(self.consumer_secret,
                                     self.request_token_secret)

        access_token_url = self.authentication['oauth1']['access']
        access_token_url = self.add_params_sign("POST", access_token_url,
                                                params, sign_key)

        access_response = self.requester.post(access_token_url)

        self.logger.debug('access_token response: %s' % access_response.text)

        assert \
            access_response.status_code == 200, \
            "Access request did not return 200, returned %s. HTML: %s" % (
                access_response.status_code,
                UrlUtils.beautify_response(access_response)
            )

        #
        access_response_queries = parse_qs(access_response.text)

        try:
            self._access_token = access_response_queries['oauth_token'][0]
            self.access_token_secret = access_response_queries[
                'oauth_token_secret'][0]
        except:
            raise UserWarning("Could not parse access_token or access_token_secret in response from %s : %s" \
                % (repr(access_response.request.url), UrlUtils.beautify_response(access_response)))

        self.store_access_creds()

        return self._access_token, self.access_token_secret
예제 #5
0
    def discover_auth(self):
        """ Discovers the location of authentication resourcers from the API"""
        discovery_url = self.requester.api_url

        response = self.requester.request('GET', discovery_url)
        response_json = response.json()

        assert \
            response_json['authentication'], \
            "resopnse should include location of authentication resources, resopnse: %s" \
                % UrlUtils.beautify_response(response)

        self._authentication = response_json['authentication']

        return self._authentication
예제 #6
0
    def request_post_mortem(self, response=None):
        """
        Attempt to diagnose what went wrong in a request
        """

        reason = None
        remedy = None

        response_json = {}
        try:
            response_json = response.json()
        except ValueError:
            pass

        # import pudb; pudb.set_trace()

        request_body = {}
        request_url = ""
        if hasattr(response, 'request'):
            if hasattr(response.request, 'url'):
                request_url = response.request.url
            if hasattr(response.request, 'body'):
                request_body = response.request.body

        if isinstance(response_json, dict) and ('code' in response_json
                                                or 'message' in response_json):
            reason = u" - ".join([
                str(response_json.get(key)) for key in ['code', 'message', 'data'] \
                if key in response_json
            ])

            if 'code' == 'rest_user_invalid_email':
                remedy = "Try checking the email %s doesn't already exist" % \
                request_body.get('email')

            elif 'code' == 'json_oauth1_consumer_mismatch':
                remedy = "Try deleting the cached credentials at %s" % \
                self.auth.creds_store

            elif 'code' == 'woocommerce_rest_cannot_view':
                if not self.auth.query_string_auth:
                    remedy = "Try enabling query_string_auth"
                else:
                    remedy = (
                        "This error is super generic and can be caused by just "
                        "about anything. Here are some things to try: \n"
                        " - Check that the account which as assigned to your "
                        "oAuth creds has the correct access level\n"
                        " - Enable logging and check for error messages in "
                        "wp-content and wp-content/uploads/wc-logs\n"
                        " - Check that your query string parameters are valid\n"
                        " - Make sure your server is not messing with authentication headers\n"
                        " - Try a different endpoint\n"
                        " - Try enabling HTTPS and using basic authentication\n"
                    )

        response_headers = {}
        if hasattr(response, 'headers'):
            response_headers = response.headers

        if not reason:
            requester_api_url = self.requester.api_url
            if hasattr(response, 'links') and response.links:
                links = response.links
                first_link_key = list(links)[0]
                header_api_url = links[first_link_key].get('url', '')
                if header_api_url:
                    header_api_url = StrUtils.eviscerate(header_api_url, '/')

                if header_api_url and requester_api_url\
                and header_api_url != requester_api_url:
                    reason = "hostname mismatch. %s != %s" % (
                        header_api_url, requester_api_url)
                    header_url = StrUtils.eviscerate(header_api_url, '/')
                    header_url = StrUtils.eviscerate(header_url,
                                                     self.requester.api)
                    header_url = StrUtils.eviscerate(header_url, '/')
                    remedy = "try changing url to %s" % header_url

        msg = "API call to %s returned \nCODE: %s\nRESPONSE:%s \nHEADERS: %s\nREQ_BODY:%s" % (
            request_url, str(
                response.status_code), UrlUtils.beautify_response(response),
            str(response_headers), str(request_body)[:1000])
        if reason:
            msg += "\nBecause of %s" % reason
        if remedy:
            msg += "\n%s" % remedy
        raise UserWarning(msg)