105 lines
2.6 KiB
Python
105 lines
2.6 KiB
Python
import random
|
|
import string
|
|
import hashlib
|
|
import hmac
|
|
import base64
|
|
import re
|
|
import uuid
|
|
|
|
FORMATS = {
|
|
"email": r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
|
|
"phone_number": r"\+\d{,15}",
|
|
}
|
|
|
|
|
|
PAGINATION_MODEL = {
|
|
"list_user_pools": {
|
|
"input_token": "next_token",
|
|
"limit_key": "max_results",
|
|
"limit_default": 60,
|
|
"unique_attribute": "arn",
|
|
},
|
|
"list_user_pool_clients": {
|
|
"input_token": "next_token",
|
|
"limit_key": "max_results",
|
|
"limit_default": 60,
|
|
"unique_attribute": "id",
|
|
},
|
|
"list_identity_providers": {
|
|
"input_token": "next_token",
|
|
"limit_key": "max_results",
|
|
"limit_default": 60,
|
|
"unique_attribute": "name",
|
|
},
|
|
"list_users": {
|
|
"input_token": "pagination_token",
|
|
"limit_key": "limit",
|
|
"limit_default": 60,
|
|
"unique_attribute": "id",
|
|
},
|
|
"list_groups": {
|
|
"input_token": "next_token",
|
|
"limit_key": "limit",
|
|
"limit_default": 60,
|
|
"unique_attribute": "group_name",
|
|
},
|
|
"list_users_in_group": {
|
|
"input_token": "next_token",
|
|
"limit_key": "limit",
|
|
"limit_default": 60,
|
|
"unique_attribute": "id",
|
|
},
|
|
}
|
|
|
|
|
|
def create_id():
|
|
size = 26
|
|
chars = list(range(10)) + list(string.ascii_lowercase)
|
|
return "".join(str(random.choice(chars)) for x in range(size))
|
|
|
|
|
|
def check_secret_hash(app_client_secret, app_client_id, username, secret_hash):
|
|
key = bytes(str(app_client_secret).encode("latin-1"))
|
|
msg = bytes(str(username + app_client_id).encode("latin-1"))
|
|
new_digest = hmac.new(key, msg, hashlib.sha256).digest()
|
|
SECRET_HASH = base64.b64encode(new_digest).decode()
|
|
return SECRET_HASH == secret_hash
|
|
|
|
|
|
def validate_username_format(username, _format="email"):
|
|
# if the value of the `_format` param other than `email` or `phone_number`,
|
|
# the default value for the regex will match nothing and the
|
|
# method will return None
|
|
return re.fullmatch(FORMATS.get(_format, r"a^"), username)
|
|
|
|
|
|
def flatten_attrs(attrs):
|
|
return {attr["Name"]: attr["Value"] for attr in attrs}
|
|
|
|
|
|
def expand_attrs(attrs):
|
|
return [{"Name": k, "Value": v} for k, v in attrs.items()]
|
|
|
|
|
|
ID_HASH_STRATEGY = "HASH"
|
|
|
|
|
|
def generate_id(strategy, *args):
|
|
if strategy == ID_HASH_STRATEGY:
|
|
return _generate_id_hash(args)
|
|
else:
|
|
return _generate_id_uuid()
|
|
|
|
|
|
def _generate_id_uuid():
|
|
return uuid.uuid4().hex
|
|
|
|
|
|
def _generate_id_hash(args):
|
|
hasher = hashlib.sha256()
|
|
|
|
for arg in args:
|
|
hasher.update(str(arg).encode())
|
|
|
|
return hasher.hexdigest()
|