Initial commit
Dieser Commit ist enthalten in:
50
v2_adminpanel/utils/license.py
Normale Datei
50
v2_adminpanel/utils/license.py
Normale Datei
@ -0,0 +1,50 @@
|
||||
import re
|
||||
import secrets
|
||||
from datetime import datetime
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
|
||||
def generate_license_key(license_type='full'):
|
||||
"""
|
||||
Generate a license key in format: AF-F-YYYYMM-XXXX-YYYY-ZZZZ
|
||||
|
||||
AF = Account Factory (Product identifier)
|
||||
F/T = F for Full version, T for Test version
|
||||
YYYY = Year
|
||||
MM = Month
|
||||
XXXX-YYYY-ZZZZ = Random alphanumeric characters
|
||||
"""
|
||||
# Allowed characters (without confusing ones like 0/O, 1/I/l)
|
||||
chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'
|
||||
|
||||
# Date part
|
||||
now = datetime.now(ZoneInfo("Europe/Berlin"))
|
||||
date_part = now.strftime('%Y%m')
|
||||
type_char = 'F' if license_type == 'full' else 'T'
|
||||
|
||||
# Generate random parts (3 blocks of 4 characters)
|
||||
parts = []
|
||||
for _ in range(3):
|
||||
part = ''.join(secrets.choice(chars) for _ in range(4))
|
||||
parts.append(part)
|
||||
|
||||
# Assemble key
|
||||
key = f"AF-{type_char}-{date_part}-{parts[0]}-{parts[1]}-{parts[2]}"
|
||||
|
||||
return key
|
||||
|
||||
|
||||
def validate_license_key(key):
|
||||
"""
|
||||
Validate the License Key Format
|
||||
Expected: AF-F-YYYYMM-XXXX-YYYY-ZZZZ or AF-T-YYYYMM-XXXX-YYYY-ZZZZ
|
||||
"""
|
||||
if not key:
|
||||
return False
|
||||
|
||||
# Pattern for the new format
|
||||
# AF- (fixed) + F or T + - + 6 digits (YYYYMM) + - + 4 characters + - + 4 characters + - + 4 characters
|
||||
pattern = r'^AF-[FT]-\d{6}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$'
|
||||
|
||||
# Uppercase for comparison
|
||||
return bool(re.match(pattern, key.upper()))
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren