Improve error handling & security

This commit is contained in:
dakedres 2024-01-10 20:02:25 -05:00
parent 3219eb8813
commit 1a1ff23107

View File

@ -1,11 +1,3 @@
// const fetch = require('node-fetch')
// const config = require('./config.js')
// const Path = require('path')
// const { writeFile } = require('fs/promises')
// let cache = require('./cache.json')
// const { JSDOM } = require('jsdom')
import fetch from "node-fetch" import fetch from "node-fetch"
import Path from "path" import Path from "path"
import FS from "fs/promises" import FS from "fs/promises"
@ -47,8 +39,7 @@ const handleNitterUser = async user => {
console.warn(`Failed to fetch ${user} from ${source}`) console.warn(`Failed to fetch ${user} from ${source}`)
index++ index++
} else { } else {
console.error(err) throw err
break
} }
} }
} }
@ -166,7 +157,7 @@ const processTumblr = (rss, user) => {
const oneDay = 1000 * 60 * 60 * 24 const oneDay = 1000 * 60 * 60 * 24
const printFeed = async (sources, directory, header, viewOptions) => { const printFeed = async (sources, directory, header, viewOptions, error) => {
// Coalate // Coalate
let feed = [] let feed = []
let tooLongAgo = viewOptions.tooLongAgo ? let tooLongAgo = viewOptions.tooLongAgo ?
@ -214,7 +205,15 @@ const printFeed = async (sources, directory, header, viewOptions) => {
} }
if(pages.length == 0) { if(pages.length == 0) {
writePage(0, renderPage('No posts', [], header, 'No posts available') ) let message = 'No posts available'
if(error) {
// Put in an iframe to prevent potential XSS through response body? Who knows.
message += `<br><br>
<iframe src="data:text/plain,${encodeURIComponent(error.stack)}" style="width: 100%;"></iframe>`
}
writePage(0, renderPage('No posts', [], header, message) )
} }
return Promise.all(promises) return Promise.all(promises)
@ -291,8 +290,12 @@ ${footer}
return html return html
} }
const renderImage = image => `\ const renderImage = image => {
<a href="${image}"><img src="${image}" loading="lazy"></img></a>` let { href } = new URL(image)
return `\
<a href="${href}"><img src="${href}" loading="lazy"></img></a>`
}
const main = async () => { const main = async () => {
let promises = [] let promises = []
@ -306,18 +309,20 @@ const main = async () => {
let feed = config.feeds[feedName] let feed = config.feeds[feedName]
let feedSources = [] let feedSources = []
const subscribe = (postPromise, type, name) => const subscribe = (postPromise, type, name) => {
postPromise let source = { type, name, link: Path.join(type, name) }
.catch(error => console.error(error) )
return postPromise
.catch(error => {
source.error = error
console.error(error)
})
.then(posts => { .then(posts => {
feedSources.push(posts) feedSources.push(posts)
sources.push({ source.posts = posts
type, sources.push(source)
name,
link: Path.join(type, name),
posts
})
}) })
}
if(feed.nitter) { if(feed.nitter) {
for(let user of feed.nitter) { for(let user of feed.nitter) {
@ -354,8 +359,10 @@ const main = async () => {
let link = buildLink(root + page.link + '/') let link = buildLink(root + page.link + '/')
let extra = '' let extra = ''
if(page.posts === undefined) { if(page.error) {
extra += ' (missing)' extra += ' (errored)'
} else if (page.posts.length == 0) {
extra += ' (empty)'
} }
return `<li><a href="${link}">${name}</a>${extra}</li>` return `<li><a href="${link}">${name}</a>${extra}</li>`
@ -393,7 +400,7 @@ ${sources.map(source => renderEntry(source)).join('\n')}
console.log('Writing...') console.log('Writing...')
for(let source of sources) { for(let source of sources) {
wait( wait(
printFeed([ source.posts ], Path.join('out', source.link), navs[2], config.sourceView) printFeed([ source.posts ], Path.join('out', source.link), navs[2], config.sourceView, source.error)
) )
} }
for(let feed of feeds) { for(let feed of feeds) {