forked from mozilla/openbadges-backpack
-
Notifications
You must be signed in to change notification settings - Fork 0
/
demo.js
102 lines (92 loc) · 3.43 KB
/
demo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Controller for providing metadata for & awarding demo badges.
var qs = require('querystring');
var fs = require('fs');
var path = require('path');
var configuration = require('../lib/configuration');
var request = require('request');
var awardBadge = require('../lib/award');
var logger = require('../lib/logging').logger;
var protocol = configuration.get('protocol') || 'http';
var port = configuration.get('port') || '';
var ORIGIN = protocol + '://' + configuration.get('hostname') + (port ? ':' + port : '');
// Render the view for the demo badge issuer.
exports.issuer = function (req, res) {
res.render('issuer.html', {
login: false,
title: 'Demo Issuer',
csrfToken: req.session._csrf
});
};
// Bake & award a demo badge. Uses `demoBadge` below to generate a proper assertion.
exports.award = function (req, res) {
var assertionURL = encodeURIComponent([ORIGIN + '/demo/badge.json', qs.stringify(req.body)].join('?'));
var bakeURL = ORIGIN + '/baker?award=true&assertion=' + assertionURL;
request({url: bakeURL, encoding: 'binary'}, function (err, resp, body) {
res.send(Buffer(body, 'binary'), {'content-type': 'image/png'});
});
};
exports.massAward = function (req, res) {
if (!req.user) return res.send('nope');
var demoBadgeDir = path.join(process.cwd(), 'static', '_demo');
var email = req.user.get('email');
var salt = 'ballertime';
var hash = require('crypto').createHash('sha256').update(email + salt).digest('hex');
var recipient = 'sha256$' + hash;
fs.readdirSync(demoBadgeDir)
.map(function (f) {
var imgUrl = ORIGIN + '/static/_demo/' + f;
var assertion = makeDemoAssertion(recipient, imgUrl);
return {
imgData: fs.readFileSync(path.join(demoBadgeDir, f)),
assertion: assertion,
assertionUrl: ORIGIN + '/demo/badge.json?' + qs.stringify({title: 'raaad', image: imgUrl, recipient: recipient})
};
})
.forEach(function (item) {
awardBadge({
assertion: item.assertion,
url: item.assertionUrl,
imagedata: item.imgData,
recipient: email
});
});
res.redirect('/', 303);
};
// Create a demo badge. Optionally override default values by providing GET
// params. This less an avenue for fraud than it might look: the name will
// always contain "DEMO" and the issuer will always be the backpack host.
exports.demoBadge = function (req, res) {
var title = req.query.title;
var desc = req.query.description;
var recp = req.query.recipient || 'me@example.com';
var image = req.query.image || '/images/demo-badge.png';
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify(makeDemoAssertion(recp, image, title, desc)));
};
// Send back a bad assertion after a timeout to simulate latency.
exports.badBadge = function (req, res) {
setTimeout(function () {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({'this': 'is not a badge'}));
}, 200);
};
function makeDemoAssertion(email, image, title, description) {
return ({
recipient: email,
salt: 'ballertime',
evidence: '/demo/evidence',
expires: '2040-08-13',
issued_on: '2011-08-23',
badge: {
version: 'v0.5.0',
name: 'DEMO: ' + (title || 'Open Badges Demo Badge'),
description: description || 'For rocking in the "free world"',
image: image,
criteria: '/demo/criteria',
issuer: {
name: 'Open Badges Demo',
origin: ORIGIN
}
}
});
}