feat: Enhance Configuration Management for Cursor Paths

- Add OS-specific path configurations for Cursor storage, SQLite, and machine ID files
- Integrate configuration file management in `new_signup.py` and `reset_machine_manual.py`
- Remove Workbench Cursor path and main.js modification steps
- Improve cross-platform path detection and configuration handling
- Update version to 1.7.02
This commit is contained in:
yeongpin 2025-03-10 11:18:21 +08:00
parent 66a67fce8b
commit 90e9a5b287
4 changed files with 135 additions and 42 deletions

4
.env
View File

@ -1,2 +1,2 @@
version=1.7.01 version=1.7.02
VERSION=1.7.01 VERSION=1.7.02

View File

@ -1,5 +1,11 @@
# Change Log # Change Log
## v1.7.02
1. Fix: Cursor Path | 修復Cursor路徑
2. Add: Config File | 增加配置文件
3. Remove: Workbench Cursor Path | 移除Workbench Cursor路徑
4. Remove: Cursor Main JS | 移除Cursor main.js
## v1.7.01 ## v1.7.01
- Refactoring: Extract configuration-related code from the `setup_driver` function to an independent `setup_config` function - Refactoring: Extract configuration-related code from the `setup_driver` function to an independent `setup_config` function
- Optimization: Improve code maintainability and make configuration management and browser settings more clear - Optimization: Improve code maintainability and make configuration management and browser settings more clear

View File

@ -170,6 +170,29 @@ def setup_config(translator=None):
} }
} }
# Add OS-specific path configurations
if sys.platform == "win32":
appdata = os.getenv("APPDATA")
default_config['WindowsPaths'] = {
'storage_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "storage.json"),
'sqlite_path': os.path.join(appdata, "Cursor", "User", "globalStorage", "state.vscdb"),
'machine_id_path': os.path.join(os.getenv("APPDATA"), "Cursor", "machineId")
}
elif sys.platform == "darwin":
default_config['MacPaths'] = {
'storage_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/storage.json")),
'sqlite_path': os.path.abspath(os.path.expanduser("~/Library/Application Support/Cursor/User/globalStorage/state.vscdb")),
'machine_id_path': os.path.expanduser("~/Library/Application Support/Cursor/machineId")
}
elif sys.platform == "linux":
sudo_user = os.environ.get('SUDO_USER')
actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~")
default_config['LinuxPaths'] = {
'storage_path': os.path.abspath(os.path.join(actual_home, ".config/Cursor/User/globalStorage/storage.json")),
'sqlite_path': os.path.abspath(os.path.join(actual_home, ".config/Cursor/User/globalStorage/state.vscdb")),
'machine_id_path': os.path.expanduser("~/.config/Cursor/machineId")
}
if os.path.exists(config_file): if os.path.exists(config_file):
config.read(config_file) config.read(config_file)
config_modified = False config_modified = False

View File

