upgrade: dependency updates across phases 1-3

Phase 1 - Security:
  - lodash 4.17.21 -> 4.18.1 (CVE fix)
  - dompurify 3.3.1 -> 3.4.10 (XSS fixes)
  - passport 0.4.1 -> 0.7.0 (security fixes)
  - remove deprecated request/request-promise, use native fetch instead
  - update semver, simple-git, winston, nodemailer

Phase 2 - Light upgrades:
  - sass 1.27.0 -> 1.101.0
  - chokidar 3.5.3 -> 4.0.3
  - mysql2 3.16.0 -> 3.22.5
  - pg 8.16.3 -> 8.21.0
  - cors, cross-env updates

Phase 3 - Medium risk:
  - js-yaml 3.14.0 -> 4.2.0 (safeLoad -> load across 11 files)
  - markdown-it 11.0.1 -> 14.2.0 (+7 plugin updates)
  - luxon 1.25.0 -> 3.7.2
  - fs-extra 9.0.1 -> 11.3.5
  - cheerio 1.0.0-rc.5 -> 1.2.0
  - highlight.js 10.3.1 -> 11.11.1

18 files changed, 67 insertions, 79 deletions
pull/8027/head
Dalibor Marković 4 weeks ago
parent 6f042e97cc
commit 4b0456f545
No known key found for this signature in database
GPG Key ID: 9A80B4A40A8B91A7

