// Trae-Toolbox oss-browser 包装层(resources/app/main.js) // 作用:启动时读取 exe 同目录 trae_default_oss_path.txt(第1行 oss 路径,第2行可选 region), // 并从本机 ~/Toolbox_local_creds.env.local 读取 DOC_CLOUD_KEEPER_OSS_* 凭据(运行时读取,零硬编码), // 注入渲染进程:写入 AuthInfo 并补丁 $rootScope.currentAuthInfo / bucketMap, // 使 oss-browser 每次启动即以有效账号登录、地址栏自动定位到默认目录; // 随后原样交接给官方 app.asar 内的 main.js,不改动官方包任何字节。 // 卸载:删除 resources\app 目录与 trae_default_oss_path.txt 即恢复原版。 const { app } = require('electron') const fs = require('fs') const os = require('os') const path = require('path') const readDefaultConfig = () => { const cfg = { target: '', region: 'oss-cn-shanghai', id: '', secret: '' } try { const p = path.join(path.dirname(process.execPath), 'trae_default_oss_path.txt') if (fs.existsSync(p)) { const lines = String(fs.readFileSync(p, 'utf8')).split(/\r?\n/).map(l => l.trim()).filter(Boolean) if (lines[0] && lines[0].indexOf('oss://') === 0) cfg.target = lines[0] if (lines[1] && /^oss-[a-z0-9-]+$/.test(lines[1])) cfg.region = lines[1] } } catch (e) {} try { const p = path.join(os.homedir(), 'Toolbox_local_creds.env.local') if (fs.existsSync(p)) { const text = String(fs.readFileSync(p, 'utf8')) for (const line of text.split(/\r?\n/)) { const t = line.trim() if (!t || t.startsWith('#')) continue const eq = t.indexOf('=') if (eq <= 0) continue const k = t.slice(0, eq).trim() const v = t.slice(eq + 1).trim() if (k === 'DOC_CLOUD_KEEPER_OSS_ACCESS_KEY_ID') cfg.id = v if (k === 'DOC_CLOUD_KEEPER_OSS_ACCESS_KEY_SECRET') cfg.secret = v } } } catch (e) {} return cfg } const CFG = readDefaultConfig() if (CFG.target) { const credPatch = (CFG.id && CFG.secret) ? { id: CFG.id, secret: CFG.secret, eptpl: 'https://{region}.aliyuncs.com' } : null const injection = '(function () {' + ' var TARGET = ' + JSON.stringify(CFG.target) + ';' + ' var REGION = ' + JSON.stringify(CFG.region) + ';' + ' var CRED = ' + JSON.stringify(credPatch) + ';' + ' var BUCKET = TARGET.split("/")[2];' + ' var seeded = false;' + ' var broadcasts = 0;' + ' var tries = 0;' + ' var timer = setInterval(function () {' + ' tries++;' + ' if (tries > 80) { clearInterval(timer); return; }' + ' try {' + ' var ng = window.angular;' + ' if (!ng) return;' + ' var el = document.querySelector("[ng-app]") || document.documentElement;' + ' var inj = ng.element(el).injector();' + ' if (!inj) return;' + ' if (!seeded) {' + ' seeded = true;' + ' var patch = { osspath: TARGET, address: TARGET, region: REGION };' + ' if (CRED) { patch.id = CRED.id; patch.secret = CRED.secret; patch.eptpl = CRED.eptpl; }' + ' inj.get("AuthInfo").saveToAuthInfo(patch);' + ' var rs = inj.get("$rootScope");' + ' rs.currentAuthInfo = rs.currentAuthInfo || {};' + ' for (var k in patch) { rs.currentAuthInfo[k] = patch[k]; }' + ' rs.internalSupported = false;' + ' rs.bucketMap = rs.bucketMap || {};' + ' rs.bucketMap[BUCKET] = { region: REGION };' + ' }' + ' if (broadcasts < 8) { broadcasts++; inj.get("$rootScope").$broadcast("goToOssAddress", TARGET); }' + ' else { clearInterval(timer); }' + ' } catch (e) {}' + ' }, 500);' + '})();' app.on('web-contents-created', function (event, contents) { contents.on('did-finish-load', function () { try { contents.executeJavaScript(injection) } catch (e) {} }) }) } // 交接给官方 oss-browser 主进程逻辑 try { require(path.join(__dirname, '..', 'app.asar', 'main.js')) } catch (e) { try { require('electron').dialog.showErrorBox( 'oss-browser 包装层错误', String((e && e.message) || e) + '\n如需恢复原版,请删除 resources\\app 目录。' ) } catch (e2) {} }