Merge branch 'release/21.49.0' into master
[gitter.git] / modules / invites / lib / invite-validation.js
blobc3cf4c213743c4ab00cae73c392f56153f193f88
1 'use strict';
3 var StatusError = require('statuserror');
4 var identityService = require('gitter-web-identity');
5 var avatars = require('gitter-web-avatars');
7 /**
8  * Hide the resolved email address from the caller
9  */
10 function maskEmail(email) {
11   return email
12     .split('@')
13     .map(function(item, index) {
14       if (index === 0) {
15         var gmailMagic = item.split('+')[0];
16         return gmailMagic.slice(0, -8) + '****';
17       }
18       return item;
19     })
20     .join('@');
23 function validateIsString(value) {
24   if (value && typeof value !== 'string') {
25     throw new StatusError(400);
26   }
28   return value;
31 function parseAndValidateInput(input) {
32   // Check for new cleaner method first...
33   if (input.type) {
34     if (!input.externalId) throw new StatusError(400);
36     switch (input.type) {
37       case 'email':
38         return {
39           type: input.type,
40           externalId: input.emailAddress,
41           emailAddress: input.emailAddress
42         };
44       case 'gitter':
45       case identityService.GITHUB_IDENTITY_PROVIDER:
46       case identityService.GITLAB_IDENTITY_PROVIDER:
47       case identityService.TWITTER_IDENTITY_PROVIDER:
48         return {
49           type: input.type,
50           externalId: input.externalId,
51           emailAddress: input.emailAddress
52         };
53       default:
54         throw new StatusError(400);
55     }
56   }
58   // Older (crappier) method
59   var types = {};
61   function addUserIdentifer(identifier, key) {
62     var value = input[key];
63     if (!value) return;
65     if (typeof value !== 'string') {
66       throw new StatusError(400);
67     }
69     types[identifier] = value;
70   }
72   addUserIdentifer('gitter', 'username');
73   addUserIdentifer(identityService.GITHUB_IDENTITY_PROVIDER, 'githubUsername');
74   addUserIdentifer(identityService.GITLAB_IDENTITY_PROVIDER, 'gitlabUsername');
75   // TODO: this doesn't actually work in the rest if the invites code
76   addUserIdentifer(identityService.TWITTER_IDENTITY_PROVIDER, 'twitterUsername');
78   var emailAddress = validateIsString(input.email);
80   var keys = Object.keys(types);
82   // You can't specify more than one username
83   if (keys.length > 1) throw new StatusError(400);
85   var type, externalId;
87   if (keys.length) {
88     // Provided the username from an external service, and
89     // optionally an email address
90     type = keys[0];
91     externalId = types[type];
92   } else {
93     // No external username provided. Use the email address if it exists.
94     if (!emailAddress) throw new StatusError(400);
95     type = 'email';
96     externalId = emailAddress;
97   }
99   return {
100     type: type,
101     externalId: externalId,
102     emailAddress: emailAddress
103   };
106 function getAvatar(type, externalId, resolvedEmailAddress) {
107   // TODO: what about an arbitrary gitter user?
109   if (type === identityService.GITHUB_IDENTITY_PROVIDER) {
110     return avatars.getForGitHubUsername(externalId);
111   }
113   // TODO: what about a twitter user? At least one that has signed up.
114   // TODO: what about a gitlab user? At least one that has signed up.
116   if (resolvedEmailAddress) {
117     return avatars.getForGravatarEmail(resolvedEmailAddress);
118   }
120   return avatars.getDefault();
123 module.exports = {
124   parseAndValidateInput: parseAndValidateInput,
125   // or should these be elsewhere?
126   maskEmail: maskEmail,
127   getAvatar: getAvatar