示例#1
0
 def test_no_content_length_or_transfer_encoding_headers_002(self):
     request = mock.Mock()
     request.headers = {}
     value_if_not_found = "bindle"
     self.assertEqual(
         trhutil.get_request_body_if_exists(request, value_if_not_found),
         value_if_not_found)
示例#2
0
 def test_all_good_001(self):
     request = mock.Mock()
     request.headers = {"Content-Length": 10}
     request.body = "dave was here"
     self.assertEqual(
         trhutil.get_request_body_if_exists(request),
         request.body)
示例#3
0
 def test_all_good_002(self):
     request = mock.Mock()
     request.headers = {"Transfer-Encoding": 10}
     request.body = "dave was here"
     self.assertEqual(
         trhutil.get_request_body_if_exists(request),
         request.body)
示例#4
0
 def test_content_length_in_headers_but_no_body_002(self):
     request = mock.Mock()
     request.headers = {"Content-Length": 10}
     request.body = None
     value_if_not_found = "bindle"
     self.assertEqual(
         trhutil.get_request_body_if_exists(request, value_if_not_found),
         value_if_not_found)
示例#5
0
 def test_content_length_in_headers_but_no_body_001(self):
     request = mock.Mock()
     request.headers = {"Content-Length": 10}
     request.body = None
     self.assertIsNone(trhutil.get_request_body_if_exists(request))
示例#6
0
 def test_no_content_length_or_transfer_encoding_headers_001(self):
     request = mock.Mock()
     request.headers = {}
     self.assertIsNone(trhutil.get_request_body_if_exists(request))
示例#7
0
    def _on_async_mac_creds_retriever_done(
        self,
        is_ok,
        mac_key_identifier,
        mac_algorithm=None,
        mac_key=None,
        principal=None):

        if not is_ok:
            _logger.info(
                "No MAC credentials found for '%s'",
                self._request.full_url())
            self._on_auth_done(False, AUTH_FAILURE_DETAIL_CREDS_NOT_FOUND)
            return

        (host, port) = get_request_host_and_port(
            self._request,
            "127.0.0.1",
            80)
        content_type = self._request.headers.get("Content-type", None)
        body = get_request_body_if_exists(self._request, None)
        ext = mac.Ext.generate(content_type, body)
        normalized_request_string = mac.NormalizedRequestString.generate(
            self._auth_hdr_val.ts,
            self._auth_hdr_val.nonce,
            self._request.method,
            self._request.uri,
            host,
            port,
            ext)

        macs_equal = self._auth_hdr_val.mac.verify(
            mac_key,
            mac_algorithm,
            normalized_request_string)
        if not macs_equal:
            fmt = (
                "For '%s' using MAC key identifier '%s' "
                "MAC in request '%s' doesn't match computed MAC"
            )
            _logger.info(
                fmt,
                self._request.full_url(),
                mac_key_identifier,
                self._auth_hdr_val.mac)

            # When an authentication failure occurs it can be super hard
            # to figure out the root cause of the error. This method is called
            # on authentication failure and, if logging is set to at least
            # debug, a whole series of HTTP headers are set to return the
            # core elements that are used to generate the MAC.
            auth_failure_debug_details = {}

            if body:
                sha1_of_body = hashlib.sha1(body).hexdigest()
                auth_failure_debug_details["BODY-SHA1"] = sha1_of_body
                auth_failure_debug_details["BODY-LEN"] = len(body)

            auth_failure_debug_details["MAC-KEY-IDENTIFIER"] = mac_key_identifier
            auth_failure_debug_details["MAC-KEY"] = mac_key
            auth_failure_debug_details["MAC-ALGORITHM"] = mac_algorithm
            auth_failure_debug_details["HOST"] = host
            auth_failure_debug_details["PORT"] = port
            auth_failure_debug_details["CONTENT-TYPE"] = content_type
            auth_failure_debug_details["REQUEST-METHOD"] = self._request.method
            auth_failure_debug_details["URI"] = self._request.uri
            auth_failure_debug_details["TIMESTAMP"] = self._auth_hdr_val.ts
            auth_failure_debug_details["NONCE"] = self._auth_hdr_val.nonce
            auth_failure_debug_details["EXT"] = ext
            auth_failure_debug_details["MAC"] = mac.MAC.generate(
                mac_key,
                mac_algorithm,
                normalized_request_string)
            sha1_of_nrs = hashlib.sha1(normalized_request_string).hexdigest()
            auth_failure_debug_details["NRS-SHA1"] = sha1_of_nrs

            # end of pumping out debug headers - returning to regular headers
            self._on_auth_done(
                False,
                auth_failure_detail=AUTH_FAILURE_DETAIL_MACS_DO_NOT_MATCH,
                auth_failure_debug_details=auth_failure_debug_details)
            return

        _logger.info(
            "Authorization successful for '%s' and MAC '%s'",
            self._request.full_url(),
            self._auth_hdr_val.mac)

        self._on_auth_done(True, principal=principal)