79 lines
2.2 KiB
Python
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
|