Gitter migration: Setup redirects (rollout pt. 3)
[gitter.git] / server / web / validate-user-agent-from-req.js
blob5cb9d5c96a1395ebe9c7734c4796160c4bf013b9
1 'use strict';
3 var Promise = require('bluebird');
4 var env = require('gitter-web-env');
5 var nconf = env.config;
6 var logger = env.logger;
7 var errorReporter = env.errorReporter;
8 var StatusError = require('statuserror');
9 var checkAlreadyOnUnauthorizedUrl = require('../utils/check-already-on-unauthorized-url');
11 const revokedUserAgents = [].concat(nconf.get('revokedUserAgents'));
13 function validateUserAgentFromReq(req) {
14   let isUserAgentValid = true;
15   try {
16     // We would be safe without this check but this is just a pre-optimization to avoid going through the logic below
17     if (!revokedUserAgents || revokedUserAgents.length === 0) return true;
19     // If they are missing a user-agent then let them pass because we have nothing to filter on
20     if (!req || !req.headers) return true;
21     var useragentHeader = req.headers['user-agent'];
22     if (!useragentHeader) return true;
24     // We already redirected them to the only page they can visit
25     var alreadyOnUnauthorizedUrl = checkAlreadyOnUnauthorizedUrl(req.url);
26     if (alreadyOnUnauthorizedUrl) return true;
28     isUserAgentValid = !revokedUserAgents.some(needle => {
29       return useragentHeader.includes(needle);
30     });
31   } catch (err) {
32     errorReporter(err, {}, { module: 'validate-user-agent-from-req' });
34     // Just let them through if it's our fault
35     return true;
36   }
38   if (!isUserAgentValid) {
39     logger.warn('user-agent can not be accepted (matches revoked user-agent): ', {
40       userAgent: useragentHeader
41     });
43     var err = new StatusError(401, 'user-agent is not allowed');
44     err.revokedUserAgent = true;
45     throw err;
46   }
49 module.exports = Promise.method(validateUserAgentFromReq);