Source code for dq.string
import random
import re
NAMESPACE = 'abcdefghijklmnopqrstuvwxyz1234567890'
PUNCS = '!"#$%&\'()*+,.:;<=>?@[\\]^_`{|}~'
TBL = dict.fromkeys(ord(i) for i in PUNCS)
SAFE_PATH = re.compile(r'^(?!(/|\.{2}))(?!.*/(\.*)(?:/.*|$)).*$')
[docs]def lower_no_punc(text):
"""Convert string to lowercase, stripping spaces and punctuations.
:param string text: The text to clean up.
:returns string: The cleaned up text.
"""
# Strip whitespaces and convert to lowercase.
return text.translate(TBL).strip().lower()
[docs]def random_string(length):
"""Get a random string of lowercase letters + numbers of the given length.
:param int length: The desired length of the string.
:returns string: A random string of the given length.
"""
return ''.join(random.choice(NAMESPACE) for i in range(length))
[docs]def valid_filename(text):
"""Turn a string into a valid filename.
:param string text: The string to convert.
:returns string: A valid filename derived from the string.
"""
text = text.strip().replace(' ', '_')
return re.sub(r'(?u)[^-\w.]', '', text)
[docs]def safe_relative_path(path):
"""Check whether a relative path is "safe".
A path is safe if it is a relative path and doesn't contain . or ..'s.
This prevents us from directory traversal attacks.
Note that for simplicity, certain safe paths aren't allowed either, notably
... (e.g. .../path). Normal user should not really use such paths.
:param string path: The path to check.
:returns boolean: True if the path is safe, and False otherwise.
"""
if not path or not isinstance(path, str):
return False
return bool(re.match(SAFE_PATH, path))