From 5c5f2db1b6a2033a76ccffd88b6c2e8ecd962bf9 Mon Sep 17 00:00:00 2001 From: butlerx Date: Thu, 14 Jul 2016 17:05:42 +0100 Subject: [PATCH 1/5] Add support for account, \n add db migration for userlockout \n add email asking user to reset when account lockout --- .../user-lockout-en_US/user-lockout.html.ejs | 15 +++++++++ .../user-lockout-en_US/user-lockout.text.ejs | 10 ++++++ lib/users/unlock-account-email.js | 33 +++++++++++++++++++ package.json | 6 ++-- .../pg/migrations/019.do.add-user-lock.sql | 9 +++++ users.js | 1 + 6 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 email-templates/user-lockout-en_US/user-lockout.html.ejs create mode 100644 email-templates/user-lockout-en_US/user-lockout.text.ejs create mode 100644 lib/users/unlock-account-email.js create mode 100644 scripts/database/pg/migrations/019.do.add-user-lock.sql diff --git a/email-templates/user-lockout-en_US/user-lockout.html.ejs b/email-templates/user-lockout-en_US/user-lockout.html.ejs new file mode 100644 index 00000000..fef409b8 --- /dev/null +++ b/email-templates/user-lockout-en_US/user-lockout.html.ejs @@ -0,0 +1,15 @@ +<% include ../common-en_US/header.ejs %> + +

Hi <%=name%>,

+ +

We have noticed multiple failed attempts to login to your zen account so for security reasons have locked your account.

+ +

To unlock your account you will need to change your password.

+

Please follow the link below to reset your password.
+<%=resetlink%>

+ + +

Best wishes,
+The CoderDojo Foundation Team

