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

118 lines
3.5 KiB
JavaScript

const aws = require('aws-sdk')
const s3 = new aws.S3()
const fs = require('fs').promises
const path = require('path')
const util = require('util')
const exec = util.promisify(require('child_process').exec)
const express = require('express')
const router = express.Router()
const { Mutex } = require('async-mutex')
const mutex = new Mutex()
const Contribution = require('../models/contributions.model.js')
const oauth = require('oauth')
const consumer = new oauth.OAuth(
'https://twitter.com/oauth/request_token',
'https://twitter.com/oauth/access_token',
process.env.TWITTER_CONSUMER_KEY,
process.env.TWITTER_CONSUMER_SECRET,
'1.0A',
process.env.TWITTER_CALLBACK_URL,
'HMAC-SHA1')
async function uploadToS3(response) {
const currentContributionIndex = await Contribution.currentContributionIndex()
return await s3.upload({
Bucket: process.env.AWS_S3_BUCKET,
Key: `response_${currentContributionIndex}`,
ACL: 'public-read',
Body: response,
}).promise()
}
async function verifyResponse() {
console.log('Running verifier')
const { stdout, stderr } = await exec(
'../bin/verify_contribution circuit.json current.params /tmp/new.params', {
cwd: './snark_files/',
env: { 'RUST_BACKTRACE': 1 }
}
)
console.log(stdout)
console.error(stderr)
}
router.get('/', (req, res) => {
let userData
consumer.get(
'https://api.twitter.com/1.1/account/verify_credentials.json',
req.session.oauthAccessToken,
req.session.oauthAccessTokenSecret,
function (error, data,) {
if (error) {
console.log('error', error)
userData = { name: 'Anonymous' }
res.render('pages/index', { userData })
// res.send("Error getting twitter screen name : " + util.inspect(error), 500);
} else {
userData = JSON.parse(data)
req.session.twitterScreenName = userData.screen_name
res.render('pages/index', { userData })
}
})
})
// router.get('/dashboard') --> index
// router.get('/makeContribution')
// router.get('/autotizeContribution?token=asdfas')
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()
})
router.post('/response', async (req, res) => {
if (!req.files.response) {
res.status(400).send('Missing response file')
return
}
await mutex.runExclusive(async () => {
const currentContributionIndex = await Contribution.currentContributionIndex()
try {
console.log(`Started processing contribution ${currentContributionIndex}`)
await fs.writeFile('/tmp/new.params', req.files.response.data)
await verifyResponse()
} catch (e) {
console.error('Error', e)
res.status(422).send(e.toString())
}
try {
console.log('Contribution is correct, uploading to storage')
// await uploadToS3(req.files.response.data)
// await fs.copyFile(
// '/tmp/new.params',
// `./snark_files/response_${currentContributionIndex}`
// )
console.log('Committing changes')
await fs.rename('/tmp/new.params', './snark_files/current.params')
await Contribution.insertContributionInfo(
req.body ? req.body.name || null : null,
req.body ? req.body.company || null : null
)
console.log('Finished')
res.send()
} catch (e) {
console.error('Error', e)
res.status(503).send(e.toString())
}
})
})
module.exports = router