50 Zeilen
1.4 KiB
Python
50 Zeilen
1.4 KiB
Python
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())) |