@hapi/bell 12.2.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +2 -1
- package/lib/index.js +5 -6
- package/lib/oauth.js +8 -5
- package/lib/providers/azure-legacy.js +5 -6
- package/lib/providers/azure.js +4 -5
- package/lib/providers/cognito.js +3 -3
- package/lib/providers/digitalocean.js +2 -2
- package/lib/providers/discord.js +5 -5
- package/lib/providers/facebook.js +1 -1
- package/lib/providers/foursquare.js +1 -1
- package/lib/providers/github.js +4 -6
- package/lib/providers/gitlab.js +4 -6
- package/lib/providers/instagram.js +1 -3
- package/lib/providers/linkedin.js +3 -3
- package/lib/providers/live.js +1 -1
- package/lib/providers/okta.js +4 -4
- package/lib/providers/phabricator.js +3 -3
- package/lib/providers/pingfed.js +4 -6
- package/lib/providers/salesforce.js +3 -3
- package/lib/providers/spotify.js +4 -6
- package/lib/providers/trakt.js +4 -5
- package/lib/providers/twitter.js +2 -2
- package/lib/providers/vk.js +2 -2
- package/lib/providers/yahoo.js +2 -2
- package/package.json +19 -13
    
        package/LICENSE.md
    CHANGED
    
    
    
        package/lib/index.js
    CHANGED
    
    | @@ -9,7 +9,7 @@ const Providers = require('./providers'); | |
