From ae698796e723eae20fd3f38fdce8e084beed9121 Mon Sep 17 00:00:00 2001 From: huangzhenpc Date: Fri, 14 Feb 2025 20:44:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E9=9D=A2=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=95=8C=E9=9D=A2=E5=92=8C=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=201.=E7=BB=9F=E4=B8=80=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E7=95=8C=E9=9D=A2=E9=A3=8E=E6=A0=BC=202.?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A6=81=E7=94=A8=E6=9B=B4=E6=96=B0/?= =?UTF-8?q?=E7=AA=81=E7=A0=B4=E9=99=90=E5=88=B6/=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=9A=84=E6=93=8D=E4=BD=9C=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=203.=E5=A2=9E=E5=8A=A0=E5=A4=8D=E5=88=B6=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E5=8A=9F=E8=83=BD=204.=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=E5=92=8C=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=8C=87=E5=BC=95=205.=E6=8F=90=E5=8D=87=E6=95=B4=E4=BD=93?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=B5=81=E7=95=85=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account_switcher.py | 323 +++++++--------------- banbenjietu.png | Bin 56841 -> 38535 bytes cursor_auth_manager.py | 96 ++++++- cursor_win_id_modifier.ps1 | 93 +++++-- disable_update.ps1 | 83 ++++++ gui/main_window.py | 533 +++++++++++++++++++++---------------- test_disable_update.py | 210 +++++++++++++++ utils/cursor_resetter.py | 114 ++++++-- version.txt | 2 +- 9 files changed, 945 insertions(+), 509 deletions(-) create mode 100644 disable_update.ps1 create mode 100644 test_disable_update.py diff --git a/account_switcher.py b/account_switcher.py index 5909c35..4a915fa 100644 --- a/account_switcher.py +++ b/account_switcher.py @@ -352,106 +352,30 @@ class AccountSwitcher: return "网络请求失败,请稍后重试" return str(error) - def get_process_details(self, process_name: str) -> List[Dict]: - """获取进程详细信息 - - Args: - process_name: 进程名称 - - Returns: - List[Dict]: 进程详细信息列表 - """ - try: - # 使用 tasklist 命令替代 wmi - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - - output = subprocess.check_output( - f'tasklist /FI "IMAGENAME eq {process_name}" /FO CSV /NH', - startupinfo=startupinfo, - shell=True - ).decode('gbk') - - processes = [] - if output.strip(): - for line in output.strip().split('\n'): - if line.strip(): - parts = line.strip('"').split('","') - if len(parts) >= 2: - processes.append({ - 'name': parts[0], - 'pid': parts[1] - }) - return processes - except Exception as e: - logging.error(f"获取进程信息失败: {str(e)}") - return [] - def close_cursor_process(self) -> bool: - """关闭所有Cursor进程 - - Returns: - bool: 是否成功关闭所有进程 - """ + """关闭所有Cursor相关进程""" try: if sys.platform == "win32": - # 创建startupinfo对象来隐藏命令行窗口 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - startupinfo.wShowWindow = subprocess.SW_HIDE - # 获取进程详情 - processes = self.get_process_details("Cursor.exe") - if processes: - logging.info(f"发现 {len(processes)} 个Cursor进程") - for p in processes: - logging.info(f"进程信息: PID={p['pid']}, 路径={p['name']}") + # 直接使用taskkill命令强制结束所有相关进程 + process_names = ["Cursor.exe", "devsense.php.ls.exe", "intelliphp.ls.exe"] + for name in process_names: + try: + subprocess.run( + f"taskkill /f /t /im {name} >nul 2>&1", + startupinfo=startupinfo, + shell=True, + timeout=5 + ) + except: + pass - # 尝试关闭进程 - subprocess.run( - "taskkill /f /im Cursor.exe >nul 2>&1", - startupinfo=startupinfo, - shell=True - ) - - # 等待进程关闭,增加重试次数和等待时间 - retry_count = 0 - max_retries = 10 # 增加最大重试次数 - wait_time = 2 # 增加每次等待时间 - - while retry_count < max_retries: - remaining_processes = self.get_process_details("Cursor.exe") - if not remaining_processes: - logging.info("所有Cursor进程已关闭") - # 额外等待一段时间确保系统资源完全释放 - time.sleep(2) - return True - - retry_count += 1 - if retry_count >= max_retries: - processes = self.get_process_details("Cursor.exe") - if processes: - logging.error(f"无法关闭以下进程:") - for p in processes: - logging.error(f"PID={p['pid']}, 路径={p['name']}") - # 最后一次尝试强制结束 - try: - subprocess.run( - "taskkill /f /im Cursor.exe /t >nul 2>&1", - startupinfo=startupinfo, - shell=True - ) - time.sleep(2) - except: - pass - return False - - logging.warning(f"等待进程关闭, 尝试 {retry_count}/{max_retries}...") - time.sleep(wait_time) - + # 等待一小段时间确保进程完全关闭 + time.sleep(2) return True else: - # 其他系统的处理 if sys.platform == "darwin": subprocess.run("killall Cursor 2>/dev/null", shell=True) else: @@ -472,12 +396,11 @@ class AccountSwitcher: return False # 2. 使用新的重置工具类执行重置 - success, message = self.resetter.reset_cursor(disable_update=True) + success, message = self.resetter.reset_cursor(disable_update=False) # 不在这里禁用更新 if not success: logging.error(f"重置失败: {message}") return False - # 不在这里重启Cursor,让调用者决定何时重启 logging.info("机器码重置完成") return True @@ -486,104 +409,55 @@ class AccountSwitcher: return False def restart_cursor(self) -> bool: - """重启Cursor编辑器 - - Returns: - bool: 是否成功重启 - """ + """重启Cursor编辑器""" try: - logging.info("正在重启Cursor...") + # 1. 确保进程已关闭 + self.close_cursor_process() - # 确保进程已关闭 - if not self.close_cursor_process(): - logging.error("无法关闭Cursor进程") - return False - - # 等待系统资源释放 - time.sleep(3) + # 2. 等待一小段时间 + time.sleep(2) - # 启动Cursor + # 3. 启动Cursor if sys.platform == "win32": cursor_exe = self.cursor_path / "Cursor.exe" if cursor_exe.exists(): - max_retries = 3 - for attempt in range(max_retries): - try: - # 使用subprocess启动 - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + try: + # 使用ShellExecuteW以管理员权限启动 + result = ctypes.windll.shell32.ShellExecuteW( + None, # 父窗口句柄 + "runas", # 以管理员权限运行 + str(cursor_exe), # 程序路径 + None, # 参数 + str(cursor_exe.parent), # 工作目录 + 1 # 正常窗口显示 + ) + + # ShellExecuteW返回值大于32表示成功 + if result > 32: + time.sleep(3) # 等待启动 + return True + else: + logging.error(f"启动Cursor失败,错误码: {result}") + return False - subprocess.Popen( - str(cursor_exe), - startupinfo=startupinfo, - creationflags=subprocess.CREATE_NEW_CONSOLE - ) - - # 等待进程启动 - time.sleep(5) # 增加等待时间 - - # 验证进程是否启动 - processes = self.get_process_details("Cursor.exe") - if processes: - logging.info("Cursor启动成功") - return True - else: - if attempt < max_retries - 1: - logging.warning(f"启动尝试 {attempt + 1} 失败,准备重试...") - time.sleep(3) - continue - - logging.error("Cursor进程未找到") - # 尝试使用 os.startfile 作为备选方案 - try: - os.startfile(str(cursor_exe)) - time.sleep(5) - logging.info("使用备选方案启动Cursor") - return True - except Exception as e: - logging.error(f"备选启动方案失败: {str(e)}") - return False - - except Exception as e: - if attempt < max_retries - 1: - logging.warning(f"启动尝试 {attempt + 1} 失败: {str(e)},准备重试...") - time.sleep(3) - continue - - logging.error(f"启动Cursor失败: {str(e)}") - # 尝试使用 os.startfile 作为最后的备选方案 - try: - os.startfile(str(cursor_exe)) - time.sleep(5) - logging.info("使用备选方案启动Cursor") - return True - except Exception as e: - logging.error(f"备选启动方案失败: {str(e)}") - return False + except Exception as e: + logging.error(f"启动Cursor失败: {str(e)}") + return False else: logging.error(f"未找到Cursor程序: {cursor_exe}") return False - elif sys.platform == "darwin": + else: try: - subprocess.run("open -a Cursor", shell=True, check=True) - time.sleep(5) - logging.info("Cursor启动成功") + if sys.platform == "darwin": + subprocess.run("open -a Cursor", shell=True, check=True) + else: + subprocess.run("sudo cursor &", shell=True, check=True) + time.sleep(3) return True - except subprocess.CalledProcessError as e: - logging.error(f"启动Cursor失败: {str(e)}") - return False - elif sys.platform == "linux": - try: - subprocess.run("cursor &", shell=True, check=True) - time.sleep(5) - logging.info("Cursor启动成功") - return True - except subprocess.CalledProcessError as e: + except Exception as e: logging.error(f"启动Cursor失败: {str(e)}") return False - return False - except Exception as e: logging.error(f"重启Cursor失败: {str(e)}") return False @@ -776,12 +650,14 @@ class AccountSwitcher: if not self.reset_machine_id(): return False, "重置机器码失败" - # 7. 重启Cursor(只在这里执行一次重启) + # 7. 重启Cursor logging.info("正在重启Cursor...") retry_count = 0 max_retries = 3 while retry_count < max_retries: if self.restart_cursor(): + # 等待进程完全启动 + time.sleep(5) break retry_count += 1 if retry_count < max_retries: @@ -824,50 +700,17 @@ class AccountSwitcher: """禁用Cursor更新""" try: # 1. 先关闭所有Cursor进程 - if sys.platform == "win32": - # 创建startupinfo对象来隐藏命令行窗口 - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - startupinfo.wShowWindow = subprocess.SW_HIDE - - # 关闭Cursor - subprocess.run( - "taskkill /f /im Cursor.exe >nul 2>&1", - startupinfo=startupinfo, - shell=True - ) - time.sleep(2) + if not self.close_cursor_process(): + return False, "无法关闭Cursor进程,请手动关闭后重试" - # 2. 删除updater目录并创建同名文件以阻止更新 - updater_path = Path(os.getenv('LOCALAPPDATA')) / "cursor-updater" + # 2. 调用resetter的disable_auto_update方法 + success, message = self.resetter.disable_auto_update() + if not success: + logging.error(f"禁用自动更新失败: {message}") + return False, f"禁用更新失败: {message}" - try: - # 如果是目录,则删除 - if updater_path.is_dir(): - import shutil - shutil.rmtree(str(updater_path)) - logging.info("删除updater目录成功") - - # 如果是文件,则删除 - if updater_path.is_file(): - os.remove(str(updater_path)) - logging.info("删除updater文件成功") - - # 创建同名空文件 - updater_path.touch() - logging.info("创建updater空文件成功") - - # 3. 重启Cursor - cursor_exe = self.cursor_path / "Cursor.exe" - if cursor_exe.exists(): - os.startfile(str(cursor_exe)) - logging.info("Cursor重启成功") - - return True, "Cursor更新已禁用,程序已重启" - - except Exception as e: - logging.error(f"操作updater文件失败: {str(e)}") - return False, f"禁用更新失败: {str(e)}" + logging.info("更新已禁用") + return True, "Cursor更新已禁用" except Exception as e: logging.error(f"禁用Cursor更新失败: {str(e)}") @@ -967,6 +810,26 @@ class AccountSwitcher: return False, "多次尝试后心跳发送失败" + def bypass_cursor_limit(self) -> Tuple[bool, str]: + """突破Cursor使用限制""" + try: + # 1. 先关闭所有Cursor进程 + if not self.close_cursor_process(): + return False, "无法关闭Cursor进程,请手动关闭后重试" + + # 2. 调用resetter的reset_cursor方法 + success, message = self.resetter.reset_cursor(disable_update=True) + if not success: + logging.error(f"突破限制失败: {message}") + return False, f"突破限制失败: {message}" + + logging.info("突破限制成功") + return True, "突破限制成功" + + except Exception as e: + logging.error(f"突破限制失败: {str(e)}") + return False, f"突破限制失败: {str(e)}" + def main(): """主函数""" try: @@ -982,13 +845,15 @@ def main(): switcher = AccountSwitcher() print("\n=== Cursor账号切换工具 ===") - print("1. 激活并切换账号") - print("2. 仅重置机器码") + print("1. 禁用自动更新") + print("2. 突破使用限制") + print("3. 激活并切换账号") + print("4. 仅重置机器码") while True: try: - choice = int(input("\n请选择操作 (1 或 2): ").strip()) - if choice in [1, 2]: + choice = int(input("\n请选择操作 (1-4): ").strip()) + if choice in [1, 2, 3, 4]: break else: print("无效的选项,请重新输入") @@ -996,6 +861,18 @@ def main(): print("请输入有效的数字") if choice == 1: + success, message = switcher.disable_cursor_update() + if success: + print("\n更新已禁用!") + else: + print(f"\n禁用更新失败: {message}") + elif choice == 2: + success, message = switcher.bypass_cursor_limit() + if success: + print("\n突破限制成功!") + else: + print(f"\n突破限制失败: {message}") + elif choice == 3: activation_code = input("请输入激活码: ").strip() if switcher.activate_and_switch(activation_code): print("\n账号激活成功!") diff --git a/banbenjietu.png b/banbenjietu.png index 9ae94f28e4e32acd3d42fad2138122f8a23988b2..276042b30e1cb02406b44060b9fedf3358721b6c 100644 GIT binary patch literal 38535 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�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 dU<#jF)I+UG=>`9D5A{j%*J{TlR%_m|o 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%0Aw}rh3(DP+QG@G)ZsTEgmY z+;(JLp1T)1L^(v><;nU`uu>E@ACWbwKtdN!GiL2`mn_4AcmMyNzE z;@B{b2+92x+tI}bpNVP^pJ8!XQtZSjnGeE8<`uO)q57t2V)&7{AymXM_qo-Eie#W@ z&v$kWCf=?ReB)|KMRn*A_Djb}8kMn3%6`GMi?CAO#*=Wz>iM=k8Ep_9$sUW-Wcu?G z!lJbOXnd3>nW%ka%;233SZ*~qgE)bal0EQjJ*`udnUX{dvt?{ilrDKP`c8D@$$!4b zEjF(-=G>t&DwATwtkKbxhpd?AnJj!vn>O5wv|!T4?B45h*?5zRQW4uoi0Ow!iEh64 zvVaCsV45uXKx#S3?u8f9;JwPPt+737eKnCC&qv+gBdb`yzU@@*)I2-R135GkP}Dwj zfycub(pn^(7Vet>a2wr6dG~$8N9|x$f6XPzdr;rTd0O^%^)r&rb6xxv@rVM9XmBMn zrP+*Z$-BPtIqjVB_xm)CKUZ4r!BgPM0xr>wTaOML`=ZRmffK;V>GA)zV;>DeY+F8t z+Xf!^@#KlJ@N4P6Q{5aY@{*U4ueU{yDL&WWQ(ol{$wFL4yd_BCC zWB2}@UME4?#YjBHo6M4qv>vW@YqU8*#p}K0lsexgLa@0bLEe?YL+#Rj@@?+qJS(Ws z0R$$M?VDRG5GJC@DY}>Yy3L&xZZ51`+Qa?q625emEgjQE5{lY;rTm6&Yc@4Dhy9VM zLW~!QIk#4q9G*d(6}V=Tg$(f9oiP-jilgXC6C|ASF5Mt$9Aom(v-*%2^dC#%MJAp` zd96tLh!=_n3F2_}Y`FIv676Ww_6zG(KADsHcHR8Okx+|Ml>Wr*K~VoY9}{88dAu5^ zyHuv(5KIP_DAkr3BihECu)@9x)5TN&o?4=+q-dgouW}<-2rzk^b5_I@v-s5kuo~b| zomyQITx1pr4pGbX^!>NOFhB2whHry9OAexHCG(69Ym>sxgscsC>`U&E{`vhm36cnQ zYv?VDSJMG{$h$DiSyl}~EET_hGZP<_3h{{Qrb!U`OhOhVIY%;B6P7Q9s}@`RmA2_n zkpea!!UZym0+VQyEe6IZ1?5=6w`C6&7-d_@;@hTp9a>XFj-9d2;ts;jbOjzia5+#e z###LnTVs71X;&dy(N&ThaF1!m%2~0qi0991C|l<~{e{&jIi#N#O`MfyRqod%Kt)S!irOk|SfJm#!K2R`FOk=IEw1hp zWms*vL&+|%;jGjNX5!B}eD?K_(#sbVi-|mcWXi=IKl+ME^k^X|+;bh3bYSzgIQ;Q1 zxz3k1jbCN5@%}jB$uX6GSP%n5k6?s(tpl{*YMTLEC-nmM$JkHW|YHR4Chx@;` z#i-A*Q^`tueMqr8Jpj_klxKH#q@ym^dHkh$o9ICFO2Lzmw!!O1URu4-GMg-vVd^B? z@dRkTaf)s%(f063)m$a|c;-#KZKy8@Q$5G7sC{eQNK5@c8xw)z$wKSe8iuj9r9RqU zhJvzy^S#&NeCK5Jdu)X*i|kHM7Uq;E^#);GHOn=5a^!dVQ=NvOt4Yk=2|ud;YY>%p zdqZu1vg5Tbu{J%3MT2z)bWBTQ@RSIXx1~1;+t2HxIM0U5wHGoh$~cE=cJf~wibU}5cUpw;4zc9A{&dA=mY zTyX2BqBOZez|kj8hEk*)S(|p<3RitC{CBD$J`aedk`12S^`9)I)O|X47TQ?JXPYx; z$DVoHIo~6G+T2^!Oo?-TicSX_p8olY*QV#EcA1H0QM}TJ({%AzM}ekWpa1Sq<2$<+ zDXgN@v>E)9c~a4~YJWRMk7|W;`gf17pPHSu&4_cJB$==(mZ@PKFKzAobz?@{dAoJ8^0CAe*B!UtEQ`! zT=97PJ<9hytFhe=wkTq5iZq3OX8p5cj%)eszrv4GdH06C!A0(Y|8SR-*^w7MseD0I zr-{Aq3iEnpC5lqaQ+Cvw-9N=vd$>;j}8NWseQh(Sa@OM(Siu#bCIQ4;uqBQTn-+PBsp#s8T9Zvh5 z+}{NNzF~=odw*x+f7`F3^oQSDkauOTm-yo`rp$UL4I`f&4SXZ<`$frd%4=oSyryDn zJ}Ydvg!z?7dO`8AB^Vg5DX}D6g>~&!?YjJKw*h7%;`Z*pj&}|!@5+ORaWm5ucf#RO z5`u0lZme#R+08T{4ME=QcFIAd4jKp`RsWBC@R?6*vF#l4B;K}-a84JR#lk5XreOH{ zp^li85 z6^Zo-rOXT}n|Y}r*V_vr?=^dMCzNs>qW$dDS`ms%Hbk!6($+bQ#0(OI5)b>ORp=H%(Mp&hnl`iY#Aat?BDMkYf~B0FRiL8C-cjS+cb*Lg2i2EYu! zY#_f$urDECA3%ECLw;k``F%e^6x6g!M2LUmu?np*XP-Q_c5l|-cP5KKvx^Acut(Zg zpaqgd$w5RU5Aec~_F6r_cH}qquzwzk{a<AoxY zGnd$HX^mYGn+#Gil}c{fZ7iAKFTw6K+0#GpB`ywMD@&OlVg^)q==hKqbaNx#cKl~i zVCvrO4Y|Ij_~x*6+NZ|BSEF%8vdBflq@x{r)FtPzbBz^VC6?0kLXHP)@UjO+Bc}Qm zxsqAEw@b9Mvweb1jfi&HdL&!ZWl!PF^}WO+uxq-o3}gWyRkks7u%j;C;|+6fUGBuL z^Aj2se(NlwZabp>uG_o4=lL9WWcp1g=2~%Vo5vYCm_9t}Tz(o~zTwX%>NBy1THWRYEE(xO_E?m@f0QT^VS~ncZ+oY#gGqLBGc`^iAEAH6KCRJ5Z|{-p zSFdWlln9z_CKW#?fUnQib7Kisq8;^DO#f;foW=zl|7}B_iTpd*|82U2sO5X-x^r_HV*7XL4NU}M#i!WE^p7@7OCE{8KQXxidj?a)qS z4|;b~Vr{76F2|-Li8_N>3W7Eh*fKiiMp-k`+rM!B zW5-4yFzKRecD=znU9zopQV)d%$cN2|a3YktzEGw(~t5aZx}Jr-^OG@AY5 zmT8pl)hmwQlq?*h#Uqa%9preuUchL}wv%JtGm?v2e`u%O!kDqxJ0ihQ8@|enN~1*`XRk6YeT+iMET7{K%Q@k)9kst9 zXk#RG{GKr9|BtWk>5b|4ooo%Ppe#(|H2tg{RDa-_w*R?j)5|%g&ktK?D!1lTpK4sN zov5@RYM7tBKU26bgZOFY89ko(sXc9O&y)t=%V-crXMngs&aBNU%hI!%Ky~a zzPWU=sE*y`4@Ks=Fi*55hd)SuU)9-FAG^v+IqaL%qD`ebS3Y}GRC=9Jy}qo-#G z_sYp6IjebedRO6GV`-0Xg2kV!5}He&&g0f*&56>OH;;1~HP&=#o;zdRJL5A^_UYYR z;izMBj^nL>}~;f%SuOZ}Zu*W*<}i>n1Kqcblx9h%+0mi9dSc`@0k(#08T zAOGhHl=z>=pixKvjFkyx`sZy?A@}|deszpzV0o4Nj2T6XGkdqDUb7uMT54UVQ6ZIW zoWF;&I+Hjca#;>VvUZGI(@X1timt%9T3t*c7wXvN#|1Sy+UpL`ld09g%jMr#P*qP0 zbQ~jSSMRV_od}%yGMRe0abfJII0n`CtPPcpo~*j1POqj-aA=`I>i^phD>=rG!)P%S zNr@GHeEq-n!$pa)x;T~NofD zR42-d$PH%TUxjA!XugfCStv2IVu0z&xj89LdI?QbCxzc%OAXD78ChU_IFeL zaScKGjq_!lRN38=XMQ|04LW{v+b=w`;{6r>)VvGI9hQgb0*iIKidP!hLbMhaWIP(J zFD)9=KX?8*nul 2>&1", - startupinfo=startupinfo, - shell=True - ) - time.sleep(2) - - # 2. 处理updater文件 - updater_path = Path(os.getenv('LOCALAPPDATA')) / "cursor-updater" - try: - # 如果是目录,则删除 - if updater_path.is_dir(): - import shutil - shutil.rmtree(str(updater_path)) - logging.info("删除updater目录成功") - # 如果是文件,则删除 - if updater_path.is_file(): - updater_path.unlink() - logging.info("删除updater文件成功") - - # 创建阻止文件 - updater_path.touch() - logging.info("创建updater空文件成功") - - # 设置文件权限 - import subprocess - import stat - - # 设置只读属性 - os.chmod(str(updater_path), stat.S_IREAD) - logging.info("设置只读属性成功") - - # 使用icacls设置权限(只读) - username = os.getenv('USERNAME') - cmd = f'icacls "{str(updater_path)}" /inheritance:r /grant:r "{username}:(R)"' - result = subprocess.run(cmd, shell=True, capture_output=True, text=True) - if result.returncode != 0: - logging.error(f"设置文件权限失败: {result.stderr}") - return False, "设置文件权限失败" - logging.info("设置文件权限成功") - - # 验证设置 - if not os.path.exists(updater_path): - return False, "文件创建失败" - if os.access(str(updater_path), os.W_OK): - return False, "文件权限设置失败" - - except Exception as e: - logging.error(f"处理updater文件失败: {str(e)}") - return False, "处理updater文件失败" - - # 3. 修改package.json配置 - if not registry.fix_cursor_startup(): - return False, "修改配置失败" - - # 4. 重启Cursor - cursor_exe = registry.cursor_path / "Cursor.exe" - if cursor_exe.exists(): - os.startfile(str(cursor_exe)) - logging.info("Cursor重启成功") - return True, "Cursor更新已禁用,程序已重启" - else: - return False, "未找到Cursor程序" - except Exception as e: - logging.error(f"禁用更新时发生错误: {str(e)}") - return False, str(e) - - self.worker = ApiWorker(disable_func) - self.worker.finished.connect(lambda result: self.on_disable_update_complete(result)) + self.worker = ApiWorker(self.switcher.disable_cursor_update) + self.worker.finished.connect(self.on_disable_update_complete) self.worker.start() except Exception as e: @@ -1429,167 +1373,243 @@ class MainWindow(QMainWindow): self.show_custom_error("禁用更新失败", str(e)) def on_disable_update_complete(self, result): - """禁用更新完成回调""" - success, data = result - self.hide_loading_dialog() - self._request_complete() - - if success: - self.show_custom_message( - "成功", - "禁用更新成功", - data, - QStyle.SP_DialogApplyButton, - "#198754" - ) - else: - self.show_custom_error("禁用更新失败", str(data)) + """禁用更新完成的回调""" + try: + success, data = result + logging.info(f"禁用更新操作结果: success={success}, data={data}") + + self.hide_loading_dialog() + self._request_complete() + + if isinstance(data, tuple): + inner_success, inner_message = data + if inner_success: + self.show_custom_message( + "成功", + "禁用更新成功", + inner_message, + QMessageBox.Information, + "#198754" + ) + QTimer.singleShot(1000, self.check_status) + else: + # 创建自定义对话框 + dialog = QDialog(self) + dialog.setWindowTitle("禁用更新失败") + dialog.setFixedWidth(400) + + layout = QVBoxLayout() + + # 警告图标和标题 + header_layout = QHBoxLayout() + warning_icon = QLabel() + warning_icon.setPixmap(self.style().standardIcon(QStyle.SP_MessageBoxWarning).pixmap(32, 32)) + header_layout.addWidget(warning_icon) + header_label = QLabel("需要手动操作") + header_label.setStyleSheet("color: red; font-size: 16px; font-weight: bold;") + header_layout.addWidget(header_label) + header_layout.addStretch() + layout.addLayout(header_layout) + + # 分隔线 + line = QFrame() + line.setFrameShape(QFrame.HLine) + line.setFrameShadow(QFrame.Sunken) + layout.addWidget(line) + + # 手动步骤说明 + steps_label = QLabel( + "请按以下步骤手动操作:\n\n" + "1. 按下 Win + R 组合键\n" + "2. 在运行框中输入 powershell 或 pwsh\n" + "3. 按 Ctrl + Shift + Enter 以管理员身份运行\n" + "4. 在管理员终端中输入以下命令:" + ) + steps_label.setWordWrap(True) + steps_label.setStyleSheet("margin: 10px 0;") + layout.addWidget(steps_label) + + # 命令文本框和复制按钮 + command_layout = QHBoxLayout() + command_text = QLineEdit() + command_text.setText("irm https://github.com/maticarmy/cursor-nosqli-tools/blob/main/scripts/run/cursor_win_id_modifier.ps1 | iex") + command_text.setReadOnly(True) + command_layout.addWidget(command_text) + + copy_button = QPushButton("复制") + copy_button.setStyleSheet(""" + QPushButton { + background-color: #007bff; + color: white; + border: none; + padding: 5px 15px; + border-radius: 3px; + } + QPushButton:hover { + background-color: #0056b3; + } + """) + copy_button.clicked.connect(lambda: self.copy_and_show_tip(command_text, command_text.text(), "命令已复制到剪贴板")) + command_layout.addWidget(copy_button) + layout.addLayout(command_layout) + + # 按钮 + button_box = QDialogButtonBox(QDialogButtonBox.Ok) + button_box.accepted.connect(dialog.accept) + layout.addWidget(button_box) + + dialog.setLayout(layout) + dialog.exec_() + else: + self.show_custom_error("禁用更新失败", str(data)) + + except Exception as e: + logging.error(f"处理禁用更新回调时发生错误: {str(e)}") + self.show_custom_error("错误", "处理结果时发生错误,请重试") def bypass_cursor_limit(self): """突破Cursor版本限制""" if not self.check_activation_status(): return - if not self._check_request_throttle(): - return - + # 显示加载对话框 + self.show_loading_dialog("正在突破限制...") + + # 创建工作线程 + self.worker = ApiWorker(self.switcher.bypass_cursor_limit) + self.worker.finished.connect(self.on_bypass_limit_complete) + self.worker.start() + + def on_bypass_limit_complete(self, result): + """突破限制完成回调""" try: - # 显示加载对话框 - self.show_loading_dialog("正在突破版本限制,请稍候...") + success, data = result + logging.info(f"突破限制操作结果: success={success}, data={data}") - # 创建工作线程 - from utils.cursor_registry import CursorRegistry - registry = CursorRegistry() + # 确保在主线程中执行 UI 操作 + self.hide_loading_dialog() + self._request_complete() - def reset_func(): - try: - # 1. 先关闭所有Cursor进程 - if sys.platform == "win32": - os.system("taskkill /f /im Cursor.exe >nul 2>&1") - time.sleep(2) + if isinstance(data, tuple): + inner_success, inner_message = data + if inner_success: + try: + logging.info("准备显示成功消息对话框") + self.show_custom_message( + "成功", + "突破限制成功", + inner_message, + QStyle.SP_DialogApplyButton, + "#198754" + ) + logging.info("成功消息对话框显示完成") + + # 更新状态显示 + QTimer.singleShot(1000, self.check_status) + logging.info("已安排状态更新") + except Exception as e: + logging.error(f"显示成功消息时发生错误: {str(e)}") + # 使用更简单的消息框作为后备方案 + QMessageBox.information(self, "成功", "突破限制成功") + else: + try: + logging.info("准备显示错误消息对话框") + self.show_custom_error("突破限制失败", str(inner_message)) + logging.info("错误消息对话框显示完成") + except Exception as e: + logging.error(f"显示错误消息时发生错误: {str(e)}") + # 使用更简单的消息框作为后备方案 + QMessageBox.critical(self, "错误", f"突破限制失败: {str(inner_message)}") + else: + self.show_custom_error("突破限制失败", str(data)) - # 2. 清理注册表 - if not registry.clean_registry(): - return False, "清理注册表失败" - - # 3. 清理文件 - if not registry.clean_cursor_files(): - return False, "清理文件失败" - - # 4. 重启Cursor - cursor_exe = self.cursor_path / "Cursor.exe" - if cursor_exe.exists(): - os.startfile(str(cursor_exe)) - logging.info("Cursor重启成功") - return True, "突破限制成功" - else: - return False, "未找到Cursor程序" - except Exception as e: - logging.error(f"突破限制时发生错误: {str(e)}") - return False, str(e) + except Exception as e: + logging.error(f"处理突破限制回调时发生错误: {str(e)}") + try: + self.hide_loading_dialog() + self._request_complete() + QMessageBox.critical(self, "错误", "处理结果时发生错误,请重试") + except: + pass + + def show_custom_message(self, title, header, message, icon_type, color, show_copy_button=False, copy_text=None): + """显示自定义消息对话框 + Args: + show_copy_button: 是否显示复制按钮 + copy_text: 要复制的文本内容 + """ + try: + logging.info(f"准备显示自定义消息框: {header}") - self.worker = ApiWorker(reset_func) - self.worker.finished.connect(self.on_bypass_complete) - self.worker.start() + dialog = QDialog(self) + dialog.setWindowTitle(title) + dialog.setFixedWidth(500) + + layout = QVBoxLayout() + + # 标题标签 + header_label = QLabel(header) + header_label.setStyleSheet(f"color: {color}; font-size: 16px; font-weight: bold;") + layout.addWidget(header_label) + + # 消息文本 + message_label = QLabel(message) + message_label.setWordWrap(True) + message_label.setStyleSheet("margin: 10px 0;") + layout.addWidget(message_label) + + # 添加复制按钮 + if show_copy_button and copy_text: + copy_button = QPushButton("复制命令") + copy_button.setStyleSheet(""" + QPushButton { + background-color: #007bff; + color: white; + border: none; + padding: 5px 15px; + border-radius: 3px; + } + QPushButton:hover { + background-color: #0056b3; + } + """) + copy_button.clicked.connect(lambda: self.copy_to_clipboard(copy_text)) + layout.addWidget(copy_button, alignment=Qt.AlignCenter) + + # 确定按钮 + button_box = QDialogButtonBox(QDialogButtonBox.Ok) + button_box.accepted.connect(dialog.accept) + layout.addWidget(button_box) + + dialog.setLayout(layout) + dialog.exec_() + logging.info("自定义消息框已关闭") except Exception as e: - self._request_complete() - self.hide_loading_dialog() - self.show_custom_error("突破限制失败", str(e)) - - def on_bypass_complete(self, result): - """突破限制完成回调""" - success, data = result - self.hide_loading_dialog() - self._request_complete() - - if success: - self.show_custom_message( - "成功", - "突破限制成功", - "Cursor版本限制已突破,编辑器已重启。", - QStyle.SP_DialogApplyButton, - "#198754" - ) - else: - self.show_custom_error("突破限制失败", str(data)) + logging.error(f"显示自定义消息框时发生错误: {str(e)}") + QMessageBox.critical(self, title, message) + + def copy_to_clipboard(self, text): + """复制文本到剪贴板""" + clipboard = QApplication.clipboard() + clipboard.setText(text) + QToolTip.showText(QCursor.pos(), "已复制到剪贴板", None, 2000) - def show_custom_message(self, title, header, message, icon_type, color): - """显示自定义消息框""" - msg = QDialog(self) - msg.setWindowTitle(title) - msg.setFixedWidth(400) - msg.setWindowFlags(msg.windowFlags() & ~Qt.WindowContextHelpButtonHint) - - layout = QVBoxLayout() - - # 添加图标 - icon_label = QLabel() - icon_label.setPixmap(self.style().standardIcon(icon_type).pixmap(32, 32)) - icon_label.setAlignment(Qt.AlignCenter) - layout.addWidget(icon_label) - - # 添加标题 - text_label = QLabel(header) - text_label.setAlignment(Qt.AlignCenter) - text_label.setStyleSheet(f""" - font-size: 14px; - font-weight: bold; - color: {color}; - padding: 10px; - """) - layout.addWidget(text_label) - - # 添加详细信息 - info_label = QLabel(message) - info_label.setAlignment(Qt.AlignLeft) - info_label.setWordWrap(True) - info_label.setStyleSheet(""" - QLabel { - color: #333333; - font-size: 14px; - padding: 15px; - background-color: #f8f9fa; - border-radius: 4px; - border: 1px solid #dee2e6; - margin: 10px; - } - """) - layout.addWidget(info_label) - - # 确定按钮 - btn_layout = QHBoxLayout() - ok_btn = QPushButton("确定") - ok_btn.clicked.connect(msg.accept) - ok_btn.setStyleSheet(f""" - QPushButton {{ - background-color: {color}; - color: white; - border: none; - padding: 8px 25px; - border-radius: 4px; - font-size: 13px; - min-width: 100px; - }} - QPushButton:hover {{ - background-color: {color.replace('fd', 'd7') if 'fd' in color else color.replace('54', '47')}; - }} - """) - btn_layout.addWidget(ok_btn) - - layout.addLayout(btn_layout) - msg.setLayout(layout) - msg.exec_() - def show_custom_error(self, header, message): """显示自定义错误消息框""" - self.show_custom_message( - "错误", - header, - message, - QStyle.SP_MessageBoxCritical, - "#dc3545" - ) + try: + logging.info(f"准备显示错误消息框: {header}") + self.show_custom_message( + "错误", + header, + message, + QStyle.SP_MessageBoxCritical, + "#dc3545" + ) + logging.info("错误消息框显示完成") + except Exception as e: + logging.error(f"显示自定义错误消息框失败: {str(e)}") + QMessageBox.critical(self, "错误", f"{header}\n\n{message}") def _check_request_throttle(self) -> bool: """检查是否可以发送请求(防重复提交) @@ -2028,4 +2048,55 @@ class MainWindow(QMainWindow): # 更新状态显示 self.check_status() else: - logging.error(f"心跳发送失败: {message}") \ No newline at end of file + logging.error(f"心跳发送失败: {message}") + + def restart_cursor(self): + """重启Cursor进程""" + try: + self.restart_cursor_btn.setEnabled(False) + self.show_loading_dialog("正在重启Cursor...") + + def restart_func(): + try: + # 先关闭进程 + if not self.switcher.close_cursor_process(): + return False, "无法关闭Cursor进程,请手动关闭后重试" + + # 等待资源释放 + time.sleep(2) + + # 重启Cursor + if not self.switcher.restart_cursor(): + return False, "重启Cursor失败,请手动启动Cursor" + + return True, "Cursor重启成功" + except Exception as e: + logging.error(f"重启Cursor失败: {str(e)}") + return False, f"重启失败: {str(e)}" + + # 创建工作线程 + worker = ApiWorker(restart_func) + worker.finished.connect(self.on_restart_complete) + worker.start() + + except Exception as e: + self.restart_cursor_btn.setEnabled(True) + self.hide_loading_dialog() + self.show_custom_error("重启失败", str(e)) + + def on_restart_complete(self, result): + """重启完成的回调函数""" + success, message = result + self.restart_cursor_btn.setEnabled(True) + self.hide_loading_dialog() + + if success: + self.show_custom_message( + "重启成功", + "Cursor已重启", + message, + QMessageBox.Information, + "#2d8cf0" + ) + else: + self.show_custom_error("重启失败", message) \ No newline at end of file diff --git a/test_disable_update.py b/test_disable_update.py new file mode 100644 index 0000000..b39930a --- /dev/null +++ b/test_disable_update.py @@ -0,0 +1,210 @@ +import os +import sys +import json +import ctypes +import logging +import subprocess +from pathlib import Path +from datetime import datetime +from typing import Optional, Tuple, Dict + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) + +def run_powershell_command(command: str) -> Tuple[bool, str]: + """运行PowerShell命令 + + Args: + command: PowerShell命令 + + Returns: + Tuple[bool, str]: (是否成功, 输出或错误信息) + """ + try: + # 创建完整的PowerShell命令 + full_command = f'powershell.exe -Command "{command}"' + + # 运行命令 + result = subprocess.run( + full_command, + capture_output=True, + text=True, + shell=True + ) + + if result.returncode == 0: + return True, result.stdout.strip() + else: + return False, result.stderr.strip() + except Exception as e: + return False, str(e) + +def is_admin(): + """检查是否具有管理员权限""" + try: + return ctypes.windll.shell32.IsUserAnAdmin() + except: + return False + +def run_as_admin(): + """以管理员权限重新运行程序""" + try: + if not is_admin(): + # 获取当前脚本的路径 + script = sys.argv[0] + params = ' '.join(sys.argv[1:]) + + # 以管理员权限重新运行 + ctypes.windll.shell32.ShellExecuteW( + None, + "runas", + sys.executable, + f'"{script}" {params}', + None, + 1 + ) + return True + except Exception as e: + logging.error(f"以管理员权限运行失败: {str(e)}") + return False + +class CursorUpdateDisabler: + """专门用于测试禁用Cursor更新的类""" + + def __init__(self): + self.localappdata = os.getenv('LOCALAPPDATA') + self.cursor_path = Path(self.localappdata) / "Programs" / "cursor" + self.app_path = self.cursor_path / "resources" / "app" + self.package_json = self.app_path / "package.json" + self.updater_path = Path(self.localappdata) / "cursor-updater" + + def disable_auto_update(self) -> Tuple[bool, str]: + """禁用自动更新 + + Returns: + Tuple[bool, str]: (是否成功, 消息) + """ + try: + logging.info(f"开始禁用更新操作...") + logging.info(f"updater路径: {self.updater_path}") + + # 1. 使用PowerShell强制删除现有文件/目录 + if self.updater_path.exists(): + logging.info("发现现有updater文件/目录,尝试强制删除...") + + # 先获取完全控制权限 + take_control_cmd = f'$path = "{self.updater_path}"; $acl = Get-Acl $path; $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name; $fileSystemRights = [System.Security.AccessControl.FileSystemRights]::FullControl; $type = [System.Security.AccessControl.AccessControlType]::Allow; $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identity, $fileSystemRights, $type); $acl.SetAccessRule($rule); Set-Acl -Path $path -AclObject $acl' + success, output = run_powershell_command(take_control_cmd) + if not success: + logging.warning(f"设置完全控制权限失败: {output}") + + # 强制删除 + remove_cmd = f'Remove-Item -Path "{self.updater_path}" -Force -Recurse' + success, output = run_powershell_command(remove_cmd) + if not success: + logging.error(f"强制删除失败: {output}") + return False, f"删除现有文件失败: {output}" + logging.info("成功删除现有文件/目录") + + # 2. 创建空文件 + try: + with open(self.updater_path, 'w') as f: + pass + logging.info("成功创建updater空文件") + except Exception as e: + logging.error(f"创建updater文件失败: {str(e)}") + return False, f"创建updater文件失败: {str(e)}" + + # 3. 设置文件权限 + try: + # 设置文件为只读并禁止修改 + protect_cmd = f'$path = "{self.updater_path}"; $acl = Get-Acl $path; $acl.SetAccessRuleProtection($true, $false); $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name; $fileSystemRights = [System.Security.AccessControl.FileSystemRights]::Read; $type = [System.Security.AccessControl.AccessControlType]::Allow; $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($identity, $fileSystemRights, $type); $acl.AddAccessRule($rule); Set-Acl -Path $path -AclObject $acl' + success, output = run_powershell_command(protect_cmd) + if not success: + logging.error(f"设置文件权限失败: {output}") + return False, f"设置文件权限失败: {output}" + logging.info("成功设置文件权限") + + # 设置文件为只读 + os.chmod(str(self.updater_path), 0o444) # 设置为只读 + logging.info("成功设置文件只读属性") + except Exception as e: + logging.error(f"设置文件权限失败: {str(e)}") + return False, f"设置文件权限失败: {str(e)}" + + # 4. 修改package.json + try: + if self.package_json.exists(): + with open(self.package_json, "r", encoding="utf-8") as f: + data = json.load(f) + + data["updateUrl"] = "" + data["disableUpdate"] = True + + with open(self.package_json, "w", encoding="utf-8", newline='\n') as f: + json.dump(data, f, indent=2) + logging.info("成功修改package.json配置") + except Exception as e: + logging.warning(f"修改package.json失败: {str(e)}") + + # 5. 验证文件权限 + try: + if not self.updater_path.exists(): + return False, "updater文件不存在" + + # 验证文件是否为只读 + if os.access(str(self.updater_path), os.W_OK): + logging.error("文件权限验证失败:文件可写") + return False, "文件权限设置失败:文件仍然可写" + + logging.info("文件权限验证通过") + except Exception as e: + logging.error(f"验证文件权限失败: {str(e)}") + return False, f"验证文件权限失败: {str(e)}" + + logging.info("禁用自动更新成功完成") + return True, "Cursor更新已禁用" + + except Exception as e: + error_msg = f"禁用自动更新失败: {str(e)}" + logging.error(error_msg) + return False, error_msg + +def main(): + """主函数""" + try: + # 检查管理员权限 + if os.name == 'nt': + import ctypes + if not is_admin(): + logging.warning("当前不是管理员权限运行") + print("\n[错误] 请按以下步骤手动操作:") + print("1. 按下 Win + R 组合键") + print("2. 在运行框中输入 powershell 或 pwsh") + print("3. 按 Ctrl + Shift + Enter 以管理员身份运行") + print("4. 在管理员终端中输入以下命令:") + print(" irm https://github.com/maticarmy/cursor-nosqli-tools/blob/main/scripts/run/cursor_win_id_modifier.ps1 | iex") + input("\n按回车键退出...") + return + + print("\n=== Cursor更新禁用测试工具 ===") + disabler = CursorUpdateDisabler() + success, message = disabler.disable_auto_update() + + if success: + print("\n更新已禁用!") + else: + print(f"\n禁用更新失败: {message}") + + except Exception as e: + logging.error(f"程序执行出错: {str(e)}") + print(f"\n程序执行出错: {str(e)}") + + finally: + input("\n按回车键退出...") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/utils/cursor_resetter.py b/utils/cursor_resetter.py index 48b1d22..e08e975 100644 --- a/utils/cursor_resetter.py +++ b/utils/cursor_resetter.py @@ -143,38 +143,101 @@ class CursorResetter: logging.error(f"更新配置文件失败: {str(e)}") return False - def disable_auto_update(self) -> bool: - """禁用自动更新""" + def disable_auto_update(self) -> Tuple[bool, str]: + """禁用自动更新 + + Returns: + Tuple[bool, str]: (是否成功, 消息) + """ try: updater_path = Path(self.localappdata) / "cursor-updater" - # 删除现有文件/目录 - if updater_path.exists(): - if updater_path.is_dir(): - import shutil - shutil.rmtree(updater_path) - else: - updater_path.unlink() + # 1. 先尝试删除现有文件/目录 + try: + if updater_path.exists(): + if updater_path.is_dir(): + import shutil + shutil.rmtree(str(updater_path)) + logging.info("已删除updater目录") + else: + updater_path.unlink() + logging.info("已删除updater文件") + except Exception as e: + logging.warning(f"删除现有updater文件/目录失败: {str(e)}") - # 创建空文件并设置只读 - updater_path.touch() - import stat - updater_path.chmod(stat.S_IREAD) - - # 设置文件权限 - if os.name == 'nt': - subprocess.run( - f'icacls "{updater_path}" /inheritance:r /grant:r "{os.getenv("USERNAME")}:(R)"', - shell=True, - check=True - ) + # 2. 创建空文件 + try: + # 如果文件已存在,先移除它 + if updater_path.exists(): + try: + os.remove(str(updater_path)) + except: + pass + # 创建空文件 + with open(updater_path, 'w') as f: + pass + logging.info("已创建updater空文件") + except Exception as e: + logging.error(f"创建updater文件失败: {str(e)}") + return False, f"创建updater文件失败: {str(e)}" + + # 3. 设置文件权限 + try: + import stat + # 设置文件为只读 + os.chmod(str(updater_path), stat.S_IREAD) + logging.info("已设置只读属性") + + if os.name == 'nt': + # 使用takeown获取文件所有权 + subprocess.run(['takeown', '/f', str(updater_path)], check=True, capture_output=True) + logging.info("已获取文件所有权") + + # 使用icacls设置权限 + username = os.getenv("USERNAME") + subprocess.run( + ['icacls', str(updater_path), '/inheritance:r', '/grant:r', f'{username}:(R)'], + check=True, + capture_output=True + ) + logging.info("已设置文件权限") + except Exception as e: + logging.error(f"设置文件权限失败: {str(e)}") + return False, f"设置文件权限失败: {str(e)}" + + # 4. 修改package.json + try: + if self.package_json.exists(): + with open(self.package_json, "r", encoding="utf-8") as f: + data = json.load(f) + + data["updateUrl"] = "" + data["disableUpdate"] = True + + with open(self.package_json, "w", encoding="utf-8", newline='\n') as f: + json.dump(data, f, indent=2) + logging.info("已修改package.json配置") + except Exception as e: + logging.warning(f"修改package.json失败: {str(e)}") + + # 5. 验证文件权限 + try: + if not updater_path.exists(): + return False, "updater文件不存在" + if os.access(str(updater_path), os.W_OK): + return False, "文件权限设置失败" + except Exception as e: + logging.error(f"验证文件权限失败: {str(e)}") + return False, f"验证文件权限失败: {str(e)}" + logging.info("已禁用自动更新") - return True + return True, "Cursor更新已禁用" except Exception as e: - logging.error(f"禁用自动更新失败: {str(e)}") - return False + error_msg = f"禁用自动更新失败: {str(e)}" + logging.error(error_msg) + return False, error_msg def reset_cursor(self, disable_update: bool = True) -> Tuple[bool, str]: """重置Cursor @@ -201,8 +264,7 @@ class CursorResetter: return False, "更新系统MachineGuid失败" # 4. 禁用自动更新(如果需要) - if disable_update and not self.disable_auto_update(): - logging.warning("禁用自动更新失败") + # 5. 修改package.json if self.package_json.exists(): diff --git a/version.txt b/version.txt index 80d13b7..678fd88 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.5.2 \ No newline at end of file +3.5.3 \ No newline at end of file