Bug fixes on SMTP account verification

This commit is contained in:
Ylian Saint-Hilaire 2017-12-12 18:23:26 -08:00
parent 72ee422623
commit b171750f65
5 changed files with 62 additions and 21 deletions

View File

@ -355,6 +355,7 @@ function CreateMeshCentralServer() {
// Setup email server // Setup email server
if ((obj.config.smtp != null) && (obj.config.smtp.host != null) && (obj.config.smtp.from != null)) { if ((obj.config.smtp != null) && (obj.config.smtp.host != null) && (obj.config.smtp.from != null)) {
obj.mailserver = require('./meshmail.js').CreateMeshMain(obj); obj.mailserver = require('./meshmail.js').CreateMeshMain(obj);
obj.mailserver.verify();
//obj.mailserver.sendMail('ylian.saint-hilaire@intel.com', 'Test Subject', 'This is a sample test', 'This is a <b>sample</b> html test'); //obj.mailserver.sendMail('ylian.saint-hilaire@intel.com', 'Test Subject', 'This is a sample test', 'This is a <b>sample</b> html test');
} }
@ -365,6 +366,12 @@ function CreateMeshCentralServer() {
obj.DispatchEvent(['*'], obj, { etype: 'server', action: 'started', msg: 'Server started' }) obj.DispatchEvent(['*'], obj, { etype: 'server', action: 'started', msg: 'Server started' })
obj.debug(1, 'Server started'); obj.debug(1, 'Server started');
/*
obj.db.GetUserWithVerifiedEmail('', 'ylian.saint-hilaire@intel.com', function (err, docs) {
console.log(JSON.stringify(docs));
});
*/
}); });
}); });
}); });

View File

@ -24,8 +24,9 @@ module.exports.CreateMeshMain = function (parent) {
var accountResetMailText = '[[[SERVERNAME]]] - Account Reset\r\n\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting an account password reset. Nagivate to the following link to complete the process: [[[CALLBACKURL]]]\r\nIf you did not initiate this request, please ignore this mail.\r\n'; var accountResetMailText = '[[[SERVERNAME]]] - Account Reset\r\n\r\nHi [[[USERNAME]]], [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting an account password reset. Nagivate to the following link to complete the process: [[[CALLBACKURL]]]\r\nIf you did not initiate this request, please ignore this mail.\r\n';
// Setup mail server // Setup mail server
var options = { host: parent.config.smtp.host, secure: false, tls: { rejectUnauthorized: false } }; var options = { host: parent.config.smtp.host, secure: (parent.config.smtp.tls == true), tls: { rejectUnauthorized: false } };
if (parent.config.smtp.port != null) { options.port = parent.config.smtp.port; } if (parent.config.smtp.port != null) { options.port = parent.config.smtp.port; }
if ((parent.config.smtp.user != null) && (parent.config.smtp.pass != null)) { options.auth = { user: parent.config.smtp.user, pass: parent.config.smtp.pass }; }
obj.smtpServer = nodemailer.createTransport(options); obj.smtpServer = nodemailer.createTransport(options);
// Perform all e-mail substitution // Perform all e-mail substitution
@ -73,8 +74,19 @@ module.exports.CreateMeshMain = function (parent) {
sendNextMail(); // Send the next mail sendNextMail(); // Send the next mail
} else { } else {
obj.retry++; obj.retry++;
//console.log('SMTP server failed, will try again in a minute (' + obj.retry + ').'); console.log('SMTP server failed: ' + err.response);
setTimeout(sendNextMail, 60000); // Wait and try again if (obj.retry < 6) { setTimeout(sendNextMail, 60000); } // Wait and try again
}
});
}
// Send out the next mail in the pending list
obj.verify = function() {
obj.smtpServer.verify(function (err, info) {
if (err == null) {
console.log('SMTP mail server ' + parent.config.smtp.host + ' working as expected.');
} else {
console.log('SMTP mail server ' + parent.config.smtp.host + ' failed: ' + err.response);
} }
}); });
} }

View File

