diff --git a/helpers/paramconverter.js b/helpers/paramconverter.js index 89d312e1..8160d63b 100644 --- a/helpers/paramconverter.js +++ b/helpers/paramconverter.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 = /^(?[\d]+y)?(?[\d]+mo)?(?[\d]+w)?(?[\d]+d)?(?[\d]+h)?(?[\d]+m)?(?[\d]+s)?$/ , timeUtils = require(__dirname+'/timeutils.js') , makeArrayIfSingle = (obj) => !Array.isArray(obj) ? [obj] : obj; diff --git a/helpers/setting.js b/helpers/setting.js new file mode 100644 index 00000000..0d8697d8 --- /dev/null +++ b/helpers/setting.js @@ -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; + } +}; diff --git a/models/forms/changeboardsettings.js b/models/forms/changeboardsettings.js index dae3f116..644218e2 100644 --- a/models/forms/changeboardsettings.js +++ b/models/forms/changeboardsettings.js @@ -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) => { diff --git a/models/forms/changeglobalsettings.js b/models/forms/changeglobalsettings.js index 4989beea..02b0be4e 100644 --- a/models/forms/changeglobalsettings.js +++ b/models/forms/changeglobalsettings.js @@ -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', diff --git a/redis.js b/redis.js index 17a7e520..5a0ef848 100644 --- a/redis.js +++ b/redis.js @@ -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);