pointapi/common/verification.py
2021-05-17 17:37:23 +08:00

68 lines
1.8 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 item in v:
if isinstance(item, dict) or isinstance(item, list):
raise ValueError(f'请检查字段:{key} 数据类型,值:{v}')
sign_kv[key] = ','.join(map(lambda x: str(x), v))
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