/** * Copyright JS Foundation and other contributors, http://js.foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ var util = require("util"); var clone = require("clone"); var bcrypt; try { bcrypt = require('bcrypt'); } catch(e) { bcrypt = require('bcryptjs'); } var users = {}; var defaultUser = null; function authenticate() { var username = arguments[0]; if (typeof username !== 'string') { username = username.username; } const args = Array.from(arguments); return api.get(username).then(function(user) { if (user) { if (args.length === 2) { // Username/password authentication var password = args[1]; return new Promise(function(resolve,reject) { bcrypt.compare(password, user.password, function(err, res) { resolve(res?cleanUser(user):null); }); }); } else { // Try to extract common profile information if (args[0].hasOwnProperty('photos') && args[0].photos.length > 0) { user.image = args[0].photos[0].value; } return cleanUser(user); } } return null; }); } function get(username) { return Promise.resolve(users[username]); } function getDefaultUser() { return Promise.resolve(null); } var api = { get: wrapperGetUserFromSettings(get), authenticate: authenticate, default: getDefaultUser } var apiAccessUsers = {}; function wrapperGetUserFromSettings (getFunc) { return function (username) { if (apiAccessUsers[username]) { return Promise.resolve(apiAccessUsers[username]); } else { return getFunc(username); } }; } function init(config, apiAccessTokensSettings) { users = {}; defaultUser = null; apiAccessUsers = apiAccessTokensSettings.reduce(function (prev, current) { if (current.username) { prev[current.username] = current.username; } return prev; }, {}); if (config.type == "credentials" || config.type == "strategy") { if (config.users) { if (typeof config.users === "function") { api.get = wrapperGetUserFromSettings(config.users); } else { var us = config.users; /* istanbul ignore else */ if (!util.isArray(us)) { us = [us]; } for (var i=0;i