Dmtlant commited on
Commit
65dd513
·
verified ·
1 Parent(s): 6572d1b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +146 -0
app.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from cryptography.fernet import Fernet
3
+ import base64
4
+ from cryptography.hazmat.primitives import hashes
5
+ from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
6
+ import os
7
+ import time
8
+ import datetime
9
+
10
+ # Хранилище сообщений в памяти
11
+ messages = []
12
+ GLOBAL_PASSWORD = "default_password" # Установите общий пароль для всего чата
13
+ SALT = os.urandom(16) # Генерируем общую соль для всех сообщений
14
+ MAX_MESSAGES = 100 # Максимальное количество сохраняемых сообщений
15
+
16
+ def generate_key(password, salt):
17
+ kdf = PBKDF2HMAC(
18
+ algorithm=hashes.SHA256(),
19
+ length=32,
20
+ salt=salt,
21
+ iterations=100000,
22
+ )
23
+ key = base64.urlsafe_b64encode(kdf.derive(password.encode()))
24
+ return key
25
+
26
+ def encrypt_message(text):
27
+ key = generate_key(GLOBAL_PASSWORD, SALT)
28
+ f = Fernet(key)
29
+ return f.encrypt(text.encode())
30
+
31
+ def decrypt_message(encrypted_data):
32
+ key = generate_key(GLOBAL_PASSWORD, SALT)
33
+ f = Fernet(key)
34
+ return f.decrypt(encrypted_data).decode()
35
+
36
+ def send_message(username, message_text, password):
37
+ global GLOBAL_PASSWORD
38
+
39
+ if not message_text or not username:
40
+ return "Введите имя и сообщение", get_chat_history(password)
41
+
42
+ # Если это первое сообщение, устанавливаем пароль
43
+ if not messages and password:
44
+ GLOBAL_PASSWORD = password
45
+
46
+ # Проверяем пароль для существующего чата
47
+ if messages and password != GLOBAL_PASSWORD:
48
+ return "❌ Неверный пароль чата", get_chat_history(password)
49
+
50
+ timestamp = datetime.datetime.now().strftime("%H:%M:%S")
51
+
52
+ try:
53
+ # Подготовка сообщения для шифрования
54
+ full_message = f"{username} ({timestamp}): {message_text}"
55
+
56
+ # Шифруем и сохраняем сообщение
57
+ encrypted_data = encrypt_message(full_message)
58
+ messages.append(encrypted_data)
59
+
60
+ # Ограничиваем количество сообщений
61
+ if len(messages) > MAX_MESSAGES:
62
+ messages.pop(0)
63
+
64
+ return "", get_chat_history(password)
65
+ except Exception as e:
66
+ return f"Ошибка: {str(e)}", get_chat_history(password)
67
+
68
+ def get_chat_history(password):
69
+ global GLOBAL_PASSWORD
70
+
71
+ if not messages:
72
+ return "Чат пуст. Отправьте первое сообщение!"
73
+
74
+ if password != GLOBAL_PASSWORD:
75
+ return "🔒 Введите правильный пароль чата для просмотра сообщений"
76
+
77
+ try:
78
+ # Расшифровываем и отображаем все сообщения
79
+ decrypted_messages = []
80
+ for msg in messages:
81
+ decrypted = decrypt_message(msg)
82
+ decrypted_messages.append(decrypted)
83
+
84
+ return "\n".join(decrypted_messages)
85
+ except Exception as e:
86
+ return f"Ошибка при расшифровке: {str(e)}"
87
+
88
+ def check_for_updates(chat_history, password):
89
+ time.sleep(1) # Задержка для предотвращения слишком частого обновления
90
+ return get_chat_history(password)
91
+
92
+ # Создаем интерфейс Gradio
93
+ with gr.Blocks(title="Зашифрованный чат (72 часа)") as demo:
94
+ gr.Markdown("## 🔒 Временный зашифрованный чат")
95
+ gr.Markdown("Чат доступен в течение 72 часов или до закрытия Google Colab")
96
+
97
+ with gr.Row():
98
+ username = gr.Textbox(label="Ваше имя", placeholder="Введите ваше имя...")
99
+ chat_password = gr.Textbox(label="Пароль чата", type="password",
100
+ placeholder="Пароль для шифрования чата...")
101
+
102
+ chat_display = gr.Textbox(label="Сообщения чата", lines=15, interactive=False)
103
+
104
+ with gr.Row():
105
+ message_input = gr.Textbox(label="Сообщение", placeholder="Введите сообщение...", lines=2)
106
+ send_btn = gr.Button("Отправить")
107
+
108
+ error_box = gr.Textbox(label="Статус", interactive=False, visible=True)
109
+
110
+ refresh_btn = gr.Button("Обновить чат")
111
+
112
+ # Обработчики событий
113
+ send_btn.click(
114
+ fn=send_message,
115
+ inputs=[username, message_input, chat_password],
116
+ outputs=[error_box, chat_display]
117
+ ).then(lambda: "", outputs=message_input)
118
+
119
+ refresh_btn.click(
120
+ fn=check_for_updates,
121
+ inputs=[chat_display, chat_password],
122
+ outputs=[chat_display]
123
+ )
124
+
125
+ # Автоматическое обновление
126
+ chat_display.change(
127
+ fn=lambda: time.sleep(0.5), # Небольшая пауза
128
+ inputs=None,
129
+ outputs=None
130
+ )
131
+
132
+ gr.Markdown("""
133
+ ### 📝 Инструкция по использованию
134
+ 1. **Первый пользователь** устанавливает пароль чата
135
+ 2. **Поделитесь ссылкой** и паролем с участниками чата
136
+ 3. **Все участники** должны использовать один и тот же пароль
137
+ 4. Нажимайте "Обновить чат" чтобы увидеть новые сообщения
138
+ 5. История сообщений хранится только в памяти и будет потеряна при закрытии Colab
139
+
140
+ ### ⚠️ Важно:
141
+ - Ссылка будет работать не более 72 часов
142
+ - При закрытии вкладки Google Colab чат будет потерян
143
+ - Чат не сохраняется между сессиями
144
+ """)
145
+
146
+ demo.launch(share=True)