@ -10,6 +10,8 @@ import re
import tempfile import tempfile
from colorama import Fore, Style, init from colorama import Fore, Style, init
from typing import Tuple from typing import Tuple
import configparser
from new_signup import get_user_documents_path
# Initialize colorama # Initialize colorama
init() init()
@ -70,15 +72,42 @@ def get_cursor_machine_id_path(translator=None) -> str:
Returns: Returns:
str: Path to machineId file str: Path to machineId file
""" """
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if os.path.exists(config_file):
config.read(config_file)
if sys.platform == "win32": # Windows if sys.platform == "win32": # Windows
return os.path.join(os.getenv("APPDATA"), "Cursor", "machineId") if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'machine_id_path',
os.path.join(os.getenv("APPDATA"), "Cursor", "machineId"))
return config.get('WindowsPaths', 'machine_id_path')
elif sys.platform == "linux": # Linux elif sys.platform == "linux": # Linux
return os.path.expanduser("~/.config/Cursor/machineId") if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
config.set('LinuxPaths', 'machine_id_path',
os.path.expanduser("~/.config/Cursor/machineId"))
return config.get('LinuxPaths', 'machine_id_path')
elif sys.platform == "darwin": # macOS elif sys.platform == "darwin": # macOS
return os.path.expanduser("~/Library/Application Support/Cursor/machineId") if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'machine_id_path',
os.path.expanduser("~/Library/Application Support/Cursor/machineId"))
return config.get('MacPaths', 'machine_id_path')
else: else:
raise OSError(f"Unsupported operating system: {sys.platform}") raise OSError(f"Unsupported operating system: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def get_workbench_cursor_path(translator=None) -> str: def get_workbench_cursor_path(translator=None) -> str:
"""Get Cursor workbench.desktop.main.js path""" """Get Cursor workbench.desktop.main.js path"""
system = platform.system() system = platform.system()
@ -318,43 +347,73 @@ class MachineIDResetter:
def __init__(self, translator=None): def __init__(self, translator=None):
self.translator = translator self.translator = translator
# Read configuration
config_dir = os.path.join(get_user_documents_path(), ".cursor-free-vip")
config_file = os.path.join(config_dir, "config.ini")
config = configparser.ConfigParser()
if not os.path.exists(config_file):
raise FileNotFoundError(f"Config file not found: {config_file}")
config.read(config_file)
# Check operating system # Check operating system
if sys.platform == "win32": # Windows if sys.platform == "win32": # Windows
appdata = os.getenv("APPDATA") appdata = os.getenv("APPDATA")
if appdata is None: if appdata is None:
raise EnvironmentError("APPDATA Environment Variable Not Set") raise EnvironmentError("APPDATA Environment Variable Not Set")
self.db_path = os.path.join(
if not config.has_section('WindowsPaths'):
config.add_section('WindowsPaths')
config.set('WindowsPaths', 'storage_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "storage.json" appdata, "Cursor", "User", "globalStorage", "storage.json"
) ))
self.sqlite_path = os.path.join( config.set('WindowsPaths', 'sqlite_path', os.path.join(
appdata, "Cursor", "User", "globalStorage", "state.vscdb" appdata, "Cursor", "User", "globalStorage", "state.vscdb"
) ))
self.db_path = config.get('WindowsPaths', 'storage_path')
self.sqlite_path = config.get('WindowsPaths', 'sqlite_path')
elif sys.platform == "darwin": # macOS elif sys.platform == "darwin": # macOS
self.db_path = os.path.abspath(os.path.expanduser( if not config.has_section('MacPaths'):
config.add_section('MacPaths')
config.set('MacPaths', 'storage_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/storage.json" "~/Library/Application Support/Cursor/User/globalStorage/storage.json"
)) )))
self.sqlite_path = os.path.abspath(os.path.expanduser( config.set('MacPaths', 'sqlite_path', os.path.abspath(os.path.expanduser(
"~/Library/Application Support/Cursor/User/globalStorage/state.vscdb" "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb"
)) )))
self.db_path = config.get('MacPaths', 'storage_path')
self.sqlite_path = config.get('MacPaths', 'sqlite_path')
elif sys.platform == "linux": # Linux elif sys.platform == "linux": # Linux
if not config.has_section('LinuxPaths'):
config.add_section('LinuxPaths')
# 获取实际用户的主目录 # 获取实际用户的主目录
sudo_user = os.environ.get('SUDO_USER') sudo_user = os.environ.get('SUDO_USER')
if sudo_user: actual_home = f"/home/{sudo_user}" if sudo_user else os.path.expanduser("~")
actual_home = f"/home/{sudo_user}"
else:
actual_home = os.path.expanduser("~")
self.db_path = os.path.abspath(os.path.join( config.set('LinuxPaths', 'storage_path', os.path.abspath(os.path.join(
actual_home, actual_home,
".config/Cursor/User/globalStorage/storage.json" ".config/Cursor/User/globalStorage/storage.json"
)) )))
self.sqlite_path = os.path.abspath(os.path.join( config.set('LinuxPaths', 'sqlite_path', os.path.abspath(os.path.join(
actual_home, actual_home,
".config/Cursor/User/globalStorage/state.vscdb" ".config/Cursor/User/globalStorage/state.vscdb"
)) )))
self.db_path = config.get('LinuxPaths', 'storage_path')
self.sqlite_path = config.get('LinuxPaths', 'sqlite_path')
else: else:
raise NotImplementedError(f"Not Supported OS: {sys.platform}") raise NotImplementedError(f"Not Supported OS: {sys.platform}")
# Save any changes to config file
with open(config_file, 'w', encoding='utf-8') as f:
config.write(f)
def generate_new_ids(self): def generate_new_ids(self):
"""Generate new machine ID""" """Generate new machine ID"""
# Generate new UUID # Generate new UUID
@ -507,17 +566,22 @@ class MachineIDResetter:
# Update system IDs # Update system IDs
self.update_system_ids(new_ids) self.update_system_ids(new_ids)
# Modify workbench.desktop.main.js
workbench_path = get_workbench_cursor_path(self.translator)
modify_workbench_js(workbench_path, self.translator)
### Remove In v1.7.02
# Modify workbench.desktop.main.js
# workbench_path = get_workbench_cursor_path(self.translator)
# modify_workbench_js(workbench_path, self.translator)
### Remove In v1.7.02
# Check Cursor version and perform corresponding actions # Check Cursor version and perform corresponding actions
greater_than_0_45 = check_cursor_version(self.translator)
if greater_than_0_45: # greater_than_0_45 = check_cursor_version(self.translator)
print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}") # if greater_than_0_45:
patch_cursor_get_machine_id(self.translator) # print(f"{Fore.CYAN}{EMOJI['INFO']} {self.translator.get('reset.detecting_version')} >= 0.45.0{self.translator.get('reset.patching_getmachineid')}{Style.RESET_ALL}")
else: # patch_cursor_get_machine_id(self.translator)
print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}") # else:
# print(f"{Fore.YELLOW}{EMOJI['INFO']} {self.translator.get('reset.version_less_than_0_45')}{Style.RESET_ALL}")
print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}") print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('reset.success')}{Style.RESET_ALL}")
print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}") print(f"\n{Fore.CYAN}{self.translator.get('reset.new_id')}:{Style.RESET_ALL}")