1 | 'use strict';
|
2 |
|
3 | var _assign = require('babel-runtime/core-js/object/assign');
|
4 |
|
5 | var _assign2 = _interopRequireDefault(_assign);
|
6 |
|
7 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | var btoa = require('btoa');
|
17 | var bodyParser = require('body-parser');
|
18 | var browserify = require('browserify-middleware');
|
19 | var compression = require('compression');
|
20 | var cors = require('cors');
|
21 | var express = require('express');
|
22 | var fs = require('fs');
|
23 | var glob = require('glob');
|
24 | var http = require('http');
|
25 | var morgan = require('morgan');
|
26 | var path = require('path');
|
27 | var querystring = require('querystring');
|
28 | var request = require('request');
|
29 | var url = require('url');
|
30 | var base64 = require('urlsafe-base64');
|
31 |
|
32 | var app = express();
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | if (process.env.DEBUG) {
|
38 | app.use(morgan('short', {
|
39 | immediate: true
|
40 | }));
|
41 | }
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | app.use(cors({
|
47 | credentials: true,
|
48 | origin: function origin(o, callback) {
|
49 | callback(null, true);
|
50 | }
|
51 | }));
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | app.use(bodyParser.raw({ type: 'image/*' }));
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | app.use(compression());
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 | app.use(function (req, res, next) {
|
69 | res.set('connection', 'close');
|
70 | next();
|
71 | });
|
72 |
|
73 |
|
74 |
|
75 |
|
76 | var appPattern = 'packages/node_modules/{*,*/*}/test/automation/fixtures/app.js';
|
77 |
|
78 | glob.sync(appPattern).forEach(function (appjs) {
|
79 | var packageName = appjs.replace('packages/node_modules/', '').replace('/test/automation/fixtures/app.js', '');
|
80 |
|
81 |
|
82 | fs.statSync(appjs);
|
83 | app.use('/' + packageName + '/app.js', browserify(appjs, {
|
84 | debug: true,
|
85 | transform: ['babelify', 'envify']
|
86 | }));
|
87 | });
|
88 |
|
89 |
|
90 |
|
91 |
|
92 | app.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 |
|
96 | app.use('/cookies', require('./cookies'));
|
97 | app.use('/json', require('./json'));
|
98 | app.use('/form', require('./form'));
|
99 | app.use('/files', require('./files'));
|
100 | app.use('/jwt', require('@ciscospark/test-helper-appid').router);
|
101 |
|
102 | app.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 |
|
110 | app.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 |
|
118 | app.get('/return-qs-as-object', function (req, res) {
|
119 | res.status(200).json(req.query).end();
|
120 | });
|
121 |
|
122 | app.get('/embargoed', function (req, res) {
|
123 | res.status(451).end();
|
124 | });
|
125 |
|
126 |
|
127 |
|
128 |
|
129 | var fixturePattern = 'packages/node_modules/{*,*/*}/test/automation/fixtures';
|
130 |
|
131 | glob.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 |
|
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 |
|
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 |
|
183 | app.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 |
|
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 |
|
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 |
|
220 | app.use(express.static(path.resolve(__dirname, '..', 'static')));
|
221 |
|
222 |
|
223 |
|
224 |
|
225 | var port = parseInt(process.env.SERVER_PORT, 10) || 8000;
|
226 | http.createServer(app).listen(port, function () {
|
227 | console.log('Express server listening on port ' + port);
|
228 | });
|
229 |
|
230 | var fixtureport = parseInt(process.env.FIXTURE_PORT, 10) || 3000;
|
231 | http.createServer(app).listen(fixtureport, function () {
|
232 | console.log('Express server listening on port ' + fixtureport);
|
233 | });
|
234 |
|
235 | var corsport = parseInt(process.env.CORS_PORT, 10) || 3002;
|
236 | http.createServer(app).listen(corsport, function () {
|
237 | console.log('Express server listening on port ' + corsport);
|
238 | });
|
239 |
|