Newer
Older
Lloyd Hilaiel
committed
const path = require('path'),
url = require('url'),
fs = require('fs'),
httputils = require('./lib/httputils.js'),
idassertion = require('./lib/idassertion.js'),
jwt = require('./lib/jwt.js'),
express = require('express');
logging = require('../libs/logging.js');
// create the var directory if it doesn't exist
var VAR_DIR = path.join(__dirname, "var");
try { fs.mkdirSync(VAR_DIR, 0755); } catch(e) { }
Lloyd Hilaiel
committed
Lloyd Hilaiel
committed
function doVerify(req, resp, next) {
var assertion = (req.query && req.query.assertion) ? req.query.assertion : req.body.assertion;
var audience = (req.query && req.query.audience) ? req.query.audience : req.body.audience;
Lloyd Hilaiel
committed
Lloyd Hilaiel
committed
if (!(assertion && audience))
return resp.json({ status: "failure", reason: "need assertion and audience" });
Lloyd Hilaiel
committed
// allow client side XHR to access this WSAPI, see
// https://developer.mozilla.org/en/http_access_control
// for details
// FIXME: should we really allow this? It might encourage the wrong behavior
resp.setHeader('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS') {
resp.setHeader('Access-Control-Allow-Methods', 'POST, GET');
Lloyd Hilaiel
committed
resp.writeHead(200);
resp.end();
return;
}
Lloyd Hilaiel
committed
try {
var assertionObj = new idassertion.IDAssertion(assertion);
assertionObj
.verify(
audience,
function(payload) {
type: 'verify',
result: 'success',
rp: payload.audience
});
Lloyd Hilaiel
committed
result = {
status : "okay",
email : payload.email,
audience : payload.audience,
"valid-until" : payload["valid-until"],
issuer : payload.issuer
};
Lloyd Hilaiel
committed
},
function(errorObj) {
type: 'verify',
result: 'failure',
rp: audience
});
resp.json({ status: "failure", reason: errorObj });
Lloyd Hilaiel
committed
}
);
} catch (e) {
console.log(e.stack);
type: 'verify',
result: 'failure',
rp: audience
});
resp.json({ status: "failure", reason: e.toString() });
Lloyd Hilaiel
committed
}
}
exports.varDir = VAR_DIR;
exports.setup = function(app) {
app.use(express.bodyParser());
Lloyd Hilaiel
committed
// code_update is an internal api that causes the node server to
// shut down. This should never be externally accessible and
// is used during the dead simple deployment procedure.
app.get("/code_update", function (req, resp) {
console.log("code updated. shutting down.");
process.exit();
});
Lloyd Hilaiel
committed
Lloyd Hilaiel
committed
// A simple ping hook for monitoring.
app.get("/ping.txt", function(req ,resp) {
resp.writeHead(200, {"Content-Type": "text/plain"})
resp.write("k.");
resp.end();
});
Lloyd Hilaiel
committed
Lloyd Hilaiel
committed
app.get('/', doVerify);
app.get('/verify', doVerify);
app.post('/', doVerify);
app.post('/verify', doVerify);