vaka.pro commited on
Commit
3fe9d85
·
1 Parent(s): e2f3a86

fix: removes sensitive data from interface and logs

Browse files
Files changed (1) hide show
  1. app.py +91 -55
app.py CHANGED
@@ -3,87 +3,123 @@ import requests
3
  import gradio as gr
4
  from fastapi import FastAPI, Request, HTTPException
5
  from fastapi.responses import JSONResponse
6
- import json
7
 
8
  # Конфигурация
9
  PRIVATE_SPACE_URL = os.getenv("PRIVATE_SPACE_URL")
10
  PUBLIC_ENDPOINT = os.getenv("PUBLIC_ENDPOINT")
11
 
12
- # Создаем FastAPI приложение
13
- fastapi_app = FastAPI(title="Yandex Forms Proxy")
14
 
15
- # FastAPI эндпоинт
16
- if PUBLIC_ENDPOINT:
17
 
18
- @fastapi_app.post(f"/{PUBLIC_ENDPOINT}")
19
- async def proxy_webhook(request: Request):
20
- if not PRIVATE_SPACE_URL:
21
- raise HTTPException(status_code=500, detail="Service misconfigured")
 
 
 
 
22
 
23
- try:
24
- # Получаем данные запроса
25
- body_bytes = await request.body()
26
 
27
- # Подготавливаем заголовки
28
- headers = {
29
- "Content-Type": request.headers.get("content-type", "application/json"),
30
- }
31
 
32
- # Копируем заголовки
33
- for header in ["X-FORM-ID", "X-DELIVERY-ID", "X-FORM-ANSWER-ID"]:
34
- if value := request.headers.get(header):
35
- headers[header] = value
36
 
37
- # Отправляем в приватное пространство
38
- response = requests.post(
39
- PRIVATE_SPACE_URL, data=body_bytes, headers=headers, timeout=30
40
- )
 
41
 
42
- # Возвращаем ответ
43
- return JSONResponse(
44
- content=response.json() if response.content else {},
45
- status_code=response.status_code,
46
- )
47
 
48
- except requests.exceptions.Timeout:
49
- raise HTTPException(status_code=504, detail="Service timeout")
50
- except requests.exceptions.ConnectionError:
51
- raise HTTPException(
52
- status_code=502, detail="Cannot connect to target service"
53
- )
54
- except Exception as e:
55
- raise HTTPException(status_code=500, detail="Internal server error")
 
 
56
 
57
 
58
  # Health check
59
  @fastapi_app.get("/health")
60
  async def health_check():
61
- return {
62
- "status": "ok" if PRIVATE_SPACE_URL and PUBLIC_ENDPOINT else "error",
63
- "service": "yandex-forms-proxy",
64
- "webhook_configured": bool(PUBLIC_ENDPOINT),
65
- "target_configured": bool(PRIVATE_SPACE_URL),
66
- }
 
 
 
 
67
 
68
 
69
  # Корневой эндпоинт
70
  @fastapi_app.get("/")
71
  async def root():
72
- return {
73
- "service": "Yandex Forms Proxy",
74
- "description": "Сервисный прокси для перенаправления запросов",
75
- "status": "operational",
76
- "health_check": "/health",
77
- "docs": "/docs",
78
- }
 
 
 
 
 
 
 
 
 
 
 
 
79
 
 
 
80
 
81
- # Создаем Gradio интерфейс
82
- with gr.Blocks(title="Proxy Service") as demo:
83
- gr.Markdown("# 🔒 Proxy Service")
84
- gr.Markdown("## Сервисное приложение для системной интеграции")
85
 
86
- gr.Markdown("### ⚠️ см. README")
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
  # Монтируем FastAPI в Gradio
89
  app = gr.mount_gradio_app(fastapi_app, demo, path="/")
 
 
 
 
 
3
  import gradio as gr
4
  from fastapi import FastAPI, Request, HTTPException
5
  from fastapi.responses import JSONResponse
 
6
 
7
  # Конфигурация
8
  PRIVATE_SPACE_URL = os.getenv("PRIVATE_SPACE_URL")
9
  PUBLIC_ENDPOINT = os.getenv("PUBLIC_ENDPOINT")
10
 
11
+ # ==================== FastAPI приложение ====================
12
+ fastapi_app = FastAPI(title="Proxy Service")
13
 
 
 
