diff --git a/spec/TwitterAuth.spec.js b/spec/TwitterAuth.spec.js new file mode 100644 index 00000000..0c0de56e --- /dev/null +++ b/spec/TwitterAuth.spec.js @@ -0,0 +1,50 @@ +let twitter = require('../src/authDataManager/twitter'); + +describe('Twitter Auth', () => { + it('should use the proper configuration', () => { + // Multiple options, consumer_key found + expect(twitter.handleMultipleConfigurations({ + consumer_key: 'hello', + }, [{ + consumer_key: 'hello' + }, { + consumer_key: 'world' + }]).consumer_key).toEqual('hello') + + // Multiple options, consumer_key not found + expect(function(){ + twitter.handleMultipleConfigurations({ + consumer_key: 'some', + }, [{ + consumer_key: 'hello' + }, { + consumer_key: 'world' + }]); + }).toThrow(); + + // Multiple options, consumer_key not found + expect(function(){ + twitter.handleMultipleConfigurations({ + auth_token: 'token', + }, [{ + consumer_key: 'hello' + }, { + consumer_key: 'world' + }]); + }).toThrow(); + + // Single configuration and consumer_key set + expect(twitter.handleMultipleConfigurations({ + consumer_key: 'hello', + }, { + consumer_key: 'hello' + }).consumer_key).toEqual('hello'); + + // General case, only 1 config, no consumer_key set + expect(twitter.handleMultipleConfigurations({ + auth_token: 'token', + }, { + consumer_key: 'hello' + }).consumer_key).toEqual('hello'); + }); +}); \ No newline at end of file diff --git a/src/authDataManager/twitter.js b/src/authDataManager/twitter.js index 8de2fca5..20d73a39 100644 --- a/src/authDataManager/twitter.js +++ b/src/authDataManager/twitter.js @@ -1,9 +1,11 @@ // Helper functions for accessing the twitter API. var OAuth = require('./OAuth1Client'); var Parse = require('parse/node').Parse; +var logger = require('../logger').default; // Returns a promise that fulfills iff this user id is valid. function validateAuthData(authData, options) { + options = handleMultipleConfigurations(authData, options); var client = new OAuth(options); client.host = "api.twitter.com"; client.auth_token = authData.auth_token; @@ -24,7 +26,28 @@ function validateAppId() { return Promise.resolve(); } +function handleMultipleConfigurations(authData, options) { + if (Array.isArray(options)) { + let consumer_key = authData.consumer_key; + if (!consumer_key) { + logger.error('Twitter Auth', 'Multiple twitter configurations are available, by no consumer_key was sent by the client.'); + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.'); + } + options = options.filter((option) => { + return option.consumer_key == consumer_key; + }); + + if (options.length == 0) { + logger.error('Twitter Auth','Cannot find a configuration for the provided consumer_key'); + throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Twitter auth is invalid for this user.'); + } + options = options[0]; + } + return options; +} + module.exports = { - validateAppId: validateAppId, - validateAuthData: validateAuthData + validateAppId, + validateAuthData, + handleMultipleConfigurations };