UNPKG

7.08 kBJavaScriptView Raw
1'use strict';
2
3var _assign = require('babel-runtime/core-js/object/assign');
4
5var _assign2 = _interopRequireDefault(_assign);
6
7function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
9/*!
10 * Copyright (c) 2015-2017 Cisco Systems, Inc. See LICENSE file.
11 */
12
13/* eslint max-nested-callbacks: [2, 3] */
14/* eslint no-console: [0] */
15
16var btoa = require('btoa');
17var bodyParser = require('body-parser');
18var browserify = require('browserify-middleware');
19var compression = require('compression');
20var cors = require('cors');
21var express = require('express');
22var fs = require('fs');
23var glob = require('glob');
24var http = require('http');
25var morgan = require('morgan');
26var path = require('path');
27var querystring = require('querystring');
28var request = require('request');
29var url = require('url');
30var base64 = require('urlsafe-base64');
31
32var app = express();
33
34// Configure Logging
35// -----------------
36
37if (process.env.DEBUG) {
38 app.use(morgan('short', {
39 immediate: true
40 }));
41}
42
43// Configure CORS
44// --------------
45
46app.use(cors({
47 credentials: true,
48 origin: function origin(o, callback) {
49 callback(null, true);
50 }
51}));
52
53// Configure body processing
54// -------------------------
55
56app.use(bodyParser.raw({ type: 'image/*' }));
57
58// Enable gzip/deflate
59// -------------------
60
61app.use(compression());
62
63// Close all connections
64// ---------------------
65
66// This *should* help tests run faster in IE, which has a very low number of
67// allowed connections to the same origin.
68app.use(function (req, res, next) {
69 res.set('connection', 'close');
70 next();
71});
72
73// Configure Browserify
74// --------------------
75
76var appPattern = 'packages/node_modules/{*,*/*}/test/automation/fixtures/app.js';
77
78glob.sync(appPattern).forEach(function (appjs) {
79 var packageName = appjs.replace('packages/node_modules/', '').replace('/test/automation/fixtures/app.js', '');
80
81 // eslint-disable-next-line no-sync
82 fs.statSync(appjs);
83 app.use('/' + packageName + '/app.js', browserify(appjs, {
84 debug: true,
85 transform: ['babelify', 'envify']
86 }));
87});
88
89// Enable active routes
90// --------------------
91
92app.get('/', function (req, res) {
93 res.send('<!DOCTYPE html>\n<html>\n <head>\n <title>Redirect Dispatcher</title>\n <script>\n try {\n var state = /state=(.+?)(&.*)?$/.exec(window.location)[1]\n console.info(\'state\', state);\n var name = JSON.parse(atob(state)).name;\n console.info(\'name\', name);\n window.location.pathname = name;\n }\n catch(err) {\n console.warn(err);\n }\n </script>\n </head>\n <body>\n\n </body>\n</html>');
94});
95
96app.use('/cookies', require('./cookies'));
97app.use('/json', require('./json'));
98app.use('/form', require('./form'));
99app.use('/files', require('./files'));
100app.use('/jwt', require('@ciscospark/test-helper-appid').router);
101
102app.get('/requires-basic-auth', function (req, res) {
103 if (req.headers.authorization === 'Basic ' + btoa('basicuser:basicpass')) {
104 res.status(200).send().end();
105 } else {
106 res.status(403).send().end();
107 }
108});
109
110app.get('/requires-bearer-auth', function (req, res) {
111 if (req.headers.authorization === 'Bearer bearertoken') {
112 res.status(200).send().end();
113 } else {
114 res.status(403).send().end();
115 }
116});
117
118app.get('/return-qs-as-object', function (req, res) {
119 res.status(200).json(req.query).end();
120});
121
122app.get('/embargoed', function (req, res) {
123 res.status(451).end();
124});
125
126// Enable static routes
127// --------------------
128
129var fixturePattern = 'packages/node_modules/{*,*/*}/test/automation/fixtures';
130
131glob.sync(fixturePattern).forEach(function (fixturePath) {
132 var packageName = fixturePath.replace('packages/node_modules/', '').replace('/test/automation/fixtures', '');
133
134 app.get('/' + packageName, function (req, res, next) {
135 if (!req.query.code) {
136 next();
137 return;
138 }
139
140 var state = JSON.parse(base64.decode(req.query.state));
141 if (state.exchange === false) {
142 next();
143 return;
144 }
145
146 request({
147 /* eslint-disable camelcase */
148 method: 'POST',
149 uri: (process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com') + '/idb/oauth2/v1/access_token',
150 form: {
151 grant_type: 'authorization_code',
152 redirect_uri: process.env.CISCOSPARK_REDIRECT_URI,
153 code: req.query.code,
154 self_contained_token: true
155 },
156 auth: {
157 user: process.env.CISCOSPARK_CLIENT_ID,
158 pass: process.env.CISCOSPARK_CLIENT_SECRET,
159 sendImmediately: true
160 /* eslint-enable camelcase */
161 } }, function (err, response) {
162 if (err) {
163 console.warn('Request to CI failed with non-HTTP error');
164 next(err);
165 return;
166 }
167 if (response.statusCode >= 400) {
168 console.warn('Got unexpected response from CI');
169 next(new Error(response.body));
170 return;
171 }
172 var redirect = url.parse(req.url, true);
173 var qs = querystring.stringify((0, _assign2.default)({ state: req.query.state }, JSON.parse(response.body)));
174 redirect = redirect.pathname + '#' + qs;
175
176 console.info('redirecting to ' + redirect);
177 res.redirect(redirect);
178 });
179 });
180 app.use('/' + packageName, express.static(fixturePath));
181});
182
183app.post('/refresh', bodyParser.json(), function (req, res, next) {
184 if (!req.body.refresh_token) {
185 next(new Error('`refresh_token` is required'));
186 return;
187 }
188 console.info('Refreshing access token');
189 request({
190 /* eslint-disable camelcase */
191 method: 'POST',
192 uri: (process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com') + '/idb/oauth2/v1/access_token',
193 form: {
194 grant_type: 'refresh_token',
195 redirect_uri: process.env.CISCOSPARK_REDIRECT_URI,
196 refresh_token: req.body.refresh_token
197 },
198 auth: {
199 user: process.env.CISCOSPARK_CLIENT_ID,
200 pass: process.env.CISCOSPARK_CLIENT_SECRET,
201 sendImmediately: true
202 /* eslint-enable camelcase */
203 } }, function (err, response) {
204 if (err) {
205 console.warn('Request to CI failed with non-HTTP error');
206 next(err);
207 return;
208 }
209 if (response.statusCode >= 400) {
210 console.warn('Got unexpected response from CI');
211 next(new Error(response.body));
212 return;
213 }
214
215 console.info('Returning new access token');
216 res.status(200).json(JSON.parse(response.body)).end();
217 });
218});
219
220app.use(express.static(path.resolve(__dirname, '..', 'static')));
221
222// Start the server
223// ----------------
224
225var port = parseInt(process.env.SERVER_PORT, 10) || 8000;
226http.createServer(app).listen(port, function () {
227 console.log('Express server listening on port ' + port);
228});
229
230var fixtureport = parseInt(process.env.FIXTURE_PORT, 10) || 3000;
231http.createServer(app).listen(fixtureport, function () {
232 console.log('Express server listening on port ' + fixtureport);
233});
234
235var corsport = parseInt(process.env.CORS_PORT, 10) || 3002;
236http.createServer(app).listen(corsport, function () {
237 console.log('Express server listening on port ' + corsport);
238});
239//# sourceMappingURL=index.js.map