DmitrMakeev commited on
Commit
8f797d2
·
verified ·
1 Parent(s): 55d9963

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -11
app.py CHANGED
@@ -1017,47 +1017,84 @@ def get_order_monitop():
1017
 
1018
  # Функция для валидации подписи ВК приложения
1019
  def is_valid(*, query: dict, secret: str) -> bool:
1020
- """Check VK Apps signature"""
 
 
 
 
 
 
1021
  logging.debug(f"Checking signature for query: {query}")
 
 
1022
  vk_subset = OrderedDict(sorted(x for x in query.items() if x[0][:3] == "vk_"))
1023
  logging.debug(f"Filtered VK params: {vk_subset}")
 
 
1024
  hash_code = b64encode(HMAC(secret.encode(), urlencode(vk_subset, doseq=True).encode(), sha256).digest())
 
 
1025
  decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
1026
  logging.debug(f"Calculated signature: {decoded_hash_code}")
 
 
1027
  return query.get("sign") == decoded_hash_code
1028
 
1029
- # Чтение ордера по ключу и ВК ИД для приложения
1030
- # Функция для для Чтение ордера для приложения
1031
  @app.route('/get_order', methods=['POST'])
1032
  def get_order():
 
 
 
 
 
1033
  try:
1034
  logging.debug("Starting get_order")
1035
 
1036
- # Читаем параметры из POST-запроса
1037
  vkid = request.form.get('vk_id', '')
1038
  order = request.form.get('order', '')
1039
- apps_id = request.form.get('apps_id', '') # Сюда придёт ИД ВК приложения, значение будет ключем для поиска Защищённого ключа в переменной 'api_key_apps_vk'
1040
- sign = request.form.get('sign', '') # Значение sign полученное при запуске приложения
1041
 
1042
- # надо проверку подленности добавить, находим в переменной 'api_key_apps_vk' Защищённый ключ по значению apps_id и проверяем подпись sign
1043
- # Если подленная продолжаем действие, если нет сразу возвращаем в ответе not
1044
  if not vkid or not order:
1045
  logging.error("VK ID and order are required")
1046
  return json.dumps({"error": "VK ID and order are required"}), 400
1047
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1048
  conn = sqlite3.connect(DATABASE_NEW)
1049
  cursor = conn.cursor()
1050
 
1051
- # Ищем запись по vk_id
1052
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1053
  result = cursor.fetchone()
1054
 
1055
- # Если запись по vk_id не найдена, возвращаем значение "not" для ордера
1056
  if not result:
1057
  logging.error(f"VK ID {vkid} not found")
1058
  response = {order: 'not'}
1059
  return jsonify(response), 200
1060
 
 
1061
  shop_st = result[0] if result[0] else '{}'
1062
  shop_st_data = json.loads(shop_st)
1063
  logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
@@ -1065,7 +1102,7 @@ def get_order():
1065
  # Ищем значение по ключу order
1066
  value = shop_st_data.get(order, 'not')
1067
 
1068
- # Возвращаем данные из столбца
1069
  response = {order: value}
1070
  return jsonify(response), 200
1071
 
 
1017
 
1018
  # Функция для валидации подписи ВК приложения
1019
  def is_valid(*, query: dict, secret: str) -> bool:
1020
+ """
1021
+ Проверяет подпись VK приложения.
1022
+
1023
+ :param query: словарь параметров запроса, включая параметр "sign".
1024
+ :param secret: секретный ключ для подписи.
1025
+ :return: True, если подпись валидна, иначе False.
1026
+ """
1027
  logging.debug(f"Checking signature for query: {query}")
1028
+
1029
+ # Отбираем только параметры, начинающиеся с "vk_" и сортируем их по ключу
1030
  vk_subset = OrderedDict(sorted(x for x in query.items() if x[0][:3] == "vk_"))
1031
  logging.debug(f"Filtered VK params: {vk_subset}")
1032
+
1033
+ # Формируем строку запроса и вычисляем HMAC с использованием sha256
1034
  hash_code = b64encode(HMAC(secret.encode(), urlencode(vk_subset, doseq=True).encode(), sha256).digest())
1035
+
1036
+ # Декодируем результат и заменяем символы для соответствия формату VK
1037
  decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
1038
  logging.debug(f"Calculated signature: {decoded_hash_code}")
1039
+
1040
+ # Сравниваем вычисленную подпись с переданной в запросе
1041
  return query.get("sign") == decoded_hash_code
1042
 
1043
+
1044
+ # Маршрут для получения информации о заказе по VK ID
1045
  @app.route('/get_order', methods=['POST'])
1046
  def get_order():
1047
+ """
1048
+ Обрабатывает POST-запрос для получения информации о заказе на основе VK ID.
1049
+
1050
+ :return: JSON ответ с информацией о заказе или ошибке.
1051
+ """
1052
  try:
1053
  logging.debug("Starting get_order")
1054
 
1055
+ # Чтение данных из POST-запроса
1056
  vkid = request.form.get('vk_id', '')
1057
  order = request.form.get('order', '')
1058
+ apps_id = request.form.get('apps_id', '') # Получаем ID VK приложения
1059
+ sign = request.form.get('sign', '') # Подпись для проверки
1060
 
1061
+ # Проверка наличия обязательных параметров
 
1062
  if not vkid or not order:
1063
  logging.error("VK ID and order are required")
1064
  return json.dumps({"error": "VK ID and order are required"}), 400
1065
 
1066
+ # Получаем секретный ключ для приложения по его ID
1067
+ secret_key = api_key_apps_vk.get(apps_id) # api_key_apps_vk - это словарь с ключами для приложений
1068
+ if not secret_key:
1069
+ logging.error(f"App ID {apps_id} not found")
1070
+ return json.dumps({"error": "App ID not found"}), 400
1071
+
1072
+ # Проверка подписи
1073
+ query_params = {
1074
+ 'vk_id': vkid,
1075
+ 'order': order,
1076
+ 'apps_id': apps_id,
1077
+ 'sign': sign
1078
+ }
1079
+ if not is_valid(query=query_params, secret=secret_key):
1080
+ logging.error("Invalid signature")
1081
+ return json.dumps({"error": "Invalid signature"}), 400
1082
+
1083
+ # Подключаемся к базе данных
1084
  conn = sqlite3.connect(DATABASE_NEW)
1085
  cursor = conn.cursor()
1086
 
1087
+ # Ищем запись по vk_id в базе данных
1088
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1089
  result = cursor.fetchone()
1090
 
1091
+ # Если запись не найдена, возвращаем ошибку
1092
  if not result:
1093
  logging.error(f"VK ID {vkid} not found")
1094
  response = {order: 'not'}
1095
  return jsonify(response), 200
1096
 
1097
+ # Загружаем данные заказа из найденной записи
1098
  shop_st = result[0] if result[0] else '{}'
1099
  shop_st_data = json.loads(shop_st)
1100
  logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
 
1102
  # Ищем значение по ключу order
1103
  value = shop_st_data.get(order, 'not')
1104
 
1105
+ # Возвращаем информацию о заказе
1106
  response = {order: value}
1107
  return jsonify(response), 200
1108