Synchronize saved GitHub user tokens

Issue #529.

Having a server down breaks the process currently. That will be addressed in a
later commit.
This commit is contained in:
Thaddee Tyl 2016-05-30 23:12:07 +02:00
parent 419483f24e
commit c403e367f7
2 changed files with 27 additions and 8 deletions

View File

@ -4,13 +4,16 @@
var querystring = require('querystring'); var querystring = require('querystring');
var request = require('request'); var request = require('request');
var autosave = require('json-autosave'); var autosave = require('json-autosave');
var githubUserTokens = autosave('github-user-tokens.json', {data:[]});
var serverSecrets; var serverSecrets;
try { try {
// Everything that cannot be checked in but is useful server-side // Everything that cannot be checked in but is useful server-side
// is stored in this JSON data. // is stored in this JSON data.
serverSecrets = require('../secret.json'); serverSecrets = require('../secret.json');
} catch(e) {} } catch(e) {}
var githubUserTokens;
autosave('github-user-tokens.json', {data:[]}).then(function(f) {
githubUserTokens = f;
}).catch(function(e) { console.error('Could not create github-user-tokens.json'); });
function setRoutes(server) { function setRoutes(server) {
server.route(/^\/github-auth$/, function(data, match, end, ask) { server.route(/^\/github-auth$/, function(data, match, end, ask) {
@ -46,8 +49,7 @@ function setRoutes(server) {
}), }),
method: 'POST', method: 'POST',
}; };
console.log(JSON.stringify(options)); request(options, function(err, res, body) {
request.post(options, function(err, res, body) {
if (err != null) { return end('The connection to GitHub failed'); } if (err != null) { return end('The connection to GitHub failed'); }
try { try {
var content = querystring.parse(body); var content = querystring.parse(body);
@ -58,35 +60,52 @@ function setRoutes(server) {
} }
console.log('GitHub OAuth: ' + token); console.log('GitHub OAuth: ' + token);
// FIXME: synchronize things in the background.
// Send the token to all of those IPs. // Send the token to all of those IPs.
var ips = serverSecrets.shieldsIps; var ips = serverSecrets.shieldsIps;
Promise.all(ips.map(function(ip) { Promise.all(ips.map(function(ip) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var options = { var options = {
uri: 'https://' + ip + '/github-auth/add-token', url: 'https://' + ip + '/github-auth/add-token',
method: 'POST', method: 'POST',
form: { form: {
shieldsSecret: serverSecrets.shieldsSecret, shieldsSecret: serverSecrets.shieldsSecret,
token: token, token: token,
}, },
// We target servers by IP, and we use HTTPS. Assuming that
// 1. Internet routers aren't hacked, and
// 2. We don't unknowingly lose our IP to someone else,
// we're not leaking people's and our information.
// (If we did, it would have no impact, as we only ask for a token,
// no GitHub scope. The malicious entity would only be able to use
// our rate limit pool.)
// FIXME: use letsencrypt.
strictSSL: false,
}; };
request.post(options, function(err, res, body) { request(options, function(err, res, body) {
if (err != null) { return reject('Posting the GitHub user token failed'); } if (err != null) { return reject('Posting the GitHub user token failed: ' + err.stack); }
resolve(); resolve();
}); });
}); });
})).then(function() { })).then(function() {
end('Done!'); end('Done!');
}).catch(function(e) {
console.error('GitHub user token transmission failed:', e);
end('Horror! Something went wrong. Please try again.');
}); });
}); });
}); });
server.route(/^\/github-auth\/add-token$/, function(data, match, end, ask) { server.route(/^\/github-auth\/add-token$/, function(data, match, end, ask) {
console.log('GitHub add token called with', JSON.stringify(data));
if (data.shieldsSecret !== serverSecrets.shieldsSecret) { if (data.shieldsSecret !== serverSecrets.shieldsSecret) {
// An unknown entity tries to connect. Let the connection linger for a minute. // An unknown entity tries to connect. Let the connection linger for a minute.
return setTimeout(function() { end('Invalid secret'); }, 60000); return setTimeout(function() { end('Invalid secret'); }, 60000);
} }
// Insert it only if it is not registered yet.
if (githubUserTokens.data.indexOf(data.token) === -1) {
githubUserTokens.data.push(data.token); githubUserTokens.data.push(data.token);
}
end('Thanks!'); end('Thanks!');
}); });
}; };

View File

@ -28,7 +28,7 @@
"bower": "~1.4.1", "bower": "~1.4.1",
"promise": "~7.0.0", "promise": "~7.0.0",
"chrome-web-store-item-property": "^1.1.2", "chrome-web-store-item-property": "^1.1.2",
"json-autosave": "~1.1.0" "json-autosave": "~1.1.1"
}, },
"devDependencies": { "devDependencies": {
"ass": "~0.0.6", "ass": "~0.0.6",