start on the model, update paramconverter, refactor the setting thing from boardsettings and fix a bug (how did that not cause problems?? o.o)

merge-requests/218/head
Thomas Lynch 3 years ago
parent 85d1c83575
commit c6441c33f8
  1. 25
      helpers/paramconverter.js
  2. 23
      helpers/setting.js
  3. 15
      models/forms/changeboardsettings.js
  4. 398
      models/forms/changeglobalsettings.js
  5. 1
      redis.js

@ -1,13 +1,32 @@
'use strict';
const { ObjectId } = require(__dirname+'/../db/db.js')
//todo: separate these into a schema/set for differ ent routes and inject it before the controller, to prevent checkign a bunch of other shit for every post
, allowedArrays = new Set(['captcha', 'checkedcustompages', 'checkednews', 'checkedposts', 'globalcheckedposts', 'spoiler', 'strip_filename',
'checkedreports', 'checkedbans', 'checkedbanners', 'checkedaccounts', 'countries']) //only these should be arrays, since express bodyparser can output arrays
, trimFields = ['tags', 'uri', 'moderators', 'filters', 'announcement', 'description', 'message',
'checkedreports', 'checkedbans', 'checkedbanners', 'checkedaccounts', 'countries'])
, trimFields = ['allowed_hosts', 'dnsbl_blacklists', 'other_mime_types', 'highlight_options_language_subset', 'themes', 'code_themes',
'global_limits_custom_css_filters', 'board_defaults_filters', 'filters', 'tags', 'uri', 'moderators', 'announcement', 'description', 'message',
'name', 'subject', 'email', 'postpassword', 'password', 'default_name', 'report_reason', 'ban_reason', 'log_message', 'custom_css'] //trim if we dont want filed with whitespace
, numberFields = ['sticky', 'lock_reset', 'captcha_reset', 'filter_mode', 'lock_mode', 'message_r9k_mode', 'file_r9k_mode', 'captcha_mode',
'tph_trigger', 'pph_trigger', 'pph_trigger_action', 'tph_trigger_action', 'bump_limit', 'reply_limit', 'move_to_thread', 'postId',
'max_files', 'thread_limit', 'thread', 'max_thread_message_length', 'max_reply_message_length', 'min_thread_message_length', 'min_reply_message_length', 'auth_level'] //convert these to numbers before they hit our routes
'max_files', 'thread_limit', 'thread', 'max_thread_message_length', 'max_reply_message_length', 'min_thread_message_length', 'min_reply_message_length', 'auth_level',
'captcha_options_num_distorts_min', 'captcha_options_num_distorts_max', 'captcha_options_distortion', 'dnsbl_cache_time', 'flood_timers_same_content_same_ip',
'flood_timers_same_content_any_ip', 'flood_timers_any_content_same_ip', 'block_bypass_expire_after_uses', 'block_bypass_expire_after_time', 'ip_hash_perm_level',
'delete_board_perm_level', 'rate_limit_cost_captcha', 'rate_limit_cost_board_settings', 'rate_limit_cost_edit_post', 'overboard_limit', 'overboard_catalog_limit',
'lock_wait', 'prune_modlogs', 'thumb_size', 'video_thumb_percentage', 'default_ban_duration', 'quote_limit', 'preview_replies', 'sticky_preview_replies',
'early_404_fraction', 'early_404_replies', 'max_recent_news', 'highlight_options_threshold', 'global_limits_thread_limit_min', 'global_limits_thread_limit_max',
'global_limits_reply_limit_min', 'global_limits_reply_limit_max', 'global_limits_bump_limit_min', 'global_limits_bump_limit_max', 'global_limits_post_files_max',
'global_limits_post_files_size_max', 'global_limits_banner_files_width', 'global_limits_banner_files_height', 'global_limits_banner_files_max',
'global_alimits_banner_files_total', 'global_limits_banner_files_size_max', 'global_limits_field_length_name', 'global_limits_field_length_email',
'global_limits_field_length_subject', 'global_limits_field_length_postpassword', 'global_limits_field_length_message', 'global_limits_field_length_report_reason',
'global_limits_field_length_ban_reason', 'global_limits_field_length_log_message', 'global_limits_field_length_uri', 'global_limits_field_length_boardname',
'global_limits_field_length_description', 'global_limits_multi_input_posts_anon', 'global_limits_multi_input_posts_staff', 'global_limits_custom_css_max',
'global_limits_custom_pages_max', 'global_limits_custom_pages_max_length', 'frontend_script_default_volume', 'board_defaults_lock_mode',
'board_defaults_file_r9k_mode', 'board_defaults_message_r9k_mode', 'board_defaults_captcha_mode', 'board_defaults_tph_trigger', 'board_defaults_pph_trigger',
'board_defaults_tph_trigger_action', 'board_defaults_pph_trigger_action', 'board_defaults_captcha_reset', 'board_defaults_lock_reset', 'board_defaults_thread_limit',
'board_defaults_reply_limit', 'board_defaults_bump_limit', 'board_defaults_max_files', 'board_defaults_min_thread_message_length',
'board_defaults_min_reply_message_length', 'board_defaults_max_thread_message_length', 'board_defaults_max_reply_message_length', 'board_defaults_filter_mode',
'board_defaults_filter_ban_duration', 'ban_duration'] //convert these to numbers before they hit our routes
, banDurationRegex = /^(?<YEAR>[\d]+y)?(?<MONTH>[\d]+mo)?(?<WEEK>[\d]+w)?(?<DAY>[\d]+d)?(?<HOUR>[\d]+h)?(?<MINUTE>[\d]+m)?(?<SECOND>[\d]+s)?$/
, timeUtils = require(__dirname+'/timeutils.js')
, makeArrayIfSingle = (obj) => !Array.isArray(obj) ? [obj] : obj;

