index.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. const express = require('express');
  2. const router = express.Router();
  3. const request = require('request');
  4. const config = require('../config');
  5. const { badge } = require('../lib/badge');
  6. const sanitize = require('sanitize');
  7. router.get('/', function(req, res) {
  8. res.setLocale(config.locale);
  9. res.render('index', { community: config.community,
  10. tokenRequired: !!config.inviteToken,
  11. recaptchaSiteKey: config.recaptchaSiteKey });
  12. });
  13. router.post('/invite', function(req, res) {
  14. if (req.body.email && (!config.inviteToken || (!!config.inviteToken && req.body.token === config.inviteToken))) {
  15. function doInvite() {
  16. request.post({
  17. url: 'https://'+ config.slackUrl + '/api/users.admin.invite',
  18. form: {
  19. email: req.body.email,
  20. token: config.slacktoken,
  21. set_active: true
  22. }
  23. }, function(err, httpResponse, body) {
  24. // body looks like:
  25. // {"ok":true}
  26. // or
  27. // {"ok":false,"error":"already_invited"}
  28. if (err) { return res.send('Error:' + err); }
  29. body = JSON.parse(body);
  30. if (body.ok) {
  31. res.render('result', {
  32. community: config.community,
  33. message: 'Success! Check “'+ req.body.email +'” for an invite from Slack.'
  34. });
  35. } else {
  36. let error = body.error;
  37. if (error === 'already_invited' || error === 'already_in_team') {
  38. res.render('result', {
  39. community: config.community,
  40. message: 'Success! You were already invited.<br>' +
  41. 'Visit <a href="https://'+ config.slackUrl +'">'+ config.community +'</a>'
  42. });
  43. return;
  44. } else if (error === 'invalid_email') {
  45. error = 'The email you entered is an invalid email.';
  46. } else if (error === 'invalid_auth') {
  47. error = 'Something has gone wrong. Please contact a system administrator.';
  48. }
  49. res.render('result', {
  50. community: config.community,
  51. message: 'Failed! ' + error,
  52. isFailed: true
  53. });
  54. }
  55. });
  56. }
  57. if (!!config.recaptchaSiteKey && !!config.recaptchaSecretKey) {
  58. request.post({
  59. url: 'https://www.google.com/recaptcha/api/siteverify',
  60. form: {
  61. response: req.body['g-recaptcha-response'],
  62. secret: config.recaptchaSecretKey
  63. }
  64. }, function(err, httpResponse, body) {
  65. if (typeof body === "string") {
  66. body = JSON.parse(body);
  67. }
  68. if (body.success) {
  69. doInvite();
  70. } else {
  71. error = 'Invalid captcha.';
  72. res.render('result', {
  73. community: config.community,
  74. message: 'Failed! ' + error,
  75. isFailed: true
  76. });
  77. }
  78. });
  79. } else {
  80. doInvite();
  81. }
  82. } else {
  83. const errMsg = [];
  84. if (!req.body.email) {
  85. errMsg.push('your email is required');
  86. }
  87. if (!!config.inviteToken) {
  88. if (!req.body.token) {
  89. errMsg.push('valid token is required');
  90. }
  91. if (req.body.token && req.body.token !== config.inviteToken) {
  92. errMsg.push('the token you entered is wrong');
  93. }
  94. }
  95. res.render('result', {
  96. community: config.community,
  97. message: 'Failed! ' + errMsg.join(' and ') + '.',
  98. isFailed: true
  99. });
  100. }
  101. });
  102. router.get('/badge.svg', (req, res) => {
  103. request.get({
  104. url: 'https://'+ config.slackUrl + '/api/users.list',
  105. qs: {
  106. token: config.slacktoken,
  107. presence: true
  108. }
  109. }, function(err, httpResponse, body) {
  110. try {
  111. body = JSON.parse(body);
  112. } catch(e) {
  113. return res.status(404).send('');
  114. }
  115. if (!body.members) {
  116. return res.status(404).send('');
  117. }
  118. const members = body.members.filter(function(m) {
  119. return !m.is_bot;
  120. });
  121. const total = members.length;
  122. const presence = members.filter(function(m) {
  123. return m.presence === 'active';
  124. }).length;
  125. const hexColor = /^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
  126. sanitize.middleware.mixinFilters(req);
  127. res.type('svg');
  128. res.set('Cache-Control', 'max-age=0, no-cache');
  129. res.set('Pragma', 'no-cache');
  130. res.send(
  131. badge(
  132. presence,
  133. total,
  134. req.queryPattern('colorA', hexColor),
  135. req.queryPattern('colorB', hexColor)
  136. )
  137. );
  138. });
  139. });
  140. module.exports = router;