Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1022,24 +1022,15 @@ def get_order_monitop():
|
|
| 1022 |
|
| 1023 |
|
| 1024 |
|
| 1025 |
-
# Функция для валидации подписи
|
| 1026 |
def is_valid(*, query: dict, secret: str) -> bool:
|
| 1027 |
"""Check VK Apps signature"""
|
| 1028 |
-
|
| 1029 |
-
|
| 1030 |
-
|
| 1031 |
-
# Формируем строку для подписи и вычисляем подпись HMAC
|
| 1032 |
-
data_to_sign = urlencode(vk_subset, doseq=True)
|
| 1033 |
-
hash_code = b64encode(HMAC(secret.encode(), data_to_sign.encode(), sha256).digest())
|
| 1034 |
-
|
| 1035 |
-
# Декодируем и преобразуем подпись
|
| 1036 |
decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
|
| 1037 |
-
|
| 1038 |
-
# Сравниваем полученную подпись с подписью из запроса
|
| 1039 |
return query["sign"] == decoded_hash_code
|
| 1040 |
|
| 1041 |
-
#
|
| 1042 |
-
# Функция для для Чтение ордера для приложения
|
| 1043 |
@app.route('/get_order', methods=['POST'])
|
| 1044 |
def get_order():
|
| 1045 |
try:
|
|
@@ -1048,15 +1039,34 @@ def get_order():
|
|
| 1048 |
# Читаем параметры из POST-запроса
|
| 1049 |
vkid = request.form.get('vk_id', '')
|
| 1050 |
order = request.form.get('order', '')
|
| 1051 |
-
apps_id = request.form.get('apps_id', '')
|
| 1052 |
-
|
| 1053 |
|
| 1054 |
-
|
| 1055 |
-
# Если подленная продолжаем действие, если нет сразу возвращаем в ответе not
|
| 1056 |
-
if not vkid or not order:
|
| 1057 |
-
logging.error("VK ID and order are required")
|
| 1058 |
-
return json.dumps({"error": "VK ID and order are required"}), 400
|
| 1059 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1060 |
conn = sqlite3.connect(DATABASE_NEW)
|
| 1061 |
cursor = conn.cursor()
|
| 1062 |
|
|
@@ -1118,7 +1128,6 @@ def get_order():
|
|
| 1118 |
|
| 1119 |
|
| 1120 |
|
| 1121 |
-
|
| 1122 |
|
| 1123 |
|
| 1124 |
|
|
|
|
| 1022 |
|
| 1023 |
|
| 1024 |
|
| 1025 |
+
# Функция для валидации подписи ВК приложения
|
| 1026 |
def is_valid(*, query: dict, secret: str) -> bool:
|
| 1027 |
"""Check VK Apps signature"""
|
| 1028 |
+
vk_subset = OrderedDict(sorted(x for x in query.items() if x[0][:3] == "vk_"))
|
| 1029 |
+
hash_code = b64encode(HMAC(secret.encode(), urlencode(vk_subset, doseq=True).encode(), sha256).digest())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1030 |
decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
|
|
|
|
|
|
|
| 1031 |
return query["sign"] == decoded_hash_code
|
| 1032 |
|
| 1033 |
+
# Чтение ордера по ключу и ВК ИД для приложения
|
|
|
|
| 1034 |
@app.route('/get_order', methods=['POST'])
|
| 1035 |
def get_order():
|
| 1036 |
try:
|
|
|
|
| 1039 |
# Читаем параметры из POST-запроса
|
| 1040 |
vkid = request.form.get('vk_id', '')
|
| 1041 |
order = request.form.get('order', '')
|
| 1042 |
+
apps_id = request.form.get('apps_id', '') # Сюда придёт ИД ВК приложения
|
| 1043 |
+
fullUrl = request.form.get('fullUrl', '') # Полный URL, который выдаёт ВКонтакте
|
| 1044 |
|
| 1045 |
+
logging.debug(f"Received data: vk_id={vkid}, order={order}, apps_id={apps_id}, fullUrl={fullUrl}")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1046 |
|
| 1047 |
+
# Проверяем наличие обязательных параметров
|
| 1048 |
+
if not vkid or not order or not fullUrl:
|
| 1049 |
+
logging.error("VK ID, order, and fullUrl are required")
|
| 1050 |
+
return json.dumps({"error": "VK ID, order, and fullUrl are required"}), 400
|
| 1051 |
+
|
| 1052 |
+
# Проверка подписи для приложения
|
| 1053 |
+
if str(apps_id) not in api_key_apps_vk: # Приводим apps_id к строке
|
| 1054 |
+
logging.error("Invalid apps_id")
|
| 1055 |
+
return json.dumps({"error": "Invalid apps_id"}), 400
|
| 1056 |
+
|
| 1057 |
+
secret = api_key_apps_vk[str(apps_id)] # Приводим apps_id к строке
|
| 1058 |
+
logging.debug(f"Using secret: {secret}")
|
| 1059 |
+
|
| 1060 |
+
# Парсим полный URL для получения параметров запроса
|
| 1061 |
+
query_params = dict(parse_qsl(urlparse(fullUrl).query, keep_blank_values=True))
|
| 1062 |
+
logging.debug(f"Query params for signature check: {query_params}")
|
| 1063 |
+
|
| 1064 |
+
# Проверяем подпись
|
| 1065 |
+
if not is_valid(query=query_params, secret=secret):
|
| 1066 |
+
logging.error("Invalid signature")
|
| 1067 |
+
return json.dumps({"error": "Invalid signature"}), 400
|
| 1068 |
+
|
| 1069 |
+
# Подключаемся к базе данных
|
| 1070 |
conn = sqlite3.connect(DATABASE_NEW)
|
| 1071 |
cursor = conn.cursor()
|
| 1072 |
|
|
|
|
| 1128 |
|
| 1129 |
|
| 1130 |
|
|
|
|
| 1131 |
|
| 1132 |
|
| 1133 |
|