DmitrMakeev commited on
Commit
14cce21
·
verified ·
1 Parent(s): 2ff1993

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -51
app.py CHANGED
@@ -1017,88 +1017,63 @@ def get_order_monitop():
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
-
1069
- # Добавляем вывод ключа в консоль
1070
  if secret_key:
1071
  logging.debug(f"Secret key for app {apps_id}: {secret_key}")
1072
  else:
1073
  logging.error(f"Secret key not found for app ID {apps_id}")
1074
- return json.dumps({"error": "Secret key not found for app ID"}), 400
1075
-
1076
- # Проверка подписи
1077
- query_params = {
1078
- 'vk_id': vkid,
1079
- 'order': order,
1080
- 'apps_id': apps_id,
1081
- 'sign': sign
1082
- }
1083
- if not is_valid(query=query_params, secret=secret_key):
1084
  logging.error("Invalid signature")
1085
- return json.dumps({"error": "Invalid signature"}), 400
1086
 
1087
- # Подключаемся к базе данных
1088
- conn = sqlite3.connect(DATABASE_NEW)
 
 
 
 
 
1089
  cursor = conn.cursor()
1090
 
1091
- # Ищем запись по vk_id в базе данных
1092
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1093
  result = cursor.fetchone()
1094
 
1095
- # Если запись не найдена, возвращаем ошибку
1096
  if not result:
1097
  logging.error(f"VK ID {vkid} not found")
1098
  response = {order: 'not'}
1099
  return jsonify(response), 200
1100
 
1101
- # Загружаем данные заказа из найденной записи
1102
  shop_st = result[0] if result[0] else '{}'
1103
  shop_st_data = json.loads(shop_st)
1104
  logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
@@ -1106,13 +1081,13 @@ def get_order():
1106
  # Ищем значение по ключу order
1107
  value = shop_st_data.get(order, 'not')
1108
 
1109
- # Возвращаем информацию о заказе
1110
  response = {order: value}
1111
  return jsonify(response), 200
1112
 
1113
  except Exception as e:
1114
  logging.error(f"An error occurred: {str(e)}")
1115
- return json.dumps({"error": str(e)}), 500
1116
 
1117
 
1118
 
 
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 в консоль
1043
+ logging.debug(f"api_key_apps_vk: {api_key_apps_vk}")
 
 
1044
 
1045
+ # Проверка на наличие apps_id и извлечение ключа
1046
+ secret_key = api_key_apps_vk.get(apps_id)
 
 
1047
  if secret_key:
1048
  logging.debug(f"Secret key for app {apps_id}: {secret_key}")
1049
  else:
1050
  logging.error(f"Secret key not found for app ID {apps_id}")
1051
+ return jsonify({"error": "Secret key not found for app ID"}), 400
1052
+
1053
+ # Нужно добавить проверку подписи
1054
+ if not is_valid(query=request.form, secret=secret_key):
 
 
 
 
 
 
1055
  logging.error("Invalid signature")
1056
+ return jsonify({"error": "Invalid signature"}), 400
1057
 
1058
+ # Проверка наличия vk_id и order
1059
+ if not vkid or not order:
1060
+ logging.error("VK ID and order are required")
1061
+ return jsonify({"error": "VK ID and order are required"}), 400
1062
+
1063
+ # Подключение к базе данных
1064
+ conn = sqlite3.connect('your_database.db') # Замените на ваш путь к базе данных
1065
  cursor = conn.cursor()
1066
 
1067
+ # Ищем запись по vk_id
1068
  cursor.execute("SELECT orders FROM contacts WHERE vk_id = ?", (vkid,))
1069
  result = cursor.fetchone()
1070
 
1071
+ # Если запись по vk_id не найдена, возвращаем значение "not" для ордера
1072
  if not result:
1073
  logging.error(f"VK ID {vkid} not found")
1074
  response = {order: 'not'}
1075
  return jsonify(response), 200
1076
 
 
1077
  shop_st = result[0] if result[0] else '{}'
1078
  shop_st_data = json.loads(shop_st)
1079
  logging.debug(f"Existing record found. Loaded JSON: {shop_st_data}")
 
1081
  # Ищем значение по ключу order
1082
  value = shop_st_data.get(order, 'not')
1083
 
1084
+ # Возвращаем данные из столбца
1085
  response = {order: value}
1086
  return jsonify(response), 200
1087
 
1088
  except Exception as e:
1089
  logging.error(f"An error occurred: {str(e)}")
1090
+ return jsonify({"error": str(e)}), 500
1091
 
1092
 
1093