From cc766d2260a6562fac802e555f14962b93682754 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 27 Feb 2019 18:47:33 +0100 Subject: [PATCH 1/3] gcp stackdriver tracing: attach user id (#11033) --- website/server/index.js | 8 +++----- website/server/libs/gcpTraceAgent.js | 12 ++++++++++++ website/server/middlewares/auth.js | 12 +++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 website/server/libs/gcpTraceAgent.js diff --git a/website/server/index.js b/website/server/index.js index 1662b33010..c1d6757dee 100644 --- a/website/server/index.js +++ b/website/server/index.js @@ -12,15 +12,13 @@ const setupNconf = require('./libs/setupNconf'); setupNconf(); const nconf = require('nconf'); -const IS_PROD = nconf.get('IS_PROD'); -const STACKDRIVER_TRACING_ENABLED = nconf.get('ENABLE_STACKDRIVER_TRACING') === 'true'; -if (IS_PROD && STACKDRIVER_TRACING_ENABLED) { - require('@google-cloud/trace-agent').start(); // eslint-disable-line global-require -} +// Initialize @google-cloud/trace-agent +require('./libs/gcpTraceAgent'); const cluster = require('cluster'); const logger = require('./libs/logger'); +const IS_PROD = nconf.get('IS_PROD'); const IS_DEV = nconf.get('IS_DEV'); const CORES = Number(nconf.get('WEB_CONCURRENCY')) || 0; diff --git a/website/server/libs/gcpTraceAgent.js b/website/server/libs/gcpTraceAgent.js new file mode 100644 index 0000000000..0e017aa943 --- /dev/null +++ b/website/server/libs/gcpTraceAgent.js @@ -0,0 +1,12 @@ +const nconf = require('nconf'); + +const IS_PROD = nconf.get('IS_PROD'); +const STACKDRIVER_TRACING_ENABLED = nconf.get('ENABLE_STACKDRIVER_TRACING') === 'true'; + +let tracer = null; + +if (IS_PROD && STACKDRIVER_TRACING_ENABLED) { + tracer = require('@google-cloud/trace-agent').start(); // eslint-disable-line global-require +} + +export default tracer; \ No newline at end of file diff --git a/website/server/middlewares/auth.js b/website/server/middlewares/auth.js index ab5987b50e..f4c301acf9 100644 --- a/website/server/middlewares/auth.js +++ b/website/server/middlewares/auth.js @@ -6,6 +6,7 @@ import { } from '../models/user'; import nconf from 'nconf'; import url from 'url'; +import gcpStackdriverTracer from '../libs/gcpTraceAgent'; const COMMUNITY_MANAGER_EMAIL = nconf.get('EMAILS_COMMUNITY_MANAGER_EMAIL'); @@ -34,6 +35,13 @@ function getUserFields (options, req) { return `notifications ${userFieldOptions.join(' ')}`; } +// Make sure stackdriver traces are storing the user id +function stackdriverTraceUserId (userId) { + if (gcpStackdriverTracer) { + gcpStackdriverTracer.getCurrentRootSpan().addLabel('userId', userId); + } +} + // Strins won't be translated here because getUserLanguage has not run yet // Authenticate a request through the x-api-user and x-api key header @@ -64,8 +72,9 @@ export function authWithHeaders (options = {}) { if (user.auth.blocked) throw new NotAuthorized(res.t('accountSuspended', {communityManagerEmail: COMMUNITY_MANAGER_EMAIL, userId: user._id})); res.locals.user = user; - req.session.userId = user._id; + stackdriverTraceUserId(user._id); + return next(); }) .catch(next); @@ -93,6 +102,7 @@ export function authWithSession (req, res, next) { if (!user) throw new NotAuthorized(res.t('invalidCredentials')); res.locals.user = user; + stackdriverTraceUserId(user._id); return next(); }) .catch(next); From 45a9d6d17b024da53b5e1126d7afa40a22b39ae4 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 27 Feb 2019 18:48:13 +0100 Subject: [PATCH 2/3] ios: cancel invalid subscriptions without errors (#11035) --- website/server/libs/payments/apple.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/website/server/libs/payments/apple.js b/website/server/libs/payments/apple.js index d680c841e0..34241a1881 100644 --- a/website/server/libs/payments/apple.js +++ b/website/server/libs/payments/apple.js @@ -239,17 +239,26 @@ api.cancelSubscribe = async function cancelSubscribe (user, headers) { await iap.setup(); - let appleRes = await iap.validate(iap.APPLE, plan.additionalData); + let dateTerminated; - let isValidated = iap.isValidated(appleRes); - if (!isValidated) throw new NotAuthorized(this.constants.RESPONSE_INVALID_RECEIPT); + try { + let appleRes = await iap.validate(iap.APPLE, plan.additionalData); - let purchases = iap.getPurchaseData(appleRes); - if (purchases.length === 0) throw new NotAuthorized(this.constants.RESPONSE_INVALID_RECEIPT); - let subscriptionData = purchases[0]; + let isValidated = iap.isValidated(appleRes); + if (!isValidated) throw new NotAuthorized(this.constants.RESPONSE_INVALID_RECEIPT); - let dateTerminated = new Date(Number(subscriptionData.expirationDate)); - if (dateTerminated > new Date()) throw new NotAuthorized(this.constants.RESPONSE_STILL_VALID); + let purchases = iap.getPurchaseData(appleRes); + if (purchases.length === 0) throw new NotAuthorized(this.constants.RESPONSE_INVALID_RECEIPT); + let subscriptionData = purchases[0]; + + dateTerminated = new Date(Number(subscriptionData.expirationDate)); + if (dateTerminated > new Date()) throw new NotAuthorized(this.constants.RESPONSE_STILL_VALID); + } catch (err) { + // If we have an invalid receipt, cancel anyway + if (!err || !err.validatedData || err.validatedData.is_retryable === true || err.validatedData.status !== 21010) { + throw err; + } + } await payments.cancelSubscription({ user, From 868759d3e853a095486930321bf56b69e300b406 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Wed, 27 Feb 2019 16:17:01 -0600 Subject: [PATCH 3/3] 4.85.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5b73cb0ea..fe63ae76f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.85.2", + "version": "4.85.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c9885fbf92..e84cdce9fd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.85.2", + "version": "4.85.3", "main": "./website/server/index.js", "dependencies": { "@google-cloud/trace-agent": "^3.5.2",