Skip to content

Commit 72e659b

Browse files
authored
Merge pull request #393 from nestoracunablanco/fix/380
fix: auth leakage with basic authentication
2 parents 8a42d5c + ba2b7d9 commit 72e659b

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

src/RequestsLibrary/log.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from RequestsLibrary.utils import is_file_descriptor
66

77
LOG_CHAR_LIMIT = 10000
8+
AUTHORIZATION = 'Authorization'
89

910

1011
def log_response(response):
@@ -24,11 +25,14 @@ def log_request(response):
2425
else:
2526
original_request = request
2627
redirected = ""
28+
safe_headers = dict(original_request.headers)
29+
if logger.LOGLEVEL not in ['TRACE', 'DEBUG'] and AUTHORIZATION in safe_headers:
30+
safe_headers[AUTHORIZATION] = '*****'
2731
logger.info(
2832
"%s Request : " % original_request.method.upper()
2933
+ "url=%s %s\n " % (original_request.url, redirected)
3034
+ "path_url=%s \n " % original_request.path_url
31-
+ "headers=%s \n " % original_request.headers
35+
+ "headers=%s \n " % safe_headers
3236
+ "body=%s \n " % format_data_to_log_string(original_request.body)
3337
)
3438

utests/test_log.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
import os
3+
import pytest
34

45
from requests import Request
56

@@ -60,6 +61,71 @@ def test_log_request(mocked_logger):
6061
"body=%s \n " % request.body)
6162

6263

64+
@mock.patch('RequestsLibrary.log.logger')
65+
def test_log_request_with_headers(mocked_logger):
66+
headers = {'User-Agent': 'python-requests/2.31.0',
67+
'Accept-Encoding': 'gzip, deflate',
68+
'Accept': '*/*',
69+
'Connection': 'keep-alive'}
70+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
71+
request = request.prepare()
72+
response = mock.MagicMock()
73+
response.history = []
74+
response.request = request
75+
log_request(response)
76+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
77+
"url=%s \n " % request.url +
78+
"path_url=%s \n " % request.path_url +
79+
"headers=%s \n " % request.headers +
80+
"body=%s \n " % request.body)
81+
82+
83+
@pytest.mark.parametrize('log_level', ['INFO', 'CONSOLE', 'HTML', 'WARN', 'ERROR'])
84+
@mock.patch('RequestsLibrary.log.logger')
85+
def test_log_request_with_headers_auth_with_no_debug_trace_logger(mocked_logger, log_level):
86+
mocked_logger.LOGLEVEL = log_level
87+
headers = {'User-Agent': 'python-requests/2.31.0',
88+
'Accept-Encoding': 'gzip, deflate',
89+
'Accept': '*/*',
90+
'Connection': 'keep-alive',
91+
'Authorization': 'some_token'}
92+
safe_headers = dict(headers)
93+
safe_headers['Authorization'] = '*****'
94+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
95+
request = request.prepare()
96+
response = mock.MagicMock()
97+
response.history = []
98+
response.request = request
99+
log_request(response)
100+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
101+
"url=%s \n " % request.url +
102+
"path_url=%s \n " % request.path_url +
103+
"headers=%s \n " % safe_headers +
104+
"body=%s \n " % request.body)
105+
106+
107+
@pytest.mark.parametrize('log_level', ['DEBUG', 'TRACE'])
108+
@mock.patch('RequestsLibrary.log.logger')
109+
def test_log_request_with_headers_auth_with_debug_trace_logger(mocked_logger, log_level):
110+
headers = {'User-Agent': 'python-requests/2.31.0',
111+
'Accept-Encoding': 'gzip, deflate',
112+
'Accept': '*/*',
113+
'Connection': 'keep-alive',
114+
'Authorization': 'some_token'}
115+
mocked_logger.LOGLEVEL = log_level
116+
request = Request(method='get', url='http://mock.rulezz', headers=headers)
117+
request = request.prepare()
118+
response = mock.MagicMock()
119+
response.history = []
120+
response.request = request
121+
log_request(response)
122+
assert mocked_logger.info.call_args[0][0] == ("%s Request : " % request.method +
123+
"url=%s \n " % request.url +
124+
"path_url=%s \n " % request.path_url +
125+
"headers=%s \n " % request.headers +
126+
"body=%s \n " % request.body)
127+
128+
63129
@mock.patch('RequestsLibrary.log.logger')
64130
def test_log_request_with_redirect(mocked_logger):
65131
request = Request(method='get', url='http://mock.rulezz/redirected')

0 commit comments

Comments
 (0)