Implement permission request handler
This commit is contained in:
@@ -37,6 +37,7 @@ const appMenu = require('./main/menus/app');
|
|||||||
const trayMenu = require('./main/menus/tray');
|
const trayMenu = require('./main/menus/tray');
|
||||||
const downloadURL = require('./main/downloadURL');
|
const downloadURL = require('./main/downloadURL');
|
||||||
const allowProtocolDialog = require('./main/allowProtocolDialog');
|
const allowProtocolDialog = require('./main/allowProtocolDialog');
|
||||||
|
const permissionRequestHandler = require('./main/permissionRequestHandler');
|
||||||
|
|
||||||
const SpellChecker = require('./main/SpellChecker');
|
const SpellChecker = require('./main/SpellChecker');
|
||||||
|
|
||||||
@@ -577,6 +578,9 @@ app.on('ready', () => {
|
|||||||
});
|
});
|
||||||
ipcMain.emit('update-dict');
|
ipcMain.emit('update-dict');
|
||||||
|
|
||||||
|
const permissionFile = path.join(app.getPath('userData'), 'permission.json');
|
||||||
|
session.defaultSession.setPermissionRequestHandler(permissionRequestHandler(mainWindow, permissionFile));
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.openDevTools();
|
// mainWindow.openDevTools();
|
||||||
});
|
});
|
||||||
|
88
src/main/permissionRequestHandler.js
Normal file
88
src/main/permissionRequestHandler.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
const {dialog} = require('electron');
|
||||||
|
const {URL} = require('url');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const PERMISSION_GRANTED = 'granted';
|
||||||
|
const PERMISSION_DENIED = 'denied';
|
||||||
|
|
||||||
|
class PermissionManager {
|
||||||
|
constructor(file) {
|
||||||
|
this.file = file;
|
||||||
|
if (fs.existsSync(file)) {
|
||||||
|
this.permissions = JSON.parse(fs.readFileSync(this.file, 'utf-8'));
|
||||||
|
} else {
|
||||||
|
this.permissions = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeFileSync() {
|
||||||
|
fs.writeFileSync(this.file, JSON.stringify(this.permissions, null, ' '));
|
||||||
|
}
|
||||||
|
|
||||||
|
grant(origin, permission) {
|
||||||
|
if (!this.permissions[origin]) {
|
||||||
|
this.permissions[origin] = {};
|
||||||
|
}
|
||||||
|
this.permissions[origin][permission] = PERMISSION_GRANTED;
|
||||||
|
this.writeFileSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
deny(origin, permission) {
|
||||||
|
if (!this.permissions[origin]) {
|
||||||
|
this.permissions[origin] = {};
|
||||||
|
}
|
||||||
|
this.permissions[origin][permission] = PERMISSION_DENIED;
|
||||||
|
this.writeFileSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
clear(origin, permission) {
|
||||||
|
delete this.permissions[origin][permission];
|
||||||
|
}
|
||||||
|
|
||||||
|
isGranted(origin, permission) {
|
||||||
|
return this.permissions[origin] && this.permissions[origin][permission] === PERMISSION_GRANTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
isDenied(origin, permission) {
|
||||||
|
return this.permissions[origin] && this.permissions[origin][permission] === PERMISSION_DENIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function permissionRequestHandler(mainWindow, permissionFile) {
|
||||||
|
const permissionManager = new PermissionManager(permissionFile);
|
||||||
|
return (webContents, permission, callback) => {
|
||||||
|
const targetURL = new URL(webContents.getURL());
|
||||||
|
if (permissionManager.isDenied(targetURL.origin, permission)) {
|
||||||
|
callback(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (permissionManager.isGranted(targetURL.origin, permission)) {
|
||||||
|
callback(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttons = ['Allow', 'Deny', 'Skip'];
|
||||||
|
const result = dialog.showMessageBox(mainWindow, {
|
||||||
|
type: 'warning',
|
||||||
|
buttons,
|
||||||
|
title: 'Permission Required',
|
||||||
|
message: `${targetURL.host} is requesting "${permission}" permission`,
|
||||||
|
cancelId: 2,
|
||||||
|
noLink: false
|
||||||
|
});
|
||||||
|
switch (result) {
|
||||||
|
case buttons.indexOf('Allow'):
|
||||||
|
permissionManager.grant(targetURL.origin, permission);
|
||||||
|
callback(true);
|
||||||
|
return;
|
||||||
|
case buttons.indexOf('Deny'):
|
||||||
|
permissionManager.deny(targetURL.origin, permission);
|
||||||
|
callback(false);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = permissionRequestHandler;
|
Reference in New Issue
Block a user