import loadAdapter from '../AdapterLoader'; const apple = require('./apple'); const gcenter = require('./gcenter'); const gpgames = require('./gpgames'); const facebook = require('./facebook'); const instagram = require('./instagram'); const linkedin = require('./linkedin'); const meetup = require('./meetup'); const google = require('./google'); const github = require('./github'); const twitter = require('./twitter'); const spotify = require('./spotify'); const digits = require('./twitter'); // digits tokens are validated by twitter const janrainengage = require('./janrainengage'); const janraincapture = require('./janraincapture'); const line = require('./line'); const vkontakte = require('./vkontakte'); const qq = require('./qq'); const wechat = require('./wechat'); const weibo = require('./weibo'); const oauth2 = require('./oauth2'); const phantauth = require('./phantauth'); const microsoft = require('./microsoft'); const keycloak = require('./keycloak'); const ldap = require('./ldap'); const anonymous = { validateAuthData: () => { return Promise.resolve(); }, validateAppId: () => { return Promise.resolve(); }, }; const providers = { apple, gcenter, gpgames, facebook, instagram, linkedin, meetup, google, github, twitter, spotify, anonymous, digits, janrainengage, janraincapture, line, vkontakte, qq, wechat, weibo, phantauth, microsoft, keycloak, ldap, }; function authDataValidator(adapter, appIds, options) { return function (authData) { return adapter.validateAuthData(authData, options).then(() => { if (appIds) { return adapter.validateAppId(appIds, authData, options); } return Promise.resolve(); }); }; } function loadAuthAdapter(provider, authOptions) { let defaultAdapter = providers[provider]; const providerOptions = authOptions[provider]; if ( providerOptions && Object.prototype.hasOwnProperty.call(providerOptions, 'oauth2') && providerOptions['oauth2'] === true ) { defaultAdapter = oauth2; } if (!defaultAdapter && !providerOptions) { return; } const adapter = Object.assign({}, defaultAdapter); const appIds = providerOptions ? providerOptions.appIds : undefined; // Try the configuration methods if (providerOptions) { const optionalAdapter = loadAdapter(providerOptions, undefined, providerOptions); if (optionalAdapter) { ['validateAuthData', 'validateAppId'].forEach(key => { if (optionalAdapter[key]) { adapter[key] = optionalAdapter[key]; } }); } } // TODO: create a new module from validateAdapter() in // src/Controllers/AdaptableController.js so we can use it here for adapter // validation based on the src/Adapters/Auth/AuthAdapter.js expected class // signature. if (!adapter.validateAuthData || !adapter.validateAppId) { return; } return { adapter, appIds, providerOptions }; } module.exports = function (authOptions = {}, enableAnonymousUsers = true) { let _enableAnonymousUsers = enableAnonymousUsers; const setEnableAnonymousUsers = function (enable) { _enableAnonymousUsers = enable; }; // To handle the test cases on configuration const getValidatorForProvider = function (provider) { if (provider === 'anonymous' && !_enableAnonymousUsers) { return; } const { adapter, appIds, providerOptions } = loadAuthAdapter(provider, authOptions); return authDataValidator(adapter, appIds, providerOptions); }; return Object.freeze({ getValidatorForProvider, setEnableAnonymousUsers, }); }; module.exports.loadAuthAdapter = loadAuthAdapter;