@ -57,21 +57,21 @@
"bluebird": "3.7.2",
"body-parser": "1.20.1",
"chalk": "4.1.0",
"cheerio": "1.0.0-rc.5",
"chokidar": "3.5.3",
"cheerio": "1.2.0",
"chokidar": "4.0.3",
"chromium-pickle-js": "0.2.0",
"clean-css": "5.3.3",
"command-exists": "1.2.9",
"compression": "1.8.1",
"connect-session-knex": "2.0.0",
"cookie-parser": "1.4.7",
"cors": "2.8.5",
"cors": "2.8.6",
"cuint": "0.2.2",
"custom-error-instance": "2.1.2",
"dependency-graph": "0.11.0",
"diff": "4.0.2",
"diff2html": "3.1.14",
"dompurify": "3.3.1",
"dompurify": "3.4.10",
"dotize": "0.3.0",
"elasticsearch6": "npm:@elastic/elasticsearch@6",
"elasticsearch7": "npm:@elastic/elasticsearch@7",
@ -83,7 +83,7 @@
"express-session": "1.18.2",
"file-type": "15.0.1",
"filesize": "6.1.0",
"fs-extra": "9.0.1",
"fs-extra": "11.3.5",
"getos": "3.2.1",
"graphql": "15.3.0",
"graphql-list-fields": "2.0.2",
@ -91,36 +91,36 @@
"graphql-subscriptions": "1.1.0",
"graphql-tools": "7.0.0",
"he": "1.2.0",
"highlight.js": "10.3.1",
"highlight.js": "11.11.1",
"i18next": "19.8.3",
"i18next-express-middleware": "2.0.0",
"i18next-node-fs-backend": "2.1.3",
"image-size": "0.9.2",
"js-base64": "3.7.8",
"js-binary": "1.2.0",
"js-yaml": "3.14.0",
"js-yaml": "4.2.0",
"jsdom": "16.4.0",
"jsonwebtoken": "9.0.3",
"katex": "0.12.0",
"klaw": "3.0.0",
"knex": "0.21.7",
"lodash": "4.17.21",
"luxon": "1.25.0",
"markdown-it": "11.0.1",
"markdown-it-abbr": "1.0.4",
"markdown-it-attrs": "3.0.3",
"lodash": "4.18.1",
"luxon": "3.7.2",
"markdown-it": "14.2.0",
"markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "5.0.0",
"markdown-it-decorate": "1.2.2",
"markdown-it-emoji": "3.0.0",
"markdown-it-expand-tabs": "1.0.13",
"markdown-it-external-links": "0.0.6",
"markdown-it-footnote": "3.0.3",
"markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1",
"markdown-it-mark": "3.0.1",
"markdown-it-mark": "4.0.0",
"markdown-it-mathjax": "2.0.0",
"markdown-it-multimd-table": "4.0.3",
"markdown-it-multimd-table": "4.2.3",
"markdown-it-pivot-table": "1.0.5",
"markdown-it-sub": "1.0.0",
"markdown-it-sup": "1.0.0",
"markdown-it-sub": "2.0.0",
"markdown-it-sup": "2.0.0",
"markdown-it-task-lists": "2.1.1",
"mathjax": "3.2.2",
"mime-types": "2.1.35",
@ -130,13 +130,13 @@
"ms": "2.1.3",
"mssql": "6.2.3",
"multer": "1.4.4",
"mysql2": "3.16.0",
"mysql2": "3.22.5",
"nanoid": "3.2.0",
"node-2fa": "1.1.2",
"node-cache": "5.1.2",
"nodemailer": "6.9.1",
"nodemailer": "8.0.11",
"objection": "2.2.18",
"passport": "0.4.1",
"passport": "0.7.0",
"passport-auth0": "1.4.5",
"passport-azure-ad": "4.3.5",
"passport-cas": "0.1.1",
@ -158,7 +158,7 @@
"passport-twitch-strategy": "2.2.0",
"patch-package": "8.0.1",
"pem-jwk": "2.0.0",
"pg": "8.16.3",
"pg": "8.21.0",
"pg-hstore": "2.3.4",
"pg-pubsub": "0.8.1",
"pg-query-stream": "4.10.3",
@ -169,14 +169,12 @@
"qr-image": "3.2.0",
"raven": "2.6.4",
"remove-markdown": "0.6.2",
"request": "2.88.2",
"request-promise": "4.2.6",
"safe-regex": "2.1.1",
"sanitize-filename": "1.6.3",
"scim-query-filter-parser": "2.0.4",
"semver": "7.7.3",
"semver": "7.8.4",
"serve-favicon": "2.5.1",
"simple-git": "3.30.0",
"simple-git": "3.36.0",
"solr-node": "1.2.1",
"sqlite3": "5.1.7",
"ssh2": "1.11.0",
@ -189,7 +187,7 @@
"uslug": "1.0.4",
"uuid": "9.0.0",
"validate.js": "0.13.1",
"winston": "3.8.2",
"winston": "3.19.0",
"xss": "1.0.15",
"yargs": "17.6.2"
},
@ -240,7 +238,7 @@
"codemirror-asciidoc": "1.0.4",
"copy-webpack-plugin": "6.2.1",
"core-js": "3.6.5",
"cross-env": "10.0.0",
"cross-env": "10.1.0",
"css-loader": "4.3.0",
"cssnano": "4.1.10",
"cypress": "5.3.0",
@ -292,7 +290,7 @@
"pug-plain-loader": "1.0.0",
"raw-loader": "4.0.2",
"resolve-url-loader": "3.1.2",
"sass": "1.27.0",
"sass": "1.101.0",
"sass-loader": "10.0.4",
"sass-resources-loader": "2.1.1",
"script-ext-html-webpack-plugin": "2.1.5",