14
 
15
+ # Универсальный обработчик
16
+ @fastapi_app.post("/{path:path}")
17
+ async def proxy_webhook(path: str, request: Request):
18
+ """Обработчик вебхуков с проверкой пути."""
19
+ # Проверяем секретный путь
20
+ if not PUBLIC_ENDPOINT or path != PUBLIC_ENDPOINT:
21
+ # Возвращаем 404 без деталей
22
+ raise HTTPException(status_code=404, detail="Not found")
23
 
24
+ if not PRIVATE_SPACE_URL:
25
+ # Общая ошибка без деталей
26
+ raise HTTPException(status_code=500, detail="Service error")
27
 
28
+ try:
29
+ body_bytes = await request.body()
 
 
30
 
31
+ # Минимальные заголовки
32
+ headers = {
33
+ "Content-Type": request.headers.get("content-type", "application/json"),
34
+ }
35
 
36
+ # Только заголовки
37
+ incoming_headers = ["X-FORM-ID", "X-DELIVERY-ID", "X-FORM-ANSWER-ID"]
38
+ for header in incoming_headers:
39
+ if value := request.headers.get(header):
40
+ headers[header] = value
41
 
42
+ # Отправляем запрос
43
+ response = requests.post(
44
+ PRIVATE_SPACE_URL, data=body_bytes, headers=headers, timeout=25
45
+ )
 
46
 
47
+ # Возвращаем ответ
48
+ return JSONResponse(
49
+ status_code=response.status_code, content={"status": "processed"}
50
+ )
51
+
52
+ except requests.exceptions.Timeout:
53
+ raise HTTPException(status_code=504, detail="Service timeout")
54
+ except Exception:
55
+ # Общая ошибка без деталей
56
+ raise HTTPException(status_code=500, detail="Internal error")
57
 
58
 
59
  # Health check
60
  @fastapi_app.get("/health")
61
  async def health_check():
62
+ """Безопасная проверка работоспособности."""
63
+ is_configured = bool(PRIVATE_SPACE_URL and PUBLIC_ENDPOINT)
64
+
65
+ return JSONResponse(
66
+ content={
67
+ "status": "healthy" if is_configured else "degraded",
68
+ "service": "proxy",
69
+ "timestamp": "...", # Можно добавить timestamp без деталей
70
+ }
71
+ )
72
 
73
 
74
  # Корневой эндпоинт
75
  @fastapi_app.get("/")
76
  async def root():
77
+ return JSONResponse(content={"service": "API Gateway", "status": "operational"})
78
+
79
+
80
+ # ==================== Безопасный Gradio интерфейс ====================
81
+ def create_gradio_interface():
82
+ with gr.Blocks(title="Proxy Service", theme=gr.themes.Base()) as demo:
83
+ gr.Markdown("# 🔒 Защищенный прокси-сервис")
84
+
85
+ gr.Markdown(
86
+ """
87
+ ### ⚠️ Сервисное приложение
88
+
89
+ Этот сервис предназначен исключительно для системной интеграции.
90
+
91
+ ---
92
+
93
+ ### 📊 Системный статус
94
+ """
95
+ )
96
 
97
+ # Безопасный статус
98
+ status_box = gr.Textbox(label="Статус", interactive=False, lines=4)
99
 
100
+ def get_safe_status():
101
+ """Возвращает безопасный статус без конфиденциальной информации."""
102
+ if not PUBLIC_ENDPOINT or not PRIVATE_SPACE_URL:
103
+ return "🔧 Требуется настройка\n\nУстановите необходимые переменные окружения."
104
 
105
+ # БЕЗОПАСНО: только общая информация
106
+ return """✅ Сервис готов к работе
107
+
108
+ Статус: Активен
109
+ Вебхук: Настроен
110
+ Целевой сервис: Доступен
111
+
112
+ Для настройки интеграции обратитесь к администратору системы.
113
+ """
114
+ return demo
115
+
116
+
117
+ # Создаем интерфейс
118
+ demo = create_gradio_interface()
119
 
120
  # Монтируем FastAPI в Gradio
121
  app = gr.mount_gradio_app(fastapi_app, demo, path="/")
122
+
123
+ # Локальный запуск
124
+ if __name__ == "__main__":
125
+ demo.launch(server_name="0.0.0.0", server_port=7860)