Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mdellavo
Created January 22, 2020 18:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mdellavo/008aa382944f7436e08bc71f6338ba1f to your computer and use it in GitHub Desktop.
Save mdellavo/008aa382944f7436e08bc71f6338ba1f to your computer and use it in GitHub Desktop.
SAFE = True
MASK = "*"
def mask(val):
return MASK * len(val)
def value(val):
return mask(val) if SAFE else val
DANGEROUS = [
"__str__",
"__repr__",
"__add__",
"__mul__",
"format",
'capitalize',
'casefold',
'center',
'format_map',
'ljust',
'lower',
'lstrip',
'splitlines',
'strip',
'rstrip',
'swapcase',
'title',
'upper',
'join',
'zfill',
'replace',
]
class Wrapped:
def __init__(self, orig):
self.orig = orig
def __get__(self, instance, owner=None):
def _wrapped(*args, **kwargs):
return value(self.orig(instance, *args, **kwargs))
return _wrapped
def wrap_dangerous(cls):
for name in DANGEROUS:
orig = getattr(cls, name)
setattr(cls, name, Wrapped(orig))
return cls
@wrap_dangerous
class SafeString(str):
pass
sstr = SafeString
if __name__ == "__main__":
print(str(sstr("foo")))
print("{} bar baz".format(sstr("foo")))
print(sstr("foo {}").format("bar baz"))
print(sstr("foo") + " bar baz")
print(sstr("foo").lower())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment