diff --git a/package.json b/package.json index c4d4b81528..b14ee1e15f 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "lodash": "^3.9.3", "loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password", "loopback-boot": "^2.8.0", - "loopback-component-passport": "^1.5.0", + "loopback-component-passport": "https://github.com/FreeCodeCamp/loopback-component-passport.git#feature/flashfailure", "loopback-connector-mongodb": "^1.10.0", "lusca": "~1.0.2", "method-override": "~2.3.0", diff --git a/server/boot/a-extendUserIdent.js b/server/boot/a-extendUserIdent.js index 1d504b5b4e..f5f5e9ebc7 100644 --- a/server/boot/a-extendUserIdent.js +++ b/server/boot/a-extendUserIdent.js @@ -1,5 +1,9 @@ +import{ Observable } from 'rx'; import { observeMethod, observeQuery } from '../utils/rx'; import { getSocialProvider } from '../utils/auth'; +import debugFactory from 'debug'; + +const debug = debugFactory('fcc:userIdent'); export default function({ models }) { const { User, UserIdentity, UserCredential } = models; @@ -20,15 +24,18 @@ export default function({ models }) { options = {}; } const user$ = findUserById(userId); - console.log('provider', provider); - console.log('id', profile.id); - findIdent({ - provider: getSocialProvider(provider), - externalId: profile.id - }) + const query = { + where: { + provider: getSocialProvider(provider), + externalId: profile.id + } + }; + + debug('link identity query', query); + findIdent(query) .flatMap(identity => { const modified = new Date(); - if (!identity || identity.externalId !== profile.id) { + if (!identity) { return observeQuery(UserIdentity, 'create', { provider: getSocialProvider(provider), externalId: profile.id, @@ -40,6 +47,11 @@ export default function({ models }) { modified }); } + if (identity.userId !== userId) { + return Observable.throw( + new Error('An account is already linked to that profile') + ); + } identity.credentials = credentials; return observeQuery(identity, 'updateAttributes', { profile: getSocialProvider(provider), diff --git a/server/views/partials/flash.jade b/server/views/partials/flash.jade index e69a6d69bc..512e7ae7a4 100644 --- a/server/views/partials/flash.jade +++ b/server/views/partials/flash.jade @@ -1,11 +1,11 @@ .row .col-xs-12 - if messages.errors + if (messages.errors || messages.error) .alert.alert-danger.fade.in button.close(type='button', data-dismiss='alert') span.ion-close-circled - for error in messages.errors - div!= error.msg + for error in (messages.errors || messages.error) + div!= error.msg || error if messages.info .alert.alert-info.fade.in button.close(type='button', data-dismiss='alert')