From 6c2ef2eef3db35ea6cc981fda238b7f0c33ccc18 Mon Sep 17 00:00:00 2001 From: shaw Date: Sat, 11 Oct 2025 11:23:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Ddroid=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=9B=B4=E6=96=B0=E4=B8=A2=E5=A4=B1apikey=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/droidAccountService.js | 32 +++++++++++++++---- .../src/components/accounts/AccountForm.vue | 9 ++++++ web/admin-spa/src/views/AccountsView.vue | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/services/droidAccountService.js b/src/services/droidAccountService.js index 8338caf0..8a98db74 100644 --- a/src/services/droidAccountService.js +++ b/src/services/droidAccountService.js @@ -782,6 +782,8 @@ class DroidAccountService { } const storedAccount = await redis.getDroidAccount(accountId) + const hasStoredAccount = + storedAccount && typeof storedAccount === 'object' && Object.keys(storedAccount).length > 0 const sanitizedUpdates = { ...updates } if (typeof sanitizedUpdates.accessToken === 'string') { @@ -905,7 +907,7 @@ class DroidAccountService { // 使用 Redis 中的原始数据获取加密的 API Key 条目 const existingApiKeyEntries = this._parseApiKeyEntries( - storedAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'apiKeys') + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'apiKeys') ? storedAccount.apiKeys : '' ) @@ -957,13 +959,29 @@ class DroidAccountService { encryptedUpdates.accessToken = this._encryptSensitiveData(sanitizedUpdates.accessToken) } + const baseAccountData = hasStoredAccount ? { ...storedAccount } : { id: accountId } + const updatedData = { - ...account, - ...encryptedUpdates, - refreshToken: - encryptedUpdates.refreshToken || this._encryptSensitiveData(account.refreshToken), - accessToken: encryptedUpdates.accessToken || this._encryptSensitiveData(account.accessToken), - proxy: encryptedUpdates.proxy + ...baseAccountData, + ...encryptedUpdates + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'refreshToken')) { + updatedData.refreshToken = + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'refreshToken') + ? storedAccount.refreshToken + : this._encryptSensitiveData(account.refreshToken) + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'accessToken')) { + updatedData.accessToken = + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'accessToken') + ? storedAccount.accessToken + : this._encryptSensitiveData(account.accessToken) + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'proxy')) { + updatedData.proxy = hasStoredAccount ? storedAccount.proxy || '' : account.proxy || '' } await redis.setDroidAccount(accountId, updatedData) diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index 604817ff..58ae7f32 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -3160,6 +3160,15 @@ const parseProxyResponse = (rawProxy) => { } } + if ( + proxyObject && + typeof proxyObject === 'object' && + proxyObject.proxy && + typeof proxyObject.proxy === 'object' + ) { + proxyObject = proxyObject.proxy + } + if (!proxyObject || typeof proxyObject !== 'object') { return null } diff --git a/web/admin-spa/src/views/AccountsView.vue b/web/admin-spa/src/views/AccountsView.vue index 3abc1ec3..038afa34 100644 --- a/web/admin-spa/src/views/AccountsView.vue +++ b/web/admin-spa/src/views/AccountsView.vue @@ -2488,7 +2488,7 @@ const filterByGroup = () => { } // 规范化代理配置,支持字符串与对象 -const normalizeProxyData = (proxy) => { +function normalizeProxyData(proxy) { if (!proxy) { return null }