@ -0,0 +1,23 @@
'use strict';
module.exports = {
trimSetting: (setting, oldSetting) => {
return setting && setting.trim().length > 0 ? setting : oldSetting;
},
numberSetting: (setting, oldSetting) => {
return typeof setting === 'number' && setting !== oldSetting ? setting : oldSetting;
},
booleanSetting: (setting) => {
return setting != null;
},
arraySetting: (setting, oldSetting, limit=false) => {
if (setting !== null) {
const split = setting
.split(/\r?\n/)
.fitler(n => n);
return split
.slice(0, limit || split.length);
}
return oldSetting;
}
};

@ -10,19 +10,8 @@ const { Boards, Posts, Accounts } = require(__dirname+'/../../db/')
, { prepareMarkdown } = require(__dirname+'/../../helpers/posting/markdown.js')
, messageHandler = require(__dirname+'/../../helpers/posting/message.js')
, { countryCodes } = require(__dirname+'/../../helpers/countries.js')
, validCountryCodes = new Set(countryCodes)
, trimSetting = (setting, oldSetting) => {
return setting && setting.trim().length > 0 ? setting : oldSetting;
}
, numberSetting = (setting, oldSetting) => {
return typeof setting === 'number' && setting !== oldSetting ? setting : oldSetting;
}
, booleanSetting = (setting) => {
return setting != null;
}
, arraySetting = (setting, oldSetting, limit) => {
return setting !== null ? setting.split(/\r?\n/).filter(n => n).slice(0,limit) : oldSettings;
};
, { trimSetting, numberSetting, booleanSetting, arraySetting } = require(__dirname+'/../../helpers/setting.js')
, validCountryCodes = new Set(countryCodes);
module.exports = async (req, res, next) => {

@ -4,293 +4,263 @@ const { Boards, Posts, Accounts } = require(__dirname+'/../../db/')
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js')
, uploadDirectory = require(__dirname+'/../../helpers/files/uploadDirectory.js')
, buildQueue = require(__dirname+'/../../queue.js')
, cache = require(__dirname+'/../../redis.js')
, { redisPublisher } = require(__dirname+'/../../redis.js')
, getConfig = require(__dirname+'/../../getconfig.js')
, { trimSetting, numberSetting, booleanSetting, arraySetting } = require(__dirname+'/../../helpers/setting.js')
, { remove } = require('fs-extra');
module.exports = async (req, res, next) => {
const promises = [];
const oldSettings = await cache.get('globalsettings');
const oldSettings = getConfig();
const newSettings = {
//todo: holy fuck this is gonna be too much boilerplate, not like per-board settings wasnt too much already (^:
//todo: make massive fucking template update for expanded global settings page
//idea: for permissions level and stuff, we can show the name as "Admin" and send the value as perm level number
secureCookies: true,
refererCheck: true,
allowedHosts: [],
countryCodeHeader: 'x-country-code',
ipHeader: 'x-real-ip',
secureCookies: booleanSetting(req.body.secure_cookies),
refererCheck: booleanSetting(req.body.referrer_check),
allowedHosts: arraySetting(req.body.allowed_hosts, oldSettings.allowedHosts),
countryCodeHeader: trimSetting(req.body.country_code_header, oldSettings.countryCodeHeader),
ipHeader: trimSetting(req.body.ip_header, oldSettings.ipHeader),
meta: {
siteName: 'fatchan',
url: 'https://fatchan.org'
siteName: trimSetting(req.body.meta_site_name, oldSettings.meta.siteName),
url: trimSetting(req.body.meta_url, oldSettings.meta.url),
},
captchaOptions: {
type: 'grid',
generateLimit: 250,
type: trimSetting(req.body.captcha_options_type, oldSettings.captchaOptions.type),
generateLimit: trimSetting(req.body.captcha_options_generate_limit, oldSettings.captchaOptions.generateLimit),
google: {
siteKey: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
secretKey: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
siteKey: trimSetting(req.body.captcha_options_google_site_key, oldSettings.captchaOptions.google.siteKey),
secretKey: trimSetting(req.body.captcha_options_google_secret_key, oldSettings.captchaOptions.google.secretKey),
},
hcaptcha: {
siteKey: 'zzzz',
secretKey: 'xxxxxxxxxxxxxxxx'
siteKey: trimSetting(req.body.captcha_options_hcaptcha_site_key, oldSettings.captchaOptions.hcaptcha.siteKey),
secretKey: trimSetting(req.body.captcha_option_hcaptcha_secret_key, oldSettings.captchaOptions.hcaptcha.secretKey),
},
grid: {
size: 4,
imageSize: 120,
iconYOffset: 15,
size: trimSetting(req.body.captcha_options_grid_size, oldSettings.captchaOptions.grid.size),
imageSize: trimSetting(req.body.captcha_options_grid_image_size, oldSettings.captchaOptions.grid.imageSize),
iconYOffset: trimSetting(req.body.captcha_options_grid_icon_y_offset, oldSettings.captchaOptions.grid.iconYOffset),
},
numDistorts: {
min: 2,
max: 3
min: numberSetting(req.body.captcha_options_num_distorts_min, oldSettings.captchaOptions.numDistorts.min),
max: numberSetting(req.body.captcha_options_num_distorts_max, oldSettings.captchaOptions.numDistorts.max),
},
distortion: 7,
distortion: numberSetting(req.body.captcha_options_distortion, oldSettings.captchaOptions.distortion),
},
dnsbl: {
enabled: false,
blacklists: ['tor.dan.me.uk', 'zen.spamhaus.org'],
cacheTime: 3600
enabled: booleanSetting(req.body.dnsbl_enabled),
blacklists: arraySetting(req.body.dnsbl_blacklists, oldSettings.dnsbl.blacklists),
cacheTime: numberSetting(req.body.dnsbl_cache_time, oldSettings.dnsbl.cacheTime),
},
disableAnonymizerFilePosting: false,
statsCountAnonymizers: true,
disableAnonymizerFilePosting: booleanSetting(req.body.disable_anonymizer_file_software, oldSettings.disableAnonymizerFilePosting),
statsCountAnonymizers: booleanSetting(req.body.stats_count_anonymizers, oldSettings.statsCountAnonymizers),
floodTimers: {
sameContentSameIp: 120000,
sameContentAnyIp: 30000,
anyContentSameIp: 5000,
sameContentSameIp: numberSetting(req.body.flood_timers_same_content_same_ip, oldSettings.floodTimers.sameContentSameIp),
sameContentAnyIp: numberSetting(req.body.flood_timers_same_content_any_ip, oldSettings.floodTimers.sameContentAnyIp),
anyContentSameIp: numberSetting(req.body.flood_timers_any_content_same_ip, oldSettings.floodTimers.anyContentSameIp),
},
blockBypass: {
enabled: true,
forceAnonymizers: true,
expireAfterUses: 50,
expireAfterTime: 86400000,
bypassDnsbl: false,
enabled: booleanSetting(req.body.block_bypass_enabled, oldSettings.blockBypass.enabled),
forceAnonymizers: booleanSetting(req.body.block_bypass_force_anonymizers, oldSettings.blockBypass.forceAnonymizers),
expireAfterUses: numberSetting(req.body.block_bypass_expire_after_uses, oldSettings.blockBypass.expireAfterUses),
expireAfterTime: numberSetting(req.body.block_bypass_expire_after_time, oldSettings.blockBypass.expireAfterTime),
bypassDnsbl: booleanSetting(req.body.block_bypass_bypass_dnsbl, oldSettings.blockBypass.bypassDnsbl),
},
ipHashPermLevel: 0,
deleteBoardPermLevel: 2,
pruneImmediately: true,
hashImages: false,
ipHashPermLevel: numberSetting(req.body.ip_hash_perm_level, oldSettings.ipHashPermLevel),
deleteBoardPermLevel: numberSetting(req.body.delete_board_perm_level, oldSettings.deleteBoardPermLevel),
pruneImmediately: booleanSetting(req.body.prune_immediately, oldSettings.pruneImmediately),
hashImages: booleanSetting(req.body.hash_images, oldSettings.hashImages),
rateLimitCost: {
captcha: 11,
boardSettings: 30,
editPost: 30,
captcha: numberSetting(req.body.rate_limit_cost_captcha, oldSettings.rateLimitCost.captcha),
boardSettings: numberSetting(req.body.rate_limit_cost_board_settings, oldSettings.rateLimitCost.boardSettings),
editPost: numberSetting(req.body.rate_limit_cost_edit_post, oldSettings.rateLimitCost.editPost),
},
overboardLimit: 20,
overboardCatalogLimit: 50,
cacheTemplates: true,
debugLogs: true,
lockWait: 3000,
pruneModlogs: 30,
pruneIps: false,
enableWebring: true,
enableUserBoardCreation: false,
enableUserAccountCreation: true,
thumbExtension: '.jpg',
animatedGifThumbnails: false,
audioThumbnails: true,
ffmpegGifThumbnails: true,
thumbSize: 250,
videoThumbPercentage: 5,
otherMimeTypes: [
'text/plain',
'application/pdf',
'application/x-sid',
],
checkRealMimeTypes: false,
allowMimeNoMatch: false,
defaultBanDuration: 31536000000,
quoteLimit: 25,
strictFiltering: true,
previewReplies: 5,
stickyPreviewReplies: 5,
early404Fraction: 3,
early404Replies: 5,
maxRecentNews: 5,
filterFileNames: false,
spaceFileNameReplacement: '_',
overboardLimit: numberSetting(req.body.overboard_limit, oldSettings.overboardLimit),
overboardCatalogLimit: numberSetting(req.body.overboard_catalog_limit, oldSettings.overboardCatalogLimit),
cacheTemplates: booleanSetting(req.body.cache_templates, oldSettings.cacheTemplates),
debugLogs: booleanSetting(req.body.debug_logs, oldSettings.debugLogs),
lockWait: numberSetting(req.body.lock_wait, oldSettings.lockWait),
pruneModlogs: numberSetting(req.body.prune_modlogs, oldSettings.pruneModlogs),
pruneIps: booleanSetting(req.body.prune_ips, oldSettings.pruneIps),
enableWebring: booleanSetting(req.body.enable_webring, oldSettings.enableWebring),
enableUserBoardCreation: booleanSetting(req.body.enable_user_board_creation, oldSettings.enableUserBoardCreation),
enableUserAccountCreation: booleanSetting(req.body.enable_user_account_creation, oldSettings.enableUserAccountCreation),
thumbExtension: trimSetting(req.body.thumb_extension, oldSettings.thumbExtension),
animatedGifThumbnails: booleanSetting(req.body.animated_gif_thumbnails, oldSettings.animatedGifThumbnails),
audioThumbnails: booleanSetting(req.body.audio_thumbnails, oldSettings.audioThumbnails),
ffmpegGifThumbnails: booleanSetting(req.body.ffmpeg_gif_thumbnails, oldSettings.ffmpegGifThumbnails),
thumbSize: numberSetting(req.body.thumb_size, oldSettings.thumbSize),
videoThumbPercentage: numberSetting(req.body.video_thumb_percentage, oldSettings.videoThumbPercentage),
otherMimeTypes: arraySetting(req.body.other_mime_types, oldSettings.otherMimeTypes),
checkRealMimeTypes: booleanSetting(req.body.check_real_mime_types, oldSettings.checkRealMimeTypes),
allowMimeNoMatch: booleanSetting(req.body.allow_mime_no_match, oldSettings.allowMimeNoMatch),
defaultBanDuration: numberSetting(req.body.default_ban_duration, oldSettings.defaultBanDuration),
quoteLimit: numberSetting(req.body.quote_limit, oldSettings.quoteLimit),
strictFiltering: booleanSetting(req.body.strict_filtering, oldSettings.strictFiltering),
previewReplies: numberSetting(req.body.preview_replies, oldSettings.previewReplies),
stickyPreviewReplies: numberSetting(req.body.sticky_preview_replies, oldSettings.stickyPreviewReplies),
early404Fraction: numberSetting(req.body.early_404_fraction, oldSettings.early404Fraction),
early404Replies: numberSetting(req.body.early_404_replies, oldSettings.early404Replies),
maxRecentNews: numberSetting(req.body.max_recent_news, oldSettings.maxRecentNews),
filterFileNames: booleanSetting(req.body.filter_file_names, oldSettings.filterFileNames),
spaceFileNameReplacement: trimSetting(req.body.space_file_name_replacement, oldSettings.spaceFileNameReplacement),
highlightOptions: {
languageSubset: [
'javascript',
'typescript',
'perl',
'js',
'c++',
'c',
'java',
'kotlin',
'php',
'h',
'csharp',
'bash',
'sh',
'zsh',
'python',
'ruby',
'css',
'html',
'json',
'golang',
'rust'
],
threshold: 5
languageSubset: arraySetting(req.body.highlight_options_language_subset, oldSettings.highlightOptions.languageSubset),
threshold: numberSetting(req.body.highlight_options_threshold, oldSettings.highlightOptions.threshold),
},
themes: [],
codeThemes: [],
themes: arraySetting(req.body.themes, oldSettings.themes),
codeThemes: arraySetting(req.body.code_themes, oldSettings.codeThemes),
globalLimits: {
threadLimit: {
min: 10,
max: 200
min: numberSetting(req.body.global_limits_thread_limit_min, oldSettings.globalLimits.threadLimit.min),
max: numberSetting(req.body.global_limits_thread_limit_max, oldSettings.globalLimits.threadLimit.max),
},
replyLimit: {
min: 10,
max: 1000
min: numberSetting(req.body.global_limits_reply_limit_min, oldSettings.globalLimits.replyLimit.min),
max: numberSetting(req.body.global_limits_reply_limit_max, oldSettings.globalLimits.replyLimit.max),
},
bumpLimit: {
min: 10,
max: 1000
min: numberSetting(req.body.global_limits_bump_limit_min, oldSettings.globalLimits.bumpLimit.min),
max: numberSetting(req.body.global_limits_bump_limit_max, oldSettings.globalLimits.bumpLimit.max),
},
postFiles: {
max: 5
max: numberSetting(req.body.global_limits_post_files_max, oldSettings.globalLimits.postFiles.max),
},
postFilesSize: {
max: 21023948
max: numberSetting(req.body.global_limits_post_files_size_max, oldSettings.globalLimits.postFilesSize.max),
},
bannerFiles: {
width: 600,
height: 600,
forceAspectRatio: false,
max: 10,
total: 100,
width: numberSetting(req.body.global_limits_banner_files_width, oldSettings.globalLimits.bannerFiles.width),
height: numberSetting(req.body.global_limits_banner_files_height, oldSettings.globalLimits.bannerFiles.height),
max: numberSetting(req.body.global_limits_banner_files_max, oldSettings.globalLimits.bannerFiles.max),
total: numberSetting(req.body.global_limits_banner_files_total, oldSettings.globalLimits.bannerFiles.total),
forceAspectRatio: booleanSetting(req.body.global_limits_banner_files_force_aspect_ratio, oldSettings.globalLimits.bannerFiles.forceAspectRatio),
},
bannerFilesSize: {
max: 10485760
max: numberSetting(req.body.global_limits_banner_files_size_max, oldSettings.globalLimits.bannerFilesSize.max),
},
fieldLength: {
name: 100,
email: 100,
subject: 100,
postpassword: 100,
message: 20000,
report_reason: 100,
ban_reason: 100,
log_message: 100,
uri: 50,
boardname: 50,
description: 100,
name: numberSetting(req.body.global_limits_field_length_name, oldSettings.globalLimits.fieldLength.name),
email: numberSetting(req.body.global_limits_field_length_email, oldSettings.globalLimits.fieldLength.email),
subject: numberSetting(req.body.global_limits_field_length_subject, oldSettings.globalLimits.fieldLength.subject),
postpassword: numberSetting(req.body.global_limits_field_length_postpassword, oldSettings.globalLimits.fieldLength.postpassword),
message: numberSetting(req.body.global_limits_field_length_message, oldSettings.globalLimits.fieldLength.message),
report_reason: numberSetting(req.body.global_limits_field_length_report_reason, oldSettings.globalLimits.fieldLength.report_reason),
ban_reason: numberSetting(req.body.global_limits_field_length_ban_reason, oldSettings.globalLimits.fieldLength.ban_reason),
log_message: numberSetting(req.body.global_limits_field_length_log_message, oldSettings.globalLimits.fieldLength.log_message),
uri: numberSetting(req.body.global_limits_field_length_uri, oldSettings.globalLimits.fieldLength.uri),
boardname: numberSetting(req.body.global_limits_field_length_boardname, oldSettings.globalLimits.fieldLength.boardname),
description: numberSetting(req.body.global_limits_field_length_description, oldSettings.globalLimits.fieldLength.description),
},
multiInputs: {
posts: {
anon: 20,
staff: 100,
anon: numberSetting(req.body.global_limits_multi_input_posts_anon, oldSettings.globalLimits.multiInputs.posts.anon),
staff: numberSetting(req.body.global_limits_multi_input_posts_staff, oldSettings.globalLimits.multiInputs.posts.staff),
},
},
customCss: {
enabled: true,
max: 10000,
strict: true,
filters: [
'@',
'url(',
]
enabled: booleanSetting(req.body.global_limits_custom_css_enabled, oldSettings.globalLimits.customCss.enabled),
max: numberSetting(req.body.global_limits_custom_css_max, oldSettings.globalLimits.customCss.max),
strict: booleanSetting(req.body.global_limits_custom_css_strict, oldSettings.globalLimits.customCss.strict),
filters: arraySetting(req.body.global_limits_custom_css_filters, oldSettings.globalLimits.customCss.filters),
},
customPages: {
max: 5,
maxLength: 10000,
max: numberSetting(req.body.global_limits_custom_pages_max, oldSettings.globalLimits.customPages.max),
maxLength: numberSetting(req.body.global_limits_custom_pages_max_length, oldSettings.globalLimits.customPages.maxLength),
}
},
frontendScriptDefault: {
embedsEnabled: true,
heightUnlimit: false,
hideRecursive: true,
crispImages: false,
hideThumbnails: false,
nonColorIds: false,
alwaysShowSpoilers: false,
hidePostStubs: false,
smoothScrolling: true,
defaultVolume: 100,
loop: true,
imageLoadingBars: true,
live: true,
scrollToPosts: false,
localTime: true,
hour24Time: false,
relativeTime: true,
notificationsEnabled: false,
notificationsYousOnly: true,
showYous: true,
embedsEnabled: booleanSetting(req.body.frontend_script_default_embeds_enabled, oldSettings.frontendScriptDefault.embedsEnabled),
heightUnlimit: booleanSetting(req.body.frontend_script_default_height_unlimit, oldSettings.frontendScriptDefault.heightUnlimit),
hideRecursive: booleanSetting(req.body.frontend_script_default_hide_recursive, oldSettings.frontendScriptDefault.hideRecursive),
crispImages: booleanSetting(req.body.frontend_script_default_crisp_images, oldSettings.frontendScriptDefault.crispImages),
hideThumbnails: booleanSetting(req.body.frontend_script_default_hide_thumbnails, oldSettings.frontendScriptDefault.hideThumbnails),
nonColorIds: booleanSetting(req.body.frontend_script_default_non_color_ids, oldSettings.frontendScriptDefault.nonColorIds),
alwaysShowSpoilers: booleanSetting(req.body.frontend_script_default_always_show_spoilers, oldSettings.frontendScriptDefault.alwaysShowSpoilers),
hidePostStubs: booleanSetting(req.body.frontend_script_default_hide_post_stubs, oldSettings.frontendScriptDefault.hidePostStubs),
smoothScrolling: booleanSetting(req.body.frontend_script_default_smooth_scrolling, oldSettings.frontendScriptDefault.smoothScrolling),
defaultVolume: numberSetting(req.body.frontend_script_default_volume, oldSettings.frontendScriptDefault.defaultVolume),
loop: booleanSetting(req.body.frontend_script_default_loop, oldSettings.frontendScriptDefault.loop),
imageLoadingBars: booleanSetting(req.body.frontend_script_default_image_loading_bars, oldSettings.frontendScriptDefault.imageLoadingBars),
live: booleanSetting(req.body.frontend_script_default_live, oldSettings.frontendScriptDefault.live),
scrollToPosts: booleanSetting(req.body.frontend_script_default_scroll_to_posts, oldSettings.frontendScriptDefault.scrollToPosts),
localTime: booleanSetting(req.body.frontend_script_default_local_time, oldSettings.frontendScriptDefault.localTime),
hour24Time: booleanSetting(req.body.frontend_script_default_hour_24_time, oldSettings.frontendScriptDefault.hour24Time),
relativeTime: booleanSetting(req.body.frontend_script_default_relative_time, oldSettings.frontendScriptDefault.relativeTime),
notificationsEnabled: booleanSetting(req.body.frontend_script_default_notifications_embed, oldSettings.frontendScriptDefault.notificationsEnabled),
notificationsYousOnly: booleanSetting(req.body.frontend_script_default_notifications_yous_only, oldSettings.frontendScriptDefault.notificationsYousOnly),
showYous: booleanSetting(req.body.frontend_script_default_show_yous, oldSettings.frontendScriptDefault.showYous),
},
boardDefaults: {
theme: 'clear',
codeTheme: 'ir-black',
sfw: false,
lockMode: 0,
fileR9KMode: 0,
messageR9KMode: 0,
unlistedLocal: false,
unlistedWebring: false,
captchaMode: 0,
tphTrigger: 10,
pphTrigger: 50,
tphTriggerAction: 1,
pphTriggerAction: 2,
captchaReset: 0,
lockReset: 0,
forceAnon: false,
sageOnlyEmail: false,
early404: true,
ids: false,
flags: false,
userPostDelete: true,
userPostSpoiler: true,
userPostUnlink: true,
threadLimit: 200,
replyLimit: 700,
bumpLimit: 500,
maxFiles: 5,
forceReplyMessage: false,
forceReplyFile: false,
forceThreadMessage: false,
forceThreadFile: false,
forceThreadSubject: false,
disableReplySubject: false,
minThreadMessageLength: 0,
minReplyMessageLength: 0,
maxThreadMessageLength: 20000,
maxReplyMessageLength: 20000,
defaultName: 'Anon',
theme: trimSetting(req.body.board_defaults_theme, oldSettings.boardDefaults.theme),
codeTheme: trimSetting(req.body.board_defaults_code_theme, oldSettings.boardDefaults.codeTheme),
sfw: booleanSetting(req.body.board_defaults_sfw, oldSettings.boardDefaults.sfw),
lockMode: numberSetting(req.body.board_defaults_lock_mode, oldSettings.boardDefaults.lockMode),
fileR9KMode: numberSetting(req.body.board_defaults_file_r9k_mode, oldSettings.boardDefaults.fileR9KMode),
messageR9KMode: numberSetting(req.body.board_defaults_message_r9k_mode, oldSettings.boardDefaults.messageR9KMode),
unlistedLocal: booleanSetting(req.body.board_defaults_unlisted_local, oldSettings.boardDefaults.unlistedLocal),
unlistedWebring: booleanSetting(req.body.board_defaults_unlisted_webring, oldSettings.boardDefaults.unlistedWebring),
captchaMode: numberSetting(req.body.board_defaults_captcha_mode, oldSettings.boardDefaults.captchaMode),
tphTrigger: numberSetting(req.body.board_defaults_tph_trigger, oldSettings.boardDefaults.tphTrigger),
pphTrigger: numberSetting(req.body.board_defaults_pph_trigger, oldSettings.boardDefaults.pphTrigger),
tphTriggerAction: numberSetting(req.body.board_defaults_tph_trigger_action, oldSettings.boardDefaults.tphTriggerAction),
pphTriggerAction: numberSetting(req.body.board_defaults_pph_trigger_action, oldSettings.boardDefaults.pphTriggerAction),
captchaReset: numberSetting(req.body.board_defaults_captcha_reset, oldSettings.boardDefaults.captchaReset),
lockReset: numberSetting(req.body.board_defaults_lock_reset, oldSettings.boardDefaults.lockReset),
forceAnon: booleanSetting(req.body.board_defaults_force_anon, oldSettings.boardDefaults.forceAnon),
sageOnlyEmail: booleanSetting(req.body.board_defaults_sage_only_email, oldSettings.boardDefaults.sageOnlyEmail),
early404: booleanSetting(req.body.board_defaults_early_404, oldSettings.boardDefaults.early404),
ids: booleanSetting(req.body.board_defaults_ids, oldSettings.boardDefaults.ids),
flags: booleanSetting(req.body.board_defaults_flags, oldSettings.boardDefaults.flags),
userPostDelete: booleanSetting(req.body.board_defaults_user_post_delete, oldSettings.boardDefaults.userPostDelete),
userPostSpoiler: booleanSetting(req.body.board_defaults_user_post_spoiler, oldSettings.boardDefaults.userPostSpoiler),
userPostUnlink: booleanSetting(req.body.board_defaults_user_post_unlink, oldSettings.boardDefaults.userPostUnlink),
threadLimit: numberSetting(req.body.board_defaults_thread_limit, oldSettings.boardDefaults.threadLimit),
replyLimit: numberSetting(req.body.board_defaults_reply_limit, oldSettings.boardDefaults.replyLimit),
bumpLimit: numberSetting(req.body.board_defaults_bump_limit, oldSettings.boardDefaults.bumpLimit),
maxFiles: numberSetting(req.body.board_defaults_max_files, oldSettings.boardDefaults.maxFiles),
forceReplyMessage: booleanSetting(req.body.board_defaults_force_reply_message, oldSettings.boardDefaults.forceReplyMessage),
forceReplyFile: booleanSetting(req.body.board_defaults_force_reply_file, oldSettings.boardDefaults.forceReplyFile),
forceThreadMessage: booleanSetting(req.body.board_defaults_force_thread_message, oldSettings.boardDefaults.forceThreadMessage),
forceThreadFile: booleanSetting(req.body.board_defaults_force_thread_file, oldSettings.boardDefaults.forceThreadFile),
forceThreadSubject: booleanSetting(req.body.board_defaults_force_thread_subject, oldSettings.boardDefaults.forceThreadSubject),
disableReplySubject: booleanSetting(req.body.board_defaults_disable_reply_subject, oldSettings.boardDefaults.disableReplySubject),
minThreadMessageLength: numberSetting(req.body.board_defaults_min_thread_message_length, oldSettings.boardDefaults.minThreadMessageLength),
minReplyMessageLength: numberSetting(req.body.board_defaults_min_reply_message_length, oldSettings.boardDefaults.minReplyMessageLength),
maxThreadMessageLength: numberSetting(req.body.board_defaults_max_thread_message_length, oldSettings.boardDefaults.maxThreadMessageLength),
maxReplyMessageLength: numberSetting(req.body.board_defaults_max_reply_message_length, oldSettings.boardDefaults.maxReplyMessageLength),
defaultName: trimSetting(req.body.board_defaults_default_name, oldSettings.boardDefaults.defaultName),
customCSS: null,
blockedCountries: [],
disableAnonymizerFilePosting: false,
filters: [],
filterMode: 0,
filterBanDuration: 0,
strictFiltering: false,
disableAnonymizerFilePosting: booleanSetting(req.body.board_defaults_disable_anonymizer_file_posting, oldSettings.boardDefaults.disableAnonymizerFilePosting),
filters: arraySetting(req.body.board_defaults_filters, oldSettings.boardDefaults.filters),
filterMode: numberSetting(req.body.board_defaults_filter_mode, oldSettings.boardDefaults.filterMode),
filterBanDuration: numberSetting(req.body.board_defaults_filter_ban_duration, oldSettings.boardDefaults.filterBanDuration),
strictFiltering: booleanSetting(req.body.board_defaults_strict_filtering, oldSettings.boardDefaults.strictFiltering),
announcement: {
raw: null,
markdown: null
},
allowedFileTypes: {
animatedImage: true,
image: true,
video: true,
audio: true,
other: false
animatedImage: booleanSetting(req.body.board_defaults_allowed_file_types_animated_image, oldSettings.boardDefaults.allowedFileTypes.animatedImage),
image: booleanSetting(req.body.board_defaults_allowed_file_types_image, oldSettings.boardDefaults.allowedFileTypes.image),
video: booleanSetting(req.body.board_defaults_allowed_file_types_video, oldSettings.boardDefaults.allowedFileTypes.video),
audio: booleanSetting(req.body.board_defaults_allowed_file_types_audio, oldSettings.boardDefaults.allowedFileTypes.audio),
other: booleanSetting(req.body.board_defaults_allowed_file_types_other, oldSettings.boardDefaults.allowedFileTypes.other)
}
},
'filters': req.body.filters !== null ? req.body.filters.split(/\r?\n/).filter(n => n) : oldSettings.filters,
'filterMode': typeof req.body.filter_mode === 'number' && req.body.filter_mode !== oldSettings.filterMode ? req.body.filter_mode : oldSettings.filterMode,
'filterBanDuration': typeof req.body.ban_duration === 'number' && req.body.ban_duration !== oldSettings.filterBanDuration ? req.body.ban_duration : oldSettings.filterBanDuration,
filters: arraySetting(req.body.filters, oldSettings.filters),
filterMode: numberSetting(req.body.filter_mode, oldSettings.filterMode),
filterBanDuration: numberSetting(req.body.ban_duration, oldSettings.filterBanDuration),
};
cache.set('globalsettings', newSettings);
/*
//todo: implement removing pages/rebuilding for all affected boards i.e. query for ones with settings.catchaMode < newSettings.captchaMode
let rebuildThreads = false
, rebuildBoard = false
, rebuildCatalog = false;
/*
//todo: implement removing pages/rebuilding for all affected boards i.e. query for ones with settings.catchaMode < newSettings.captchaMode
if (newSettings.captchaMode > oldSettings.captchaMode) {
rebuildBoard = true;
rebuildCatalog = true;
@ -331,7 +301,7 @@ module.exports = async (req, res, next) => {
}
//publish to redis so running processes get updated config
cache.redisPublisher.publish('config', 'TODO: put the full config object here, so no need to query db on all instances');
redisPublisher.publish('config', JSON.stringify(newSettings));
return dynamicResponse(req, res, 200, 'message', {
'title': 'Success',

@ -30,6 +30,7 @@ module.exports = {
console.log(`Redis subscribed to ${count} channels`);
});
subscriber.on("message", (channel, message) => {
console.log(`Redis subscriber message from channel ${channel}`);
const data = JSON.parse(message);
messageCallbacks[channel].forEach(cb => {
cb(data);

Loading…
Cancel
Save