From deaa680aae856792b6bf6a45a85ef77975edfc3b Mon Sep 17 00:00:00 2001 From: Jiiks Date: Wed, 28 Feb 2018 21:34:12 +0200 Subject: [PATCH] Initial plugin permissions --- client/src/modules/contentmanager.js | 3 +- client/src/modules/modules.js | 1 + client/src/modules/permissionmanager.js | 44 +++++++++++++++ client/src/modules/pluginmanager.js | 17 +++++- client/src/styles/partials/modals/index.scss | 1 + .../partials/modals/permission-modal.scss | 52 ++++++++++++++++++ .../components/bd/modals/PermissionModal.vue | 55 +++++++++++++++++++ client/src/ui/modals.js | 11 ++++ tests/plugins/Permission Test/config.json | 16 ++++++ tests/plugins/Permission Test/index.js | 12 ++++ 10 files changed, 209 insertions(+), 3 deletions(-) create mode 100644 client/src/modules/permissionmanager.js create mode 100644 client/src/styles/partials/modals/permission-modal.scss create mode 100644 client/src/ui/components/bd/modals/PermissionModal.vue create mode 100644 tests/plugins/Permission Test/config.json create mode 100644 tests/plugins/Permission Test/index.js diff --git a/client/src/modules/contentmanager.js b/client/src/modules/contentmanager.js index 5ffbd30f..cb93f2aa 100644 --- a/client/src/modules/contentmanager.js +++ b/client/src/modules/contentmanager.js @@ -211,7 +211,8 @@ export default class { mainPath }; - const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies); + const content = await this.loadContent(paths, configs, readConfig.info, readConfig.main, readConfig.dependencies, readConfig.permissions); + if (!content) return null; if (!reload && this.getContentById(content.id)) throw {message: `A ${this.contentType} with the ID ${content.id} already exists.`}; diff --git a/client/src/modules/modules.js b/client/src/modules/modules.js index 90f3e99c..db1b5b7c 100644 --- a/client/src/modules/modules.js +++ b/client/src/modules/modules.js @@ -11,3 +11,4 @@ export { default as ModuleManager } from './modulemanager'; export { default as EventListener } from './eventlistener'; export { default as SocketProxy } from './socketproxy'; export { default as EventHook } from './eventhook'; +export { default as Permissions } from './permissionmanager'; diff --git a/client/src/modules/permissionmanager.js b/client/src/modules/permissionmanager.js new file mode 100644 index 00000000..a5fc0d94 --- /dev/null +++ b/client/src/modules/permissionmanager.js @@ -0,0 +1,44 @@ +/** + * BetterDiscord Permission Manager + * Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks + * All rights reserved. + * https://betterdiscord.net + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. +*/ + +const PermissionMap = { + IDENTIFY: { + HEADER: 'Access your account information', + BODY: 'Allows :NAME: to read your account information(excluding user token)' + }, + READ_MESSAGES: { + HEADER: 'Read all messages', + BODY: 'Allows :NAME: to read all messages accessible through your Discord account' + }, + SEND_MESSAGES: { + HEADER: 'Send messages', + BODY: 'Allows :NAME: to send messages on your behalf' + }, + DELETE_MESSAGES: { + HEADER: 'Delete messages', + BODY: 'Allows :NAME: to delete messages on your behalf' + }, + EDIT_MESSAGES: { + HEADER: 'Edit messages', + BODY: 'Allows :NAME: to edit messages on your behalf' + }, + JOIN_SERVERS: { + HEADER: 'Join servers for you', + BODY: 'Allows :NAME: to join servers on your behalf' + } +} + +export default class { + + static permissionText(permission) { + return PermissionMap[permission]; + } + +} diff --git a/client/src/modules/pluginmanager.js b/client/src/modules/pluginmanager.js index a43755d6..2367ad35 100644 --- a/client/src/modules/pluginmanager.js +++ b/client/src/modules/pluginmanager.js @@ -14,7 +14,8 @@ import Plugin from './plugin'; import PluginApi from './pluginapi'; import Vendor from './vendor'; import { ClientLogger as Logger } from 'common'; -import { Events } from 'modules'; +import { Events, Permissions } from 'modules'; +import { Modals } from 'ui'; export default class extends ContentManager { @@ -47,7 +48,19 @@ export default class extends ContentManager { static get refreshPlugins() { return this.refreshContent } static get loadContent() { return this.loadPlugin } - static async loadPlugin(paths, configs, info, main, dependencies) { + static async loadPlugin(paths, configs, info, main, dependencies, permissions) { + + if (permissions && permissions.length > 0) { + for (let perm of permissions) { + console.log(`Permission: ${Permissions.permissionText(perm).HEADER} - ${Permissions.permissionText(perm).BODY}`); + } + try { + const allowed = await Modals.permissions(`${info.name} wants to:`, info.name, permissions).promise; + } catch (err) { + return null; + } + } + const deps = []; if (dependencies) { for (const [key, value] of Object.entries(dependencies)) { diff --git a/client/src/styles/partials/modals/index.scss b/client/src/styles/partials/modals/index.scss index db8ff474..994bbd64 100644 --- a/client/src/styles/partials/modals/index.scss +++ b/client/src/styles/partials/modals/index.scss @@ -6,3 +6,4 @@ @import './basic-modal.scss'; @import './error-modal.scss'; @import './settings-modal.scss'; +@import './permission-modal.scss'; diff --git a/client/src/styles/partials/modals/permission-modal.scss b/client/src/styles/partials/modals/permission-modal.scss new file mode 100644 index 00000000..78c5e804 --- /dev/null +++ b/client/src/styles/partials/modals/permission-modal.scss @@ -0,0 +1,52 @@ +.bd-perm-scope { + display: flex; + + .bd-perm-allow { + display: flex; + flex: 1; + + .bd-perm-check { + -webkit-box-sizing: border-box; + background: hsla(0,0%,100%,.2); + border-radius: 18px; + box-sizing: border-box; + height: 36px; + margin-right: 20px; + margin-top: 14px; + padding: 2px; + width: 36px; + + .bd-perm-check-inner { + background-color: #43b581; + border: 2px solid #35383c; + border-radius: 16px; + box-sizing: border-box; + height: 32px; + width: 32px; + } + } + + .bd-perm-inner { + display: flex; + flex: 1; + flex-direction: column; + justify-content: center; + min-height: 45px; + padding: 13px 0; + border-bottom: 1px solid hsla(0,0%,100%,.1); + + .bd-perm-name { + color: #fff; + font-size: 17px; + font-weight: 500; + line-height: 22px; + } + + .bd-perm-desc { + color: hsla(0,0%,100%,.2); + font-size: 12px; + line-height: 15px; + } + } + } +} diff --git a/client/src/ui/components/bd/modals/PermissionModal.vue b/client/src/ui/components/bd/modals/PermissionModal.vue new file mode 100644 index 00000000..d67b34c2 --- /dev/null +++ b/client/src/ui/components/bd/modals/PermissionModal.vue @@ -0,0 +1,55 @@ +/** + * BetterDiscord Permission Modal Component + * Copyright (c) 2015-present Jiiks/JsSucks - https://github.com/Jiiks / https://github.com/JsSucks + * All rights reserved. + * https://betterdiscord.net + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. +*/ + + + + diff --git a/client/src/ui/modals.js b/client/src/ui/modals.js index 64702d9a..f1440e77 100644 --- a/client/src/ui/modals.js +++ b/client/src/ui/modals.js @@ -14,6 +14,7 @@ import BasicModal from './components/bd/modals/BasicModal.vue'; import ConfirmModal from './components/bd/modals/ConfirmModal.vue'; import ErrorModal from './components/bd/modals/ErrorModal.vue'; import SettingsModal from './components/bd/modals/SettingsModal.vue'; +import PermissionModal from './components/bd/modals/PermissionModal.vue'; export default class { @@ -81,6 +82,16 @@ export default class { return modal; } + static permissions(title, name, perms) { + const modal = { title,name, perms }; + modal.promise = new Promise((resolve, reject) => { + modal.confirm = () => resolve(true); + modal.beforeClose = () => reject(); + this.add(modal, PermissionModal); + }); + return modal; + } + static error(event) { return this.add({ event }, ErrorModal); } diff --git a/tests/plugins/Permission Test/config.json b/tests/plugins/Permission Test/config.json new file mode 100644 index 00000000..38ca802a --- /dev/null +++ b/tests/plugins/Permission Test/config.json @@ -0,0 +1,16 @@ +{ + "info": { + "id": "permission-test", + "name": "Permission Test", + "authors": [ "Jiiks" ], + "version": 1.0, + "description": "Permission Test Description" + }, + "main": "index.js", + "type": "plugin", + "permissions": [ + "READ_MESSAGES", + "SEND_MESSAGES" + ], + "defaultConfig": [] +} diff --git a/tests/plugins/Permission Test/index.js b/tests/plugins/Permission Test/index.js new file mode 100644 index 00000000..1e277b54 --- /dev/null +++ b/tests/plugins/Permission Test/index.js @@ -0,0 +1,12 @@ +module.exports = (Plugin, Api, Vendor) => { + + return class extends Plugin { + onStart() { + return true; + } + + onStop() { + return true; + } + } +}