From 44f383a3ed309f2dc3dc1daff3d7cebfcd0198ba Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 6 Jun 2018 11:42:46 -0300 Subject: [PATCH 1/2] Unlock session key if something failed --- web-dapp/controllers/notifyRegTx.js | 6 ++++++ web-dapp/routes/notify_reg_tx.js | 10 +++++++++- web-dapp/server-lib/session-stores/memory.js | 5 +++++ web-dapp/server-lib/session-stores/redis.js | 9 +++++++++ web-dapp/test/server/notify_reg_tx.spec.js | 1 + 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/web-dapp/controllers/notifyRegTx.js b/web-dapp/controllers/notifyRegTx.js index 80f9d3c9..c3aae7be 100644 --- a/web-dapp/controllers/notifyRegTx.js +++ b/web-dapp/controllers/notifyRegTx.js @@ -150,6 +150,11 @@ const removeUsedSessionKey = (opts, prelog) => { }); }; +const unlockSession = (sessionKey, prelog) => { + logger.log(`${prelog} unlocking session: ${sessionKey}`); + return db.unlock(sessionKey); +}; + module.exports = { validateData, normalizeData, @@ -158,4 +163,5 @@ module.exports = { getAddressByBN, createPostCard, removeUsedSessionKey, + unlockSession, }; diff --git a/web-dapp/routes/notify_reg_tx.js b/web-dapp/routes/notify_reg_tx.js index c555f4bf..3a184152 100644 --- a/web-dapp/routes/notify_reg_tx.js +++ b/web-dapp/routes/notify_reg_tx.js @@ -43,7 +43,15 @@ module.exports = () => { }) .catch(error => { logger.error(`${prelog} ${error.msg}`); - return sendResponse(res, { ok: false, err: error.msg }); + return notifyRegTxController + .unlockSession(sessionKey, prelog) + .then( + () => {}, + () => logger.error(`${prelog} Could not unlock key ${sessionKey}`) + ) + .then(() => { + return sendResponse(res, { ok: false, err: error.msg }); + }); }); }); diff --git a/web-dapp/server-lib/session-stores/memory.js b/web-dapp/server-lib/session-stores/memory.js index a3a0cfda..4d6ab602 100644 --- a/web-dapp/server-lib/session-stores/memory.js +++ b/web-dapp/server-lib/session-stores/memory.js @@ -25,6 +25,11 @@ module.exports = function () { return resolve(db[k1(k)]); }); }, + unlock: (k) => { + db[k] = db[k1(k)]; + delete db[k1(k)]; + return Promise.resolve(); + }, unset: (k) => { delete db[k1(k)]; return new Promise((resolve) => { diff --git a/web-dapp/server-lib/session-stores/redis.js b/web-dapp/server-lib/session-stores/redis.js index 19aa1143..bf0b69b8 100644 --- a/web-dapp/server-lib/session-stores/redis.js +++ b/web-dapp/server-lib/session-stores/redis.js @@ -55,6 +55,15 @@ module.exports = function () { }); }); }, + unlock: (k) => { + return new Promise((resolve, reject) => { + client.rename(k1(k), k, (err, res) => { + if (err) return reject(err); + + resolve(res); + }); + }); + }, get: (k) => { return new Promise((resolve, reject) => { client.get(k, (err, v) => { diff --git a/web-dapp/test/server/notify_reg_tx.spec.js b/web-dapp/test/server/notify_reg_tx.spec.js index dc4fb4ae..fdcb41ed 100644 --- a/web-dapp/test/server/notify_reg_tx.spec.js +++ b/web-dapp/test/server/notify_reg_tx.spec.js @@ -33,6 +33,7 @@ jest.mock('../../controllers/notifyRegTx', () => ({ getAddressByBN: jest.fn(() => Promise.resolve('0x1aa2d288d03d8397c193d2327ee7a7443d4ec3a3')), createPostCard: jest.fn(() => Promise.resolve({ postcard: 'PostCard' })), removeUsedSessionKey: jest.fn(() => Promise.resolve({ ok: true, result: { postcard: 'PostCard' } })), + unlockSession: jest.fn(() => Promise.resolve()), })); describe('notify_reg_tx', () => { From b99d567f608ed0a9bbc44fb99418a766c08d4476 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 6 Jun 2018 12:05:47 -0300 Subject: [PATCH 2/2] Unlock all session keys on startup --- web-dapp/server-lib/session-stores/redis.js | 35 ++++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/web-dapp/server-lib/session-stores/redis.js b/web-dapp/server-lib/session-stores/redis.js index bf0b69b8..035ea3be 100644 --- a/web-dapp/server-lib/session-stores/redis.js +++ b/web-dapp/server-lib/session-stores/redis.js @@ -4,9 +4,20 @@ const logger = require('../logger'); const redis = require('redis'); // https://github.com/NodeRedis/node_redis const prelog = '[redis]'; +const lockedPrefix = 'locked'; function k1(k) { - return `locked:${k}`; + return `${lockedPrefix}:${k}`; +} + +function unlock(client, k) { + return new Promise((resolve, reject) => { + client.rename(k1(k), k, (err, res) => { + if (err) return reject(err); + + resolve(res); + }); + }); } module.exports = function () { @@ -30,6 +41,20 @@ module.exports = function () { logger.error(`${prelog} connection closed`); }); + client.keys(`${lockedPrefix}:*`, (err, keys) => { + if (err) { + logger.error('Could not get keys to unlock'); + return; + } + + keys.forEach((key) => { + unlock(client, key.replace(`${lockedPrefix}:`, '')) + .catch((e) => { + logger.error(`Could not unlock key ${key}`, e); + }); + }); + }); + return { set: function (k, v) { return new Promise((resolve) => { @@ -56,13 +81,7 @@ module.exports = function () { }); }, unlock: (k) => { - return new Promise((resolve, reject) => { - client.rename(k1(k), k, (err, res) => { - if (err) return reject(err); - - resolve(res); - }); - }); + return unlock(client, k); }, get: (k) => { return new Promise((resolve, reject) => {