feat(plugins): add req.rawBody for routes

Stripe webhooks endpoints requires to read the raw request body.
https://docs.stripe.com/webhooks#verify-webhook-signatures-with-official-libraries
pull/6318/head
kontrollanten 2024-03-29 08:22:26 +01:00 committed by Chocobozzz
parent 107e6e73a6
commit 1b323f4f65
5 changed files with 37 additions and 1 deletions

View File

@ -9,6 +9,10 @@ async function register ({
router.post('/form/post/mirror', (req, res) => { router.post('/form/post/mirror', (req, res) => {
res.json(req.body) res.json(req.body)
}) })
router.post('/form/post/mirror-raw-body', (req, res) => {
res.json(JSON.parse(req.rawBody))
})
} }
async function unregister () { async function unregister () {

View File

@ -80,6 +80,24 @@ describe('Test plugin helpers', function () {
} }
}) })
it('Should mirror the raw post body', async function () {
const body = {
torso: 'arms',
legs: 'feet'
}
for (const path of basePaths) {
const res = await makePostBodyRequest({
url: server.url,
path: path + 'form/post/mirror-raw-body',
fields: body,
expectedStatus: HttpStatusCode.OK_200
})
expect(res.body).to.deep.equal(body)
}
})
it('Should remove the plugin and remove the routes', async function () { it('Should remove the plugin and remove the routes', async function () {
await server.plugins.uninstall({ npmName: 'peertube-plugin-test-five' }) await server.plugins.uninstall({ npmName: 'peertube-plugin-test-five' })

View File

@ -54,6 +54,7 @@ declare module 'express' {
export interface Request { export interface Request {
query: any query: any
method: HttpMethodType method: HttpMethodType
rawBody: Buffer // Allow plugin routes to access the raw body
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -211,6 +211,10 @@ app.use(express.json({
message: 'Invalid digest' message: 'Invalid digest'
}) })
} }
if (req.originalUrl.startsWith('/plugins/')) {
req.rawBody = buf
}
} }
})) }))

View File

@ -247,7 +247,7 @@ function register ({
router.get('/ping', (req, res) => res.json({ message: 'pong' })) router.get('/ping', (req, res) => res.json({ message: 'pong' }))
// Users are automatically authenticated // Users are automatically authenticated
router.get('/auth', async (res, res) => { router.get('/auth', async (req, res) => {
const user = await peertubeHelpers.user.getAuthUser(res) const user = await peertubeHelpers.user.getAuthUser(res)
const isAdmin = user.role === 0 const isAdmin = user.role === 0
@ -261,6 +261,15 @@ function register ({
isUser isUser
}) })
}) })
router.post('/webhook', async (req, res) => {
const rawBody = req.rawBody // Buffer containing the raw body
handleRawBody(rawBody)
res.status(204)
})
} }
``` ```