diff --git a/ghost/members-api/lib/MembersAPI.js b/ghost/members-api/lib/MembersAPI.js index c94fd3832a..cd6957e108 100644 --- a/ghost/members-api/lib/MembersAPI.js +++ b/ghost/members-api/lib/MembersAPI.js @@ -2,6 +2,7 @@ const {Router} = require('express'); const body = require('body-parser'); const MagicLink = require('@tryghost/magic-link'); const errors = require('@tryghost/errors'); +const logging = require('@tryghost/logging'); const MemberAnalyticsService = require('@tryghost/member-analytics-service'); const MembersAnalyticsIngress = require('@tryghost/members-analytics-ingress'); @@ -204,7 +205,7 @@ module.exports = function MembersAPI({ } async function getMemberDataFromMagicLinkToken(token) { - const {email, labels = [], name = '', oldEmail, newsletters, attribution} = await getTokenDataFromMagicLinkToken(token); + const {email, labels = [], name = '', oldEmail, newsletters, attribution, reqIp} = await getTokenDataFromMagicLinkToken(token); if (!email) { return null; } @@ -220,7 +221,19 @@ module.exports = function MembersAPI({ } return member; } - const newMember = await users.create({name, email, labels, newsletters, attribution}); + + let geolocation; + if (reqIp) { + try { + geolocation = JSON.stringify(await geolocationService.getGeolocationFromIP(reqIp)); + } catch (err) { + logging.warn(err); + // no-op, we don't want to stop anything working due to + // geolocation lookup failing + } + } + + const newMember = await users.create({name, email, labels, newsletters, attribution, geolocation}); // Notify staff users of new free member signup if (labsService.isSet('emailAlerts')) { diff --git a/ghost/members-api/lib/controllers/router.js b/ghost/members-api/lib/controllers/router.js index 65400ae739..6493652ef4 100644 --- a/ghost/members-api/lib/controllers/router.js +++ b/ghost/members-api/lib/controllers/router.js @@ -27,6 +27,7 @@ module.exports = class RouterController { * @param {import('@tryghost/members-stripe-service')} deps.stripeAPIService * @param {import('@tryghost/member-attribution')} deps.memberAttributionService * @param {any} deps.tokenService + * @param {any} deps.sendEmailWithMagicLink * @param {{isSet(name: string): boolean}} deps.labsService */ constructor({ @@ -401,7 +402,9 @@ module.exports = class RouterController { } } else { const tokenData = _.pick(req.body, ['labels', 'name', 'newsletters']); - + if (req.ip) { + tokenData.reqIp = req.ip; + } // Save attribution data in the tokenData tokenData.attribution = this._memberAttributionService.getAttribution(req.body.urlHistory);