license_manager.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import requests
  2. import json
  3. import os
  4. import platform
  5. import uuid
  6. import hashlib
  7. from datetime import datetime
  8. from cryptography.fernet import Fernet
  9. import base64
  10. class LicenseManager:
  11. def __init__(self):
  12. self.license_file = os.path.join(
  13. os.getenv("APPDATA"), "CursorPro", "license.json"
  14. )
  15. self.activation_url = (
  16. "https://your-activation-server.com/activate" # 替换为您的激活服务器地址
  17. )
  18. self.verify_url = (
  19. "https://your-activation-server.com/verify" # 替换为您的验证服务器地址
  20. )
  21. self.key = b"Kj8nP9x2Qs5mY7vR4wL1hC3fA6tD0iB8"
  22. self.fernet = Fernet(base64.b64encode(self.key))
  23. def get_hardware_info(self):
  24. """获取硬件信息作为机器码"""
  25. system_info = {
  26. "platform": platform.platform(),
  27. "machine": platform.machine(),
  28. "processor": platform.processor(),
  29. "hostname": platform.node(),
  30. }
  31. # 获取MAC地址
  32. mac = ":".join(
  33. [
  34. "{:02x}".format((uuid.getnode() >> elements) & 0xFF)
  35. for elements in range(0, 2 * 6, 2)
  36. ][::-1]
  37. )
  38. system_info["mac"] = mac
  39. # 生成机器码
  40. machine_code = hashlib.md5(json.dumps(system_info).encode()).hexdigest()
  41. return machine_code
  42. def activate_license(self, license_key):
  43. """在线激活许可证"""
  44. try:
  45. machine_code = self.get_hardware_info()
  46. # 准备激活数据
  47. activation_data = {
  48. "license_key": license_key,
  49. "machine_code": machine_code,
  50. "activation_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
  51. }
  52. # 发送激活请求
  53. response = requests.post(
  54. self.activation_url, json=activation_data, timeout=10
  55. )
  56. if response.status_code == 200:
  57. result = response.json()
  58. if result.get("success"):
  59. # 保存许可证信息
  60. license_data = {
  61. "license_key": license_key,
  62. "machine_code": machine_code,
  63. "activation_date": activation_data["activation_date"],
  64. "expiry_date": result.get("expiry_date"),
  65. "is_activated": True,
  66. }
  67. self._save_license(license_data)
  68. return True, "激活成功!"
  69. else:
  70. return False, result.get("message", "激活失败")
  71. else:
  72. return False, "服务器连接失败"
  73. except Exception as e:
  74. return False, f"激活过程出错: {str(e)}"
  75. def verify_license(self):
  76. """验证许可证"""
  77. try:
  78. if not os.path.exists(self.license_file):
  79. return False, "未找到许可证文件"
  80. license_data = self._load_license()
  81. if not license_data:
  82. return False, "许可证文件无效"
  83. # 验证机器码
  84. current_machine = self.get_hardware_info()
  85. if current_machine != license_data.get("machine_code"):
  86. return False, "硬件信息不匹配"
  87. # 在线验证
  88. verify_data = {
  89. "license_key": license_data.get("license_key"),
  90. "machine_code": current_machine,
  91. }
  92. response = requests.post(self.verify_url, json=verify_data, timeout=10)
  93. if response.status_code == 200:
  94. result = response.json()
  95. if result.get("success"):
  96. return True, "许可证有效"
  97. return False, result.get("message", "许可证无效")
  98. # 如果在线验证失败,使用本地数据
  99. expiry_date = datetime.strptime(license_data["expiry_date"], "%Y-%m-%d")
  100. if datetime.now() > expiry_date:
  101. return False, "许可证已过期"
  102. return True, "许可证有效"
  103. except Exception as e:
  104. return False, f"验证过程出错: {str(e)}"
  105. def _save_license(self, license_data):
  106. """加密保存许可证数据"""
  107. try:
  108. os.makedirs(os.path.dirname(self.license_file), exist_ok=True)
  109. encrypted_data = self.fernet.encrypt(json.dumps(license_data).encode())
  110. with open(self.license_file, "wb") as f:
  111. f.write(encrypted_data)
  112. except Exception as e:
  113. print(f"保存许可证出错: {e}")
  114. def _load_license(self):
  115. """加密读取许可证数据"""
  116. try:
  117. with open(self.license_file, "rb") as f:
  118. encrypted_data = f.read()
  119. decrypted_data = self.fernet.decrypt(encrypted_data)
  120. return json.loads(decrypted_data)
  121. except Exception as e:
  122. print(f"读取许可证出错: {e}")
  123. return None