diff --git a/src/client.js b/src/client.js index 6cb313ff..b188fafa 100644 --- a/src/client.js +++ b/src/client.js @@ -617,10 +617,7 @@ Client.prototype.quit = function(signOut) { } this.networks.forEach((network) => { - if (network.irc) { - network.irc.quit(Helper.config.leaveMessage); - } - + network.quit(Helper.config.leaveMessage); network.destroy(); }); diff --git a/src/models/network.js b/src/models/network.js index 918133f0..07fbf4ba 100644 --- a/src/models/network.js +++ b/src/models/network.js @@ -373,6 +373,17 @@ Network.prototype.addChannel = function(newChan) { return index; }; +Network.prototype.quit = function(quitMessage) { + if (!this.irc) { + return; + } + + // https://ircv3.net/specs/extensions/sts#rescheduling-expiry-on-disconnect + STSPolicies.refreshExpiration(this.host); + + this.irc.quit(quitMessage || Helper.config.leaveMessage); +}; + Network.prototype.exportForEdit = function() { let fieldsToReturn; diff --git a/src/plugins/inputs/disconnect.js b/src/plugins/inputs/disconnect.js index db733a44..3fe2aa30 100644 --- a/src/plugins/inputs/disconnect.js +++ b/src/plugins/inputs/disconnect.js @@ -1,19 +1,13 @@ "use strict"; -const Helper = require("../../helper"); - exports.commands = ["disconnect"]; exports.allowDisconnected = true; exports.input = function(network, chan, cmd, args) { - const quitMessage = args[0] ? args.join(" ") : Helper.config.leaveMessage; - - // Even if we are disconnected, but there is an internal connection object - // pass the quit/end to it, so the reconnection timer stops - if (network.irc && network.irc.connection) { - network.irc.quit(quitMessage); - } + const quitMessage = args[0] ? args.join(" ") : null; + network.quit(quitMessage); network.userDisconnected = true; + this.save(); }; diff --git a/src/plugins/inputs/quit.js b/src/plugins/inputs/quit.js index 252f050b..0bce3fa3 100644 --- a/src/plugins/inputs/quit.js +++ b/src/plugins/inputs/quit.js @@ -1,7 +1,6 @@ "use strict"; const _ = require("lodash"); -const Helper = require("../../helper"); exports.commands = ["quit"]; exports.allowDisconnected = true; @@ -16,10 +15,8 @@ exports.input = function(network, chan, cmd, args) { network: network.uuid, }); - if (network.irc) { - const quitMessage = args[0] ? args.join(" ") : Helper.config.leaveMessage; - network.irc.quit(quitMessage); - } + const quitMessage = args[0] ? args.join(" ") : null; + network.quit(quitMessage); return true; }; diff --git a/src/plugins/sts.js b/src/plugins/sts.js index 6dadcc59..25164ee7 100644 --- a/src/plugins/sts.js +++ b/src/plugins/sts.js @@ -23,6 +23,7 @@ class STSPolicies { if (value.expires > now) { this.policies.set(value.host, { port: value.port, + duration: value.duration, expires: value.expires, }); } @@ -49,6 +50,7 @@ class STSPolicies { if (duration > 0) { this.policies.set(host, { port: port, + duration: duration, expires: Date.now() + duration * 1000, }); } else { @@ -58,6 +60,16 @@ class STSPolicies { this.refresh(); } + refreshExpiration(host) { + const policy = this.policies.get(host); + + if (typeof policy === "undefined") { + return null; + } + + policy.expires = Date.now() + policy.duration * 1000; + } + saveFile() { const policiesToStore = []; @@ -65,6 +77,7 @@ class STSPolicies { policiesToStore.push({ host: key, port: value.port, + duration: value.duration, expires: value.expires, }); });