diff --git a/lib/channel/chat.js b/lib/channel/chat.js index 46eefbc8..d5805aaf 100644 --- a/lib/channel/chat.js +++ b/lib/channel/chat.js @@ -116,8 +116,14 @@ ChatModule.prototype.handleChatMsg = function (user, data) { return; } - // Limit to 240 characters, disallow all ASCII control characters except tab (\t) - data.msg = data.msg.substring(0, 240).replace(/[\x00-\x08\x0a-\x1f]+/g, " "); + // Limit to 240 characters + data.msg = data.msg.substring(0, 240); + // If channel doesn't permit them, strip ASCII control characters + if (!this.channel.modules.options || + !this.channel.modules.options.get("allow_ascii_control")) { + + data.msg = data.msg.replace(/[\x00-\x1f]+/g, " "); + } // Disallow blankposting if (!data.msg.trim()) { diff --git a/lib/channel/opts.js b/lib/channel/opts.js index 484d6247..27c55d2e 100644 --- a/lib/channel/opts.js +++ b/lib/channel/opts.js @@ -6,24 +6,25 @@ var url = require("url"); function OptionsModule(channel) { ChannelModule.apply(this, arguments); this.opts = { - allow_voteskip: true, // Allow users to voteskip - voteskip_ratio: 0.5, // Ratio of skip votes:non-afk users needed to skip the video - afk_timeout: 600, // Number of seconds before a user is automatically marked afk + allow_voteskip: true, // Allow users to voteskip + voteskip_ratio: 0.5, // Ratio of skip votes:non-afk users needed to skip the video + afk_timeout: 600, // Number of seconds before a user is automatically marked afk pagetitle: this.channel.name, // Title of the browser tab - maxlength: 0, // Maximum length (in seconds) of a video queued - externalcss: "", // Link to external stylesheet - externaljs: "", // Link to external script - chat_antiflood: false, // Throttle chat messages + maxlength: 0, // Maximum length (in seconds) of a video queued + externalcss: "", // Link to external stylesheet + externaljs: "", // Link to external script + chat_antiflood: false, // Throttle chat messages chat_antiflood_params: { - burst: 4, // Number of messages to allow with no throttling - sustained: 1, // Throttle rate (messages/second) - cooldown: 4 // Number of seconds with no messages before burst is reset + burst: 4, // Number of messages to allow with no throttling + sustained: 1, // Throttle rate (messages/second) + cooldown: 4 // Number of seconds with no messages before burst is reset }, - show_public: false, // List the channel on the index page - enable_link_regex: true, // Use the built-in link filter - password: false, // Channel password (false -> no password required for entry) - allow_dupes: false, // Allow duplicate videos on the playlist - torbanned: false // Block connections from Tor exit nodes + show_public: false, // List the channel on the index page + enable_link_regex: true, // Use the built-in link filter + password: false, // Channel password (false -> no password required for entry) + allow_dupes: false, // Allow duplicate videos on the playlist + torbanned: false, // Block connections from Tor exit nodes + allow_ascii_control: false // Allow ASCII control characters (\x00-\x1f) }; } @@ -249,6 +250,10 @@ OptionsModule.prototype.handleSetOptions = function (user, data) { this.opts.torbanned = Boolean(data.torbanned); } + if ("allow_ascii_control" in data && user.account.effectiveRank >= 3) { + this.opts.allow_ascii_control = Boolean(data.allow_ascii_control); + } + this.channel.logger.log("[mod] " + user.getName() + " updated channel options"); this.sendOpts(this.channel.users); }; diff --git a/templates/channeloptions.jade b/templates/channeloptions.jade index c6aa231a..ef14e827 100644 --- a/templates/channeloptions.jade +++ b/templates/channeloptions.jade @@ -76,6 +76,7 @@ mixin adminoptions mixin textbox-auto("cs-externaljs", "External Javascript", "Script URL") mixin rcheckbox-auto("cs-show_public", "List channel publicly") mixin rcheckbox-auto("cs-torbanned", "Block connections from Tor") + mixin rcheckbox-auto("cs-allow_ascii_control", "Allow ASCII control characters (e.g. newlines)") .form-group .col-sm-8.col-sm-offset-4 span.text-info Changes are automatically saved. diff --git a/www/js/util.js b/www/js/util.js index e9b3ea87..29907d0d 100644 --- a/www/js/util.js +++ b/www/js/util.js @@ -865,6 +865,7 @@ function handleModPermissions() { $("#cs-voteskip_ratio").val(CHANNEL.opts.voteskip_ratio); $("#cs-allow_dupes").val(CHANNEL.opts.allow_dupes); $("#cs-torbanned").val(CHANNEL.opts.torbanned); + $("#cs-allow_ascii_control").val(CHANNEL.opts.allow_ascii_control); (function() { if(typeof CHANNEL.opts.maxlength != "number") { $("#cs-maxlength").val("");