@ -32,12 +32,12 @@ module.exports = {
let appdata = {}
try {
appconfig = yaml.safeLoad(
appconfig = yaml.load(
cfgHelper.parseConfigValue(
fs.readFileSync(confPaths.config, 'utf8')
)
)
appdata = yaml.safeLoad(fs.readFileSync(confPaths.data, 'utf8'))
appdata = yaml.load(fs.readFileSync(confPaths.data, 'utf8'))
appdata.regex = require(confPaths.dataRegex)
console.info(chalk.green.bold(`OK`))
} catch (err) {

@ -80,7 +80,7 @@ module.exports = {
try {
const devEntriesRaw = await fs.readFile(path.join(WIKI.SERVERPATH, `locales/${locale}.yml`), 'utf8')
if (devEntriesRaw) {
const devEntries = yaml.safeLoad(devEntriesRaw)
const devEntries = yaml.load(devEntriesRaw)
_.forOwn(devEntries, (data, ns) => {
this.namespaces.push(ns)
this.engine.addResourceBundle(locale, ns, data, true, true)

@ -1,4 +1,3 @@
const request = require('request-promise')
const _ = require('lodash')
/* global WIKI */
@ -10,16 +9,16 @@ module.exports = {
ContributeQuery: {
async contributors(obj, args, context, info) {
try {
const resp = await request({
const resp = await fetch('https://graph.requarks.io', {
method: 'POST',
uri: 'https://graph.requarks.io',
json: true,
body: {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: '{\n sponsors {\n list(kind: BACKER) {\n id\n source\n name\n joined\n website\n twitter\n avatar\n }\n }\n}\n',
variables: {}
}
})
})
return _.get(resp, 'data.sponsors.list', [])
const data = await resp.json()
return _.get(data, 'data.sponsors.list', [])
} catch (err) {
WIKI.logger.warn(err)
}

@ -6,7 +6,6 @@ const path = require('path')
const fs = require('fs-extra')
const moment = require('moment')
const graphHelper = require('../../helpers/graph')
const request = require('request-promise')
const crypto = require('crypto')
const nanoid = require('nanoid/non-secure').customAlphabet('1234567890abcdef', 10)
@ -89,13 +88,11 @@ module.exports = {
async performUpgrade (obj, args, context) {
try {
if (process.env.UPGRADE_COMPANION) {
await request({
method: 'POST',
uri: 'http://wiki-update-companion/upgrade',
qs: {
...process.env.UPGRADE_COMPANION_REF && { container: process.env.UPGRADE_COMPANION_REF }
}
})
const upgradeUrl = new URL('http://wiki-update-companion/upgrade')
if (process.env.UPGRADE_COMPANION_REF) {
upgradeUrl.searchParams.set('container', process.env.UPGRADE_COMPANION_REF)
}
await fetch(upgradeUrl, { method: 'POST' })
return {
responseResult: graphHelper.generateSuccess('Upgrade has started.')
}

@ -45,7 +45,7 @@ module.exports = class Analytics extends Model {
let diskProviders = []
for (let dir of analyticsDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/analytics', dir, 'definition.yml'), 'utf8')
diskProviders.push(yaml.safeLoad(def))
diskProviders.push(yaml.load(def))
}
WIKI.data.analytics = diskProviders.map(provider => ({
...provider,
@ -111,7 +111,7 @@ module.exports = class Analytics extends Model {
for (let provider of providers) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/analytics', provider.key, 'code.yml'), 'utf8')
let code = yaml.safeLoad(def)
let code = yaml.load(def)
code.head = _.defaultTo(code.head, '')
code.bodyStart = _.defaultTo(code.bodyStart, '')
code.bodyEnd = _.defaultTo(code.bodyEnd, '')

@ -84,7 +84,7 @@ module.exports = class Authentication extends Model {
WIKI.data.authentication = []
for (let dir of authDirs) {
const defRaw = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/authentication', dir, 'definition.yml'), 'utf8')
const def = yaml.safeLoad(defRaw)
const def = yaml.load(defRaw)
WIKI.data.authentication.push({
...def,
props: commonHelper.parseModuleProps(def.props)

@ -49,7 +49,7 @@ module.exports = class CommentProvider extends Model {
let diskProviders = []
for (let dir of commentDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
diskProviders.push(yaml.safeLoad(def))
diskProviders.push(yaml.load(def))
}
WIKI.data.commentProviders = diskProviders.map(provider => ({
...provider,
@ -111,7 +111,7 @@ module.exports = class CommentProvider extends Model {
if (WIKI.data.commentProvider.codeTemplate) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', commentProvider.key, 'code.yml'), 'utf8')
let code = yaml.safeLoad(def)
let code = yaml.load(def)
code.head = _.defaultTo(code.head, '')
code.body = _.defaultTo(code.body, '')
code.main = _.defaultTo(code.main, '')

@ -44,7 +44,7 @@ module.exports = class Editor extends Model {
let diskEditors = []
for (let dir of editorDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/editor', dir, 'definition.yml'), 'utf8')
diskEditors.push(yaml.safeLoad(def))
diskEditors.push(yaml.load(def))
}
WIKI.data.editors = diskEditors.map(editor => ({
...editor,

@ -45,7 +45,7 @@ module.exports = class Logger extends Model {
let diskLoggers = []
for (let dir of loggersDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/logging', dir, 'definition.yml'), 'utf8')
diskLoggers.push(yaml.safeLoad(def))
diskLoggers.push(yaml.load(def))
}
WIKI.data.loggers = diskLoggers.map(logger => ({
...logger,

@ -199,7 +199,7 @@ module.exports = class Page extends Model {
result = frontmatterRegex.markdown.exec(raw)
if (result[2]) {
return {
...yaml.safeLoad(result[2]),
...yaml.load(result[2]),
content: result[3]
}
} else {
@ -218,7 +218,7 @@ module.exports = class Page extends Model {
result = frontmatterRegex.html.exec(raw)
if (result[2]) {
return {
...yaml.safeLoad(result[2]),
...yaml.load(result[2]),
content: result[3]
}
}

@ -40,7 +40,7 @@ module.exports = class Renderer extends Model {
let diskRenderers = []
for (let dir of rendererDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/rendering', dir, 'definition.yml'), 'utf8')
diskRenderers.push(yaml.safeLoad(def))
diskRenderers.push(yaml.load(def))
}
WIKI.data.renderers = diskRenderers.map(renderer => ({
...renderer,

@ -45,7 +45,7 @@ module.exports = class SearchEngine extends Model {
let diskSearchEngines = []
for (let dir of searchEnginesDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/search', dir, 'definition.yml'), 'utf8')
diskSearchEngines.push(yaml.safeLoad(def))
diskSearchEngines.push(yaml.load(def))
}
WIKI.data.searchEngines = diskSearchEngines.map(searchEngine => ({
...searchEngine,

@ -45,7 +45,7 @@ module.exports = class Storage extends Model {
let diskTargets = []
for (let dir of storageDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/storage', dir, 'definition.yml'), 'utf8')
diskTargets.push(yaml.safeLoad(def))
diskTargets.push(yaml.load(def))
}
WIKI.data.storage = diskTargets.map(target => ({
...target,

@ -1,21 +1,16 @@
const request = require('request-promise')
const prefetch = async (element) => {
const url = element.attr(`src`)
let response
try {
response = await request({
method: `GET`,
url,
resolveWithFullResponse: true
})
response = await fetch(url)
} catch (err) {
WIKI.logger.warn(`Failed to prefetch ${url}`)
WIKI.logger.warn(err)
return
}
const contentType = response.headers[`content-type`]
const image = Buffer.from(response.body).toString('base64')
const contentType = response.headers.get('content-type') || 'image/png'
const buffer = await response.arrayBuffer()
const image = Buffer.from(buffer).toString('base64')
element.attr('src', `data:${contentType};base64,${image}`)
element.removeClass('prefetch-candidate')
}

@ -1,6 +1,5 @@
const _ = require('lodash')
const { SearchService, QueryType } = require('azure-search-client')
const request = require('request-promise')
const { pipeline } = require('node:stream/promises')
const { Transform } = require('node:stream')
@ -100,25 +99,23 @@ module.exports = {
top: 50
})
if (results.result.value.length < 5) {
// Using plain request, not yet available in library...
// Using native fetch, not yet available in library...
try {
const suggestResults = await request({
uri: `https://${this.config.serviceName}.search.windows.net/indexes/${this.config.indexName}/docs/autocomplete`,
method: 'post',
qs: {
'api-version': '2017-11-11-Preview'
},
const suggestUrl = new URL(`https://${this.config.serviceName}.search.windows.net/indexes/${this.config.indexName}/docs/autocomplete`)
suggestUrl.searchParams.set('api-version', '2017-11-11-Preview')
const suggestResp = await fetch(suggestUrl, {
method: 'POST',
headers: {
'api-key': this.config.adminKey,
'Content-Type': 'application/json'
},
json: true,
body: {
body: JSON.stringify({
autocompleteMode: 'oneTermWithContext',
search: q,
suggesterName: 'suggestions'
}
})
})
const suggestResults = await suggestResp.json()
suggestions = suggestResults.value.map(s => s.queryPlusText)
} catch (err) {
WIKI.logger.warn('Search Engine suggestion failure: ', err)

@ -392,7 +392,9 @@ module.exports = () => {
error: WIKI.IS_DEBUG ? err : {}
})
WIKI.logger.error(err.message)
WIKI.telemetry.sendError(err)
if (WIKI.telemetry) {
WIKI.telemetry.sendError(err)
}
})
// ----------------------------------------

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save