diff --git a/src/main/permissionRequestHandler.js b/src/main/permissionRequestHandler.js index 905df4fb..f9525e84 100644 --- a/src/main/permissionRequestHandler.js +++ b/src/main/permissionRequestHandler.js @@ -40,11 +40,17 @@ class PermissionManager { } isGranted(origin, permission) { - return this.permissions[origin] && this.permissions[origin][permission] === PERMISSION_GRANTED; + if (this.permissions[origin]) { + return this.permissions[origin][permission] === PERMISSION_GRANTED; + } + return false; } isDenied(origin, permission) { - return this.permissions[origin] && this.permissions[origin][permission] === PERMISSION_DENIED; + if (this.permissions[origin]) { + return this.permissions[origin][permission] === PERMISSION_DENIED; + } + return false; } } @@ -81,8 +87,11 @@ function permissionRequestHandler(mainWindow, permissionFile) { return; default: callback(false); + } }; } +permissionRequestHandler.PermissionManager = PermissionManager; + module.exports = permissionRequestHandler; diff --git a/test/modules/environment.js b/test/modules/environment.js index ffe8abc7..7ffab88f 100644 --- a/test/modules/environment.js +++ b/test/modules/environment.js @@ -23,6 +23,7 @@ const mattermostURL = 'http://example.com/team'; module.exports = { sourceRootDir, configFilePath, + userDataDir, boundsInfoPath, mattermostURL, diff --git a/test/specs/permisson_test.js b/test/specs/permisson_test.js new file mode 100644 index 00000000..0ec0fcb0 --- /dev/null +++ b/test/specs/permisson_test.js @@ -0,0 +1,80 @@ +/* eslint-disable no-unused-expressions */ + +const fs = require('fs'); +const path = require('path'); +const env = require('../modules/environment'); +const {PermissionManager} = require('../../src/main/permissionRequestHandler'); + +const permissionFile = path.join(env.userDataDir, 'permission.json'); + +describe('PermissionManager', function() { + beforeEach(function(done) { + fs.unlink(permissionFile, () => { + done(); + }); + }); + + it('should grant a permisson for an origin', function() { + const ORIGIN = 'origin'; + const PERMISSION = 'permission'; + const manager = new PermissionManager(permissionFile); + + manager.isGranted(ORIGIN, PERMISSION).should.be.false; + manager.isDenied(ORIGIN, PERMISSION).should.be.false; + + manager.grant(ORIGIN, PERMISSION); + + manager.isGranted(ORIGIN, PERMISSION).should.be.true; + manager.isDenied(ORIGIN, PERMISSION).should.be.false; + + manager.isGranted(ORIGIN + '_another', PERMISSION).should.be.false; + manager.isGranted(ORIGIN, PERMISSION + '_another').should.be.false; + }); + + it('should deny a permisson for an origin', function() { + const ORIGIN = 'origin'; + const PERMISSION = 'permission'; + const manager = new PermissionManager(permissionFile); + + manager.isGranted(ORIGIN, PERMISSION).should.be.false; + manager.isDenied(ORIGIN, PERMISSION).should.be.false; + + manager.deny(ORIGIN, PERMISSION); + + manager.isGranted(ORIGIN, PERMISSION).should.be.false; + manager.isDenied(ORIGIN, PERMISSION).should.be.true; + + manager.isDenied(ORIGIN + '_another', PERMISSION).should.be.false; + manager.isDenied(ORIGIN, PERMISSION + '_another').should.be.false; + }); + + it('should save permissons to the file', function() { + const ORIGIN = 'origin'; + const PERMISSION = 'permission'; + const manager = new PermissionManager(permissionFile); + manager.deny(ORIGIN, PERMISSION); + manager.grant(ORIGIN + '_another', PERMISSION + '_another'); + JSON.parse(fs.readFileSync(permissionFile)).should.deep.equal({ + origin: { + permission: 'denied' + }, + origin_another: { + permission_another: 'granted' + } + }); + }); + + it('should restore permissions from the file', function() { + fs.writeFileSync(permissionFile, JSON.stringify({ + origin: { + permission: 'denied' + }, + origin_another: { + permission_another: 'granted' + } + })); + const manager = new PermissionManager(permissionFile); + manager.isDenied('origin', 'permission').should.be.true; + manager.isGranted('origin_another', 'permission_another').should.be.true; + }); +});