From eb3c5cca67a5979d6ca39b39b327af46bd23aa65 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Wed, 6 Sep 2017 14:53:09 +0300 Subject: [PATCH] allow creating users without an email address --- docs/api.md | 1 + lib/api/users.js | 3 +++ lib/user-handler.js | 61 +++++++++++++++++++++++++++------------------ 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/docs/api.md b/docs/api.md index 979f776c..dda20659 100644 --- a/docs/api.md +++ b/docs/api.md @@ -248,6 +248,7 @@ Creates a new user, returns the ID upon success. - **username** (required) is the username of the user. This is not an email address but authentication username, use only letters and numbers - **password** (required) is the password for the user - **address** is the main email address for the user. If address is not set then a new one is generated based on the username and current domain name +- **emptyAddress** if true, then do not set up an address for the user - **name** is the name for the user - **forward** is an email address to where all messages are forwarded to - **targetUrl** is an URL to where all messages are uploaded to diff --git a/lib/api/users.js b/lib/api/users.js index 4e675d22..a7a36d72 100644 --- a/lib/api/users.js +++ b/lib/api/users.js @@ -144,6 +144,9 @@ module.exports = (db, server, userHandler) => { .required(), address: Joi.string().email(), + emptyAddress: Joi.boolean() + .truthy(['Y', 'true', 'yes', 1]) + .default(false), language: Joi.string() .min(2) diff --git a/lib/user-handler.js b/lib/user-handler.js index 2ec1b6f6..66c4613a 100644 --- a/lib/user-handler.js +++ b/lib/user-handler.js @@ -537,33 +537,46 @@ class UserHandler { return callback(new Error('Database Error, failed to create user')); } - let address = data.address ? data.address : data.username + '@' + (config.emailDomain || os.hostname()).toLowerCase(); + let ensureAddress = done => { + if (data.emptyAddress) { + return done(null, ''); + } + let address = data.address ? data.address : data.username + '@' + (config.emailDomain || os.hostname()).toLowerCase(); - // insert alias address to email address registry - this.users.collection('addresses').insertOne({ - user: id, - address, - // dotless version - addrview: address.substr(0, address.indexOf('@')).replace(/\./g, '') + address.substr(address.indexOf('@')), - created: new Date() - }, err => { - if (err) { - // try to rollback - this.users.collection('users').deleteOne({ _id: id }, () => false); - this.database.collection('mailboxes').deleteMany({ user: id }, () => false); + // insert alias address to email address registry + this.users.collection('addresses').insertOne({ + user: id, + address, + // dotless version + addrview: address.substr(0, address.indexOf('@')).replace(/\./g, '') + address.substr(address.indexOf('@')), + created: new Date() + }, err => { + if (err) { + // try to rollback + this.users.collection('users').deleteOne({ _id: id }, () => false); + this.database.collection('mailboxes').deleteMany({ user: id }, () => false); - log.error('DB', 'CREATEFAIL username=%s error=%s', data.username, err.message); + log.error('DB', 'CREATEFAIL username=%s error=%s', data.username, err.message); - let response; - switch (err.code) { - case 11000: - response = 'Selected email address already exists'; - break; - default: - response = 'Database Error, failed to create user'; + let response; + switch (err.code) { + case 11000: + response = 'Selected email address already exists'; + break; + default: + response = 'Database Error, failed to create user'; + } + + return done(new Error(response)); } - return callback(new Error(response)); + done(null, address); + }); + }; + + ensureAddress((err, address) => { + if (err) { + return callback(err); } // register this address as the default address for that user @@ -605,7 +618,7 @@ class UserHandler { () => callback(null, id) ); - if (!this.messageHandler) { + if (!this.messageHandler || data.emptyAddress) { return createSuccess(); } @@ -613,7 +626,7 @@ class UserHandler { this.pushDefaultMessages( userData, { - NAME: userData.name || address, + NAME: userData.name || userData.username || address, FNAME: parsedName.firstName, LNAME: parsedName.lastName, DOMAIN: address.substr(address.indexOf('@') + 1),