DmitrMakeev commited on
Commit
35ef4da
·
verified ·
1 Parent(s): da12f0e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -21
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
- # Сортируем параметры, начинающиеся с "vk_"
1029
- vk_subset = OrderedDict(sorted((k, v) for k, v in query.items() if k.startswith("vk_")))
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', '') # Сюда придёт ИД ВК приложения, значение будет ключем для поиска Защищённого ключа в переменной 'api_key_apps_vk'
1052
- sign = request.form.get('sign', '') # Значение sign полученное при запуске приложения
1053
 
1054
- # надо проверку подленности добавить, находим в переменной 'api_key_apps_vk' Защищённый ключ по значению apps_id и проверяем подпись sign
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