Implement permission request handler

This commit is contained in:
Yuya Ochiai
2017-10-04 00:16:13 +09:00
parent 8003c49bde
commit c957857a08
2 changed files with 92 additions and 0 deletions

View File

@@ -37,6 +37,7 @@ const appMenu = require('./main/menus/app');
const trayMenu = require('./main/menus/tray');
const downloadURL = require('./main/downloadURL');
const allowProtocolDialog = require('./main/allowProtocolDialog');
const permissionRequestHandler = require('./main/permissionRequestHandler');
const SpellChecker = require('./main/SpellChecker');
@@ -577,6 +578,9 @@ app.on('ready', () => {
});
ipcMain.emit('update-dict');
const permissionFile = path.join(app.getPath('userData'), 'permission.json');
session.defaultSession.setPermissionRequestHandler(permissionRequestHandler(mainWindow, permissionFile));
// Open the DevTools.
// mainWindow.openDevTools();
});

View 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;