@ -4,293 +4,263 @@ const { Boards, Posts, Accounts } = require(__dirname+'/../../db/')
, dynamicResponse = require ( _ _dirname + '/../../helpers/dynamic.js' )
, dynamicResponse = require ( _ _dirname + '/../../helpers/dynamic.js' )
, uploadDirectory = require ( _ _dirname + '/../../helpers/files/uploadDirectory.js' )
, uploadDirectory = require ( _ _dirname + '/../../helpers/files/uploadDirectory.js' )
, buildQueue = require ( _ _dirname + '/../../queue.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' ) ;
, { remove } = require ( 'fs-extra' ) ;
module . exports = async ( req , res , next ) => {
module . exports = async ( req , res , next ) => {
const promises = [ ] ;
const promises = [ ] ;
const oldSettings = await cache . get ( 'globalsettings' ) ;
const oldSettings = getConfig ( ) ;
const newSettings = {
const newSettings = {
//todo: holy fuck this is gonna be too much boilerplate, not like per-board settings wasnt too much already (^:
secureCookies : booleanSetting ( req . body . secure _cookies ) ,
//todo: make massive fucking template update for expanded global settings page
refererCheck : booleanSetting ( req . body . referrer _check ) ,
//idea: for permissions level and stuff, we can show the name as "Admin" and send the value as perm level number
allowedHosts : arraySetting ( req . body . allowed _hosts , oldSettings . allowedHosts ) ,
secureCookies : true ,
countryCodeHeader : trimSetting ( req . body . country _code _header , oldSettings . countryCodeHeader ) ,
refererCheck : true ,
ipHeader : trimSetting ( req . body . ip _header , oldSettings . ipHeader ) ,
allowedHosts : [ ] ,
countryCodeHeader : 'x-country-code' ,
ipHeader : 'x-real-ip' ,
meta : {
meta : {
siteName : 'fatchan' ,
siteName : trimSetting ( req . body . meta _site _name , oldSettings . meta . siteName ) ,
url : 'https://fatchan.org'
url : trimSetting ( req . body . meta _url , oldSettings . meta . url ) ,
} ,
} ,
captchaOptions : {
captchaOptions : {
type : 'grid' ,
type : trimSetting ( req . body . captcha _options _type , oldSettings . captchaOptions . type ) ,
generateLimit : 250 ,
generateLimit : trimSetting ( req . body . captcha _options _generate _limit , oldSettings . captchaOptions . generateLimit ) ,
google : {
google : {
siteKey : 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' ,
siteKey : trimSetting ( req . body . captcha _options _google _site _key , oldSettings . captchaOptions . google . siteKey ) ,
secretKey : 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
secretKey : trimSetting ( req . body . captcha _options _google _secret _key , oldSettings . captchaOptions . google . secretKey ) ,
} ,
} ,
hcaptcha : {
hcaptcha : {
siteKey : 'zzzz' ,
siteKey : trimSetting ( req . body . captcha _options _hcaptcha _site _key , oldSettings . captchaOptions . hcaptcha . siteKey ) ,
secretKey : 'xxxxxxxxxxxxxxxx'
secretKey : trimSetting ( req . body . captcha _option _hcaptcha _secret _key , oldSettings . captchaOptions . hcaptcha . secretKey ) ,
} ,
} ,
grid : {
grid : {
size : 4 ,
size : trimSetting ( req . body . captcha _options _grid _size , oldSettings . captchaOptions . grid . size ) ,
imageSize : 120 ,
imageSize : trimSetting ( req . body . captcha _options _grid _image _size , oldSettings . captchaOptions . grid . imageSize ) ,
iconYOffset : 15 ,
iconYOffset : trimSetting ( req . body . captcha _options _grid _icon _y _offset , oldSettings . captchaOptions . grid . iconYOffset ) ,
} ,
} ,
numDistorts : {
numDistorts : {
min : 2 ,
min : numberSetting ( req . body . captcha _options _num _distorts _min , oldSettings . captchaOptions . numDistorts . min ) ,
max : 3
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 : {
dnsbl : {
enabled : false ,
enabled : booleanSetting ( req . body . dnsbl _enabled ) ,
blacklists : [ 'tor.dan.me.uk' , 'zen.spamhaus.org' ] ,
blacklists : arraySetting ( req . body . dnsbl _blacklists , oldSettings . dnsbl . blacklists ) ,
cacheTime : 3600
cacheTime : numberSetting ( req . body . dnsbl _cache _time , oldSettings . dnsbl . cacheTime ) ,
} ,
} ,
disableAnonymizerFilePosting : false ,
disableAnonymizerFilePosting : booleanSetting ( req . body . disable _anonymizer _file _software , oldSettings . disableAnonymizerFilePosting ) ,
statsCountAnonymizers : true ,
statsCountAnonymizers : booleanSetting ( req . body . stats _count _anonymizers , oldSettings . statsCountAnonymizers ) ,
floodTimers : {
floodTimers : {
sameContentSameIp : 120000 ,
sameContentSameIp : numberSetting ( req . body . flood _timers _same _content _same _ip , oldSettings . floodTimers . sameContentSameIp ) ,
sameContentAnyIp : 30000 ,
sameContentAnyIp : numberSetting ( req . body . flood _timers _same _content _any _ip , oldSettings . floodTimers . sameContentAnyIp ) ,
anyContentSameIp : 5000 ,
anyContentSameIp : numberSetting ( req . body . flood _timers _any _content _same _ip , oldSettings . floodTimers . anyContentSameIp ) ,
} ,
} ,
blockBypass : {
blockBypass : {
enabled : true ,
enabled : booleanSetting ( req . body . block _bypass _enabled , oldSettings . blockBypass . enabled ) ,
forceAnonymizers : true ,
forceAnonymizers : booleanSetting ( req . body . block _bypass _force _anonymizers , oldSettings . blockBypass . forceAnonymizers ) ,
expireAfterUses : 50 ,
expireAfterUses : numberSetting ( req . body . block _bypass _expire _after _uses , oldSettings . blockBypass . expireAfterUses ) ,
expireAfterTime : 86400000 ,
expireAfterTime : numberSetting ( req . body . block _bypass _expire _after _time , oldSettings . blockBypass . expireAfterTime ) ,
bypassDnsbl : false ,
bypassDnsbl : booleanSetting ( req . body . block _bypass _bypass _dnsbl , oldSettings . blockBypass . bypassDnsbl ) ,
} ,
} ,
ipHashPermLevel : 0 ,
ipHashPermLevel : numberSetting ( req . body . ip _hash _perm _level , oldSettings . ipHashPermLevel ) ,
deleteBoardPermLevel : 2 ,
deleteBoardPermLevel : numberSetting ( req . body . delete _board _perm _level , oldSettings . deleteBoardPermLevel ) ,
pruneImmediately : true ,
pruneImmediately : booleanSetting ( req . body . prune _immediately , oldSettings . pruneImmediately ) ,
hashImages : false ,
hashImages : booleanSetting ( req . body . hash _images , oldSettings . hashImages ) ,
rateLimitCost : {
rateLimitCost : {
captcha : 11 ,
captcha : numberSetting ( req . body . rate _limit _cost _captcha , oldSettings . rateLimitCost . captcha ) ,
boardSettings : 30 ,
boardSettings : numberSetting ( req . body . rate _limit _cost _board _settings , oldSettings . rateLimitCost . boardSettings ) ,
editPost : 30 ,
editPost : numberSetting ( req . body . rate _limit _cost _edit _post , oldSettings . rateLimitCost . editPost ) ,
} ,
} ,
overboardLimit : 20 ,
overboardLimit : numberSetting ( req . body . overboard _limit , oldSettings . overboardLimit ) ,
overboardCatalogLimit : 50 ,
overboardCatalogLimit : numberSetting ( req . body . overboard _catalog _limit , oldSettings . overboardCatalogLimit ) ,
cacheTemplates : true ,
cacheTemplates : booleanSetting ( req . body . cache _templates , oldSettings . cacheTemplates ) ,
debugLogs : true ,
debugLogs : booleanSetting ( req . body . debug _logs , oldSettings . debugLogs ) ,
lockWait : 3000 ,
lockWait : numberSetting ( req . body . lock _wait , oldSettings . lockWait ) ,
pruneModlogs : 30 ,
pruneModlogs : numberSetting ( req . body . prune _modlogs , oldSettings . pruneModlogs ) ,
pruneIps : false ,
pruneIps : booleanSetting ( req . body . prune _ips , oldSettings . pruneIps ) ,
enableWebring : true ,
enableWebring : booleanSetting ( req . body . enable _webring , oldSettings . enableWebring ) ,
enableUserBoardCreation : false ,
enableUserBoardCreation : booleanSetting ( req . body . enable _user _board _creation , oldSettings . enableUserBoardCreation ) ,
enableUserAccountCreation : true ,
enableUserAccountCreation : booleanSetting ( req . body . enable _user _account _creation , oldSettings . enableUserAccountCreation ) ,
thumbExtension : '.jpg' ,
thumbExtension : trimSetting ( req . body . thumb _extension , oldSettings . thumbExtension ) ,
animatedGifThumbnails : false ,
animatedGifThumbnails : booleanSetting ( req . body . animated _gif _thumbnails , oldSettings . animatedGifThumbnails ) ,
audioThumbnails : true ,
audioThumbnails : booleanSetting ( req . body . audio _thumbnails , oldSettings . audioThumbnails ) ,
ffmpegGifThumbnails : true ,
ffmpegGifThumbnails : booleanSetting ( req . body . ffmpeg _gif _thumbnails , oldSettings . ffmpegGifThumbnails ) ,
thumbSize : 250 ,
thumbSize : numberSetting ( req . body . thumb _size , oldSettings . thumbSize ) ,
videoThumbPercentage : 5 ,
videoThumbPercentage : numberSetting ( req . body . video _thumb _percentage , oldSettings . videoThumbPercentage ) ,
otherMimeTypes : [
otherMimeTypes : arraySetting ( req . body . other _mime _types , oldSettings . otherMimeTypes ) ,
'text/plain' ,
checkRealMimeTypes : booleanSetting ( req . body . check _real _mime _types , oldSettings . checkRealMimeTypes ) ,
'application/pdf' ,
allowMimeNoMatch : booleanSetting ( req . body . allow _mime _no _match , oldSettings . allowMimeNoMatch ) ,
'application/x-sid' ,
defaultBanDuration : numberSetting ( req . body . default _ban _duration , oldSettings . defaultBanDuration ) ,
] ,
quoteLimit : numberSetting ( req . body . quote _limit , oldSettings . quoteLimit ) ,
checkRealMimeTypes : false ,
strictFiltering : booleanSetting ( req . body . strict _filtering , oldSettings . strictFiltering ) ,
allowMimeNoMatch : false ,
previewReplies : numberSetting ( req . body . preview _replies , oldSettings . previewReplies ) ,
defaultBanDuration : 31536000000 ,
stickyPreviewReplies : numberSetting ( req . body . sticky _preview _replies , oldSettings . stickyPreviewReplies ) ,
quoteLimit : 25 ,
early404Fraction : numberSetting ( req . body . early _404 _fraction , oldSettings . early404Fraction ) ,
strictFiltering : true ,
early404Replies : numberSetting ( req . body . early _404 _replies , oldSettings . early404Replies ) ,
previewReplies : 5 ,
maxRecentNews : numberSetting ( req . body . max _recent _news , oldSettings . maxRecentNews ) ,
stickyPreviewReplies : 5 ,
filterFileNames : booleanSetting ( req . body . filter _file _names , oldSettings . filterFileNames ) ,
early404Fraction : 3 ,
spaceFileNameReplacement : trimSetting ( req . body . space _file _name _replacement , oldSettings . spaceFileNameReplacement ) ,
early404Replies : 5 ,
maxRecentNews : 5 ,
filterFileNames : false ,
spaceFileNameReplacement : '_' ,
highlightOptions : {
highlightOptions : {
languageSubset : [
languageSubset : arraySetting ( req . body . highlight _options _language _subset , oldSettings . highlightOptions . languageSubset ) ,
'javascript' ,
threshold : numberSetting ( req . body . highlight _options _threshold , oldSettings . highlightOptions . threshold ) ,
'typescript' ,
'perl' ,
'js' ,
'c++' ,
'c' ,
'java' ,
'kotlin' ,
'php' ,
'h' ,
'csharp' ,
'bash' ,
'sh' ,
'zsh' ,
'python' ,
'ruby' ,
'css' ,
'html' ,
'json' ,
'golang' ,
'rust'
] ,
threshold : 5
} ,
} ,
themes : [ ] ,
themes : arraySetting ( req . body . themes , oldSettings . themes ) ,
codeThemes : [ ] ,
codeThemes : arraySetting ( req . body . code _themes , oldSettings . codeThemes ) ,
globalLimits : {
globalLimits : {
threadLimit : {
threadLimit : {
min : 10 ,
min : numberSetting ( req . body . global _limits _thread _limit _min , oldSettings . globalLimits . threadLimit . min ) ,
max : 200
max : numberSetting ( req . body . global _limits _thread _limit _max , oldSettings . globalLimits . threadLimit . max ) ,
} ,
} ,
replyLimit : {
replyLimit : {
min : 10 ,
min : numberSetting ( req . body . global _limits _reply _limit _min , oldSettings . globalLimits . replyLimit . min ) ,
max : 1000
max : numberSetting ( req . body . global _limits _reply _limit _max , oldSettings . globalLimits . replyLimit . max ) ,
} ,
} ,
bumpLimit : {
bumpLimit : {
min : 10 ,
min : numberSetting ( req . body . global _limits _bump _limit _min , oldSettings . globalLimits . bumpLimit . min ) ,
max : 1000
max : numberSetting ( req . body . global _limits _bump _limit _max , oldSettings . globalLimits . bumpLimit . max ) ,
} ,
} ,
postFiles : {
postFiles : {
max : 5
max : numberSetting ( req . body . global _limits _post _files _max , oldSettings . globalLimits . postFiles . max ) ,
} ,
} ,
postFilesSize : {
postFilesSize : {
max : 21023948
max : numberSetting ( req . body . global _limits _post _files _size _max , oldSettings . globalLimits . postFilesSize . max ) ,
} ,
} ,
bannerFiles : {
bannerFiles : {
width : 600 ,
width : numberSetting ( req . body . global _limits _banner _files _width , oldSettings . globalLimits . bannerFiles . width ) ,
height : 600 ,
height : numberSetting ( req . body . global _limits _banner _files _height , oldSettings . globalLimits . bannerFiles . height ) ,
forceAspectRatio : false ,
max : numberSetting ( req . body . global _limits _banner _files _max , oldSettings . globalLimits . bannerFiles . max ) ,
max : 10 ,
total : numberSetting ( req . body . global _limits _banner _files _total , oldSettings . globalLimits . bannerFiles . total ) ,
total : 100 ,
forceAspectRatio : booleanSetting ( req . body . global _limits _banner _files _force _aspect _ratio , oldSettings . globalLimits . bannerFiles . forceAspectRatio ) ,
} ,
} ,
bannerFilesSize : {
bannerFilesSize : {
max : 10485760
max : numberSetting ( req . body . global _limits _banner _files _size _max , oldSettings . globalLimits . bannerFilesSize . max ) ,
} ,
} ,
fieldLength : {
fieldLength : {
name : 100 ,
name : numberSetting ( req . body . global _limits _field _length _name , oldSettings . globalLimits . fieldLength . name ) ,
email : 100 ,
email : numberSetting ( req . body . global _limits _field _length _email , oldSettings . globalLimits . fieldLength . email ) ,
subject : 100 ,
subject : numberSetting ( req . body . global _limits _field _length _subject , oldSettings . globalLimits . fieldLength . subject ) ,
postpassword : 100 ,
postpassword : numberSetting ( req . body . global _limits _field _length _postpassword , oldSettings . globalLimits . fieldLength . postpassword ) ,
message : 20000 ,
message : numberSetting ( req . body . global _limits _field _length _message , oldSettings . globalLimits . fieldLength . message ) ,
report _reason : 100 ,
report _reason : numberSetting ( req . body . global _limits _field _length _report _reason , oldSettings . globalLimits . fieldLength . report _reason ) ,
ban _reason : 100 ,
ban _reason : numberSetting ( req . body . global _limits _field _length _ban _reason , oldSettings . globalLimits . fieldLength . ban _reason ) ,
log _message : 100 ,
log _message : numberSetting ( req . body . global _limits _field _length _log _message , oldSettings . globalLimits . fieldLength . log _message ) ,
uri : 50 ,
uri : numberSetting ( req . body . global _limits _field _length _uri , oldSettings . globalLimits . fieldLength . uri ) ,
boardname : 50 ,
boardname : numberSetting ( req . body . global _limits _field _length _boardname , oldSettings . globalLimits . fieldLength . boardname ) ,
description : 100 ,
description : numberSetting ( req . body . global _limits _field _length _description , oldSettings . globalLimits . fieldLength . description ) ,
} ,
} ,
multiInputs : {
multiInputs : {
posts : {
posts : {
anon : 20 ,
anon : numberSetting ( req . body . global _limits _multi _input _posts _anon , oldSettings . globalLimits . multiInputs . posts . anon ) ,
staff : 100 ,
staff : numberSetting ( req . body . global _limits _multi _input _posts _staff , oldSettings . globalLimits . multiInputs . posts . staff ) ,
} ,
} ,
} ,
} ,
customCss : {
customCss : {
enabled : true ,
enabled : booleanSetting ( req . body . global _limits _custom _css _enabled , oldSettings . globalLimits . customCss . enabled ) ,
max : 10000 ,
max : numberSetting ( req . body . global _limits _custom _css _max , oldSettings . globalLimits . customCss . max ) ,
strict : true ,
strict : booleanSetting ( req . body . global _limits _custom _css _strict , oldSettings . globalLimits . customCss . strict ) ,
filters : [
filters : arraySetting ( req . body . global _limits _custom _css _filters , oldSettings . globalLimits . customCss . filters ) ,
'@' ,
'url(' ,
]
} ,
} ,
customPages : {
customPages : {
max : 5 ,
max : numberSetting ( req . body . global _limits _custom _pages _max , oldSettings . globalLimits . customPages . max ) ,
maxLength : 10000 ,
maxLength : numberSetting ( req . body . global _limits _custom _pages _max _length , oldSettings . globalLimits . customPages . maxLength ) ,
}
}
} ,
} ,
frontendScriptDefault : {
frontendScriptDefault : {
embedsEnabled : true ,
embedsEnabled : booleanSetting ( req . body . frontend _script _default _embeds _enabled , oldSettings . frontendScriptDefault . embedsEnabled ) ,
heightUnlimit : false ,
heightUnlimit : booleanSetting ( req . body . frontend _script _default _height _unlimit , oldSettings . frontendScriptDefault . heightUnlimit ) ,
hideRecursive : true ,
hideRecursive : booleanSetting ( req . body . frontend _script _default _hide _recursive , oldSettings . frontendScriptDefault . hideRecursive ) ,
crispImages : false ,
crispImages : booleanSetting ( req . body . frontend _script _default _crisp _images , oldSettings . frontendScriptDefault . crispImages ) ,
hideThumbnails : false ,
hideThumbnails : booleanSetting ( req . body . frontend _script _default _hide _thumbnails , oldSettings . frontendScriptDefault . hideThumbnails ) ,
nonColorIds : false ,
nonColorIds : booleanSetting ( req . body . frontend _script _default _non _color _ids , oldSettings . frontendScriptDefault . nonColorIds ) ,
alwaysShowSpoilers : false ,
alwaysShowSpoilers : booleanSetting ( req . body . frontend _script _default _always _show _spoilers , oldSettings . frontendScriptDefault . alwaysShowSpoilers ) ,
hidePostStubs : false ,
hidePostStubs : booleanSetting ( req . body . frontend _script _default _hide _post _stubs , oldSettings . frontendScriptDefault . hidePostStubs ) ,
smoothScrolling : true ,
smoothScrolling : booleanSetting ( req . body . frontend _script _default _smooth _scrolling , oldSettings . frontendScriptDefault . smoothScrolling ) ,
defaultVolume : 100 ,
defaultVolume : numberSetting ( req . body . frontend _script _default _volume , oldSettings . frontendScriptDefault . defaultVolume ) ,
loop : true ,
loop : booleanSetting ( req . body . frontend _script _default _loop , oldSettings . frontendScriptDefault . loop ) ,
imageLoadingBars : true ,
imageLoadingBars : booleanSetting ( req . body . frontend _script _default _image _loading _bars , oldSettings . frontendScriptDefault . imageLoadingBars ) ,
live : true ,
live : booleanSetting ( req . body . frontend _script _default _live , oldSettings . frontendScriptDefault . live ) ,
scrollToPosts : false ,
scrollToPosts : booleanSetting ( req . body . frontend _script _default _scroll _to _posts , oldSettings . frontendScriptDefault . scrollToPosts ) ,
localTime : true ,
localTime : booleanSetting ( req . body . frontend _script _default _local _time , oldSettings . frontendScriptDefault . localTime ) ,
hour24Time : false ,
hour24Time : booleanSetting ( req . body . frontend _script _default _hour _24 _time , oldSettings . frontendScriptDefault . hour24Time ) ,
relativeTime : true ,
relativeTime : booleanSetting ( req . body . frontend _script _default _relative _time , oldSettings . frontendScriptDefault . relativeTime ) ,
notificationsEnabled : false ,
notificationsEnabled : booleanSetting ( req . body . frontend _script _default _notifications _embed , oldSettings . frontendScriptDefault . notificationsEnabled ) ,
notificationsYousOnly : true ,
notificationsYousOnly : booleanSetting ( req . body . frontend _script _default _notifications _yous _only , oldSettings . frontendScriptDefault . notificationsYousOnly ) ,
showYous : true ,
showYous : booleanSetting ( req . body . frontend _script _default _show _yous , oldSettings . frontendScriptDefault . showYous ) ,
} ,
} ,
boardDefaults : {
boardDefaults : {
theme : 'clear' ,
theme : trimSetting ( req . body . board _defaults _theme , oldSettings . boardDefaults . theme ) ,
codeTheme : 'ir-black' ,
codeTheme : trimSetting ( req . body . board _defaults _code _theme , oldSettings . boardDefaults . codeTheme ) ,
sfw : false ,
sfw : booleanSetting ( req . body . board _defaults _sfw , oldSettings . boardDefaults . sfw ) ,
lockMode : 0 ,
lockMode : numberSetting ( req . body . board _defaults _lock _mode , oldSettings . boardDefaults . lockMode ) ,
fileR9KMode : 0 ,
fileR9KMode : numberSetting ( req . body . board _defaults _file _r9k _mode , oldSettings . boardDefaults . fileR9KMode ) ,
messageR9KMode : 0 ,
messageR9KMode : numberSetting ( req . body . board _defaults _message _r9k _mode , oldSettings . boardDefaults . messageR9KMode ) ,
unlistedLocal : false ,
unlistedLocal : booleanSetting ( req . body . board _defaults _unlisted _local , oldSettings . boardDefaults . unlistedLocal ) ,
unlistedWebring : false ,
unlistedWebring : booleanSetting ( req . body . board _defaults _unlisted _webring , oldSettings . boardDefaults . unlistedWebring ) ,
captchaMode : 0 ,
captchaMode : numberSetting ( req . body . board _defaults _captcha _mode , oldSettings . boardDefaults . captchaMode ) ,
tphTrigger : 10 ,
tphTrigger : numberSetting ( req . body . board _defaults _tph _trigger , oldSettings . boardDefaults . tphTrigger ) ,
pphTrigger : 50 ,
pphTrigger : numberSetting ( req . body . board _defaults _pph _trigger , oldSettings . boardDefaults . pphTrigger ) ,
tphTriggerAction : 1 ,
tphTriggerAction : numberSetting ( req . body . board _defaults _tph _trigger _action , oldSettings . boardDefaults . tphTriggerAction ) ,
pphTriggerAction : 2 ,
pphTriggerAction : numberSetting ( req . body . board _defaults _pph _trigger _action , oldSettings . boardDefaults . pphTriggerAction ) ,
captchaReset : 0 ,
captchaReset : numberSetting ( req . body . board _defaults _captcha _reset , oldSettings . boardDefaults . captchaReset ) ,
lockReset : 0 ,
lockReset : numberSetting ( req . body . board _defaults _lock _reset , oldSettings . boardDefaults . lockReset ) ,
forceAnon : false ,
forceAnon : booleanSetting ( req . body . board _defaults _force _anon , oldSettings . boardDefaults . forceAnon ) ,
sageOnlyEmail : false ,
sageOnlyEmail : booleanSetting ( req . body . board _defaults _sage _only _email , oldSettings . boardDefaults . sageOnlyEmail ) ,
early404 : true ,
early404 : booleanSetting ( req . body . board _defaults _early _404 , oldSettings . boardDefaults . early404 ) ,
ids : false ,
ids : booleanSetting ( req . body . board _defaults _ids , oldSettings . boardDefaults . ids ) ,
flags : false ,
flags : booleanSetting ( req . body . board _defaults _flags , oldSettings . boardDefaults . flags ) ,
userPostDelete : true ,
userPostDelete : booleanSetting ( req . body . board _defaults _user _post _delete , oldSettings . boardDefaults . userPostDelete ) ,
userPostSpoiler : true ,
userPostSpoiler : booleanSetting ( req . body . board _defaults _user _post _spoiler , oldSettings . boardDefaults . userPostSpoiler ) ,
userPostUnlink : true ,
userPostUnlink : booleanSetting ( req . body . board _defaults _user _post _unlink , oldSe ttings . boa rdDefa ults . us erPostUnlink ) ,
threadLimit : 200 ,
threadLimit : numberSetting ( req . body . board _defaults _thread _limit , oldSettings . boardDefaults . threadLimit ) ,
replyLimit : 700 ,
replyLimit : numberSetting ( req . body . board _defaults _reply _limit , oldSettings . boardDefaults . replyLimit ) ,
bumpLimit : 500 ,
bumpLimit : numberSetting ( req . body . board _defaults _bump _limit , oldSettings . boardDefaults . bumpLimit ) ,
maxFiles : 5 ,
maxFiles : numberSetting ( req . body . board _defaults _max _files , oldSettings . boardDefaults . maxFiles ) ,
forceReplyMessage : false ,
forceReplyMessage : booleanSetting ( req . body . board _defaults _force _reply _message , oldSettings . boardDefaults . forceReplyMessage ) ,
forceReplyFile : false ,
forceReplyFile : booleanSetting ( req . body . board _defaults _force _reply _file , oldSettings . boardDefaults . forceReplyFile ) ,
forceThreadMessage : false ,
forceThreadMessage : booleanSetting ( req . body . board _defaults _force _thread _message , oldSettings . boardDefaults . forceThreadMessage ) ,
forceThreadFile : false ,
forceThreadFile : booleanSetting ( req . body . board _defaults _force _thread _file , oldSettings . boardDefaults . forceThreadFile ) ,
forceThreadSubject : false ,
forceThreadSubject : booleanSetting ( req . body . board _defaults _force _thread _subject , oldSettings . boardDefaults . forceThreadSubject ) ,
disableReplySubject : false ,
disableReplySubject : booleanSetting ( req . body . board _defaults _disable _reply _subject , oldSettings . boardDefaults . disableReplySubject ) ,
minThreadMessageLength : 0 ,
minThreadMessageLength : numberSetting ( req . body . board _defaults _min _thread _message _length , oldSettings . boardDefaults . minThreadMessageLength ) ,
minReplyMessageLength : 0 ,
minReplyMessageLength : numberSetting ( req . body . board _defaults _min _reply _message _length , oldSettings . boardDefaults . minReplyMessageLength ) ,
maxThreadMessageLength : 20000 ,
maxThreadMessageLength : numberSetting ( req . body . board _defaults _max _thread _message _length , oldSettings . boardDefaults . maxThreadMessageLength ) ,
maxReplyMessageLength : 20000 ,
maxReplyMessageLength : numberSetting ( req . body . board _defaults _max _reply _message _length , oldSettings . boardDefaults . maxReplyMessageLength ) ,
defaultName : 'Anon' ,
defaultName : trimSetting ( req . body . board _defaults _default _name , oldSettings . boardDefaults . defaultName ) ,
customCSS : null ,
customCSS : null ,
blockedCountries : [ ] ,
blockedCountries : [ ] ,
disableAnonymizerFilePosting : false ,
disableAnonymizerFilePosting : booleanSetting ( req . body . board _defaults _disable _anonymizer _file _posting , oldSettings . boardDefaults . disableAnonymizerFilePosting ) ,
filters : [ ] ,
filters : arraySetting ( req . body . board _defaults _filters , oldSettings . boardDefaults . filters ) ,
filterMode : 0 ,
filterMode : numberSetting ( req . body . board _defaults _filter _mode , oldSettings . boardDefaults . filterMode ) ,
filterBanDuration : 0 ,
filterBanDuration : numberSetting ( req . body . board _defaults _filter _ban _duration , oldSettings . boardDefaults . filterBanDuration ) ,
strictFiltering : false ,
strictFiltering : booleanSetting ( req . body . board _defaults _strict _filtering , oldSettings . boardDefaults . strictFiltering ) ,
announcement : {
announcement : {
raw : null ,
raw : null ,
markdown : null
markdown : null
} ,
} ,
allowedFileTypes : {
allowedFileTypes : {
animatedImage : true ,
animatedImage : booleanSetting ( req . body . board _defaults _allowed _file _types _animated _image , oldSettings . boardDefaults . allowedFileTypes . animatedImage ) ,
image : true ,
image : booleanSetting ( req . body . board _defaults _allowed _file _types _image , oldSettings . boardDefaults . allowedFileTypes . image ) ,
video : true ,
video : booleanSetting ( req . body . board _defaults _allowed _file _types _video , oldSettings . boardDefaults . allowedFileTypes . video ) ,
audio : true ,
audio : booleanSetting ( req . body . board _defaults _allowed _file _types _audio , oldSettings . boardDefaults . allowedFileTypes . audio ) ,
other : false
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 ,
filters : arraySetting ( req . body . filters , oldSettings . filters ) ,
'filterMode' : typeof req . body . filter _mode === 'number' && req . body . filter _mode !== oldSettings . filterMode ? req . body . filter _mode : oldSettings . filterMode ,
filterMode : numberSetting ( 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 ,
filterBanDuration : numberSetting ( req . body . ban _duration , oldSettings . filterBanDuration ) ,
} ;
} ;
cache . set ( 'globalsettings' , newSettings ) ;
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
let rebuildThreads = false
, rebuildBoard = false
, rebuildBoard = false
, rebuildCatalog = 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 ) {
if ( newSettings . captchaMode > oldSettings . captchaMode ) {
rebuildBoard = true ;
rebuildBoard = true ;
rebuildCatalog = true ;
rebuildCatalog = true ;
@ -331,7 +301,7 @@ module.exports = async (req, res, next) => {
}
}
//publish to redis so running processes get updated config
//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' , {
return dynamicResponse ( req , res , 200 , 'message' , {
'title' : 'Success' ,
'title' : 'Success' ,