trusted-setup-server/server/controllers/contributions.js

90 lines
2.7 KiB
JavaScript
Raw Normal View History

2020-01-29 12:30:50 +01:00
const fs = require('fs').promises
const path = require('path')
const util = require('util')
const exec = util.promisify(require('child_process').exec)
2020-01-30 15:00:34 +01:00
const aws = require('aws-sdk')
2020-01-29 12:30:50 +01:00
const express = require('express')
const { Mutex } = require('async-mutex')
2020-01-29 17:59:37 +01:00
const multer = require('multer')
2020-01-30 15:00:34 +01:00
const mutex = new Mutex()
const s3 = new aws.S3()
const router = express.Router()
2020-01-29 17:59:37 +01:00
const Contribution = require('../models/contributions.model.js')
const upload = multer({ dest: '/tmp/tornado' })
2020-01-29 12:30:50 +01:00
2020-01-30 15:00:34 +01:00
async function uploadToS3({ filename }) {
const currentContributionIndex = await Contribution.currentContributionIndex()
const fileContent = await fs.readFile(`/tmp/tornado/${filename}`)
return s3
.upload({
Bucket: process.env.AWS_S3_BUCKET,
Key: `response_${currentContributionIndex}`,
ACL: 'public-read',
Body: fileContent
})
.promise()
}
2020-01-29 12:30:50 +01:00
2020-01-29 17:59:37 +01:00
async function verifyResponse({ filename }) {
2020-01-29 12:30:50 +01:00
console.log('Running verifier')
const { stdout, stderr } = await exec(
2020-01-31 18:03:09 +01:00
`../bin/phase2_verify_contribution circuit.json current.params /tmp/tornado/${filename}`,
2020-01-29 17:59:37 +01:00
{
cwd: './server/snark_files/',
env: { RUST_BACKTRACE: 1 }
2020-01-29 12:30:50 +01:00
}
)
console.log(stdout)
console.error(stderr)
}
router.get('/challenge', (req, res) => {
res.sendFile('./snark_files/current.params', { root: path.join(__dirname, '../') })
})
router.get('/contributions', async (req, res) => {
const contributions = await Contribution.getContributions()
res.json(contributions).send()
})
2020-01-29 17:59:37 +01:00
router.post('/response', upload.single('response'), async (req, res) => {
if (!req.file) {
2020-01-29 12:30:50 +01:00
res.status(400).send('Missing response file')
return
}
await mutex.runExclusive(async () => {
const currentContributionIndex = await Contribution.currentContributionIndex()
try {
console.log(`Started processing contribution ${currentContributionIndex}`)
2020-01-29 17:59:37 +01:00
await verifyResponse({ filename: req.file.filename })
2020-01-29 12:30:50 +01:00
} catch (e) {
console.error('Error', e)
res.status(422).send(e.toString())
2020-01-29 17:59:37 +01:00
return
2020-01-29 12:30:50 +01:00
}
try {
console.log('Contribution is correct, uploading to storage')
2020-01-30 15:00:34 +01:00
if (process.env.DISABLE_S3 !== 'true') {
await uploadToS3({ filename: req.file.filename })
}
2020-01-29 12:30:50 +01:00
console.log('Committing changes')
2020-01-29 17:59:37 +01:00
await fs.rename(`/tmp/tornado/${req.file.filename}`, './server/snark_files/current.params')
2020-01-29 12:30:50 +01:00
await Contribution.insertContributionInfo(
req.body ? req.body.name || null : null,
req.body ? req.body.company || null : null
)
console.log('Finished')
2020-02-05 11:53:45 +01:00
res.json({ contributionIndex: currentContributionIndex })
2020-01-29 12:30:50 +01:00
} catch (e) {
console.error('Error', e)
res.status(503).send(e.toString())
}
})
})
2020-01-29 17:59:37 +01:00
module.exports = router