Skip to content

Commit b4249a3

Browse files
authored
Merge pull request #2 from lpm0073/mcdaniel_20230426b
bug fix: make dict key evaluation case insensitive
2 parents 3ed10b9 + 999781f commit b4249a3

File tree

5 files changed

+38
-30
lines changed

5 files changed

+38
-30
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

8+
## [0.1.4] (2023-04-26)
9+
10+
- bug fix: make dict key evaluation case insensitive
11+
812
## [0.1.3] (2023-04-26)
913

1014
- rename serialized_masked_dict() to masked_dict2str() with backward compatibility

__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
# Increment this version number to trigger a new release. See
99
# CHANGELOG.md for information on the versioning scheme.
10-
__version__ = "0.1.3"
10+
__version__ = "0.1.4"
1111

1212
# The app name will be used to define the name of the default plugin root and
1313
# plugin directory. To avoid conflicts between multiple locally-installed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ build-backend = "setuptools.build_meta:__legacy__"
2424
#------------------------------------------------------------------------------
2525
[project]
2626
name = "secure-logger"
27-
version = "0.1.3"
27+
version = "0.1.4"
2828
authors = [
2929
{ name="Lawrence McDaniel", email="[email protected]" }
3030
]

secure_logger/masked_dict.py

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,34 +42,34 @@ def default(self, obj):
4242
return ""
4343

4444

45-
def masked_dict(obj, sensitive_keys: list = DEFAULT_SENSITIVE_KEYS, message: str = DEFAULT_REDACTION_MESSAGE) -> dict:
45+
def masked_dict(
46+
source_dict, sensitive_keys: list = DEFAULT_SENSITIVE_KEYS, message: str = DEFAULT_REDACTION_MESSAGE
47+
) -> dict:
4648
"""
4749
Mask sensitive key / value in log entries.
4850
4951
Masks the value of specified key.
5052
obj: a dict or a string representation of a dict, or None
5153
"""
52-
if type(obj) == str:
53-
obj = json.loads(obj)
54+
if type(source_dict) == str:
55+
source_dict = json.loads(source_dict)
5456

55-
if type(obj) != dict:
56-
raise TypeError("obj must be a dict or a json serializable string")
57+
if type(source_dict) != dict:
58+
raise TypeError("source_dict must be a dict or a json serializable string")
5759

58-
to_mask = {}
59-
for key in obj:
60-
value = obj[key]
60+
recursed_dict = {}
61+
for key in source_dict:
62+
value = source_dict[key]
6163
if type(value) == dict:
62-
value = masked_dict(obj=value, sensitive_keys=sensitive_keys, message=message)
63-
to_mask[key] = value
64+
value = masked_dict(source_dict=value, sensitive_keys=sensitive_keys, message=message)
65+
recursed_dict[key] = value
6466

65-
def redact(key: str, obj: dict) -> dict:
66-
if key in obj:
67-
obj[key] = message
68-
return obj
69-
70-
for key in sensitive_keys:
71-
to_mask = redact(key=key, obj=to_mask)
72-
return to_mask
67+
for lower_case_sensitive_key in [x.lower() for x in sensitive_keys]:
68+
if lower_case_sensitive_key in [x.lower() for x in recursed_dict.keys()]:
69+
for original_key in recursed_dict:
70+
if original_key.lower() == lower_case_sensitive_key:
71+
recursed_dict[original_key] = message
72+
return recursed_dict
7373

7474

7575
def masked_dict2str(
@@ -79,14 +79,7 @@ def masked_dict2str(
7979
message: str = DEFAULT_REDACTION_MESSAGE,
8080
) -> str:
8181
"""Return a JSON encoded string representation of a masked dict."""
82-
to_serialize = {}
83-
for key in obj:
84-
value = obj[key]
85-
if type(value) == dict:
86-
value = masked_dict(value, sensitive_keys, message=message)
87-
to_serialize[key] = value
88-
89-
return json.dumps(masked_dict(to_serialize, sensitive_keys, message=message), cls=_JSONEncoder, indent=indent)
82+
return json.dumps(masked_dict(obj, sensitive_keys, message=message), cls=_JSONEncoder, indent=indent)
9083

9184

9285
def serialized_masked_dict(

tests.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,24 @@ class Test3:
7676

7777
# test 6
7878
print("test 6 - masked_dict() with custom parameters") # noqa: T201
79-
print(masked_dict(test_dict, sensitive_keys=["insensitive_key"], message=" -- SHAME ON YOU -- ")) # noqa: T201
79+
print(masked_dict(test_dict, sensitive_keys=["insensitive_key"], message=" -- TEST 6 MESSAGE -- ")) # noqa: T201
8080

8181
# test 7
8282
print("test 7 - masked_dict2str() w defaults") # noqa: T201
8383
print(masked_dict2str(test_dict)) # noqa: T201
8484

8585
# test 8
8686
print("test 8 - masked_dict2str() w custom parameters") # noqa: T201
87-
md = masked_dict2str(test_dict, sensitive_keys=["insensitive_key"], message=" -- SHAME ON YOU -- ", indent=2)
87+
md = masked_dict2str(test_dict, sensitive_keys=["insensitive_key"], message=" -- TEST 8 MESSAGE -- ", indent=2)
8888
print(md) # noqa: T201
89+
90+
# test 9
91+
print("test 9 - masked_dict2str() upper case keys") # noqa: T201
92+
test_dict = {
93+
"insensitive_key": "you-can-see-me",
94+
"AWS_ACCESS_KEY_ID": "i-am-hidden",
95+
"AWS_Secret_Access_Key": "so-am-i",
96+
}
97+
print(test_dict) # noqa: T201
98+
print(masked_dict(test_dict)) # noqa: T201
99+
print(masked_dict2str(test_dict)) # noqa: T201

0 commit comments

Comments
 (0)