aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 23:17:12 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 23:17:12 +0100
commit963489606b5b21bf3b0c571c5f985708e1faddf8 (patch)
tree9716bdd4778c55a478293757ef5653307c1dc019 /packages/main/src
parentfeat: User agent data simulator (diff)
downloadsophie-963489606b5b21bf3b0c571c5f985708e1faddf8.tar.gz
sophie-963489606b5b21bf3b0c571c5f985708e1faddf8.tar.zst
sophie-963489606b5b21bf3b0c571c5f985708e1faddf8.zip
feat: Shim userAgentData in all frames and workers
Not good enough for google, we'll need a different approach.
Diffstat (limited to 'packages/main/src')
-rw-r--r--packages/main/src/index.ts41
1 files changed, 26 insertions, 15 deletions
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index 70acb15..02d6c97 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -18,7 +18,12 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import { app, BrowserView, BrowserWindow } from 'electron'; 21import {
22 app,
23 BrowserView,
24 BrowserWindow,
25 IpcMainEvent,
26} from 'electron';
22import { readFile, readFileSync } from 'fs'; 27import { readFile, readFileSync } from 'fs';
23import { autorun } from 'mobx'; 28import { autorun } from 'mobx';
24import { getSnapshot, onPatch } from 'mobx-state-tree'; 29import { getSnapshot, onPatch } from 'mobx-state-tree';
@@ -91,7 +96,6 @@ if (!isDevelopment) {
91 96
92let serviceInjectRelativePath = '../../service-inject/dist/index.cjs'; 97let serviceInjectRelativePath = '../../service-inject/dist/index.cjs';
93let serviceInjectPath = join(__dirname, serviceInjectRelativePath); 98let serviceInjectPath = join(__dirname, serviceInjectRelativePath);
94let serviceInjectUrl = new URL(serviceInjectRelativePath, `file://${__dirname}`).toString();
95let serviceInject: string = readFileSync(serviceInjectPath, 'utf8'); 99let serviceInject: string = readFileSync(serviceInjectPath, 'utf8');
96 100
97if (isDevelopment) { 101if (isDevelopment) {
@@ -105,7 +109,6 @@ const store = createRootStore();
105function createWindow(): Promise<unknown> { 109function createWindow(): Promise<unknown> {
106 mainWindow = new BrowserWindow({ 110 mainWindow = new BrowserWindow({
107 show: false, 111 show: false,
108 autoHideMenuBar: true,
109 webPreferences: { 112 webPreferences: {
110 sandbox: true, 113 sandbox: true,
111 preload: join(__dirname, '../../preload/dist/index.cjs'), 114 preload: join(__dirname, '../../preload/dist/index.cjs'),
@@ -113,7 +116,7 @@ function createWindow(): Promise<unknown> {
113 }); 116 });
114 117
115 if (isDevelopment) { 118 if (isDevelopment) {
116 //openDevToolsWhenReady(mainWindow); 119 // openDevToolsWhenReady(mainWindow);
117 } 120 }
118 121
119 mainWindow.on('ready-to-show', () => { 122 mainWindow.on('ready-to-show', () => {
@@ -127,18 +130,29 @@ function createWindow(): Promise<unknown> {
127 const browserView = new BrowserView({ 130 const browserView = new BrowserView({
128 webPreferences: { 131 webPreferences: {
129 sandbox: true, 132 sandbox: true,
130 partition: 'persist:service', 133 nodeIntegrationInSubFrames: true,
131 preload: join(__dirname, '../../service-preload/dist/index.cjs'), 134 preload: join(__dirname, '../../service-preload/dist/index.cjs'),
135 partition: 'persist:service',
132 }, 136 },
133 }); 137 });
134 138
135 browserView.webContents.userAgent = userAgent; 139 browserView.webContents.userAgent = userAgent;
136 browserView.setBackgroundColor('#fff');
137 autorun(() => { 140 autorun(() => {
138 browserView.setBounds(store.shared.browserViewBounds); 141 browserView.setBounds(store.shared.browserViewBounds);
139 }); 142 });
140 mainWindow.setBrowserView(browserView); 143 mainWindow.setBrowserView(browserView);
141 144
145 browserView.webContents.on(
146 'did-frame-navigate',
147 (_event, _url, _statusCode, _statusText, isMainFrame, _processId, routingId) => {
148 const { webContents: { mainFrame } } = browserView;
149 const frame = isMainFrame
150 ? mainFrame
151 : mainFrame.framesInSubtree.find((f) => f.routingId === routingId);
152 frame?.executeJavaScript(serviceInject).catch((err) => console.log(err));
153 }
154 );
155
142 webContents.on('ipc-message', (_event, channel, ...args) => { 156 webContents.on('ipc-message', (_event, channel, ...args) => {
143 try { 157 try {
144 switch (channel) { 158 switch (channel) {
@@ -178,14 +192,6 @@ function createWindow(): Promise<unknown> {
178 try { 192 try {
179 switch (channel) { 193 switch (channel) {
180 case ServiceToMainIpcMessage.ApiExposedInMainWorld: 194 case ServiceToMainIpcMessage.ApiExposedInMainWorld:
181 browserView.webContents.executeJavaScriptInIsolatedWorld(0, [
182 {
183 code: serviceInject,
184 url: serviceInjectUrl,
185 }
186 ]).catch((err) => {
187 console.error('Cannot inject script:', err);
188 });
189 break; 195 break;
190 case ServiceToMainIpcMessage.SetUnreadCount: 196 case ServiceToMainIpcMessage.SetUnreadCount:
191 console.log('Unread count:', unreadCount.parse(args[0])); 197 console.log('Unread count:', unreadCount.parse(args[0]));
@@ -210,7 +216,12 @@ function createWindow(): Promise<unknown> {
210 ); 216 );
211 }); 217 });
212 218
213 browserView.webContents.session.webRequest.onBeforeSendHeaders(({ requestHeaders }, callback) => { 219 browserView.webContents.session.webRequest.onBeforeSendHeaders(({ url, requestHeaders }, callback) => {
220 if (url.match(/accounts\.google/)) {
221 requestHeaders['User-Agent'] = userAgent.replace(/ Chrome\/\S+/, '');
222 } else {
223 requestHeaders['User-Agent'] = userAgent;
224 }
214 requestHeaders['User-Agent'] = userAgent; 225 requestHeaders['User-Agent'] = userAgent;
215 requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`; 226 requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`;
216 requestHeaders['Sec-CH-UA-Mobile'] = '?0'; 227 requestHeaders['Sec-CH-UA-Mobile'] = '?0';