| 9 9 |  | 
| 10 10 | 
             
            const internals = {
         | 
| 11 11 | 
             
                simulate: false,
         | 
| 12 | 
            -
                flexBoolean: Joi.boolean().truthy(' | 
| 12 | 
            +
                flexBoolean: Joi.boolean().truthy('yes', 1, '1').falsy('no', 0, '0')
         | 
| 13 13 | 
             
            };
         | 
| 14 14 |  | 
| 15 15 |  | 
| @@ -25,10 +25,9 @@ exports.oauth = OAuth; | |
| 25 25 | 
             
            exports.plugin = {
         | 
| 26 26 | 
             
                pkg: require('../package.json'),
         | 
| 27 27 | 
             
                requirements: {
         | 
| 28 | 
            -
                    hapi: '>= | 
| 28 | 
            +
                    hapi: '>=20.0.0'
         | 
| 29 29 | 
             
                },
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                register: function (server, options) {
         | 
| 30 | 
            +
                register: function (server) {
         | 
| 32 31 |  | 
| 33 32 | 
             
                    server.auth.scheme('bell', internals.implementation);
         | 
| 34 33 | 
             
                    server.expose('oauth', OAuth);
         | 
| @@ -128,7 +127,7 @@ internals.implementation = function (server, options) { | |
| 128 127 | 
             
                // Lookup provider
         | 
| 129 128 |  | 
| 130 129 | 
             
                if (typeof settings.provider === 'object') {
         | 
| 131 | 
            -
                    settings.name = settings.provider.name  | 
| 130 | 
            +
                    settings.name = settings.provider.name ?? 'custom';
         | 
| 132 131 | 
             
                }
         | 
| 133 132 | 
             
                else {
         | 
| 134 133 | 
             
                    settings.name = settings.provider;
         | 
| @@ -157,7 +156,7 @@ internals.implementation = function (server, options) { | |
| 157 156 | 
             
                    clearInvalid: true
         | 
| 158 157 | 
             
                };
         | 
| 159 158 |  | 
| 160 | 
            -
                settings.cookie = settings.cookie  | 
| 159 | 
            +
                settings.cookie = settings.cookie ?? `bell-${settings.name}`;
         | 
| 161 160 | 
             
                server.state(settings.cookie, cookieOptions);
         | 
| 162 161 |  | 
| 163 162 | 
             
                if (internals.simulate) {
         | 
    
        package/lib/oauth.js
    CHANGED
    
    | @@ -196,13 +196,13 @@ exports.v2 = function (settings) { | |
| 196 196 | 
             
                            }
         | 
| 197 197 | 
             
                        }
         | 
| 198 198 |  | 
| 199 | 
            -
                        let scope = settings.scope  | 
| 199 | 
            +
                        let scope = settings.scope ?? settings.provider.scope;
         | 
| 200 200 | 
             
                        if (typeof scope === 'function') {
         | 
| 201 201 | 
             
                            scope = scope(request);
         | 
| 202 202 | 
             
                        }
         | 
| 203 203 |  | 
| 204 204 | 
             
                        if (scope) {
         | 
| 205 | 
            -
                            query.scope = scope.join(settings.provider.scopeSeparator  | 
| 205 | 
            +
                            query.scope = scope.join(settings.provider.scopeSeparator ?? ' ');
         | 
| 206 206 | 
             
                        }
         | 
| 207 207 |  | 
| 208 208 | 
             
                        const state = {
         | 
| @@ -243,7 +243,7 @@ exports.v2 = function (settings) { | |
| 243 243 | 
             
                    credentials.query = state.query;
         | 
| 244 244 | 
             
                    h.unstate(cookie);
         | 
| 245 245 |  | 
| 246 | 
            -
                    const requestState = request.query.state  | 
| 246 | 
            +
                    const requestState = request.query.state ?? '';
         | 
| 247 247 | 
             
                    if (state.nonce !== requestState.substr(0, Math.min(requestState.length, internals.nonceLength))) {
         | 
| 248 248 | 
             
                        return h.unauthenticated(Boom.internal('Incorrect ' + name + ' state parameter'), { credentials });
         | 
| 249 249 | 
             
                    }
         | 
| @@ -393,9 +393,11 @@ exports.Client = internals.Client = function (options) { | |
| 393 393 | 
             
                    temporary: internals.Client.baseUri(options.provider.temporary),
         | 
| 394 394 | 
             
                    token: internals.Client.baseUri(options.provider.token),
         | 
| 395 395 | 
             
                    clientId: options.clientId,
         | 
| 396 | 
            -
                    clientSecret: options.provider.signatureMethod === 'RSA-SHA1' ? options.clientSecret : internals.encode(options.clientSecret  | 
| 396 | 
            +
                    clientSecret: options.provider.signatureMethod === 'RSA-SHA1' ? options.clientSecret : internals.encode(options.clientSecret ?? '') + '&',
         | 
| 397 397 | 
             
                    signatureMethod: options.provider.signatureMethod
         | 
| 398 398 | 
             
                };
         | 
| 399 | 
            +
             | 
| 400 | 
            +
                this._wreckOptions = { ...options.wreck };
         | 
| 399 401 | 
             
            };
         | 
| 400 402 |  | 
| 401 403 |  | 
| @@ -451,6 +453,7 @@ internals.Client.prototype._request = async function (method, uri, params, oauth | |
| 451 453 | 
             
                // Calculate OAuth header
         | 
| 452 454 |  | 
| 453 455 | 
             
                const requestOptions = {
         | 
| 456 | 
            +
                    ...this._wreckOptions,
         | 
| 454 457 | 
             
                    headers: {
         | 
| 455 458 | 
             
                        Authorization: internals.Client.header(oauth)
         | 
| 456 459 | 
             
                    }
         | 
| @@ -471,7 +474,7 @@ internals.Client.prototype._request = async function (method, uri, params, oauth | |
| 471 474 | 
             
                    return Wreck.request(method, uri, requestOptions);
         | 
| 472 475 | 
             
                }
         | 
| 473 476 |  | 
| 474 | 
            -
                const desc = (options.desc  | 
| 477 | 
            +
                const desc = (options.desc ?? 'resource');
         | 
| 475 478 | 
             
                try {
         | 
| 476 479 | 
             
                    const { res, payload } = await Wreck[method](uri, requestOptions);
         | 
| 477 480 | 
             
                    var result = { payload: payload.toString(), statusCode: res.statusCode };
         | 
| @@ -5,23 +5,22 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                 | 
| 9 | 
            -
                const tenantId = options.tenant || 'common';
         | 
| 8 | 
            +
                const tenantId = options?.tenant ?? 'common';
         | 
| 10 9 |  | 
| 11 10 | 
             
                return {
         | 
| 12 11 | 
             
                    protocol: 'oauth2',
         | 
| 13 12 | 
             
                    useParamsAuth: true,
         | 
| 14 | 
            -
                    auth:  | 
| 15 | 
            -
                    token:  | 
| 13 | 
            +
                    auth: `https://login.microsoftonline.com/${tenantId}/oauth2/authorize`,
         | 
| 14 | 
            +
                    token: `https://login.microsoftonline.com/${tenantId}/oauth2/token`,
         | 
| 16 15 | 
             
                    scope: ['openid', 'offline_access', 'profile'],
         | 
| 17 16 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 18 17 |  | 
| 19 | 
            -
                        const profile = await get( | 
| 18 | 
            +
                        const profile = await get(`https://login.microsoftonline.com/${tenantId}/openid/userinfo`);
         | 
| 20 19 |  | 
| 21 20 | 
             
                        credentials.profile = {
         | 
| 22 21 | 
             
                            id: profile.oid,
         | 
| 23 22 | 
             
                            displayName: profile.name,
         | 
| 24 | 
            -
                            email: profile.upn  | 
| 23 | 
            +
                            email: profile.upn ?? profile.email,
         | 
| 25 24 | 
             
                            raw: profile
         | 
| 26 25 | 
             
                        };
         | 
| 27 26 | 
             
                    }
         | 
    
        package/lib/providers/azure.js
    CHANGED
    
    | @@ -7,14 +7,13 @@ const internals = {}; | |
| 7 7 |  | 
| 8 8 | 
             
            exports = module.exports = function (options) {
         | 
| 9 9 |  | 
| 10 | 
            -
                 | 
| 11 | 
            -
                const tenantId = options.tenant || 'common';
         | 
| 10 | 
            +
                const tenantId = options?.tenant ?? 'common';
         | 
| 12 11 |  | 
| 13 12 | 
             
                return {
         | 
| 14 13 | 
             
                    protocol: 'oauth2',
         | 
| 15 14 | 
             
                    useParamsAuth: true,
         | 
| 16 | 
            -
                    auth:  | 
| 17 | 
            -
                    token:  | 
| 15 | 
            +
                    auth: `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize`,
         | 
| 16 | 
            +
                    token: `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`,
         | 
| 18 17 | 
             
                    scope: [
         | 
| 19 18 | 
             
                        'openid',
         | 
| 20 19 | 
             
                        'offline_access',       // Enable app to get refresh_tokens
         | 
| @@ -30,7 +29,7 @@ exports = module.exports = function (options) { | |
| 30 29 | 
             
                        credentials.profile = {
         | 
| 31 30 | 
             
                            id: profile.id,
         | 
| 32 31 | 
             
                            displayName: profile.displayName,
         | 
| 33 | 
            -
                            email: profile.userPrincipalName  | 
| 32 | 
            +
                            email: profile.userPrincipalName ?? profile.mail,
         | 
| 34 33 | 
             
                            raw: profile
         | 
| 35 34 | 
             
                        };
         | 
| 36 35 | 
             
                    }
         | 
    
        package/lib/providers/cognito.js
    CHANGED
    
    | @@ -17,14 +17,14 @@ exports = module.exports = function (options) { | |
| 17 17 |  | 
| 18 18 | 
             
                return {
         | 
| 19 19 | 
             
                    protocol: 'oauth2',
         | 
| 20 | 
            -
                    auth: settings.uri | 
| 21 | 
            -
                    token: settings.uri | 
| 20 | 
            +
                    auth: `${settings.uri}/oauth2/authorize`,
         | 
| 21 | 
            +
                    token: `${settings.uri}/oauth2/token`,
         | 
| 22 22 | 
             
                    scope: ['openid', 'email', 'profile'],
         | 
| 23 23 | 
             
                    scopeSeparator: ' ',
         | 
| 24 24 | 
             
                    useParamsAuth: true,
         | 
| 25 25 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 26 26 |  | 
| 27 | 
            -
                        const profile = await get(settings.uri | 
| 27 | 
            +
                        const profile = await get(`${settings.uri}/oauth2/userInfo`);
         | 
| 28 28 |  | 
| 29 29 | 
             
                        credentials.profile = {
         | 
| 30 30 | 
             
                            id: profile.sub,
         | 
| @@ -11,8 +11,8 @@ exports = module.exports = function () { | |
| 11 11 | 
             
                return {
         | 
| 12 12 | 
             
                    protocol: 'oauth2',
         | 
| 13 13 | 
             
                    useParamsAuth: true,
         | 
| 14 | 
            -
                    auth: digitalOceanUrl | 
| 15 | 
            -
                    token: digitalOceanUrl | 
| 14 | 
            +
                    auth: `${digitalOceanUrl}/authorize`,
         | 
| 15 | 
            +
                    token: `${digitalOceanUrl}/token`,
         | 
| 16 16 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 17 17 |  | 
| 18 18 | 
             
                        const profile = await get(digitalOceanUserUrl);
         | 
    
        package/lib/providers/discord.js
    CHANGED
    
    | @@ -7,12 +7,12 @@ exports = module.exports = function () { | |
| 7 7 |  | 
| 8 8 | 
             
                return {
         | 
| 9 9 | 
             
                    protocol: 'oauth2',
         | 
| 10 | 
            -
                    auth: 'https:// | 
| 11 | 
            -
                    token: 'https:// | 
| 12 | 
            -
                    scope: ['email', 'identify'],                                   // https:// | 
| 10 | 
            +
                    auth: 'https://discord.com/api/oauth2/authorize',
         | 
| 11 | 
            +
                    token: 'https://discord.com/api/oauth2/token',
         | 
| 12 | 
            +
                    scope: ['email', 'identify'],                                   // https://discord.com/developers/docs/topics/oauth2#scopes
         | 
| 13 13 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 14 14 |  | 
| 15 | 
            -
                        const profile = await get('https:// | 
| 15 | 
            +
                        const profile = await get('https://discord.com/api/users/@me');
         | 
| 16 16 |  | 
| 17 17 | 
             
                        credentials.profile = {
         | 
| 18 18 | 
             
                            id: profile.id,
         | 
| @@ -23,7 +23,7 @@ exports = module.exports = function () { | |
| 23 23 | 
             
                            verified: profile.verified,
         | 
| 24 24 | 
             
                            avatar: {
         | 
| 25 25 | 
             
                                id: profile.avatar,
         | 
| 26 | 
            -
                                url:  | 
| 26 | 
            +
                                url: `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.png`
         | 
| 27 27 | 
             
                            },
         | 
| 28 28 | 
             
                            raw: profile
         | 
| 29 29 | 
             
                        };
         | 
| @@ -14,7 +14,7 @@ exports = module.exports = function (options) { | |
| 14 14 | 
             
                    fields: 'id,name,email,first_name,last_name,middle_name,picture,gender,link,locale,timezone,updated_time,verified',
         | 
| 15 15 | 
             
                    scope: ['email']
         | 
| 16 16 | 
             
                };
         | 
| 17 | 
            -
                const settings = Hoek.applyToDefaults(defaults, options  | 
| 17 | 
            +
                const settings = Hoek.applyToDefaults(defaults, options ?? {});
         | 
| 18 18 |  | 
| 19 19 | 
             
                return {
         | 
| 20 20 | 
             
                    protocol: 'oauth2',
         | 
| @@ -22,7 +22,7 @@ exports = module.exports = function (options) { | |
| 22 22 |  | 
| 23 23 | 
             
                        credentials.profile = {
         | 
| 24 24 | 
             
                            id: profile.id,
         | 
| 25 | 
            -
                            displayName: profile.firstName  | 
| 25 | 
            +
                            displayName: `${profile.firstName} ${profile.lastName}`,
         | 
| 26 26 | 
             
                            name: {
         | 
| 27 27 | 
             
                                first: profile.firstName,
         | 
| 28 28 | 
             
                                last: profile.lastName
         | 
    
        package/lib/providers/github.js
    CHANGED
    
    | @@ -5,16 +5,14 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                const uri = options.uri || 'https://github.com';
         | 
| 11 | 
            -
                const user = options.uri ? options.uri + '/api/v3/user' : 'https://api.github.com/user';
         | 
| 8 | 
            +
                const uri = options?.uri ?? 'https://github.com';
         | 
| 9 | 
            +
                const user = options?.uri ? `${options.uri}/api/v3/user` : 'https://api.github.com/user';
         | 
| 12 10 |  | 
| 13 11 | 
             
                return {
         | 
| 14 12 | 
             
                    protocol: 'oauth2',
         | 
| 15 13 | 
             
                    useParamsAuth: true,
         | 
| 16 | 
            -
                    auth: uri | 
| 17 | 
            -
                    token: uri | 
| 14 | 
            +
                    auth: `${uri}/login/oauth/authorize`,
         | 
| 15 | 
            +
                    token: `${uri}/login/oauth/access_token`,
         | 
| 18 16 | 
             
                    scope: ['user:email'],
         | 
| 19 17 | 
             
                    scopeSeparator: ',',
         | 
| 20 18 | 
             
                    headers: {
         | 
    
        package/lib/providers/gitlab.js
    CHANGED
    
    | @@ -5,15 +5,13 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                const uri = options.uri || 'https://gitlab.com';
         | 
| 11 | 
            -
                const user = uri + '/api/v3/user';
         | 
| 8 | 
            +
                const uri = options?.uri ?? 'https://gitlab.com';
         | 
| 9 | 
            +
                const user = `${uri}/api/v3/user`;
         | 
| 12 10 |  | 
| 13 11 | 
             
                return {
         | 
| 14 12 | 
             
                    protocol: 'oauth2',
         | 
| 15 | 
            -
                    auth: uri | 
| 16 | 
            -
                    token: uri | 
| 13 | 
            +
                    auth: `${uri}/oauth/authorize`,
         | 
| 14 | 
            +
                    token: `${uri}/oauth/token`,
         | 
| 17 15 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 18 16 |  | 
| 19 17 | 
             
                        const profile = await get(user);
         | 
| @@ -5,8 +5,6 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                options = options || {};
         | 
| 9 | 
            -
             | 
| 10 8 | 
             
                return {
         | 
| 11 9 | 
             
                    protocol: 'oauth2',
         | 
| 12 10 | 
             
                    useParamsAuth: true,
         | 
| @@ -23,7 +21,7 @@ exports = module.exports = function (options) { | |
| 23 21 | 
             
                            raw: params.user
         | 
| 24 22 | 
             
                        };
         | 
| 25 23 |  | 
| 26 | 
            -
                        if (options | 
| 24 | 
            +
                        if (options?.extendedProfile === false) { // Defaults to true
         | 
| 27 25 | 
             
                            return;
         | 
| 28 26 | 
             
                        }
         | 
| 29 27 |  | 
| @@ -15,11 +15,11 @@ exports = module.exports = function (options) { | |
| 15 15 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 16 16 |  | 
| 17 17 | 
             
                        let fields = '';
         | 
| 18 | 
            -
                        if (this.providerParams | 
| 19 | 
            -
                            fields =  | 
| 18 | 
            +
                        if (this.providerParams?.fields) {
         | 
| 19 | 
            +
                            fields = `?projection=${this.providerParams.fields}`;
         | 
| 20 20 | 
             
                        }
         | 
| 21 21 |  | 
| 22 | 
            -
                        const profile = await get( | 
| 22 | 
            +
                        const profile = await get(`https://api.linkedin.com/v2/me${fields}`);
         | 
| 23 23 | 
             
                        const email = await get('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))');
         | 
| 24 24 |  | 
| 25 25 | 
             
                        credentials.profile = {
         | 
    
        package/lib/providers/live.js
    CHANGED
    
    | @@ -23,7 +23,7 @@ exports = module.exports = function (options) { | |
| 23 23 | 
             
                                first: profile.first_name,
         | 
| 24 24 | 
             
                                last: profile.last_name
         | 
| 25 25 | 
             
                            },
         | 
| 26 | 
            -
                            email: profile.emails | 
| 26 | 
            +
                            email: profile.emails?.preferred ?? profile.emails?.account,
         | 
| 27 27 | 
             
                            raw: profile
         | 
| 28 28 | 
             
                        };
         | 
| 29 29 | 
             
                    }
         | 
    
        package/lib/providers/okta.js
    CHANGED
    
    | @@ -15,16 +15,16 @@ exports = module.exports = function (options) { | |
| 15 15 |  | 
| 16 16 | 
             
                const settings = Joi.attempt(options, internals.schema);
         | 
| 17 17 |  | 
| 18 | 
            -
                let baseUri = settings.uri | 
| 18 | 
            +
                let baseUri = `${settings.uri}/oauth2`;
         | 
| 19 19 | 
             
                if (settings.authorizationServerId) {
         | 
| 20 | 
            -
                    baseUri +=  | 
| 20 | 
            +
                    baseUri += `/${settings.authorizationServerId}`;
         | 
| 21 21 | 
             
                }
         | 
| 22 22 |  | 
| 23 23 | 
             
                return {
         | 
| 24 24 | 
             
                    protocol: 'oauth2',
         | 
| 25 25 | 
             
                    useParamsAuth: true,
         | 
| 26 | 
            -
                    auth: baseUri | 
| 27 | 
            -
                    token: baseUri | 
| 26 | 
            +
                    auth: `${baseUri}/v1/authorize`,
         | 
| 27 | 
            +
                    token: `${baseUri}/v1/token`,
         | 
| 28 28 | 
             
                    scope: ['profile', 'openid', 'email', 'offline_access'],
         | 
| 29 29 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 30 30 |  | 
| @@ -17,8 +17,8 @@ exports = module.exports = function (options) { | |
| 17 17 | 
             
                return {
         | 
| 18 18 | 
             
                    protocol: 'oauth2',
         | 
| 19 19 | 
             
                    useParamsAuth: true,
         | 
| 20 | 
            -
                    auth: settings.uri | 
| 21 | 
            -
                    token: settings.uri | 
| 20 | 
            +
                    auth: `${settings.uri}/oauthserver/auth/`,
         | 
| 21 | 
            +
                    token: `${settings.uri}/oauthserver/token/`,
         | 
| 22 22 | 
             
                    scope: ['whoami'],
         | 
| 23 23 | 
             
                    scopeSeparator: ',',
         | 
| 24 24 | 
             
                    profile: async function (credentials, params, get) {
         | 
| @@ -27,7 +27,7 @@ exports = module.exports = function (options) { | |
| 27 27 | 
             
                            access_token: credentials.token
         | 
| 28 28 | 
             
                        };
         | 
| 29 29 |  | 
| 30 | 
            -
                        const profile = await get(settings.uri | 
| 30 | 
            +
                        const profile = await get(`${settings.uri}/api/user.whoami`, query);
         | 
| 31 31 |  | 
| 32 32 | 
             
                        credentials.profile = {
         | 
| 33 33 | 
             
                            id: profile.result.phid,
         | 
    
        package/lib/providers/pingfed.js
    CHANGED
    
    | @@ -5,20 +5,18 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                const uri = options.uri || 'https://login-dev.ext.hpe.com';
         | 
| 8 | 
            +
                const uri = options?.uri ?? 'https://login-dev.ext.hpe.com';
         | 
| 11 9 |  | 
| 12 10 | 
             
                return {
         | 
| 13 11 | 
             
                    protocol: 'oauth2',
         | 
| 14 | 
            -
                    auth: uri | 
| 15 | 
            -
                    token: uri | 
| 12 | 
            +
                    auth: `${uri}/as/authorization.oauth2`,
         | 
| 13 | 
            +
                    token: `${uri}/as/token.oauth2`,
         | 
| 16 14 | 
             
                    scope: ['openid', 'email'],
         | 
| 17 15 | 
             
                    scopeSeparator: ' ',
         | 
| 18 16 | 
             
                    useParamsAuth: true,
         | 
| 19 17 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 20 18 |  | 
| 21 | 
            -
                        const profile = await get(uri | 
| 19 | 
            +
                        const profile = await get(`${uri}/idp/userinfo.openid`);
         | 
| 22 20 |  | 
| 23 21 | 
             
                        credentials.profile = {
         | 
| 24 22 | 
             
                            id: profile.sub,
         | 
| @@ -23,13 +23,13 @@ internals.defaults = { | |
| 23 23 |  | 
| 24 24 | 
             
            exports = module.exports = function (options) {
         | 
| 25 25 |  | 
| 26 | 
            -
                const combinedSettings = Hoek.applyToDefaults(internals.defaults, options  | 
| 26 | 
            +
                const combinedSettings = Hoek.applyToDefaults(internals.defaults, options ?? {});
         | 
| 27 27 | 
             
                const settings = Joi.attempt(combinedSettings, internals.schema);
         | 
| 28 28 |  | 
| 29 29 | 
             
                return {
         | 
| 30 30 | 
             
                    protocol: 'oauth2',
         | 
| 31 | 
            -
                    auth: settings.uri | 
| 32 | 
            -
                    token: settings.uri | 
| 31 | 
            +
                    auth: `${settings.uri}/services/oauth2/authorize`,
         | 
| 32 | 
            +
                    token: `${settings.uri}/services/oauth2/token`,
         | 
| 33 33 | 
             
                    useParamsAuth: true,
         | 
| 34 34 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 35 35 |  | 
    
        package/lib/providers/spotify.js
    CHANGED
    
    | @@ -5,16 +5,14 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
                const uri = options.uri || 'https://accounts.spotify.com';
         | 
| 11 | 
            -
                const user = options.uri ? options.uri + '/v1/me' : 'https://api.spotify.com/v1/me';
         | 
| 8 | 
            +
                const uri = options?.uri ?? 'https://accounts.spotify.com';
         | 
| 9 | 
            +
                const user = options?.uri ? `${options.uri}/v1/me` : 'https://api.spotify.com/v1/me';
         | 
| 12 10 |  | 
| 13 11 | 
             
                return {
         | 
| 14 12 | 
             
                    protocol: 'oauth2',
         | 
| 15 13 | 
             
                    useParamsAuth: true,
         | 
| 16 | 
            -
                    auth: uri | 
| 17 | 
            -
                    token: uri | 
| 14 | 
            +
                    auth: `${uri}/authorize`,
         | 
| 15 | 
            +
                    token: `${uri}/api/token`,
         | 
| 18 16 | 
             
                    scope: ['user-read-email'],
         | 
| 19 17 | 
             
                    scopeSeparator: ',',
         | 
| 20 18 | 
             
                    headers: { 'User-Agent': 'hapi-bell-spotify' },
         | 
    
        package/lib/providers/trakt.js
    CHANGED
    
    | @@ -8,16 +8,15 @@ const internals = {}; | |
| 8 8 |  | 
| 9 9 | 
             
            exports = module.exports = function (options) {
         | 
| 10 10 |  | 
| 11 | 
            -
                options  | 
| 12 | 
            -
                Hoek.assert(options.apiKey, 'The property "apiKey" is required for the trakt.tv bell provider');
         | 
| 11 | 
            +
                Hoek.assert(options?.apiKey, 'The property "apiKey" is required for the trakt.tv bell provider');
         | 
| 13 12 |  | 
| 14 13 | 
             
                const uri = 'https://api.trakt.tv';
         | 
| 15 | 
            -
                const user = uri | 
| 14 | 
            +
                const user = `${uri}/users/me`;
         | 
| 16 15 |  | 
| 17 16 | 
             
                return {
         | 
| 18 17 | 
             
                    protocol: 'oauth2',
         | 
| 19 | 
            -
                    auth: uri | 
| 20 | 
            -
                    token: uri | 
| 18 | 
            +
                    auth: `${uri}/oauth/authorize`,
         | 
| 19 | 
            +
                    token: `${uri}/oauth/token`,
         | 
| 21 20 | 
             
                    headers: {
         | 
| 22 21 | 
             
                        'trakt-api-version': 2,
         | 
| 23 22 | 
             
                        'trakt-api-key': options.apiKey
         | 
    
        package/lib/providers/twitter.js
    CHANGED
    
    | @@ -13,7 +13,7 @@ const internals = { | |
| 13 13 |  | 
| 14 14 | 
             
            exports = module.exports = function (options) {
         | 
| 15 15 |  | 
| 16 | 
            -
                const settings = Hoek.applyToDefaults(internals.defaults, options  | 
| 16 | 
            +
                const settings = Hoek.applyToDefaults(internals.defaults, options ?? {});
         | 
| 17 17 |  | 
| 18 18 | 
             
                return {
         | 
| 19 19 | 
             
                    protocol: 'oauth',
         | 
| @@ -36,7 +36,7 @@ exports = module.exports = function (options) { | |
| 36 36 | 
             
                            user_id: params.user_id
         | 
| 37 37 | 
             
                        };
         | 
| 38 38 |  | 
| 39 | 
            -
                        const getParams = Hoek.applyToDefaults(paramDefaults, settings.getParams  | 
| 39 | 
            +
                        const getParams = Hoek.applyToDefaults(paramDefaults, settings.getParams ?? {});
         | 
| 40 40 |  | 
| 41 41 | 
             
                        const profile = await get(`https://api.twitter.com/1.1/${settings.getMethod}.json`, getParams);
         | 
| 42 42 | 
             
                        credentials.profile.displayName = profile.name;
         | 
    
        package/lib/providers/vk.js
    CHANGED
    
    | @@ -5,8 +5,8 @@ const internals = {}; | |
| 5 5 |  | 
| 6 6 | 
             
            exports = module.exports = function (options) {
         | 
| 7 7 |  | 
| 8 | 
            -
                options = options  | 
| 9 | 
            -
                const version = options.version  | 
| 8 | 
            +
                options = options ?? {};
         | 
| 9 | 
            +
                const version = options.version ?? '5.73';
         | 
| 10 10 | 
             
                const key_id = parseInt(version) < 5 ? 'uid' : 'id';
         | 
| 11 11 |  | 
| 12 12 | 
             
                return {
         | 
    
        package/lib/providers/yahoo.js
    CHANGED
    
    | @@ -13,11 +13,11 @@ exports = module.exports = function (options) { | |
| 13 13 | 
             
                    token: 'https://api.login.yahoo.com/oauth/v2/get_token',
         | 
| 14 14 | 
             
                    profile: async function (credentials, params, get) {
         | 
| 15 15 |  | 
| 16 | 
            -
                        const profile = await get( | 
| 16 | 
            +
                        const profile = await get(`https://social.yahooapis.com/v1/user/${params.xoauth_yahoo_guid}/profile`, { format: 'json' });
         | 
| 17 17 |  | 
| 18 18 | 
             
                        credentials.profile = {
         | 
| 19 19 | 
             
                            id: profile.profile.guid,
         | 
| 20 | 
            -
                            displayName: profile.profile.givenName  | 
| 20 | 
            +
                            displayName: `${profile.profile.givenName} ${profile.profile.familyName}`,
         | 
| 21 21 | 
             
                            name: {
         | 
| 22 22 | 
             
                                first: profile.profile.givenName,
         | 
| 23 23 | 
             
                                last: profile.profile.familyName
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "@hapi/bell",
         | 
| 3 3 | 
             
              "description": "Third-party login plugin for hapi",
         | 
| 4 | 
            -
              "version": " | 
| 4 | 
            +
              "version": "13.0.0",
         | 
| 5 5 | 
             
              "repository": "git://github.com/hapijs/bell",
         | 
| 6 6 | 
             
              "main": "lib/index.js",
         | 
| 7 7 | 
             
              "engines": {
         | 
| 8 | 
            -
                "node": ">= | 
| 8 | 
            +
                "node": ">=14.0.0"
         | 
| 9 9 | 
             
              },
         | 
| 10 10 | 
             
              "files": [
         | 
| 11 11 | 
             
                "lib"
         | 
| @@ -43,20 +43,26 @@ | |
| 43 43 | 
             
                "wordpress",
         | 
| 44 44 | 
             
                "yahoo"
         | 
| 45 45 | 
             
              ],
         | 
| 46 | 
            +
              "eslintConfig": {
         | 
| 47 | 
            +
                "extends": [
         | 
| 48 | 
            +
                  "plugin:@hapi/module"
         | 
| 49 | 
            +
                ]
         | 
| 50 | 
            +
              },
         | 
| 46 51 | 
             
              "dependencies": {
         | 
| 47 | 
            -
                "@hapi/boom": " | 
| 48 | 
            -
                "@hapi/bounce": " | 
| 49 | 
            -
                "@hapi/cryptiles": "^ | 
| 50 | 
            -
                "@hapi/hoek": " | 
| 51 | 
            -
                "@hapi/wreck": " | 
| 52 | 
            -
                "joi": "17. | 
| 52 | 
            +
                "@hapi/boom": "^10.0.0",
         | 
| 53 | 
            +
                "@hapi/bounce": "^3.0.0",
         | 
| 54 | 
            +
                "@hapi/cryptiles": "^6.0.0",
         | 
| 55 | 
            +
                "@hapi/hoek": "^10.0.0",
         | 
| 56 | 
            +
                "@hapi/wreck": "^18.0.0",
         | 
| 57 | 
            +
                "joi": "^17.0.0"
         | 
| 53 58 | 
             
              },
         | 
| 54 59 | 
             
              "devDependencies": {
         | 
| 55 | 
            -
                "@hapi/code": " | 
| 56 | 
            -
                "@hapi/ | 
| 57 | 
            -
                "@hapi/ | 
| 58 | 
            -
                "@hapi/ | 
| 59 | 
            -
                "@hapi/ | 
| 60 | 
            +
                "@hapi/code": "^9.0.0",
         | 
| 61 | 
            +
                "@hapi/eslint-plugin": "^6.0.0",
         | 
| 62 | 
            +
                "@hapi/hapi": "^21.0.0-beta.1",
         | 
| 63 | 
            +
                "@hapi/hawk": "^8.0.0",
         | 
| 64 | 
            +
                "@hapi/lab": "^25.0.1",
         | 
| 65 | 
            +
                "@hapi/teamwork": "^6.0.0"
         | 
| 60 66 | 
             
              },
         | 
| 61 67 | 
             
              "scripts": {
         | 
| 62 68 | 
             
                "test": "lab -a @hapi/code -t 100 -L -m 3000",
         |