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
This commit is contained in:
parent
107e6e73a6
commit
1b323f4f65
5 changed files with 37 additions and 1 deletions
|
@ -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 () {
|
||||||
|
|
|
@ -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' })
|
||||||
|
|
||||||
|
|
1
server/core/types/express.d.ts
vendored
1
server/core/types/express.d.ts
vendored
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
@ -211,6 +211,10 @@ app.use(express.json({
|
||||||
message: 'Invalid digest'
|
message: 'Invalid digest'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (req.originalUrl.startsWith('/plugins/')) {
|
||||||
|
req.rawBody = buf
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue