From 5cce34eb404688287f5621ab003de80ceef89d41 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Mon, 19 Jul 2021 16:25:37 +0200 Subject: [PATCH] Split push plugin up into multiple files --- karma.conf.js | 2 +- src/converse.js | 2 +- src/plugins/push.js | 123 ----------------------- src/plugins/push/index.js | 31 ++++++ {spec => src/plugins/push/tests}/push.js | 0 src/plugins/push/utils.js | 94 +++++++++++++++++ 6 files changed, 127 insertions(+), 125 deletions(-) delete mode 100644 src/plugins/push.js create mode 100644 src/plugins/push/index.js rename {spec => src/plugins/push/tests}/push.js (100%) create mode 100644 src/plugins/push/utils.js diff --git a/karma.conf.js b/karma.conf.js index 974a8cc40..f5da9831a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -25,7 +25,6 @@ module.exports = function(config) { { pattern: "node_modules/sinon/pkg/sinon.js", type: 'module' }, { pattern: "spec/mock.js", type: 'module' }, - { pattern: "spec/push.js", type: 'module' }, { pattern: "spec/user-details-modal.js", type: 'module' }, { pattern: "src/headless/plugins/caps/tests/caps.js", type: 'module' }, { pattern: "src/headless/plugins/chat/tests/api.js", type: 'module' }, @@ -87,6 +86,7 @@ module.exports = function(config) { { pattern: "src/plugins/notifications/tests/notification.js", type: 'module' }, { pattern: "src/plugins/omemo/tests/media-sharing.js", type: 'module' }, { pattern: "src/plugins/omemo/tests/omemo.js", type: 'module' }, + { pattern: "src/plugins/push/tests/push.js", type: 'module' }, { pattern: "src/plugins/register/tests/register.js", type: 'module' }, { pattern: "src/plugins/rootview/tests/root.js", type: 'module' }, { pattern: "src/plugins/rosterview/tests/presence.js", type: 'module' }, diff --git a/src/converse.js b/src/converse.js index e47ea9ab5..a2042e64a 100644 --- a/src/converse.js +++ b/src/converse.js @@ -29,7 +29,7 @@ import "./plugins/muc-views/index.js"; // Views related to MUC import "./plugins/notifications/index.js"; import "./plugins/omemo/index.js"; import "./plugins/profile/index.js"; -import "./plugins/push.js"; // XEP-0357 Push Notifications +import "./plugins/push/index.js"; // XEP-0357 Push Notifications import "./plugins/register/index.js"; // XEP-0077 In-band registration import "./plugins/roomslist/index.js"; // Show currently open chat rooms import "./plugins/rootview/index.js"; diff --git a/src/plugins/push.js b/src/plugins/push.js deleted file mode 100644 index 9b8b6833d..000000000 --- a/src/plugins/push.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @module converse-push - * @description - * Converse.js plugin which add support for registering - * an "App Server" as defined in XEP-0357 - * @copyright 2020, the Converse.js contributors - * @license Mozilla Public License (MPLv2) - */ -import { _converse, api, converse } from "@converse/headless/core"; -import log from "@converse/headless/log"; - -const { Strophe, $iq } = converse.env; - -Strophe.addNamespace('PUSH', 'urn:xmpp:push:0'); - - -converse.plugins.add('converse-push', { - - initialize () { - /* The initialize function gets called as soon as the plugin is - * loaded by converse.js's plugin machinery. - */ - api.settings.extend({ - 'push_app_servers': [], - 'enable_muc_push': false - }); - - async function disablePushAppServer (domain, push_app_server) { - if (!push_app_server.jid) { - return; - } - if (!(await api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) { - log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`); - return; - } - const stanza = $iq({'type': 'set'}); - if (domain !== _converse.bare_jid) { - stanza.attrs({'to': domain}); - } - stanza.c('disable', { - 'xmlns': Strophe.NS.PUSH, - 'jid': push_app_server.jid, - }); - if (push_app_server.node) { - stanza.attrs({'node': push_app_server.node}); - } - api.sendIQ(stanza) - .catch(e => { - log.error(`Could not disable push app server for ${push_app_server.jid}`); - log.error(e); - }); - } - - async function enablePushAppServer (domain, push_app_server) { - if (!push_app_server.jid || !push_app_server.node) { - return; - } - const identity = await api.disco.getIdentity('pubsub', 'push', push_app_server.jid); - if (!identity) { - return log.warn( - `Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.` - ); - } - const result = await Promise.all([ - api.disco.supports(Strophe.NS.PUSH, push_app_server.jid), - api.disco.supports(Strophe.NS.PUSH, domain) - ]); - if (!result[0] && !result[1]) { - log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`); - return; - } - const stanza = $iq({'type': 'set'}); - if (domain !== _converse.bare_jid) { - stanza.attrs({'to': domain}); - } - stanza.c('enable', { - 'xmlns': Strophe.NS.PUSH, - 'jid': push_app_server.jid, - 'node': push_app_server.node - }); - if (push_app_server.secret) { - stanza.c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'}) - .c('field', {'var': 'FORM_TYPE'}) - .c('value').t(`${Strophe.NS.PUBSUB}#publish-options`).up().up() - .c('field', {'var': 'secret'}) - .c('value').t(push_app_server.secret); - } - return api.sendIQ(stanza); - } - - async function enablePush (domain) { - domain = domain || _converse.bare_jid; - const push_enabled = _converse.session.get('push_enabled') || []; - if (push_enabled.includes(domain)) { - return; - } - const enabled_services = api.settings.get('push_app_servers').filter(s => !s.disable); - const disabled_services = api.settings.get('push_app_servers').filter(s => s.disable); - const enabled = enabled_services.map(s => enablePushAppServer(domain, s)); - const disabled = disabled_services.map(s => disablePushAppServer(domain, s)); - try { - await Promise.all(enabled.concat(disabled)); - } catch (e) { - log.error('Could not enable or disable push App Server'); - if (e) log.error(e); - } finally { - push_enabled.push(domain); - } - _converse.session.save('push_enabled', push_enabled); - } - api.listen.on('statusInitialized', () => enablePush()); - - function onChatBoxAdded (model) { - if (model.get('type') == _converse.CHATROOMS_TYPE) { - enablePush(Strophe.getDomainFromJid(model.get('jid'))); - } - } - if (api.settings.get('enable_muc_push')) { - api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded)); - } - } -}); - diff --git a/src/plugins/push/index.js b/src/plugins/push/index.js new file mode 100644 index 000000000..f74207cf3 --- /dev/null +++ b/src/plugins/push/index.js @@ -0,0 +1,31 @@ +/** + * @description + * Converse.js plugin which add support for registering + * an "App Server" as defined in XEP-0357 + * @copyright 2021, the Converse.js contributors + * @license Mozilla Public License (MPLv2) + */ +import { _converse, api, converse } from '@converse/headless/core'; +import { enablePush, onChatBoxAdded } from './utils.js'; + +const { Strophe } = converse.env; + +Strophe.addNamespace('PUSH', 'urn:xmpp:push:0'); + +converse.plugins.add('converse-push', { + initialize () { + /* The initialize function gets called as soon as the plugin is + * loaded by converse.js's plugin machinery. + */ + api.settings.extend({ + 'push_app_servers': [], + 'enable_muc_push': false, + }); + + api.listen.on('statusInitialized', () => enablePush()); + + if (api.settings.get('enable_muc_push')) { + api.listen.on('chatBoxesInitialized', () => _converse.chatboxes.on('add', onChatBoxAdded)); + } + }, +}); diff --git a/spec/push.js b/src/plugins/push/tests/push.js similarity index 100% rename from spec/push.js rename to src/plugins/push/tests/push.js diff --git a/src/plugins/push/utils.js b/src/plugins/push/utils.js new file mode 100644 index 000000000..22995b176 --- /dev/null +++ b/src/plugins/push/utils.js @@ -0,0 +1,94 @@ +import log from "@converse/headless/log"; +import { _converse, api, converse } from "@converse/headless/core"; + +const { Strophe, $iq } = converse.env; + +async function disablePushAppServer (domain, push_app_server) { + if (!push_app_server.jid) { + return; + } + if (!(await api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) { + log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`); + return; + } + const stanza = $iq({'type': 'set'}); + if (domain !== _converse.bare_jid) { + stanza.attrs({'to': domain}); + } + stanza.c('disable', { + 'xmlns': Strophe.NS.PUSH, + 'jid': push_app_server.jid, + }); + if (push_app_server.node) { + stanza.attrs({'node': push_app_server.node}); + } + api.sendIQ(stanza) + .catch(e => { + log.error(`Could not disable push app server for ${push_app_server.jid}`); + log.error(e); + }); +} + +async function enablePushAppServer (domain, push_app_server) { + if (!push_app_server.jid || !push_app_server.node) { + return; + } + const identity = await api.disco.getIdentity('pubsub', 'push', push_app_server.jid); + if (!identity) { + return log.warn( + `Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.` + ); + } + const result = await Promise.all([ + api.disco.supports(Strophe.NS.PUSH, push_app_server.jid), + api.disco.supports(Strophe.NS.PUSH, domain) + ]); + if (!result[0] && !result[1]) { + log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`); + return; + } + const stanza = $iq({'type': 'set'}); + if (domain !== _converse.bare_jid) { + stanza.attrs({'to': domain}); + } + stanza.c('enable', { + 'xmlns': Strophe.NS.PUSH, + 'jid': push_app_server.jid, + 'node': push_app_server.node + }); + if (push_app_server.secret) { + stanza.c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'}) + .c('field', {'var': 'FORM_TYPE'}) + .c('value').t(`${Strophe.NS.PUBSUB}#publish-options`).up().up() + .c('field', {'var': 'secret'}) + .c('value').t(push_app_server.secret); + } + return api.sendIQ(stanza); +} + +export async function enablePush (domain) { + domain = domain || _converse.bare_jid; + const push_enabled = _converse.session.get('push_enabled') || []; + if (push_enabled.includes(domain)) { + return; + } + const enabled_services = api.settings.get('push_app_servers').filter(s => !s.disable); + const disabled_services = api.settings.get('push_app_servers').filter(s => s.disable); + const enabled = enabled_services.map(s => enablePushAppServer(domain, s)); + const disabled = disabled_services.map(s => disablePushAppServer(domain, s)); + try { + await Promise.all(enabled.concat(disabled)); + } catch (e) { + log.error('Could not enable or disable push App Server'); + if (e) log.error(e); + } finally { + push_enabled.push(domain); + } + _converse.session.save('push_enabled', push_enabled); +} + +export function onChatBoxAdded (model) { + if (model.get('type') == _converse.CHATROOMS_TYPE) { + enablePush(Strophe.getDomainFromJid(model.get('jid'))); + } +}