File size: 2,691 Bytes
1e4a027
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
"""

Flare – Fernet şifreleme yardımcıları

- encrypt():  düz string → "enc:<blob>"

- decrypt():  enc:<blob>  → düz string      (veya enc: yoksa aynen döner)

Anahtar: FLARE_TOKEN_KEY   (32-bayt, base64, URL-safe)

"""

import os
from typing import Optional
from cryptography.fernet import Fernet, InvalidToken
from logger import log_error, log_warning

_ENV_KEY = "FLARE_TOKEN_KEY"

def _get_key() -> Fernet:
    """Get encryption key with better error messages"""
    # Direkt environment variable kullan
    key = os.getenv(_ENV_KEY)
    
    # .env dosyasından yüklemeyi dene
    if not key:
        try:
            from dotenv import load_dotenv
            load_dotenv()
            key = os.getenv(_ENV_KEY)
        except ImportError:
            pass
    
    if not key:
        error_msg = (
            f"{_ENV_KEY} ortam değişkeni tanımlanmadı. "
            f"Lütfen 32-byte base64 key oluşturun: python generate_key.py"
        )
        log_error(error_msg)
        raise RuntimeError(error_msg)
    
    # Key formatını kontrol et
    try:
        return Fernet(key.encode())
    except Exception as e:
        error_msg = (
            f"{_ENV_KEY} geçersiz format. "
            f"32-byte base64 URL-safe key olmalı. "
            f"Yeni key için: python generate_key.py"
        )
        log_error(error_msg, error=str(e))
        raise RuntimeError(error_msg)

def encrypt(plain: str) -> str:
    """düz string → enc:..."""
    if not plain:
        log_warning("Empty string passed to encrypt")
        return ""
    
    try:
        f = _get_key()
        encrypted = f.encrypt(plain.encode()).decode()
        return "enc:" + encrypted
    except Exception as e:
        log_error("Encryption failed", error=str(e))
        raise

def decrypt(value: Optional[str]) -> Optional[str]:
    """enc:... ise çözer, değilse aynen döndürür"""
    if value is None or not isinstance(value, str):
        return value
    
    if not value.startswith("enc:"):
        return value
    
    token = value.split("enc:", 1)[1]
    
    try:
        f = _get_key()
        decrypted = f.decrypt(token.encode()).decode()
        return decrypted
    except InvalidToken:
        error_msg = (
            "Şifre çözme başarısız. Muhtemel sebepler:\n"
            "1. FLARE_TOKEN_KEY değişti\n"
            "2. Şifreli veri bozuldu\n"
            "3. Farklı bir key ile şifrelendi"
        )
        log_error(error_msg)
        raise RuntimeError(error_msg)
    except Exception as e:
        log_error("Decryption error", error=str(e))
        raise