pointapi/common/verification.py
2021-07-14 19:11:31 +08:00

79 lines
2.2 KiB
Python

import hashlib
from copy import deepcopy
from settings import settings
__all__ = 'restore_field', 'sort_kv', 'check_sign', 'check_preset'
def restore_field(data: dict) -> tuple:
res = dict()
sign_kv = dict()
for k, v in data.items():
key = settings.FIELD_MAP.get(k) or k
if isinstance(v, dict):
res[key], sign_kv[key] = restore_field(v)
else:
res[key] = v
if isinstance(v, list):
for i, item in enumerate(v):
if isinstance(item, dict) or isinstance(item, list):
raise ValueError(f'请检查字段:{key} 数据类型,值:{v}')
if isinstance(item, bool):
v[i] = str(item).lower()
elif item is None:
v[i] = ''
sign_kv[key] = ','.join(map(lambda x: str(x), v))
elif isinstance(v, bool):
sign_kv[key] = str(v).lower()
res[key] = int(v)
elif v is None:
sign_kv[key] = 'null'
res[key] = ''
else:
sign_kv[key] = v
return res, sign_kv
def check_preset(data: dict):
preset_name = set(settings.FIELD_MAP.values())
illegality_name = dict()
for k, v in data.items():
if k.startswith('#') and k not in preset_name:
illegality_name[k] = v
for k, v in illegality_name.items():
del data[k]
data[k[1:]] = v
return data
# def restore_field(data: dict) -> dict:
# """
# 不在预置字段 去掉前置#
# :param data:
# :return:
# """
# res = dict()
# for k, v in data.items():
# map_name = settings.FIELD_MAP.get(k)
# if map_name:
# res[map_name] = v
# elif k.startswith('#'):
# res[k[1:]] = v
# else:
# res[k] = v
# return res
def sort_kv(*args: dict):
return '&'.join(map(lambda item: '&'.join(map(lambda x: f'{x[0]}={x[1]}', sorted(item.items()))), args))
def check_sign(sign: str, salt: str, *args: dict):
s = sort_kv(*args) + salt
if hashlib.md5(s.encode()).hexdigest() != sign:
return False
return True