2019-10-11 18:34:14 +02:00
|
|
|
const settingsController = require('./api/controller/settings')
|
|
|
|
const acceptLanguage = require('accept-language')
|
2020-11-13 00:13:44 +01:00
|
|
|
const dayjs = require('dayjs')
|
2019-10-11 18:34:14 +02:00
|
|
|
const config = require('config')
|
2020-05-14 22:36:58 +02:00
|
|
|
const debug = require('debug')('helpers')
|
2019-10-30 14:58:40 +01:00
|
|
|
const pkg = require('../package.json')
|
2020-05-14 22:36:58 +02:00
|
|
|
const fs = require('fs')
|
|
|
|
const path = require('path')
|
|
|
|
const sharp = require('sharp')
|
|
|
|
const axios = require('axios')
|
|
|
|
const crypto = require('crypto')
|
2020-10-10 00:40:47 +02:00
|
|
|
const Microformats = require('microformat-node')
|
|
|
|
const get = require('lodash/get')
|
2019-10-11 18:34:14 +02:00
|
|
|
|
2020-02-10 00:40:23 +01:00
|
|
|
const DOMPurify = require('dompurify')
|
|
|
|
const { JSDOM } = require('jsdom')
|
|
|
|
const { window } = new JSDOM('<!DOCTYPE html>')
|
|
|
|
const domPurify = DOMPurify(window)
|
|
|
|
const URL = require('url')
|
2020-02-20 18:37:10 +01:00
|
|
|
const locales = require('../locales')
|
2020-02-10 00:40:23 +01:00
|
|
|
|
|
|
|
domPurify.addHook('beforeSanitizeElements', node => {
|
|
|
|
if (node.hasAttribute && node.hasAttribute('href')) {
|
|
|
|
const href = node.getAttribute('href')
|
|
|
|
const text = node.textContent
|
2020-11-06 11:05:05 +01:00
|
|
|
|
|
|
|
// remove FB tracking param
|
2020-02-10 00:40:23 +01:00
|
|
|
if (href.includes('fbclid=')) {
|
|
|
|
try {
|
|
|
|
const url = new URL.URL(href)
|
|
|
|
url.searchParams.delete('fbclid')
|
|
|
|
node.setAttribute('href', url.href)
|
|
|
|
if (text.includes('fbclid=')) {
|
|
|
|
node.textContent = url.href
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
return node
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return node
|
|
|
|
})
|
|
|
|
|
2019-10-11 18:34:14 +02:00
|
|
|
module.exports = {
|
2020-02-10 00:40:23 +01:00
|
|
|
sanitizeHTML (html) {
|
|
|
|
return domPurify.sanitize(html, {
|
2020-06-22 19:15:32 +02:00
|
|
|
ALLOWED_TAGS: ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'br',
|
2020-02-10 00:40:23 +01:00
|
|
|
'h6', 'b', 'a', 'li', 'ul', 'ol', 'code', 'blockquote', 'u', 's', 'strong'],
|
|
|
|
ALLOWED_ATTR: ['href']
|
|
|
|
})
|
|
|
|
},
|
2020-01-27 00:47:03 +01:00
|
|
|
|
|
|
|
async initSettings (req, res, next) {
|
2019-12-04 00:50:15 +01:00
|
|
|
await settingsController.load()
|
2019-10-11 18:34:14 +02:00
|
|
|
// initialize settings
|
|
|
|
req.settings = settingsController.settings
|
|
|
|
req.secretSettings = settingsController.secretSettings
|
|
|
|
|
|
|
|
req.settings.baseurl = config.baseurl
|
2020-01-15 23:51:09 +01:00
|
|
|
req.settings.title = req.settings.title || config.title
|
|
|
|
req.settings.description = req.settings.description || config.description
|
2019-10-30 14:58:40 +01:00
|
|
|
req.settings.version = pkg.version
|
2019-10-11 18:34:14 +02:00
|
|
|
|
|
|
|
// set locale and user locale
|
|
|
|
const acceptedLanguages = req.headers['accept-language']
|
2020-02-20 18:37:10 +01:00
|
|
|
acceptLanguage.languages(Object.keys(locales))
|
2019-10-11 18:34:14 +02:00
|
|
|
req.settings.locale = acceptLanguage.get(acceptedLanguages)
|
|
|
|
req.settings.user_locale = settingsController.user_locale[req.settings.locale]
|
2020-11-13 00:13:44 +01:00
|
|
|
dayjs.locale(req.settings.locale)
|
|
|
|
dayjs.tz.setDefault(req.settings.instance_timezone)
|
2020-01-27 00:47:03 +01:00
|
|
|
next()
|
2020-05-14 22:36:58 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
async getImageFromURL (url) {
|
|
|
|
debug(`getImageFromURL ${url}`)
|
2020-07-08 23:02:08 +02:00
|
|
|
const filename = crypto.randomBytes(16).toString('hex') + '.jpg'
|
2020-05-14 22:36:58 +02:00
|
|
|
const finalPath = path.resolve(config.upload_path, filename)
|
|
|
|
const thumbPath = path.resolve(config.upload_path, 'thumb', filename)
|
|
|
|
const outStream = fs.createWriteStream(finalPath)
|
|
|
|
const thumbStream = fs.createWriteStream(thumbPath)
|
|
|
|
|
2020-07-19 22:05:11 +02:00
|
|
|
const resizer = sharp().resize(1200).jpeg({ quality: 95 })
|
|
|
|
const thumbnailer = sharp().resize(400).jpeg({ quality: 90 })
|
2020-05-14 22:36:58 +02:00
|
|
|
|
|
|
|
const response = await axios({ method: 'GET', url, responseType: 'stream' })
|
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
let onError = false
|
|
|
|
const err = e => {
|
|
|
|
if (onError) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
onError = true
|
|
|
|
reject(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
response.data
|
|
|
|
.pipe(thumbnailer)
|
|
|
|
.on('error', err)
|
|
|
|
.pipe(thumbStream)
|
|
|
|
.on('error', err)
|
|
|
|
|
|
|
|
response.data
|
|
|
|
.pipe(resizer)
|
|
|
|
.on('error', err)
|
|
|
|
.pipe(outStream)
|
|
|
|
.on('error', err)
|
|
|
|
|
|
|
|
outStream.on('finish', () => resolve(filename))
|
|
|
|
})
|
2020-10-10 00:40:47 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
async importURL (req, res) {
|
|
|
|
const URL = req.query.URL
|
|
|
|
try {
|
|
|
|
const response = await axios.get(URL)
|
|
|
|
Microformats.get({ html: response.data, filter: ['h-event'] }, (err, data) => {
|
2020-11-06 11:05:05 +01:00
|
|
|
if (err || !data.items.length || !data.items[0].properties) {
|
|
|
|
return res.sendStatus(404)
|
|
|
|
}
|
2020-10-10 00:40:47 +02:00
|
|
|
const event = data.items[0].properties
|
|
|
|
return res.json({
|
|
|
|
title: get(event, 'name[0]', ''),
|
|
|
|
description: get(event, 'content[0]', ''),
|
|
|
|
place: get(event, 'location[0].properties.name', ''),
|
|
|
|
address: get(event, 'location[0].properties.street-address'),
|
|
|
|
start: get(event, 'start[0]', ''),
|
|
|
|
end: get(event, 'end[0]', ''),
|
|
|
|
tags: get(event, 'category', []),
|
|
|
|
image: get(event, 'featured[0]')
|
|
|
|
})
|
|
|
|
})
|
|
|
|
// const event = dom.window.document.querySelected(".h-event")
|
|
|
|
// console.error(event)
|
|
|
|
// console.error(response)
|
2020-11-06 11:05:05 +01:00
|
|
|
} catch (e) {
|
2020-10-10 00:40:47 +02:00
|
|
|
console.error(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
// res.json('ok')
|
2019-10-11 18:34:14 +02:00
|
|
|
}
|
2020-01-27 00:47:03 +01:00
|
|
|
|
2019-10-30 14:58:40 +01:00
|
|
|
}
|