Repository navigation
Expand file tree
/
Copy pathreceiver.py
More file actions
54 lines (44 loc) · 1.97 KB
/
Copy pathreceiver.py
File metadata and controls
54 lines (44 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import loguru, pyclip
from cryptography.fernet import Fernet
from websockets.sync.server import serve
class Receiver:
MAX_MESSAGE_SIZE = 10 * 1024 * 1024
def __init__(self, host, port, key):
self.host = host
self.port = port
self.server = None
self.last_message = None
self.cipher = Fernet(key)
def run(self):
with serve(self.echo, self.host, self.port) as self.server:
loguru.logger.info(f'Receiver listening on {self.host}:{self.port}')
self.server.serve_forever()
def echo(self, websocket):
client = websocket.remote_address
client_str = f"{client[0]}:{client[1]}"
loguru.logger.debug(f'Session started: {client_str}')
try:
for encrypted_message in websocket:
if len(encrypted_message) > self.MAX_MESSAGE_SIZE:
loguru.logger.warning(f'Message size exceeds limit: {len(encrypted_message)} bytes')
continue
try:
message = self.cipher.decrypt(encrypted_message).decode(errors='replace')
except Exception as decrypt_err:
loguru.logger.error(f'Decryption error ({client_str}): {decrypt_err}')
continue
if message == self.last_message:
loguru.logger.debug(f'Duplicate message skipped: {client_str}')
continue
pyclip.copy(message)
self.last_message = message
preview = message[:50] + "..." if len(message) > 50 else message
loguru.logger.debug(f'Content copied to clipboard: {preview}')
except Exception as e:
loguru.logger.error(f'Session error ({client_str}): {e}')
finally:
loguru.logger.debug(f'Session ended: {client_str}')
def stop(self):
if self.server is not None:
self.server.shutdown()
loguru.logger.info('Receiver stopped')