update proxy
This commit is contained in:
		| @ -422,6 +422,10 @@ class WindowService { | ||||
|   async refreshSession(args, event) { | ||||
|     const { platform, partitionId } = args; | ||||
|     const view = app.viewsMap.get(partitionId); | ||||
|  | ||||
|     // 声明代理配置错误变量,确保作用域正确 | ||||
|     let configError = null; | ||||
|  | ||||
|     if (view && !view.webContents.isDestroyed()) { | ||||
|       try { | ||||
|         // 获取会话信息 | ||||
| @ -451,9 +455,19 @@ class WindowService { | ||||
|           // 等待一下确保清除操作完成 | ||||
|           await new Promise(resolve => setTimeout(resolve, 500)); | ||||
|  | ||||
|           // 重新加载代理配置 | ||||
|           await this._loadConfig(view, partitionId, sessionObj.platform); | ||||
|           logger.info(`[${partitionId}] 代理配置重新加载完成`); | ||||
|           // 重新加载代理配置 - 允许失败但记录错误 | ||||
|           try { | ||||
|             await this._loadConfig(view, partitionId, sessionObj.platform); | ||||
|             logger.info(`[${partitionId}] ✅ 代理配置重新加载完成`); | ||||
|           } catch (error) { | ||||
|             configError = error; | ||||
|             logger.error(`[${partitionId}] ❌ 代理配置加载失败:`, error); | ||||
|             logger.error(`[${partitionId}] 错误信息: ${error.message}`); | ||||
|             logger.warn(`[${partitionId}] ⚠️ 代理配置失败,但仍将刷新页面以确保退出局部代理状态`); | ||||
|  | ||||
|             // 关键修复:即使全局代理配置无效,也要强制使用全局代理而不是系统代理 | ||||
|             await this._forceApplyInvalidGlobalProxy(view, partitionId); | ||||
|           } | ||||
|  | ||||
|           // 再等待一下确保代理配置完全生效 | ||||
|           await new Promise(resolve => setTimeout(resolve, 1000)); | ||||
| @ -500,67 +514,27 @@ class WindowService { | ||||
|  | ||||
|         // 等待页面加载完成 | ||||
|         await reloadPromise; | ||||
|       } catch (error) { | ||||
|         logger.error(`[${partitionId}] 刷新会话时重新加载代理配置失败:`, error); | ||||
|         logger.warn(`[${partitionId}] 代理配置失败,但仍然继续刷新会话`); | ||||
|         logger.warn(`[${partitionId}] 错误信息: ${error.message}`); | ||||
|  | ||||
|         // 即使代理配置失败,也继续刷新页面(用户可能故意设置错误的代理) | ||||
|         try { | ||||
|           const currentURL = view.webContents.getURL(); | ||||
|           logger.info(`[${partitionId}] 准备刷新页面(忽略代理错误),当前URL: ${currentURL}`); | ||||
|  | ||||
|           // 添加页面加载事件监听器来确认刷新是否成功 | ||||
|           const reloadPromise = new Promise((resolve) => { | ||||
|             const onDidFinishLoad = () => { | ||||
|               logger.info(`[${partitionId}] 页面刷新完成(忽略代理配置错误) - did-finish-load 事件触发`); | ||||
|               view.webContents.removeListener('did-finish-load', onDidFinishLoad); | ||||
|               resolve(); | ||||
|             }; | ||||
|             view.webContents.once('did-finish-load', onDidFinishLoad); | ||||
|  | ||||
|             // 设置超时,防止无限等待 | ||||
|             setTimeout(() => { | ||||
|               view.webContents.removeListener('did-finish-load', onDidFinishLoad); | ||||
|               logger.warn(`[${partitionId}] 页面刷新超时(忽略代理错误),可能刷新失败`); | ||||
|               resolve(); | ||||
|             }, 10000); // 10秒超时 | ||||
|           }); | ||||
|  | ||||
|           // 如果当前URL为空,重新加载原始URL;否则使用reload() | ||||
|           if (!currentURL || currentURL === 'about:blank') { | ||||
|             logger.info(`[${partitionId}] 当前URL为空(忽略代理错误),重新加载原始URL`); | ||||
|             // 获取会话信息来确定平台 | ||||
|             const sessionObj = await app.sdb.selectOne("session_list", { | ||||
|               partitionId: partitionId, | ||||
|             }); | ||||
|             if (sessionObj) { | ||||
|               const platformConfig = app.platforms.find(p => p.platform === sessionObj.platform); | ||||
|               if (platformConfig) { | ||||
|                 logger.info(`[${partitionId}] 加载${sessionObj.platform}页面: ${platformConfig.url}(忽略代理错误)`); | ||||
|                 await view.webContents.loadURL(platformConfig.url); | ||||
|               } else { | ||||
|                 logger.error(`[${partitionId}] 未找到${sessionObj.platform}平台配置(忽略代理错误)`); | ||||
|                 view.webContents.reload(); | ||||
|               } | ||||
|             } else { | ||||
|               logger.error(`[${partitionId}] 未找到会话信息(忽略代理错误)`); | ||||
|               view.webContents.reload(); | ||||
|             } | ||||
|           } else { | ||||
|             view.webContents.reload(); | ||||
|             logger.info(`[${partitionId}] reload() 方法已调用(忽略代理错误)`); | ||||
|           } | ||||
|  | ||||
|           // 等待页面加载完成 | ||||
|           await reloadPromise; | ||||
|         } catch (reloadError) { | ||||
|           logger.error(`[${partitionId}] 页面刷新失败:`, reloadError); | ||||
|         // 检查是否有代理配置错误,如果有则返回警告信息 | ||||
|         if (configError) { | ||||
|           logger.warn(`[${partitionId}] ⚠️ 页面已刷新,但代理配置存在问题`); | ||||
|           return { | ||||
|             status: false, | ||||
|             message: `页面刷新失败:${reloadError.message}` | ||||
|             status: true, | ||||
|             message: `页面已刷新,但代理配置失败:${configError.message}`, | ||||
|             warning: true | ||||
|           }; | ||||
|         } | ||||
|  | ||||
|         logger.info(`[${partitionId}] ✅ 会话刷新完成`); | ||||
|       } catch (error) { | ||||
|         logger.error(`[${partitionId}] 刷新会话时发生未预期错误:`, error); | ||||
|         logger.error(`[${partitionId}] 错误信息: ${error.message}`); | ||||
|  | ||||
|         // 页面刷新相关的错误也直接返回失败 | ||||
|         return { | ||||
|           status: false, | ||||
|           message: `刷新会话失败:${error.message}` | ||||
|         }; | ||||
|       } | ||||
|     } | ||||
|     return { status: true, message: "刷新成功" }; | ||||
| @ -1567,15 +1541,24 @@ class WindowService { | ||||
|         }); | ||||
|         if (!sessionObj) continue; | ||||
|  | ||||
|         // 重新加载代理配置 | ||||
|         await this._loadConfig(view, partitionId, sessionObj.platform); | ||||
|         logger.info( | ||||
|           `Successfully updated proxy settings for session ${partitionId}` | ||||
|         ); | ||||
|         try { | ||||
|           // 重新加载代理配置 | ||||
|           await this._loadConfig(view, partitionId, sessionObj.platform); | ||||
|  | ||||
|           // 代理配置更改后必须重新加载页面 | ||||
|           logger.info(`[${partitionId}] 代理配置已更新,重新加载页面`); | ||||
|           view.webContents.reload(); | ||||
|  | ||||
|           logger.info(`[${partitionId}] ✅ 代理设置更新完成并重新加载页面`); | ||||
|         } catch (configError) { | ||||
|           // 如果代理配置失败,记录错误但不继续处理该会话 | ||||
|           logger.error(`[${partitionId}] 代理配置失败:`, configError.message); | ||||
|           logger.error(`[${partitionId}] 该会话将保持当前状态,不进行页面重新加载`); | ||||
|         } | ||||
|       } | ||||
|       return true; | ||||
|     } catch (error) { | ||||
|       logger.error("Failed to apply proxy settings:", error); | ||||
|       logger.error("应用代理设置失败:", error); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| @ -1817,6 +1800,101 @@ class WindowService { | ||||
|       }; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * 强制应用无效的全局代理配置 | ||||
|    * 当全局代理开启但配置无效时,仍然要使用该无效配置而不是回退到系统代理 | ||||
|    */ | ||||
|   async _forceApplyInvalidGlobalProxy(view, partitionId) { | ||||
|     try { | ||||
|       logger.warn(`[${partitionId}] 🔥 强制应用无效的全局代理配置`); | ||||
|  | ||||
|       // 获取全局代理配置(即使无效) | ||||
|       const globalConfig = await app.sdb.selectOne("global_proxy_config"); | ||||
|  | ||||
|       if (globalConfig && globalConfig.proxyStatus === "true") { | ||||
|         // 即使IP或端口为空,也要强制设置代理 | ||||
|         const proxyIp = globalConfig.proxyIp || "invalid.proxy.ip"; | ||||
|         const proxyPort = globalConfig.proxyPort || "0"; | ||||
|  | ||||
|         logger.error(`[${partitionId}] 🔥 强制使用无效全局代理: ${proxyIp}:${proxyPort}`); | ||||
|         logger.error(`[${partitionId}] 🔥 这将导致网络请求失败,但符合严格模式要求`); | ||||
|  | ||||
|         // 构建代理配置 | ||||
|         const proxyConfig = { | ||||
|           mode: 'fixed_servers', | ||||
|           rules: { | ||||
|             singleProxy: { | ||||
|               scheme: globalConfig.proxyType || 'http', | ||||
|               host: proxyIp, | ||||
|               port: parseInt(proxyPort) || 0 | ||||
|             } | ||||
|           } | ||||
|         }; | ||||
|  | ||||
|         // 强制设置无效代理 - 确保代理配置生效 | ||||
|         await view.webContents.session.setProxy(proxyConfig); | ||||
|  | ||||
|         // 如果有认证信息,设置代理认证监听器 | ||||
|         if (globalConfig.userVerifyStatus === "true" && globalConfig.username && globalConfig.password) { | ||||
|           logger.info(`[${partitionId}] 🔥 设置无效代理的认证监听器`); | ||||
|  | ||||
|           // 移除旧的认证监听器 | ||||
|           view.webContents.session.removeAllListeners('login'); | ||||
|  | ||||
|           // 添加代理认证监听器 | ||||
|           view.webContents.session.on('login', (event, request, authInfo, callback) => { | ||||
|             if (authInfo.isProxy) { | ||||
|               logger.info(`[${partitionId}] 🔥 代理认证请求: ${authInfo.host}:${authInfo.port}`); | ||||
|               event.preventDefault(); | ||||
|               callback(globalConfig.username, globalConfig.password); | ||||
|             } | ||||
|           }); | ||||
|         } | ||||
|  | ||||
|         // 验证代理设置是否真正生效 | ||||
|         const currentProxy = await view.webContents.session.resolveProxy('https://www.google.com'); | ||||
|         logger.error(`[${partitionId}] 🔥 当前代理解析结果: ${currentProxy}`); | ||||
|  | ||||
|         // 由于Electron代理设置可能不可靠,使用webRequest API强制阻止所有网络请求 | ||||
|         logger.error(`[${partitionId}] 🔥 使用webRequest API强制阻止所有网络请求`); | ||||
|  | ||||
|         // 移除所有现有的请求拦截器 | ||||
|         view.webContents.session.webRequest.onBeforeRequest(null); | ||||
|         view.webContents.session.webRequest.onBeforeSendHeaders(null); | ||||
|  | ||||
|         // 添加强制阻止所有网络请求的拦截器 | ||||
|         view.webContents.session.webRequest.onBeforeRequest((details, callback) => { | ||||
|           // 允许本地资源和应用内部资源 | ||||
|           if (details.url.startsWith('file://') || | ||||
|               details.url.startsWith('chrome-extension://') || | ||||
|               details.url.startsWith('devtools://') || | ||||
|               details.url.includes('localhost') || | ||||
|               details.url.includes('127.0.0.1')) { | ||||
|             callback({ cancel: false }); | ||||
|             return; | ||||
|           } | ||||
|  | ||||
|           // 阻止所有其他网络请求 | ||||
|           logger.error(`[${partitionId}] 🔥 阻止网络请求: ${details.url}`); | ||||
|           logger.error(`[${partitionId}] 🔥 原因: 全局代理配置无效,严格模式不允许网络访问`); | ||||
|           callback({ cancel: true }); | ||||
|         }); | ||||
|  | ||||
|         logger.error(`[${partitionId}] 🔥 已设置网络请求拦截器,所有外部网络请求将被阻止`); | ||||
|  | ||||
|         logger.error(`[${partitionId}] 🔥 无效全局代理已强制应用,页面将无法正常访问`); | ||||
|         logger.error(`[${partitionId}] 🔥 这是严格模式的预期行为:不允许回退到系统代理`); | ||||
|  | ||||
|       } else { | ||||
|         logger.error(`[${partitionId}] 🔥 全局代理未开启,但代理配置仍然失败,这是异常情况`); | ||||
|       } | ||||
|  | ||||
|     } catch (error) { | ||||
|       logger.error(`[${partitionId}] 🔥 强制应用无效全局代理时发生错误:`, error); | ||||
|       // 即使设置失败,也不要回退到系统代理 | ||||
|     } | ||||
|   } | ||||
| } | ||||
| WindowService.toString = () => "[class WindowService]"; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 unknown
					unknown