From 50e150199e92b266cf1f70e0ae4768f2a78fcaaf Mon Sep 17 00:00:00 2001 From: yutent Date: Sun, 24 Apr 2022 15:34:38 +0800 Subject: [PATCH] 3.8.12 --- Readme.md | 10 ++++++++ package.json | 24 +++++++++--------- src/main.js | 58 +++++++++++++++++++++++++++++++++++++++----- src/tools/inject.js | 28 +++++++++++++++++++++ src/tools/tray.js | 6 ++--- src/tools/windows.js | 51 +++++++++++++++++++++----------------- 6 files changed, 134 insertions(+), 43 deletions(-) create mode 100644 src/tools/inject.js diff --git a/Readme.md b/Readme.md index fd24f8e..3d2aa05 100644 --- a/Readme.md +++ b/Readme.md @@ -14,6 +14,16 @@ ![preview](./preview.png) +## 更新日志 + +- 2022.04.24 + 1. electron升级为18.0 + 2. 修复自动登录功能 + 3. 禁用`nodejs`, 注入更为安全 + 4. 包名修改为`top.yutent.dtalk`, 之前有安装过旧版的, 请先卸载 + 5. 不再打包`AppImage`版本, 其他非`debian`系发行版的, 请自行编译 + + ## 打包好的安装包 下载地址请转到`release`页面 diff --git a/package.json b/package.json index 79cc505..b191cd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dtalk", - "version": "3.8.8", + "version": "3.8.12", "description": "钉钉-Linux版", "main": "src/main.js", "scripts": { @@ -9,31 +9,33 @@ }, "author": { "name": "yutent", - "email": "yutent@doui.cc" + "email": "yutent.io@gmail.com" }, "devDependencies": { - "electron": "^6.0.0", - "electron-builder": "^21.2.0" + "electron": "^18.0.0", + "electron-builder": "^23.0.0" }, "build": { - "appId": "cc.doui.dtalk", - "productName": "DingDing", + "appId": "top.yutent.dtalk", + "productName": "钉钉(DingTalk)", + "electronDownload": { + "version": "18.1.0", + "mirror": "https://npm.taobao.org/mirrors/electron/" + }, "copyright": "Copyright © 2019 ${author}", "directories": { "buildResources": "icons", "output": "build" }, - "files": ["src/**/*"], + "files": [ + "src/**/*" + ], "linux": { "category": "Network;Chat", "target": [ { "target": "deb", "arch": "x64" - }, - { - "target": "AppImage", - "arch": "x64" } ], "icon": "./icons/" diff --git a/src/main.js b/src/main.js index 84db8d8..641cf5e 100644 --- a/src/main.js +++ b/src/main.js @@ -1,13 +1,15 @@ /* app */ -const { app, session, Menu } = require('electron') -const path = require('path') - -const log = console.log +const { app, session, Menu, ipcMain } = require('electron') +const { join } = require('path') +const fs = require('fs') const createTray = require('./tools/tray') const { createMainWindow } = require('./tools/windows') const ROOT = __dirname +const APP_DIR = join(app.getPath('appData'), './dtalk') +const sessionFile = join(APP_DIR, './login_session.json') +const cookieFile = join(APP_DIR, './login_cookie.json') /* ----------------------------------------------------- */ @@ -22,10 +24,54 @@ Menu.setApplicationMenu(null) app.once('ready', () => { // 修改app的UA session.defaultSession.setUserAgent( - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36' ) - let win = createMainWindow(path.join(ROOT, './images/app.png')) + let win = createMainWindow(join(ROOT, './images/app.png')) createTray(win) }) + +ipcMain.on('app', (ev, conn) => { + switch (conn.type) { + case 'saveToken': + fs.writeFile(sessionFile, conn.data, function (err) {}) + ev.returnValue = true + break + + case 'readToken': + { + let cache = '' + try { + cache = fs.readFileSync(sessionFile).toString() + } catch (err) {} + ev.returnValue = cache + } + break + + case 'restoreCookie': + { + try { + let cache = fs.readFileSync(cookieFile).toString() + cache = JSON.parse(cache) + for (let it of cache) { + it.url = 'https://im.dingtalk.com' + + session.defaultSession.cookies.set(it) + } + } catch (err) {} + ev.returnValue = true + } + break + + case 'saveCookie': + { + let cookie = session.defaultSession.cookies.get({}) + cookie.then(r => { + fs.writeFile(cookieFile, JSON.stringify(r), function (err) {}) + }) + ev.returnValue = true + } + break + } +}) diff --git a/src/tools/inject.js b/src/tools/inject.js new file mode 100644 index 0000000..acfa642 --- /dev/null +++ b/src/tools/inject.js @@ -0,0 +1,28 @@ +const { ipcRenderer, shell, contextBridge } = require('electron') + +contextBridge.exposeInMainWorld('electron', { + open(url) { + shell.openExternal(url) + }, + saveToken(id, token) { + token = JSON.parse(token) + // token.isAutoLogin = true + token = JSON.stringify(token) + + ipcRenderer.sendSync('app', { + data: JSON.stringify({ id, token }), + type: 'saveToken' + }) + }, + readToken() { + return ipcRenderer.sendSync('app', { type: 'readToken' }) + }, + + restoreCookie() { + return ipcRenderer.sendSync('app', { type: 'restoreCookie' }) + }, + + saveCookie() { + return ipcRenderer.sendSync('app', { type: 'saveCookie' }) + } +}) diff --git a/src/tools/tray.js b/src/tools/tray.js index 42b6bc0..ba4e206 100644 --- a/src/tools/tray.js +++ b/src/tools/tray.js @@ -1,16 +1,14 @@ /** * 托盘 - * @author yutent + * @author yutent * @date 2019/01/21 20:42:07 */ -'use strict' - const { app, Tray, Menu } = require('electron') const path = require('path') const ROOT = __dirname -module.exports = function(win) { +module.exports = function (win) { app.__TRAY__ = new Tray(path.join(ROOT, '../images/tray.png')) let menuList = Menu.buildFromTemplate([ { diff --git a/src/tools/windows.js b/src/tools/windows.js index c4979b2..ce3a203 100644 --- a/src/tools/windows.js +++ b/src/tools/windows.js @@ -1,17 +1,16 @@ /** * 各种窗口创建 - * @author yutent + * @author yutent * @date 2019/01/26 18:28:22 */ -'use strict' - +const { join } = require('path') const { BrowserWindow } = require('electron') /** * 应用主窗口 */ -exports.createMainWindow = function(icon) { +exports.createMainWindow = function (icon) { // 创建浏览器窗口 let win = new BrowserWindow({ title: '钉钉-electron版', @@ -23,14 +22,12 @@ exports.createMainWindow = function(icon) { webPreferences: { webSecurity: false, experimentalFeatures: true, - nodeIntegration: true + // nodeIntegration: true, + preload: join(__dirname, './inject.js') }, show: false }) - // 然后加载应用的 index.html。 - - // win.loadURL('app://local/index.html') win.loadURL('https://im.dingtalk.com') win.on('ready-to-show', _ => { @@ -42,13 +39,10 @@ exports.createMainWindow = function(icon) { win.webContents.on('dom-ready', ev => { win.webContents.executeJavaScript( ` - - const shell = require('electron').shell; - $(document).on('click', 'a[href^="http"]', function(event) { if(!this.hasAttribute('nwdirectory')){ event.preventDefault(); - shell.openExternal(this.href); + electron.open(this.href) } }); @@ -56,18 +50,28 @@ exports.createMainWindow = function(icon) { localStorage.setItem("notification", "true"); localStorage.setItem("newUserState", "secTip"); localStorage.setItem("latest_lang_info", "zh_CN"); + localStorage.setItem("login_method", "autoLogin"); - if(localStorage.getItem('fuck2')){ + + let cache = electron.readToken() - sessionStorage.setItem('wk_device_id', localStorage.getItem('fuck1')) - sessionStorage.setItem('wk_token', localStorage.getItem('fuck2')) + + if(cache){ + cache = JSON.parse(cache) + sessionStorage.setItem('wk_device_id', cache.id) + sessionStorage.setItem('wk_token', cache.token) + electron.restoreCookie() + + // 第一次进来刷新一下页面, 才会自动登录 + if(!sessionStorage.getItem('first_in')){ + sessionStorage.setItem('first_in', 1) + setTimeout(function(){ + location.reload() + }, 2000) + } } - if(!sessionStorage.getItem('first_in')){ - sessionStorage.setItem('first_in', 1) - location.reload() - } `, true @@ -80,9 +84,12 @@ exports.createMainWindow = function(icon) { ` if(sessionStorage.getItem('wk_token')){ - localStorage.setItem('fuck1', sessionStorage.getItem('wk_device_id')) - - localStorage.setItem('fuck2', sessionStorage.getItem('wk_token')) + electron.saveCookie() + + electron.saveToken( + sessionStorage.getItem('wk_device_id'), + sessionStorage.getItem('wk_token') + ) } `,