diff --git a/CHANGELOG.md b/CHANGELOG.md index 39aabb1b..af702933 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### 0.4.0 + - Hashed IPs now use an irc-style "cloaking". + ### 0.3.3 - Minor bugfix to filenames of expanded images being incorrectly truncated in some circumstances, when "image loading bars" is enabled. diff --git a/controllers/forms/boardsettings.js b/controllers/forms/boardsettings.js index 6cf8566b..0c311e4f 100644 --- a/controllers/forms/boardsettings.js +++ b/controllers/forms/boardsettings.js @@ -85,7 +85,7 @@ module.exports = { if (res.locals.permLevel > 1) { //if not global staff or above const ratelimitBoard = await Ratelimits.incrmentQuota(req.params.board, 'settings', rateLimitCost.boardSettings); //2 changes a minute - const ratelimitIp = res.locals.anonymizer ? 0 : (await Ratelimits.incrmentQuota(res.locals.ip.single, 'settings', rateLimitCost.boardSettings)); + const ratelimitIp = res.locals.anonymizer ? 0 : (await Ratelimits.incrmentQuota(res.locals.ip.cloak, 'settings', rateLimitCost.boardSettings)); if (ratelimitBoard > 100 || ratelimitIp > 100) { return dynamicResponse(req, res, 429, 'message', { 'title': 'Ratelimited', diff --git a/controllers/forms/editpost.js b/controllers/forms/editpost.js index e64d3205..9df1762f 100644 --- a/controllers/forms/editpost.js +++ b/controllers/forms/editpost.js @@ -43,7 +43,7 @@ module.exports = { if (res.locals.permLevel > 1) { //if not global staff or above const ratelimitUser = await Ratelimits.incrmentQuota(req.session.user, 'edit', rateLimitCost.editPost); - const ratelimitIp = res.locals.anonymizer ? 0 : (await Ratelimits.incrmentQuota(res.locals.ip.single, 'edit', rateLimitCost.editPost)); + const ratelimitIp = res.locals.anonymizer ? 0 : (await Ratelimits.incrmentQuota(res.locals.ip.cloak, 'edit', rateLimitCost.editPost)); if (ratelimitUser > 100 || ratelimitIp > 100) { return dynamicResponse(req, res, 429, 'message', { 'title': 'Ratelimited', diff --git a/db/bans.js b/db/bans.js index 94e30862..311e3977 100644 --- a/db/bans.js +++ b/db/bans.js @@ -10,15 +10,19 @@ module.exports = { find: (ip, board) => { let ipQuery; - if (typeof ip === 'object') { //object with hash and ranges in bancheck + if (typeof ip === 'object') { ipQuery = { - '$in': [ip.single, ip.qrange, ip.hrange] //gets single and range ban in 1 query + '$in': [ + ip.cloak, //full ip + ip.cloak.split('.').slice(0,2).join('.'), //qrange + ip.cloak.split('.').slice(0,1).join('.'), //hrange + ], } } else { ipQuery = ip; } return db.find({ - 'ip.single': ipQuery, + 'ip.cloak': ipQuery, 'board': { '$in': [board, null] } @@ -42,7 +46,7 @@ module.exports = { '_id': { '$in': ids }, - 'ip.single': ip, + 'ip.cloak': ip, 'allowAppeal': true, 'appeal': null }, { diff --git a/db/posts.js b/db/posts.js index 0adc0275..e994bfe8 100644 --- a/db/posts.js +++ b/db/posts.js @@ -1,6 +1,7 @@ 'use strict'; const Mongo = require(__dirname+'/db.js') + , { isIP } = require('net') , Boards = require(__dirname+'/boards.js') , Stats = require(__dirname+'/stats.js') , db = Mongo.db.collection('posts') @@ -35,10 +36,12 @@ module.exports = { } else { projection['globalreports'] = 0; } - if (ip instanceof RegExp) { - query['ip.single'] = ip; - } else if (typeof ip === 'string') { - query['ip.raw'] = ip; + if (ip != null) { + if (isIP(ip)) { + query['ip.raw'] = ip; + } else { + query['ip.cloak'] = ip; + } } if (permLevel > config.get.ipHashPermLevel) { projection['ip.raw'] = 0; @@ -54,21 +57,6 @@ module.exports = { }).sort({ '_id': -1 }).skip(offset).limit(limit).toArray(); - posts.forEach(p => { - //kill me - p.ip.single = p.ip.single.slice(-10); - p.ip.qrange = p.ip.qrange.slice(-10); - p.ip.hrange = p.ip.hrange.slice(-10); - if (board) { - p.reports.forEach(r => { - r.ip.single = r.ip.single.slice(-10); - }); - } else { - p.globalreports.forEach(r => { - r.ip.single = r.ip.single.slice(-10); - }); - } - }); return posts; }, @@ -479,7 +467,7 @@ module.exports = { //insert the post itself const postMongoId = await db.insertOne(data).then(result => result.insertedId); //_id of post - const statsIp = (config.get.statsCountAnonymizers === false && res.locals.anonymizer === true) ? null : data.ip.single; + const statsIp = (config.get.statsCountAnonymizers === false && res.locals.anonymizer === true) ? null : data.ip.cloak; await Stats.updateOne(board._id, statsIp, data.thread == null); //add backlinks to the posts this post quotes @@ -545,14 +533,6 @@ module.exports = { }, 'board': board }, { projection }).toArray(); - posts.forEach(p => { - p.ip.single = p.ip.single.slice(-10); - p.ip.qrange = p.ip.qrange.slice(-10); - p.ip.hrange = p.ip.hrange.slice(-10); - p.reports.forEach(r => { - r.ip.single = r.ip.single.slice(-10); - }); - }); return posts; }, @@ -571,26 +551,20 @@ module.exports = { '$exists': true } } - if (ip instanceof RegExp) { - query['$or'] = [ - { 'ip.single': ip }, - { 'globalreports.ip.single': ip } - ]; - } else if (typeof ip === 'string') { - query['$or'] = [ - { 'ip.raw': ip }, - { 'globalreports.ip.raw': ip } - ]; + if (ip != null) { + if (isIP(ip)) { + query['$or'] = [ + { 'ip.raw': ip }, + { 'globalreports.ip.raw': ip } + ]; + } else { + query['$or'] = [ + { 'ip.cloak': ip }, + { 'globalreports.ip.cloak': ip } + ]; + } } const posts = await db.find(query, { projection }).skip(offset).limit(limit).toArray(); - posts.forEach(p => { - p.ip.single = p.ip.single.slice(-10); - p.ip.qrange = p.ip.qrange.slice(-10); - p.ip.hrange = p.ip.hrange.slice(-10); - p.globalreports.forEach(r => { - r.ip.single = r.ip.single.slice(-10); - }); - }); return posts; }, diff --git a/gulpfile.js b/gulpfile.js index 6c85a8c8..4a8e1b5d 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -192,7 +192,7 @@ async function wipe() { await CustomPages.db.createIndex({ 'board': 1, 'page': 1 }, { unique: true }) await Modlogs.db.createIndex({ 'board': 1 }) await Files.db.createIndex({ 'count': 1 }) - await Bans.db.createIndex({ 'ip.single': 1 , 'board': 1 }) + await Bans.db.createIndex({ 'ip.cloak': 1 , 'board': 1 }) await Bans.db.createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 0 }) //custom expiry, i.e. it will expire when current date > than this date await Bypass.db.createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 0 }) await Captchas.db.createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 300 }) //captchas valid for 5 minutes diff --git a/helpers/captcha/verify.js b/helpers/captcha/verify.js index a59ecdd7..7418fe03 100644 --- a/helpers/captcha/verify.js +++ b/helpers/captcha/verify.js @@ -50,7 +50,7 @@ module.exports = async (req, res, next) => { //for builtin captchas, clear captchaid cookie, delete file and reset quota res.clearCookie('captchaid'); await Promise.all([ - !res.locals.anonymizer && Ratelimits.resetQuota(res.locals.ip.single, 'captcha'), + !res.locals.anonymizer && Ratelimits.resetQuota(res.locals.ip.cloak, 'captcha'), remove(`${uploadDirectory}/captcha/${captchaId}.jpg`) ]); } diff --git a/helpers/checks/spamcheck.js b/helpers/checks/spamcheck.js index 5086c4f8..2f0e77cc 100644 --- a/helpers/checks/spamcheck.js +++ b/helpers/checks/spamcheck.js @@ -57,7 +57,7 @@ module.exports = async (req, res) => { '_id': { '$gt': sameContentSameIpMongoId }, - 'ip.single': res.locals.ip.single, + 'ip.cloak': res.locals.ip.cloak, '$or': contentOr }); } @@ -69,7 +69,7 @@ module.exports = async (req, res) => { '_id': { '$gt': anyContentSameIpMongoId }, - 'ip.single': res.locals.ip.single + 'ip.cloak': res.locals.ip.cloak }) } diff --git a/helpers/decodequeryip.js b/helpers/decodequeryip.js index 38431767..1a067a8c 100644 --- a/helpers/decodequeryip.js +++ b/helpers/decodequeryip.js @@ -8,10 +8,9 @@ module.exports = (query, permLevel) => { const { ipHashPermLevel } = config.get; if (query.ip && typeof query.ip === 'string') { const decoded = decodeURIComponent(query.ip); - if (permLevel <= ipHashPermLevel && (isIP(decoded) || decoded.match(/[a-z0-9]{24}/i))) { //if perms to view raw ip or bypass, allow querying + if (permLevel <= ipHashPermLevel || !isIP(decoded)) { + //if they have perm to view raw IP, or its NOT a raw ip, return return decoded; - } else if (decoded.length === 10) { //otherwise, only allow last 10 char substring - return new RegExp(`${escapeRegExp(decoded)}$`); } } return null; //else, no ip filter diff --git a/helpers/processip.js b/helpers/processip.js index 994649eb..d46d21df 100644 --- a/helpers/processip.js +++ b/helpers/processip.js @@ -12,10 +12,8 @@ module.exports = (req, res, next) => { if (res.locals.anonymizer) { const pseudoIp = res.locals.preFetchedBypassId || req.signedCookies.bypassid; res.locals.ip = { - raw: pseudoIp, - single: pseudoIp, - qrange: pseudoIp, - hrange: pseudoIp, + raw: `${pseudoIp}.BP`, + cloak: `${pseudoIp}.BP`, }; return next(); } @@ -31,8 +29,8 @@ module.exports = (req, res, next) => { zeroElide: false, zeroPad: false, }); - let qrange = '' - , hrange = ''; + let qrange + , hrange; if (ipKind === 'ipv4') { qrange = createCIDR(ipStr, 24).toString(); hrange = createCIDR(ipStr, 16).toString(); @@ -40,11 +38,10 @@ module.exports = (req, res, next) => { qrange = createCIDR(ipStr, 64).toString(); hrange = createCIDR(ipStr, 48).toString(); } + const cloak = `${hashIp(hrange).substring(0,8)}.${hashIp(qrange).substring(0,7)}.${hashIp(ipStr).substring(0,7)}.IP`; res.locals.ip = { - raw: ipHashPermLevel === -1 ? hashIp(ipStr) : ipStr, - single: hashIp(ipStr), - qrange: hashIp(qrange), - hrange: hashIp(hrange), + raw: ipHashPermLevel === -1 ? cloak : ipStr, + cloak, } next(); } catch(e) { diff --git a/migrations/0.4.0.js b/migrations/0.4.0.js new file mode 100644 index 00000000..9a62a7c3 --- /dev/null +++ b/migrations/0.4.0.js @@ -0,0 +1,77 @@ +'use strict'; + +const hashIp = require(__dirname+'/../helpers/haship.js') + , { createCIDR, parse } = require('ip6addr') + , config = require(__dirname+'/../config.js'); + +module.exports = async(db, redis) => { + const postIps = await db.collection('posts').distinct('ip.raw'); + const logIps = await db.collection('modlog').distinct('ip.raw'); + const banIps = await db.collection('bans').distinct('ip.raw'); + const allDistinctIps = postIps.concat(logIps).concat(banIps); + const bulkWrites = allDistinctIps.map(ip => { + const ipSet = {}; + try { + const ipParsed = parse(ip); + const ipKind = ipParsed.kind(); + const ipStr = ipParsed.toString({ + format: ipKind === 'ipv4' ? 'v4' : 'v6', + zeroElide: false, + zeroPad: false, + }); + let qrange + , hrange; + if (ipKind === 'ipv4') { + qrange = createCIDR(ipStr, 24).toString(); + hrange = createCIDR(ipStr, 16).toString(); + } else { + qrange = createCIDR(ipStr, 64).toString(); + hrange = createCIDR(ipStr, 48).toString(); + } + ipSet['ip.cloak'] = `${hashIp(hrange).substring(0,8)}.${hashIp(qrange).substring(0,7)}.${hashIp(ipStr).substring(0,7)}.IP`; + } catch (e) { + //-1 old "iphashpermlevel" or bypass ids, just shorten them + const shortenedOldHash = `${hashIp(ip).slice(-10)}.IP`; + ipSet['ip.raw'] = shortenedOldHash; + ipSet['ip.cloak'] = shortenedOldHash; + } + return { + 'updateMany': { + 'filter': { + 'ip.raw': ip + }, + 'update': { + '$unset': { + 'ip.single': '', + 'ip.qrange': '', + 'ip.hrange': '', + }, + '$set': ipSet, + } + } + }; + }); + console.log('adjusting ip in modlogs, bans and posts'); + //the bulkwrites should work for ip, bans, and logs + await db.collection('posts').bulkWrite(bulkWrites); + await db.collection('modlog').bulkWrite(bulkWrites); + await db.collection('bans').bulkWrite(bulkWrites); + console.log('removing saved posts inside bans'); + await db.collection('bans').updateMany({}, { + '$set':{ + 'posts': null, + } + }); + console.log('clearing reports') + await db.collection('posts').updateMany({}, { + '$set':{ + 'reports': [], + 'globalreports': [], + } + }); + //drop old ban indexes that indexed ip.single, then recreate + console.log('recreating bans indexes'); + await db.collection('bans').dropIndexes(); + await db.collection('bans').createIndex({ 'ip.cloak': 1 , 'board': 1 }); + await db.collection('bans').createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 0 }); +} diff --git a/models/forms/actionhandler.js b/models/forms/actionhandler.js index 84a6b7a2..57031e8e 100644 --- a/models/forms/actionhandler.js +++ b/models/forms/actionhandler.js @@ -118,13 +118,13 @@ module.exports = async (req, res, next) => { } const postsBefore = res.locals.posts.length; if (req.body.delete_ip_board || req.body.delete_ip_global || req.body.delete_ip_thread) { - const deletePostIps = res.locals.posts.map(x => x.ip.single); + const deletePostIps = res.locals.posts.map(x => x.ip.cloak); const deletePostMongoIds = res.locals.posts.map(x => x._id) let query = { '_id': { '$nin': deletePostMongoIds }, - 'ip.single': { + 'ip.cloak': { '$in': deletePostIps } }; @@ -314,7 +314,7 @@ module.exports = async (req, res, next) => { message: message, user: logUser, ip: { - single: res.locals.ip.single, + cloak: res.locals.ip.cloak, raw: res.locals.ip.raw } }; diff --git a/models/forms/appeal.js b/models/forms/appeal.js index 2944a097..ae7bca88 100644 --- a/models/forms/appeal.js +++ b/models/forms/appeal.js @@ -4,6 +4,6 @@ const { Bans } = require(__dirname+'/../../db/'); module.exports = async (req, res, next) => { - return Bans.appeal(res.locals.ip.single, req.body.checkedbans, req.body.message).then(r => r.modifiedCount); + return Bans.appeal(res.locals.ip.cloak, req.body.checkedbans, req.body.message).then(r => r.modifiedCount); } diff --git a/models/forms/banposter.js b/models/forms/banposter.js index a5b62508..aa845bce 100644 --- a/models/forms/banposter.js +++ b/models/forms/banposter.js @@ -16,25 +16,31 @@ module.exports = async (req, res, next) => { if (req.body.ban || req.body.global_ban) { const banBoard = req.body.global_ban ? null : req.params.board; const ipPosts = res.locals.posts.reduce((acc, post) => { - if (!acc[post.ip.single]) { - acc[post.ip.single] = []; + if (!acc[post.ip.cloak]) { + acc[post.ip.cloak] = []; } - acc[post.ip.single].push(post); + acc[post.ip.cloak].push(post); return acc; }, {}); for (let ip in ipPosts) { const thisIpPosts = ipPosts[ip]; let type = 'single'; let banIp = { - single: ip, - raw: thisIpPosts[0].ip.raw + cloak: thisIpPosts[0].ip.cloak, + raw: thisIpPosts[0].ip.raw, }; if (req.body.ban_h) { type = 'half'; - banIp.single = thisIpPosts[0].ip.hrange; + banIp.cloak = thisIpPosts[0].ip.cloak + .split('.') + .slice(0,1) + .join('.'); } else if (req.body.ban_q) { type = 'quarter'; - banIp.single = thisIpPosts[0].ip.qrange; + banIp.cloak = thisIpPosts[0].ip.cloak + .split('.') + .slice(0,2) + .join('.'); } bans.push({ type, diff --git a/models/forms/editpost.js b/models/forms/editpost.js index 2f2072bf..a4d86555 100644 --- a/models/forms/editpost.js +++ b/models/forms/editpost.js @@ -51,7 +51,7 @@ todo: handle some more situations const banExpiry = new Date(globalSettings.filterBanDuration + banDate.getTime()); const ban = { 'ip': { - 'single': res.locals.ip.single, + 'cloak': res.locals.ip.cloak, 'raw': res.locals.ip.raw, }, 'type': 'single', @@ -163,7 +163,7 @@ todo: handle some more situations message: req.body.log_message || null, user: req.session.user, ip: { - single: res.locals.ip.single, + cloak: res.locals.ip.cloak, raw: res.locals.ip.raw, } }); diff --git a/models/forms/makepost.js b/models/forms/makepost.js index 7743a426..4fe336c7 100644 --- a/models/forms/makepost.js +++ b/models/forms/makepost.js @@ -144,7 +144,7 @@ ${res.locals.numFiles > 0 ? req.files.file.map(f => f.name+'|'+(f.phash || '')). const banExpiry = new Date(useFilterBanDuration + banDate.getTime()); const ban = { 'ip': { - 'single': res.locals.ip.single, + 'cloak': res.locals.ip.cloak, 'raw': res.locals.ip.raw, }, 'type': 'single', @@ -612,15 +612,15 @@ ${res.locals.numFiles > 0 ? req.files.file.map(f => f.name+'|'+(f.phash || '')). //dont emit thread to this socket, because the room onyl exists when the thread is open Socketio.emitRoom(`${res.locals.board._id}-${data.thread}`, 'newPost', projectedPost); } - const { raw, single } = data.ip; + const { raw, cloak } = data.ip; //but emit it to manage pages because they need to get all posts through socket including thread - Socketio.emitRoom('globalmanage-recent-hashed', 'newPost', { ...projectedPost, ip: { single: single.slice(-10), raw: null } }); - Socketio.emitRoom(`${res.locals.board._id}-manage-recent-hashed`, 'newPost', { ...projectedPost, ip: { single: single.slice(-10), raw: null } }); + Socketio.emitRoom('globalmanage-recent-hashed', 'newPost', { ...projectedPost, ip: { cloak, raw: null } }); + Socketio.emitRoom(`${res.locals.board._id}-manage-recent-hashed`, 'newPost', { ...projectedPost, ip: { cloak, raw: null } }); if (ipHashPermLevel > -1) { //small optimisation for boards where this is manually set to -1 for privacy, no need to emit to rooms that cant be accessed //even if they are empty it will create extra communication noise in redis, socket adapter, etc. - Socketio.emitRoom('globalmanage-recent-raw', 'newPost', { ...projectedPost, ip: { single: single.slice(-10), raw } }); - Socketio.emitRoom(`${res.locals.board._id}-manage-recent-raw`, 'newPost', { ...projectedPost, ip: { single: single.slice(-10), raw } }); + Socketio.emitRoom('globalmanage-recent-raw', 'newPost', { ...projectedPost, ip: { cloak, raw } }); + Socketio.emitRoom(`${res.locals.board._id}-manage-recent-raw`, 'newPost', { ...projectedPost, ip: { cloak, raw } }); } //now add other pages to be built in background diff --git a/models/forms/reportpost.js b/models/forms/reportpost.js index dd6d69b2..12128ebf 100644 --- a/models/forms/reportpost.js +++ b/models/forms/reportpost.js @@ -9,7 +9,7 @@ module.exports = (req, res) => { 'reason': req.body.report_reason, 'date': new Date(), 'ip': { - 'single': res.locals.ip.single, + 'cloak': res.locals.ip.cloak, 'raw': res.locals.ip.raw } } diff --git a/models/pages/captcha.js b/models/pages/captcha.js index e17956eb..4a793b0a 100644 --- a/models/pages/captcha.js +++ b/models/pages/captcha.js @@ -21,7 +21,7 @@ module.exports = async (req, res, next) => { let maxAge = 5*60*1000; try { if (!res.locals.anonymizer) { - const ratelimit = await Ratelimits.incrmentQuota(res.locals.ip.single, 'captcha', rateLimitCost.captcha); + const ratelimit = await Ratelimits.incrmentQuota(res.locals.ip.cloak, 'captcha', rateLimitCost.captcha); if (ratelimit > 100) { return res.status(429).redirect('/file/ratelimit.png'); } diff --git a/models/pages/globalmanage/logs.js b/models/pages/globalmanage/logs.js index 7852a0fe..de0ae639 100644 --- a/models/pages/globalmanage/logs.js +++ b/models/pages/globalmanage/logs.js @@ -3,6 +3,7 @@ const { Modlogs } = require(__dirname+'/../../../db/') , pageQueryConverter = require(__dirname+'/../../../helpers/pagequeryconverter.js') , decodeQueryIP = require(__dirname+'/../../../helpers/decodequeryip.js') + , { isIP } = require('net') , limit = 50; module.exports = async (req, res, next) => { @@ -19,10 +20,12 @@ module.exports = async (req, res, next) => { filter.board = uri; } const ipMatch = decodeQueryIP(req.query, res.locals.permLevel); - if (ipMatch instanceof RegExp) { - filter['ip.single'] = ipMatch; - } else if (typeof ipMatch === 'string') { - filter['ip.raw'] = ipMatch; + if (ipMatch != null) { + if (isIP(ipMatch)) { + filter['ip.raw'] = ipMatch; + } else { + filter['ip.cloak'] = ipMatch; + } } let logs, maxPage; diff --git a/models/pages/manage/recent.js b/models/pages/manage/recent.js index be0dae74..af408260 100644 --- a/models/pages/manage/recent.js +++ b/models/pages/manage/recent.js @@ -13,7 +13,7 @@ module.exports = async (req, res, next) => { if (postId && +postId === parseInt(postId) && Number.isSafeInteger(+postId)) { const fetchedPost = await Posts.getPost(req.params.board, +postId, true); if (fetchedPost) { - ip = decodeQueryIP({ ip: fetchedPost.ip.single.slice(-10) }, res.locals.permlevel); + ip = decodeQueryIP({ ip: fetchedPost.ip.cloak }, res.locals.permlevel); } } diff --git a/package-lock.json b/package-lock.json index 74e35756..94c8adf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jschan", - "version": "0.3.3", + "version": "0.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jschan", - "version": "0.3.3", + "version": "0.4.0", "license": "AGPL-3.0-only", "dependencies": { "@fatchan/express-fileupload": "^1.3.1", @@ -64,9 +64,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -444,9 +444,9 @@ "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==" }, "node_modules/@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==" + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" }, "node_modules/@types/vinyl": { "version": "2.0.6", @@ -489,9 +489,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "bin": { "acorn": "bin/acorn" }, @@ -1193,6 +1193,11 @@ "node": ">= 10.0.0" } }, + "node_modules/big-bitfield": { + "version": "1.2.0", + "resolved": "git+https://gitgud.io/fatchan/big-bitfield.git#770a1bf78985bfe0b0cd6115bb6e06f529cc643c", + "license": "LGPL-3.0-only" + }, "node_modules/binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -1224,15 +1229,6 @@ "url": "https://bevry.me/fund" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", @@ -1281,19 +1277,19 @@ "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=" }, "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "engines": { @@ -1468,9 +1464,9 @@ } }, "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } @@ -1893,9 +1889,9 @@ } }, "node_modules/connect-redis": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.0.0.tgz", - "integrity": "sha512-6eGEAAPHYvcfbRNCMmPzBIjrqRWLw7at9lCUH4G6NQ8gwWDJelaUmFNOqPIhehbw941euVmIuqWsaWiKXfb+5g==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.1.tgz", + "integrity": "sha512-4on27NmUz1hVCVsrUFUOe06YkgCx88ZZ29Wi7D5mXg22alN/Xx+Y+iPrJ1Cc7coUKAe5SP3W2LF/zo6WXSJFFg==", "engines": { "node": ">=12" } @@ -2025,14 +2021,6 @@ "node": ">= 0.10" } }, - "node_modules/cron": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", - "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", - "dependencies": { - "moment-timezone": "^0.5.x" - } - }, "node_modules/cron-parser": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", @@ -2045,6 +2033,11 @@ "node": ">=0.8" } }, + "node_modules/croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2266,14 +2259,14 @@ } }, "node_modules/degenerator": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", - "integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", "esprima": "^4.0.0", - "vm2": "^3.9.3" + "vm2": "^3.9.8" }, "engines": { "node": ">= 6" @@ -2525,9 +2518,9 @@ } }, "node_modules/engine.io": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", - "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -2537,7 +2530,7 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3" }, "engines": { @@ -2831,16 +2824,16 @@ } }, "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -2855,7 +2848,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -2909,6 +2902,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3114,12 +3115,6 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -3358,9 +3353,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "funding": [ { "type": "individual", @@ -3449,9 +3444,9 @@ "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" }, "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3498,24 +3493,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -4440,9 +4417,9 @@ } }, "node_modules/ioredis": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.4.tgz", - "integrity": "sha512-KmG3FDd1pKZcWQ7/fIbwzvpkZ50NwRJ3RBK9dpetJrNfC+sxhK6TzaVkExvh9AiF+rAVSUmvqfHyQp5U418aDw==", + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", "dependencies": { "cluster-key-slot": "^1.1.0", "debug": "^4.3.1", @@ -4666,17 +4643,6 @@ "object-assign": "^4.1.1" } }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5620,9 +5586,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5738,9 +5704,9 @@ } }, "node_modules/mongodb": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.3.1.tgz", - "integrity": "sha512-sNa8APSIk+r4x31ZwctKjuPSaeKuvUeNb/fu/3B6dRM02HpEgig7hTHM8A/PJQTlxuC/KFWlDlQjhsk/S43tBg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.4.0.tgz", + "integrity": "sha512-1hPhutJj6yxxu0ymwsO0uEimTo+QTh3oQP6YHxmLneBFBOGydYFdnmDDuLiGWimAlMdRN9WuDXY+JGp47aeOwA==", "dependencies": { "bson": "^4.6.1", "denque": "^2.0.1", @@ -5789,16 +5755,10 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6608,9 +6568,9 @@ } }, "node_modules/peek-readable": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.0.2.tgz", - "integrity": "sha512-9fMaz6zoxw9ypO1KZy5RDJgSupEtu0Q+g/OqqsVHX3rKGR8qehRLYzsFARZ4bVvdvfknKiXvuDbkMnO1g6cRpQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", "engines": { "node": ">=8" }, @@ -6636,14 +6596,14 @@ } }, "node_modules/pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.0.tgz", + "integrity": "sha512-8VJLToXhj+RYZGNVw8oxc7dS54iCQXUJ+MDFHezQ/fwF5B8W4OWodAMboc1wb08S/4LiHwAmkT4ohf/d3YPPsw==", "dependencies": { "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/pify": { @@ -6722,9 +6682,9 @@ } }, "node_modules/pm2": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.1.2.tgz", - "integrity": "sha512-2nJQeCWjkN0WnTkWctaoZpqrJTiUN/Icw76IMVHHzPhr/p7yQYlEQgHzlL5IFWxO2N1HdBNXNdZft2p4HUmUcA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.2.0.tgz", + "integrity": "sha512-PO5hMVhQ85cTszFM++6v07Me9hPJMkFbHjkFigtMMk+La8ty2wCi2dlBTeZYJDhPUSjK8Ccltpq2buNRcyMOTw==", "dependencies": { "@pm2/agent": "~2.0.0", "@pm2/io": "~5.0.0", @@ -6736,7 +6696,7 @@ "chokidar": "^3.5.1", "cli-tableau": "^2.0.0", "commander": "2.15.1", - "cron": "1.8.2", + "croner": "~4.1.92", "dayjs": "~1.8.25", "debug": "^4.3.1", "enquirer": "2.3.6", @@ -6744,7 +6704,7 @@ "fclone": "1.0.11", "mkdirp": "1.0.4", "needle": "2.4.0", - "pidusage": "2.0.21", + "pidusage": "~3.0", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.1", "pm2-deploy": "~1.0.2", @@ -6827,6 +6787,18 @@ "tx2": "~1.0.4" } }, + "node_modules/pm2-sysmonit/node_modules/pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "optional": true, + "dependencies": { + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pm2/node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -6895,19 +6867,6 @@ "node": ">=8" } }, - "node_modules/pm2/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/pm2/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7296,9 +7255,9 @@ } }, "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "engines": { "node": ">=0.6" }, @@ -7342,11 +7301,11 @@ } }, "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dependencies": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -8018,9 +7977,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.6.1.tgz", - "integrity": "sha512-DzjSz3H5qDntD7s1TcWCSoRPmNR8UmA+y+xZQOvWgjATe2Br9ZW73+vD3Pj6Snrg0RuEuJdXgrKvnYuiuixRkA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", + "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -8506,12 +8465,12 @@ "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg==" }, "node_modules/socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dependencies": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.13.0", @@ -8793,12 +8752,12 @@ } }, "node_modules/strtok3": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.2.4.tgz", - "integrity": "sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "dependencies": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.0.1" + "peek-readable": "^4.1.0" }, "engines": { "node": ">=10" @@ -8840,9 +8799,9 @@ } }, "node_modules/systeminformation": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.1.tgz", - "integrity": "sha512-E8ZGcnW4Pj4boATSdajw0neHh1B+f+3IqL2iAcT9t1DMgc8mdI0NRT04XPrL6oxrpvMzk0A/bSHT9eKd05tQag==", + "version": "5.11.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.4.tgz", + "integrity": "sha512-rh7bjpjP5whUaTknim5CiGdAiKZcgWhmbmxjzBRXDWqUc/k67bz2OP+03DdcX6/SN/CDSAi/NeUwM5o2gjHJoA==", "optional": true, "os": [ "darwin", @@ -8887,10 +8846,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", "dependencies": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" @@ -8900,14 +8860,17 @@ }, "engines": { "node": ">=10" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } + "engines": { + "node": ">=0.4.0" } }, "node_modules/terser/node_modules/commander": { @@ -9727,9 +9690,9 @@ } }, "node_modules/vm2": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.7.tgz", - "integrity": "sha512-g/GZ7V0Mlmch3eDVOATvAXr1GsJNg6kQ5PjvYy3HbJMCRn5slNbo/u73Uy7r5yUej1cRa3ZjtoVwcWSQuQ/fow==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.8.tgz", + "integrity": "sha512-/1PYg/BwdKzMPo8maOZ0heT7DLI0DAFTm7YQaz/Lim9oIaFZsJs3EdtalvXuBfZwczNwsYhju75NW4d6E+4q+w==", "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" @@ -9741,6 +9704,17 @@ "node": ">=6.0" } }, + "node_modules/vm2/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -10037,9 +10011,9 @@ "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==" + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==" }, "@babel/types": { "version": "7.17.0", @@ -10356,9 +10330,9 @@ "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==" }, "@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==" + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" }, "@types/vinyl": { "version": "2.0.6", @@ -10398,9 +10372,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" }, "acorn-walk": { "version": "8.2.0", @@ -10930,6 +10904,10 @@ "node-addon-api": "^3.1.0" } }, + "big-bitfield": { + "version": "git+https://gitgud.io/fatchan/big-bitfield.git#770a1bf78985bfe0b0cd6115bb6e06f529cc643c", + "from": "git+https://gitgud.io/fatchan/big-bitfield.git#770a1bf78985bfe0b0cd6115bb6e06f529cc643c" + }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -10949,15 +10927,6 @@ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", @@ -10999,19 +10968,19 @@ "integrity": "sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=" }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "dependencies": { @@ -11144,9 +11113,9 @@ } }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cache-base": { "version": "1.0.1", @@ -11479,9 +11448,9 @@ } }, "connect-redis": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.0.0.tgz", - "integrity": "sha512-6eGEAAPHYvcfbRNCMmPzBIjrqRWLw7at9lCUH4G6NQ8gwWDJelaUmFNOqPIhehbw941euVmIuqWsaWiKXfb+5g==" + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.1.tgz", + "integrity": "sha512-4on27NmUz1hVCVsrUFUOe06YkgCx88ZZ29Wi7D5mXg22alN/Xx+Y+iPrJ1Cc7coUKAe5SP3W2LF/zo6WXSJFFg==" }, "console-control-strings": { "version": "1.1.0", @@ -11589,14 +11558,6 @@ "vary": "^1" } }, - "cron": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", - "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", - "requires": { - "moment-timezone": "^0.5.x" - } - }, "cron-parser": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", @@ -11606,6 +11567,11 @@ "moment-timezone": "^0.5.31" } }, + "croner": { + "version": "4.1.97", + "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", + "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -11766,14 +11732,14 @@ } }, "degenerator": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", - "integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "requires": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", "esprima": "^4.0.0", - "vm2": "^3.9.3" + "vm2": "^3.9.8" } }, "del": { @@ -11966,9 +11932,9 @@ } }, "engine.io": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", - "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "requires": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -11978,7 +11944,7 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3" }, "dependencies": { @@ -12197,16 +12163,16 @@ } }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -12221,7 +12187,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -12233,6 +12199,11 @@ "vary": "~1.1.2" }, "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12443,12 +12414,6 @@ "token-types": "^4.1.1" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -12642,9 +12607,9 @@ } }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "for-each": { "version": "0.3.3", @@ -12701,9 +12666,9 @@ "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -12743,16 +12708,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -13481,9 +13436,9 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ioredis": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.4.tgz", - "integrity": "sha512-KmG3FDd1pKZcWQ7/fIbwzvpkZ50NwRJ3RBK9dpetJrNfC+sxhK6TzaVkExvh9AiF+rAVSUmvqfHyQp5U418aDw==", + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", + "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", "requires": { "cluster-key-slot": "^1.1.0", "debug": "^4.3.1", @@ -13650,13 +13605,6 @@ "requires": { "acorn": "^7.1.1", "object-assign": "^4.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } } }, "is-extendable": { @@ -14371,9 +14319,9 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -14465,9 +14413,9 @@ } }, "mongodb": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.3.1.tgz", - "integrity": "sha512-sNa8APSIk+r4x31ZwctKjuPSaeKuvUeNb/fu/3B6dRM02HpEgig7hTHM8A/PJQTlxuC/KFWlDlQjhsk/S43tBg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.4.0.tgz", + "integrity": "sha512-1hPhutJj6yxxu0ymwsO0uEimTo+QTh3oQP6YHxmLneBFBOGydYFdnmDDuLiGWimAlMdRN9WuDXY+JGp47aeOwA==", "requires": { "bson": "^4.6.1", "denque": "^2.0.1", @@ -14507,16 +14455,10 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true - }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" }, "nanomatch": { "version": "1.2.13", @@ -15145,9 +15087,9 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "peek-readable": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.0.2.tgz", - "integrity": "sha512-9fMaz6zoxw9ypO1KZy5RDJgSupEtu0Q+g/OqqsVHX3rKGR8qehRLYzsFARZ4bVvdvfknKiXvuDbkMnO1g6cRpQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" }, "picocolors": { "version": "1.0.0", @@ -15160,9 +15102,9 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.0.tgz", + "integrity": "sha512-8VJLToXhj+RYZGNVw8oxc7dS54iCQXUJ+MDFHezQ/fwF5B8W4OWodAMboc1wb08S/4LiHwAmkT4ohf/d3YPPsw==", "requires": { "safe-buffer": "^5.2.1" } @@ -15224,9 +15166,9 @@ } }, "pm2": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.1.2.tgz", - "integrity": "sha512-2nJQeCWjkN0WnTkWctaoZpqrJTiUN/Icw76IMVHHzPhr/p7yQYlEQgHzlL5IFWxO2N1HdBNXNdZft2p4HUmUcA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.2.0.tgz", + "integrity": "sha512-PO5hMVhQ85cTszFM++6v07Me9hPJMkFbHjkFigtMMk+La8ty2wCi2dlBTeZYJDhPUSjK8Ccltpq2buNRcyMOTw==", "requires": { "@pm2/agent": "~2.0.0", "@pm2/io": "~5.0.0", @@ -15238,7 +15180,7 @@ "chokidar": "^3.5.1", "cli-tableau": "^2.0.0", "commander": "2.15.1", - "cron": "1.8.2", + "croner": "~4.1.92", "dayjs": "~1.8.25", "debug": "^4.3.1", "enquirer": "2.3.6", @@ -15246,7 +15188,7 @@ "fclone": "1.0.11", "mkdirp": "1.0.4", "needle": "2.4.0", - "pidusage": "2.0.21", + "pidusage": "~3.0", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.1", "pm2-deploy": "~1.0.2", @@ -15305,12 +15247,6 @@ "to-regex-range": "^5.0.1" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -15417,6 +15353,17 @@ "pidusage": "^2.0.21", "systeminformation": "^5.7", "tx2": "~1.0.4" + }, + "dependencies": { + "pidusage": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", + "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", + "optional": true, + "requires": { + "safe-buffer": "^5.2.1" + } + } } }, "posix-character-classes": { @@ -15698,9 +15645,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "queue-microtask": { "version": "1.2.3", @@ -15718,11 +15665,11 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -16219,9 +16166,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.6.1.tgz", - "integrity": "sha512-DzjSz3H5qDntD7s1TcWCSoRPmNR8UmA+y+xZQOvWgjATe2Br9ZW73+vD3Pj6Snrg0RuEuJdXgrKvnYuiuixRkA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.0.tgz", + "integrity": "sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==", "requires": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", @@ -16622,12 +16569,12 @@ } }, "socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "requires": { "ip": "^1.1.5", - "smart-buffer": "^4.1.0" + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { @@ -16856,12 +16803,12 @@ } }, "strtok3": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.2.4.tgz", - "integrity": "sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", "requires": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.0.1" + "peek-readable": "^4.1.0" } }, "supports-color": { @@ -16887,9 +16834,9 @@ } }, "systeminformation": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.1.tgz", - "integrity": "sha512-E8ZGcnW4Pj4boATSdajw0neHh1B+f+3IqL2iAcT9t1DMgc8mdI0NRT04XPrL6oxrpvMzk0A/bSHT9eKd05tQag==", + "version": "5.11.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.4.tgz", + "integrity": "sha512-rh7bjpjP5whUaTknim5CiGdAiKZcgWhmbmxjzBRXDWqUc/k67bz2OP+03DdcX6/SN/CDSAi/NeUwM5o2gjHJoA==", "optional": true }, "tar": { @@ -16913,15 +16860,21 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17590,12 +17543,19 @@ } }, "vm2": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.7.tgz", - "integrity": "sha512-g/GZ7V0Mlmch3eDVOATvAXr1GsJNg6kQ5PjvYy3HbJMCRn5slNbo/u73Uy7r5yUej1cRa3ZjtoVwcWSQuQ/fow==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.8.tgz", + "integrity": "sha512-/1PYg/BwdKzMPo8maOZ0heT7DLI0DAFTm7YQaz/Lim9oIaFZsJs3EdtalvXuBfZwczNwsYhju75NW4d6E+4q+w==", "requires": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + } } }, "void-elements": { diff --git a/package.json b/package.json index 39431f23..a6d9cbc1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jschan", - "version": "0.3.3", - "migrateVersion": "0.2.0", + "version": "0.4.0", + "migrateVersion": "0.4.0", "description": "", "main": "server.js", "dependencies": { diff --git a/schedules/tasks/ips.js b/schedules/tasks/ips.js index 61f06fa2..3125020f 100644 --- a/schedules/tasks/ips.js +++ b/schedules/tasks/ips.js @@ -22,7 +22,7 @@ module.exports = { $ne: true } }).forEach(post => { - const randomIP = createHash('sha256').update(tempIpHashSecret + post.ip.single).digest('base64'); + const randomIP = createHash('sha256').update(tempIpHashSecret + post.ip.cloak).digest('base64'); bulkWrites.push({ updateOne: { filter: { @@ -31,10 +31,8 @@ module.exports = { update: { $set: { 'ip.pruned': true, - 'ip.raw': randomIP, - 'ip.single': randomIP, - 'ip.qrange': randomIP, - 'ip.hrange': randomIP, + 'ip.raw': `${randomIP.slice(-10)}.PRUNED`, + 'ip.cloak': `${randomIP.slice(-10)}.PRUNED`, } } } diff --git a/views/mixins/ban.pug b/views/mixins/ban.pug index bc862238..d3ce58d6 100644 --- a/views/mixins/ban.pug +++ b/views/mixins/ban.pug @@ -10,8 +10,11 @@ mixin ban(ban, banpage) else | Global td= ban.reason - - const ip = permLevel > ipHashPermLevel ? ban.ip.single.slice(-10) : ban.ip.raw; - td #{ip} + - const ip = permLevel > ipHashPermLevel ? ban.ip.cloak : ban.ip.raw; + if permLevel > ipHashPermLevel + td #{ip}#{ban.type === 'half' ? '.*.*' : (ban.type === 'quarter' ? '.*' : '')} + else + td #{ip} td #{ban.type} td #{(!banpage || ban.showUser === true) ? ban.issuer : 'Hidden User'} - const banDate = new Date(ban.date); diff --git a/views/mixins/post.pug b/views/mixins/post.pug index ef12b57b..797b8718 100644 --- a/views/mixins/post.pug +++ b/views/mixins/post.pug @@ -20,12 +20,12 @@ mixin post(post, truncate, manage=false, globalmanage=false, ban=false, overboar input.post-check(type='checkbox', name='checkedposts' value=post.postId) | if manage - - const ip = permLevel > ipHashPermLevel ? post.ip.single.slice(-10) : post.ip.raw; + - const ip = permLevel > ipHashPermLevel ? post.ip.cloak : post.ip.raw; a.bold(href=`${upLevel ? '../' : ''}recent.html?ip=${encodeURIComponent(ip)}`) [#{ip}] else if modview a.bold(href=`${upLevel ? '../' : ''}recent.html?postid=${post.postId}`) [+] else if globalmanage - - const ip = permLevel > ipHashPermLevel ? post.ip.single.slice(-10) : post.ip.raw; + - const ip = permLevel > ipHashPermLevel ? post.ip.cloak : post.ip.raw; a.bold(href=`?ip=${encodeURIComponent(ip)}`) [#{ip}] | if !post.thread diff --git a/views/mixins/report.pug b/views/mixins/report.pug index 00ff4e13..84aa2066 100644 --- a/views/mixins/report.pug +++ b/views/mixins/report.pug @@ -2,7 +2,7 @@ mixin report(r, manage=false) .reports.post-container input.post-check(type='checkbox', name='checkedreports' value=r.id) | - - const ip = permLevel > ipHashPermLevel ? r.ip.single.slice(-10) : r.ip.raw; + - const ip = permLevel > ipHashPermLevel ? r.ip.cloak : r.ip.raw; a.bold(href=`${manage ? 'recent.html' : ''}?ip=${encodeURIComponent(ip)}`) [#{ip}] | - const reportDate = new Date(r.date); diff --git a/views/pages/globalmanagelogs.pug b/views/pages/globalmanagelogs.pug index 5ba4c770..9ff41364 100644 --- a/views/pages/globalmanagelogs.pug +++ b/views/pages/globalmanagelogs.pug @@ -52,7 +52,7 @@ block content | a(href=`?username=${log.user}`) [+] td - - const logIp = permLevel > ipHashPermLevel ? log.ip.single.slice(-10) : log.ip.raw; + - const logIp = permLevel > ipHashPermLevel ? log.ip.cloak : log.ip.raw; a(href=`recent.html?ip=${encodeURIComponent(logIp)}`) #{logIp} | a(href=`?ip=${encodeURIComponent(logIp)}`) [+] diff --git a/views/pages/managelogs.pug b/views/pages/managelogs.pug index 1398ee7b..d5d07371 100644 --- a/views/pages/managelogs.pug +++ b/views/pages/managelogs.pug @@ -40,7 +40,7 @@ block content | a(href=`?username=${log.user}`) [+] td - - const logIp = permLevel > ipHashPermLevel ? log.ip.single.slice(-10) : log.ip.raw; + - const logIp = permLevel > ipHashPermLevel ? log.ip.cloak : log.ip.raw; | #{logIp} td #{log.actions} td diff --git a/views/pages/managerecent.pug b/views/pages/managerecent.pug index 1ee8fb90..c1a52c70 100644 --- a/views/pages/managerecent.pug +++ b/views/pages/managerecent.pug @@ -23,7 +23,7 @@ block content if posts.length === 0 p No posts. else - - const ip = permLevel > ipHashPermLevel ? posts[0].ip.single.slice(-10) : posts[0].ip.raw; + - const ip = permLevel > ipHashPermLevel ? posts[0].ip.cloak : posts[0].ip.raw; if postId || (queryIp && queryIp === ip) h4.no-m-p Post history for #{ip} |