+ +<% include ../common-en_US/footer.ejs %> diff --git a/email-templates/user-lockout-en_US/user-lockout.text.ejs b/email-templates/user-lockout-en_US/user-lockout.text.ejs new file mode 100644 index 00000000..4bdd215b --- /dev/null +++ b/email-templates/user-lockout-en_US/user-lockout.text.ejs @@ -0,0 +1,10 @@ +Hi <%=name%>; + +We have noticed multiple failed attempts to login to your zen account so for security reasons have locked your account. + +To unlock your account you will need to change your password. +Please follow the link below to reset your password. +<%=resetlink%> + +Best wishes, +The CoderDojo Foundation Team diff --git a/lib/users/unlock-account-email.js b/lib/users/unlock-account-email.js new file mode 100644 index 00000000..b54659f6 --- /dev/null +++ b/lib/users/unlock-account-email.js @@ -0,0 +1,33 @@ +'use strict'; +var async = require('async'); +var _ = require('lodash'); +var protocol = process.env.PROTOCOL || 'http'; +var zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; + +function unlockAccountEmail (args, cb) { + var seneca = this; + var email = args.email; + var locality = args.locality || 'en_US'; + var emailCode = 'user-lockout-'; + var emailSubject = 'CoderDojo Zen Account Lockout'; + + seneca.act({role: 'cd-users', cmd: 'get_users_by_email', email: email}, function (err, users) { + if (err) return done(err); + if (options['email-notifications'].sendemail) { + seneca.act({role: 'email-notifications', cmd: 'send'}, { + code: emailCode, + locality: locality, + to: email, + subject: emailSubject, + content: {name: users[0].name, resetlink: protocol + '://' + zenHostname + '/reset_password', year: moment(new Date()).format('YYYY')} + }, function (err, response) { + if (err) return done(err); + return done(null, { ok: true }); + }); + } else { + return done(null, {ok: false}); + } + }); +} + +module.exports = unlockAccountEmail; diff --git a/package.json b/package.json index 4a929947..df9dd3a0 100644 --- a/package.json +++ b/package.json @@ -50,13 +50,13 @@ "po2json": "0.4.2", "postgrator": "2.8.1", "request": "2.58.0", - "seneca": "1.4", - "seneca-auth": "1.0", + "seneca": "1.4.0", + "seneca-auth": "1.0.0", "seneca-mail": "^0.2.2", "seneca-newrelic": "Wardormeur/seneca-newrelic", "seneca-postgresql-store": "2.3", "seneca-store-query": "0.0.5", - "seneca-user": "1.0", + "seneca-user": "2.0.0", "shortid": "2.2.2", "util": "^0.10.3", "xoauth2": "1.1.0" diff --git a/scripts/database/pg/migrations/019.do.add-user-lock.sql b/scripts/database/pg/migrations/019.do.add-user-lock.sql new file mode 100644 index 00000000..6976c745 --- /dev/null +++ b/scripts/database/pg/migrations/019.do.add-user-lock.sql @@ -0,0 +1,9 @@ +DO $$ + BEGIN + BEGIN + ALTER TABLE sys_user ADD COLUMN lock_try integer; + EXCEPTION + WHEN duplicate_column THEN RAISE NOTICE 'column token already exists in sys_user.'; + END; + END; +$$ diff --git a/users.js b/users.js index 8f8328d9..4447214d 100644 --- a/users.js +++ b/users.js @@ -43,6 +43,7 @@ module.exports = function (options) { seneca.add({role: plugin, cmd: 'is_self'}, require('./lib/users/is-self')); seneca.add({role: plugin, cmd: 'is_parent_of'}, require('./lib/users/is-parent-of')); seneca.add({role: plugin, cmd: 'can_accept_join_request'}, require('./lib/users/can-accept-join-request')); + seneca.add({role: plugin, cmd: 'unlock_account_email'}, require('./lib/users/unlock-account-email')); seneca.add({role: plugin, ctrl: 'user', cmd: 'load'}, require('./lib/controllers/users/load')); // LMS Integration seneca.add({role: plugin, cmd: 'get_lms_link'}, require('./lib/users/lms/get-lms-link')); From 6d34741d7e071bd30cd2ddb259887900fb55d6cd Mon Sep 17 00:00:00 2001 From: butlerx Date: Wed, 3 May 2017 12:42:48 +0100 Subject: [PATCH 2/5] update to seneca user 2 --- .../{019.do.add-user-lock.sql => 024.do.add-user-lock.sql} | 2 +- service.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename scripts/database/pg/migrations/{019.do.add-user-lock.sql => 024.do.add-user-lock.sql} (70%) diff --git a/scripts/database/pg/migrations/019.do.add-user-lock.sql b/scripts/database/pg/migrations/024.do.add-user-lock.sql similarity index 70% rename from scripts/database/pg/migrations/019.do.add-user-lock.sql rename to scripts/database/pg/migrations/024.do.add-user-lock.sql index 6976c745..61013377 100644 --- a/scripts/database/pg/migrations/019.do.add-user-lock.sql +++ b/scripts/database/pg/migrations/024.do.add-user-lock.sql @@ -1,7 +1,7 @@ DO $$ BEGIN BEGIN - ALTER TABLE sys_user ADD COLUMN lock_try integer; + ALTER TABLE sys_user ADD COLUMN failed_login_count integer; EXCEPTION WHEN duplicate_column THEN RAISE NOTICE 'column token already exists in sys_user.'; END; diff --git a/service.js b/service.js index a8fa83b4..4a452c08 100644 --- a/service.js +++ b/service.js @@ -58,7 +58,7 @@ require('./migrate-psql-db.js')(function (err) { logger: log.logger }); seneca.use(require('./oauth2.js'), {clients: config.oauth2.clients}); - seneca.use('user'); + seneca.use('user', { failedCount: 3 }); seneca.use('auth'); seneca.use(require('./users.js'), { 'email-notifications': config['email-notifications'], From a39736653b784c0013627c006b0d4cf5a88b1e88 Mon Sep 17 00:00:00 2001 From: butlerx Date: Wed, 3 May 2017 12:47:11 +0100 Subject: [PATCH 3/5] remove templates --- .../user-lockout-en_US/user-lockout.html.ejs | 15 --------------- .../user-lockout-en_US/user-lockout.text.ejs | 10 ---------- 2 files changed, 25 deletions(-) delete mode 100644 email-templates/user-lockout-en_US/user-lockout.html.ejs delete mode 100644 email-templates/user-lockout-en_US/user-lockout.text.ejs diff --git a/email-templates/user-lockout-en_US/user-lockout.html.ejs b/email-templates/user-lockout-en_US/user-lockout.html.ejs deleted file mode 100644 index fef409b8..00000000 --- a/email-templates/user-lockout-en_US/user-lockout.html.ejs +++ /dev/null @@ -1,15 +0,0 @@ -<% include ../common-en_US/header.ejs %> - -

Hi <%=name%>,

- -

We have noticed multiple failed attempts to login to your zen account so for security reasons have locked your account.

- -

To unlock your account you will need to change your password.

-

Please follow the link below to reset your password.
-<%=resetlink%>

- - -

Best wishes,
-The CoderDojo Foundation Team

- -<% include ../common-en_US/footer.ejs %> diff --git a/email-templates/user-lockout-en_US/user-lockout.text.ejs b/email-templates/user-lockout-en_US/user-lockout.text.ejs deleted file mode 100644 index 4bdd215b..00000000 --- a/email-templates/user-lockout-en_US/user-lockout.text.ejs +++ /dev/null @@ -1,10 +0,0 @@ -Hi <%=name%>; - -We have noticed multiple failed attempts to login to your zen account so for security reasons have locked your account. - -To unlock your account you will need to change your password. -Please follow the link below to reset your password. -<%=resetlink%> - -Best wishes, -The CoderDojo Foundation Team From 88586d1a5078a13ed5ce26bd7b57a59394753cfe Mon Sep 17 00:00:00 2001 From: butlerx Date: Thu, 28 Dec 2017 14:03:49 +0000 Subject: [PATCH 4/5] fix errors --- lib/users/unlock-account-email.js | 39 ++++++++++--------- package.json | 2 +- ...user-lock.sql => 025.do.add-user-lock.sql} | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) rename scripts/database/pg/migrations/{024.do.add-user-lock.sql => 025.do.add-user-lock.sql} (57%) diff --git a/lib/users/unlock-account-email.js b/lib/users/unlock-account-email.js index b54659f6..9a9df5fd 100644 --- a/lib/users/unlock-account-email.js +++ b/lib/users/unlock-account-email.js @@ -1,31 +1,32 @@ -'use strict'; -var async = require('async'); -var _ = require('lodash'); -var protocol = process.env.PROTOCOL || 'http'; -var zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; +const moment = require('moment'); +const options = require('../../config/config'); -function unlockAccountEmail (args, cb) { - var seneca = this; - var email = args.email; - var locality = args.locality || 'en_US'; - var emailCode = 'user-lockout-'; - var emailSubject = 'CoderDojo Zen Account Lockout'; +const protocol = process.env.PROTOCOL || 'http'; +const zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; - seneca.act({role: 'cd-users', cmd: 'get_users_by_email', email: email}, function (err, users) { +function unlockAccountEmail(args, done) { + const seneca = this; + const email = args.email; + + seneca.act({ role: 'cd-users', cmd: 'get_users_by_email', email }, (err, users) => { if (err) return done(err); if (options['email-notifications'].sendemail) { - seneca.act({role: 'email-notifications', cmd: 'send'}, { - code: emailCode, - locality: locality, + seneca.act({ role: 'email-notifications', cmd: 'send' }, { + code: 'user-lockout-', + locality: args.locality || 'en_US', to: email, - subject: emailSubject, - content: {name: users[0].name, resetlink: protocol + '://' + zenHostname + '/reset_password', year: moment(new Date()).format('YYYY')} - }, function (err, response) { + subject: 'CoderDojo Zen Account Lockout', + content: { + name: users[0].name, + resetlink: `${protocol}://${zenHostname}/reset_password`, + year: moment(new Date()).format('YYYY'), + }, + }, (err, response) => { if (err) return done(err); return done(null, { ok: true }); }); } else { - return done(null, {ok: false}); + return done(null, { ok: false }); } }); } diff --git a/package.json b/package.json index df9dd3a0..fa471974 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "seneca-newrelic": "Wardormeur/seneca-newrelic", "seneca-postgresql-store": "2.3", "seneca-store-query": "0.0.5", - "seneca-user": "2.0.0", + "seneca-user": "2.1.1", "shortid": "2.2.2", "util": "^0.10.3", "xoauth2": "1.1.0" diff --git a/scripts/database/pg/migrations/024.do.add-user-lock.sql b/scripts/database/pg/migrations/025.do.add-user-lock.sql similarity index 57% rename from scripts/database/pg/migrations/024.do.add-user-lock.sql rename to scripts/database/pg/migrations/025.do.add-user-lock.sql index 61013377..8d1d02e0 100644 --- a/scripts/database/pg/migrations/024.do.add-user-lock.sql +++ b/scripts/database/pg/migrations/025.do.add-user-lock.sql @@ -3,7 +3,7 @@ DO $$ BEGIN ALTER TABLE sys_user ADD COLUMN failed_login_count integer; EXCEPTION - WHEN duplicate_column THEN RAISE NOTICE 'column token already exists in sys_user.'; + WHEN duplicate_column THEN RAISE NOTICE 'column failed_login_count already exists in sys_user.'; END; END; $$ From 9d3a78bf78f1b469fc4b52842035224752f7f817 Mon Sep 17 00:00:00 2001 From: butlerx Date: Fri, 29 Dec 2017 11:13:11 +0000 Subject: [PATCH 5/5] requested fixes --- lib/users/unlock-account-email.js | 33 +++++++++++++------------------ service.js | 2 +- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/lib/users/unlock-account-email.js b/lib/users/unlock-account-email.js index 9a9df5fd..81defc23 100644 --- a/lib/users/unlock-account-email.js +++ b/lib/users/unlock-account-email.js @@ -1,5 +1,4 @@ const moment = require('moment'); -const options = require('../../config/config'); const protocol = process.env.PROTOCOL || 'http'; const zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; @@ -10,24 +9,20 @@ function unlockAccountEmail(args, done) { seneca.act({ role: 'cd-users', cmd: 'get_users_by_email', email }, (err, users) => { if (err) return done(err); - if (options['email-notifications'].sendemail) { - seneca.act({ role: 'email-notifications', cmd: 'send' }, { - code: 'user-lockout-', - locality: args.locality || 'en_US', - to: email, - subject: 'CoderDojo Zen Account Lockout', - content: { - name: users[0].name, - resetlink: `${protocol}://${zenHostname}/reset_password`, - year: moment(new Date()).format('YYYY'), - }, - }, (err, response) => { - if (err) return done(err); - return done(null, { ok: true }); - }); - } else { - return done(null, { ok: false }); - } + seneca.act({ role: 'email-notifications', cmd: 'send' }, { + code: 'user-lockout-', + locality: args.locality || 'en_US', + to: email, + subject: 'CoderDojo Zen Account Lockout', + content: { + name: users[0].name, + resetlink: `${protocol}://${zenHostname}/reset_password`, + year: moment(new Date()).format('YYYY'), + }, + }, (err, response) => { + if (err) return done(err); + return done(null, { ok: true }); + }); }); } diff --git a/service.js b/service.js index 4a452c08..26e082f2 100644 --- a/service.js +++ b/service.js @@ -58,7 +58,7 @@ require('./migrate-psql-db.js')(function (err) { logger: log.logger }); seneca.use(require('./oauth2.js'), {clients: config.oauth2.clients}); - seneca.use('user', { failedCount: 3 }); + seneca.use('user', { failedLoginCount: 3 }); seneca.use('auth'); seneca.use(require('./users.js'), { 'email-notifications': config['email-notifications'],