@ -261,22 +261,30 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) {
var x = command.email.split('@'); var x = command.email.split('@');
if ((x.length == 2) && (x[0].length > 0) && (x[1].split('.').length > 1) && (x[1].length > 2)) { if ((x.length == 2) && (x[0].length > 0) && (x[1].split('.').length > 1) && (x[1].length > 2)) {
if (obj.parent.users[req.session.userid].email != command.email) { if (obj.parent.users[req.session.userid].email != command.email) {
// Update the user's email // Check if this email is already validated on a different account
var oldemail = user.email; obj.db.GetUserWithVerifiedEmail(domain.id, command.email, function (err, docs) {
user.email = command.email; if (docs.length > 0) {
user.emailVerified = false; // Notify the duplicate email error
obj.parent.db.SetUser(user); ws.send(JSON.stringify({ action: 'msg', type: 'notify', value: 'Failed to change email address, another account already using: <b>' + EscapeHtml(command.email) + '</b>.' }));
} else {
// Update the user's email
var oldemail = user.email;
user.email = command.email;
user.emailVerified = false;
obj.parent.db.SetUser(user);
// Event the change // Event the change
var userinfo = obj.common.Clone(user); var userinfo = obj.common.Clone(user);
delete userinfo.hash; delete userinfo.hash;
delete userinfo.passhint; delete userinfo.passhint;
delete userinfo.salt; delete userinfo.salt;
delete userinfo.type; delete userinfo.type;
delete userinfo.domain; delete userinfo.domain;
delete userinfo.subscriptions; delete userinfo.subscriptions;
delete userinfo.passtype; delete userinfo.passtype;
obj.parent.parent.DispatchEvent(['*', 'server-users', user._id], obj, { etype: 'user', username: userinfo.name, account: userinfo, action: 'accountchange', msg: 'Changed email of user ' + userinfo.name + ' from ' + oldemail + ' to ' + user.email, domain: domain.id }) obj.parent.parent.DispatchEvent(['*', 'server-users', user._id], obj, { etype: 'user', username: userinfo.name, account: userinfo, action: 'accountchange', msg: 'Changed email of user ' + userinfo.name + ' from ' + oldemail + ' to ' + user.email, domain: domain.id })
}
});
} }
} }
} }
@ -960,5 +968,8 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) {
ws.send(JSON.stringify(files)); ws.send(JSON.stringify(files));
} }
function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '&nbsp;&nbsp;'); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
return obj; return obj;
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "meshcentral", "name": "meshcentral",
"version": "0.1.0-m", "version": "0.1.0-o",
"keywords": [ "keywords": [
"Remote Management", "Remote Management",
"Intel AMT", "Intel AMT",

View File

@ -167,8 +167,8 @@
<div id="p2AccountActions"> <div id="p2AccountActions">
<p><strong><img alt="" width=150 height=103 src=images/mainaccount.png style=margin-bottom:10px;margin-right:20px;float:right />Account actions</strong></p> <p><strong><img alt="" width=150 height=103 src=images/mainaccount.png style=margin-bottom:10px;margin-right:20px;float:right />Account actions</strong></p>
<p style="margin-left:40px"> <p style="margin-left:40px">
<a onclick="account_showChangeEmail()" style="cursor:pointer">Change email address</a><br />
<span id="verifyEmailId" style="display:none"><a onclick="account_showVerifyEmail()" style="cursor:pointer">Verify email</a><br /></span> <span id="verifyEmailId" style="display:none"><a onclick="account_showVerifyEmail()" style="cursor:pointer">Verify email</a><br /></span>
<a onclick="account_showChangeEmail()" style="cursor:pointer">Change email address</a><br />
<a onclick="account_showChangePassword()" style="cursor:pointer">Change password</a><br /> <a onclick="account_showChangePassword()" style="cursor:pointer">Change password</a><br />
<a onclick="account_showDeleteAccount()" style="cursor:pointer">Delete account</a><br /> <a onclick="account_showDeleteAccount()" style="cursor:pointer">Delete account</a><br />
</p> </p>
@ -493,7 +493,10 @@
<table cellpadding=0 cellspacing=10 style="width:100%"> <table cellpadding=0 cellspacing=10 style="width:100%">
<tr> <tr>
<td style="text-align:left"></td> <td style="text-align:left"></td>
<td style="text-align:right"><a href="terms">Terms &amp; Privacy</a></td> <td style="text-align:right">
<a id="verifyEmailId2" style="color:yellow;margin-left:3px;cursor:pointer" onclick="account_showVerifyEmail()">Verify Email</a>
<a style="margin-left:3px" href="terms">Terms &amp; Privacy</a>
</td>
</tr> </tr>
</table> </table>
</div> </div>
@ -786,6 +789,7 @@
userinfo = message.userinfo; userinfo = message.userinfo;
updateSiteAdmin(); updateSiteAdmin();
QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true)); QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true));
QV('verifyEmailId2', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true));
break; break;
} }
case 'users': { case 'users': {
@ -859,6 +863,12 @@
addNotification(n); addNotification(n);
} }
} }
} else {
if (message.type == 'notify') { // This is a notification message.
var n = { text:message.value };
if (message.tag != undefined) { n.tag = message.tag; }
addNotification(n);
}
} }
break; break;
} }
@ -930,6 +940,7 @@
userinfo = message.event.account; userinfo = message.event.account;
if (oldsiteadmin != newsiteadmin) updateSiteAdmin(); if (oldsiteadmin != newsiteadmin) updateSiteAdmin();
QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true)); QV('verifyEmailId', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true));
QV('verifyEmailId2', (userinfo.emailVerified !== true) && (userinfo.email != null) && (serverinfo.emailcheck == true));
} }
if (users == null) break; if (users == null) break;
users[message.event.account._id] = message.event.account; users[message.event.account._id] = message.event.account;