mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	Improved email invite feature
This commit is contained in:
		
							parent
							
								
									d43a9eeabf
								
							
						
					
					
						commit
						b6bbe71c2a
					
				
					 6 changed files with 54 additions and 18 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -460,9 +460,8 @@ function CreateMeshCentralServer(config, args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // 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').CreateMeshMail(obj);
 | 
				
			||||||
                    obj.mailserver.verify();
 | 
					                    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');
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Start periodic maintenance
 | 
					                // Start periodic maintenance
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								meshmail.js
									
										
									
									
									
								
							
							
						
						
									
										49
									
								
								meshmail.js
									
										
									
									
									
								
							| 
						 | 
					@ -15,7 +15,7 @@
 | 
				
			||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Construct a MeshAgent object, called upon connection
 | 
					// Construct a MeshAgent object, called upon connection
 | 
				
			||||||
module.exports.CreateMeshMain = function (parent) {
 | 
					module.exports.CreateMeshMail = function (parent) {
 | 
				
			||||||
    var obj = {};
 | 
					    var obj = {};
 | 
				
			||||||
    obj.pendingMails = [];
 | 
					    obj.pendingMails = [];
 | 
				
			||||||
    obj.parent = parent;
 | 
					    obj.parent = parent;
 | 
				
			||||||
| 
						 | 
					@ -35,9 +35,9 @@ module.exports.CreateMeshMain = function (parent) {
 | 
				
			||||||
    const 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';
 | 
					    const 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';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Default account invite mail
 | 
					    // Default account invite mail
 | 
				
			||||||
    const accountInviteSubject = '[[[SERVERNAME]]] - Agent Installation Invitation';
 | 
					    const accountInviteSubject = '[[[SERVERNAME]]] - Invitation';
 | 
				
			||||||
    const accountInviteMailHtml = '<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent Installation</b></td></tr></table><p>User [[[USERNAME]]] on server <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting that you install a remote management agent. WARNING: this will allow the requester to <u>take control of your computer</u>. If you wish to do this, click on the following link to download the agent.</p><p style="margin-left:30px"><a href="[[[CALLBACKURL]]]">Click here to download the MeshAgent for Windows.</a></p>If you did not know about this request, please ignore this mail.</div>';
 | 
					    const accountInviteMailHtml = '<div style="font-family:Arial,Helvetica,sans-serif"><table style="background-color:#003366;color:lightgray;width:100%" cellpadding=8><tr><td><b style="font-size:20px;font-family:Arial,Helvetica,sans-serif">[[[SERVERNAME]]] - Agent Installation</b></td></tr></table><p>[[[INTROHTML]]]User [[[USERNAME]]] on server <a href="[[[SERVERURL]]]">[[[SERVERNAME]]]</a> is requesting you to download the following software to start the remote control session.</p>[[[MSGHTML]]][[[AGENTHTML]]]<p>If you did not initiate this request, please ignore this mail.</p>Best regards,<br>[[[USERNAME]]]<br></div>';
 | 
				
			||||||
    const accountInviteMailText = '[[[SERVERNAME]]] - Agent Installation Invitation\r\n\r\nUser [[[USERNAME]]] on server [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting you install a remote management agent. WARNING: This will allow the requester to take control of your computer. If you wish to do this, click on the following link to download the agent: [[[CALLBACKURL]]]\r\nIf you do not know about this request, please ignore this mail.\r\n';
 | 
					    const accountInviteMailText = '[[[SERVERNAME]]] - Agent Installation Invitation\r\n\r\n[[[INTROTEXT]]]User [[[USERNAME]]] on server [[[SERVERNAME]]] ([[[SERVERURL]]]) is requesting you to download the following software to start the remote control session. [[[MSGTEXT]]][[[AGENTTEXT]]]If you did not initiate this request, please ignore this mail.\r\n\r\nBest regards,\r\n[[[USERNAME]]]\r\n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, '''); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
 | 
					    function EscapeHtml(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, '''); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
 | 
				
			||||||
    //function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '  '); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
 | 
					    //function EscapeHtmlBreaks(x) { if (typeof x == "string") return x.replace(/&/g, '&').replace(/>/g, '>').replace(/</g, '<').replace(/"/g, '"').replace(/'/g, ''').replace(/\r/g, '<br />').replace(/\n/g, '').replace(/\t/g, '  '); if (typeof x == "boolean") return x; if (typeof x == "number") return x; }
 | 
				
			||||||
| 
						 | 
					@ -59,10 +59,25 @@ module.exports.CreateMeshMain = function (parent) {
 | 
				
			||||||
            url = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + domain.dns + ':' + obj.parent.args.port + domain.url;
 | 
					            url = 'http' + ((obj.parent.args.notls == null) ? 's' : '') + '://' + domain.dns + ':' + obj.parent.args.port + domain.url;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (options) {
 | 
					        if (options) {
 | 
				
			||||||
            if (options.cookie != null) { text = text.split('[[[CALLBACKURL]]]').join(url + 'checkmail?c=' + options.cookie); }
 | 
					            if (options.cookie == null) { options.cookie = ''; }
 | 
				
			||||||
            if (options.meshid != null) { text = text.split('[[[CALLBACKURL]]]').join(url + 'meshagents?id=3&meshid=' + options.meshid.split('/')[2] + '&tag=mailto:' + EscapeHtml(email)); }
 | 
					            if (options.agentlinkhtml == null) { options.agentlinkhtml = ''; }
 | 
				
			||||||
 | 
					            if (options.agentlinktext == null) { options.agentlinktext = ''; }
 | 
				
			||||||
 | 
					            if (options.meshid == null) { options.meshid = ''; }
 | 
				
			||||||
 | 
					            if (options.introtext == null) { options.introtext = ''; }
 | 
				
			||||||
 | 
					            if (options.introhtml == null) { options.introhtml = ''; }
 | 
				
			||||||
 | 
					            if (options.msgtext == null) { options.msgtext = ''; }
 | 
				
			||||||
 | 
					            if (options.msghtml == null) { options.msghtml = ''; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            text = text.split('[[[CALLBACKURL]]]').join(url + 'checkmail?c=' + options.cookie);
 | 
				
			||||||
 | 
					            text = text.split('[[[AGENTHTML]]]').join(options.agentlinkhtml);
 | 
				
			||||||
 | 
					            text = text.split('[[[AGENTTEXT]]]').join(options.agentlinktext);
 | 
				
			||||||
 | 
					            text = text.split('[[[MESHID]]]').join(options.meshid);
 | 
				
			||||||
 | 
					            text = text.split('[[[INTROTEXT]]]').join(options.introtext);
 | 
				
			||||||
 | 
					            text = text.split('[[[INTROHTML]]]').join(options.introhtml);
 | 
				
			||||||
 | 
					            text = text.split('[[[MSGTEXT]]]').join(options.msgtext);
 | 
				
			||||||
 | 
					            text = text.split('[[[MSGHTML]]]').join(options.msghtml);            
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return text.split('[[[USERNAME]]]').join(username).split('[[[SERVERURL]]]').join(url).split('[[[SERVERNAME]]]').join(domain.title);
 | 
					        return text.split('[[[USERNAME]]]').join(username).split('[[[SERVERURL]]]').join(url).split('[[[SERVERNAME]]]').join(domain.title).split('[[[EMAIL]]]').join(EscapeHtml(email)).split('[[[URL]]]').join(url);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Send a mail
 | 
					    // Send a mail
 | 
				
			||||||
| 
						 | 
					@ -88,9 +103,25 @@ module.exports.CreateMeshMain = function (parent) {
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Send agent invite mail
 | 
					    // Send agent invite mail
 | 
				
			||||||
    obj.sendAgentInviteMail = function (domain, username, email, meshid) {
 | 
					    obj.sendAgentInviteMail = function (domain, username, email, meshid, name, os, msg) {
 | 
				
			||||||
        if ((parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, can't do this.
 | 
					        if ((parent.certificates == null) || (parent.certificates.CommonName == null) || (parent.certificates.CommonName == 'un-configured')) return; // If the server name is not set, can't do this.
 | 
				
			||||||
        obj.pendingMails.push({ to: email, from: parent.config.smtp.from, subject: mailReplacements(accountInviteSubject, domain, username, email), text: mailReplacements(accountInviteMailText, domain, username, email, { meshid: meshid }), html: mailReplacements(accountInviteMailHtml, domain, username, email, { meshid: meshid }) });
 | 
					        var options = { meshid: meshid.split('/')[2] };
 | 
				
			||||||
 | 
					        var agentLinkHtml = '';
 | 
				
			||||||
 | 
					        var agentLinkText = '';
 | 
				
			||||||
 | 
					        if (os == 0 || os == 1) { // All OS or Windows
 | 
				
			||||||
 | 
					            agentLinkHtml += '<p style="margin-left:30px"><a href="[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHID]]]&tag=mailto:[[[EMAIL]]]">Click here to download the MeshAgent for Windows.</a></p>';
 | 
				
			||||||
 | 
					            agentLinkText += 'For Windows, nagivate to the following link to complete the process:\r\n\r\n[[[SERVERURL]]]/meshagents?id=3&meshid=[[[MESHID]]]&tag=mailto:[[[EMAIL]]]\r\n\r\n';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (os == 0 || os == 2) { // All OS or Linux
 | 
				
			||||||
 | 
					            agentLinkHtml += '<p>For Linux, cut & paste the following in a terminal to install the agent:<br/><pre style="margin-left:30px">wget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHID]]]\'</pre></p>';
 | 
				
			||||||
 | 
					            agentLinkText += 'For Linux, cut & paste the following in a terminal to install the agent:\r\n\r\nwget -q [[[SERVERURL]]]/meshagents?script=1 --no-check-certificate -O ./meshinstall.sh && chmod 755 ./meshinstall.sh && sudo ./meshinstall.sh [[[SERVERURL]]] \'[[[MESHID]]]\'\r\n\r\n';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        options.agentlinkhtml = agentLinkHtml;
 | 
				
			||||||
 | 
					        options.agentlinktext = agentLinkText;
 | 
				
			||||||
 | 
					        if ((name != null) && (name != '')) { options.introtext = 'Hello ' + name + ',\r\n\r\n'; options.introhtml = '<p>Hello ' + name + ',</p>'; }
 | 
				
			||||||
 | 
					        if ((msg != null) && (msg != '')) { options.msgtext = '\r\n\r\nMessage: ' + msg + '\r\n\r\n'; options.msghtml = '<p>Message: <b>' + msg + '</b></p>'; }
 | 
				
			||||||
 | 
					        var mail = { to: email, from: parent.config.smtp.from, subject: mailReplacements(accountInviteSubject, domain, username, email), text: mailReplacements(accountInviteMailText, domain, username, email, options), html: mailReplacements(accountInviteMailHtml, domain, username, email, options) };
 | 
				
			||||||
 | 
					        obj.pendingMails.push(mail);
 | 
				
			||||||
        sendNextMail();
 | 
					        sendNextMail();
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1109,7 +1109,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) {
 | 
				
			||||||
                            //if (mesh.links[user._id] == null || ((mesh.links[user._id].rights & 4) == 0)) return;
 | 
					                            //if (mesh.links[user._id] == null || ((mesh.links[user._id].rights & 4) == 0)) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            // Perform email invitation
 | 
					                            // Perform email invitation
 | 
				
			||||||
                            obj.parent.parent.mailserver.sendAgentInviteMail(domain, user.name, command.email, command.meshid);
 | 
					                            obj.parent.parent.mailserver.sendAgentInviteMail(domain, user.name, command.email, command.meshid, command.name, command.os, command.msg);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  "name": "meshcentral",
 | 
					  "name": "meshcentral",
 | 
				
			||||||
  "version": "0.2.0-e",
 | 
					  "version": "0.2.0-f",
 | 
				
			||||||
  "keywords": [
 | 
					  "keywords": [
 | 
				
			||||||
    "Remote Management",
 | 
					    "Remote Management",
 | 
				
			||||||
    "Intel AMT",
 | 
					    "Intel AMT",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1842,7 +1842,7 @@
 | 
				
			||||||
            if (mesh.mtype == 2) {
 | 
					            if (mesh.mtype == 2) {
 | 
				
			||||||
                r += ' <a style=cursor:pointer;font-size:10px title="Add a new computer to this mesh by installing the mesh agent." onclick=addAgentToMesh(\"' + mesh._id + '\")>Add Agent</a>';
 | 
					                r += ' <a style=cursor:pointer;font-size:10px title="Add a new computer to this mesh by installing the mesh agent." onclick=addAgentToMesh(\"' + mesh._id + '\")>Add Agent</a>';
 | 
				
			||||||
                if (features & 64) {
 | 
					                if (features & 64) {
 | 
				
			||||||
                    r += ' <a style=cursor:pointer;font-size:10px title="Invite someone to install the mesh agent." onclick=inviteAgentToMesh(\"' + mesh._id + '\")>Invite</a>';
 | 
					                    r += ' <a style=cursor:pointer;font-size:10px title="Invite someone to install the mesh agent on this mesh." onclick=inviteAgentToMesh(\"' + mesh._id + '\")>Invite</a>';
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return r;
 | 
					            return r;
 | 
				
			||||||
| 
						 | 
					@ -1965,8 +1965,11 @@
 | 
				
			||||||
            if (xxdialogMode) return;
 | 
					            if (xxdialogMode) return;
 | 
				
			||||||
            var mesh = meshes[meshid];
 | 
					            var mesh = meshes[meshid];
 | 
				
			||||||
            var x = "Invite someone to install the mesh agent. An email with be sent with the link to the mesh agent installation for " + EscapeHtml(mesh.name) + ".<br /><br />";
 | 
					            var x = "Invite someone to install the mesh agent. An email with be sent with the link to the mesh agent installation for " + EscapeHtml(mesh.name) + ".<br /><br />";
 | 
				
			||||||
            x += addHtmlValue('E-Mail', '<input id=agentInviteEmail style=width:240px onkeyup=validateAgentInvite()></input>');
 | 
					            x += addHtmlValue('Name (optional)', '<input id=agentInviteName value="" style=width:230px maxlength=64 />');
 | 
				
			||||||
            setDialogMode(2, "Invite Mesh Agent", 3, performAgentInvite, x, meshid);
 | 
					            x += addHtmlValue('Email', '<input id=agentInviteEmail style=width:230px placeholder="example@email.com" onkeyup=validateAgentInvite()></input>');
 | 
				
			||||||
 | 
					            x += addHtmlValue('Operating System', '<select id=agentInviteNameOs style=width:236px><option value=1>Windows</option><option value=0>Windows or Linux</option><option value=2>Linux</option></select>');
 | 
				
			||||||
 | 
					            x += addHtmlValue('Message<br />(optional)', '<textarea id=agentInviteMessage value="" style=width:230px;height:100px;resize:none maxlength=1024 /></textarea>');
 | 
				
			||||||
 | 
					            setDialogMode(2, "Invite", 3, performAgentInvite, x, meshid);
 | 
				
			||||||
            validateAgentInvite();
 | 
					            validateAgentInvite();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1975,7 +1978,7 @@
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function performAgentInvite(button, meshid) {
 | 
					        function performAgentInvite(button, meshid) {
 | 
				
			||||||
            meshserver.send({ action: 'inviteAgent', meshid: meshid, email: Q('agentInviteEmail').value });
 | 
					            meshserver.send({ action: 'inviteAgent', meshid: meshid, email: Q('agentInviteEmail').value, name: Q('agentInviteName').value, os: Q('agentInviteNameOs').value, msg: Q('agentInviteMessage').value });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function addAgentToMesh(meshid) {
 | 
					        function addAgentToMesh(meshid) {
 | 
				
			||||||
| 
						 | 
					@ -4561,7 +4564,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function account_showChangeEmail() {
 | 
					        function account_showChangeEmail() {
 | 
				
			||||||
            if (xxdialogMode) return;
 | 
					            if (xxdialogMode) return;
 | 
				
			||||||
            var x = "Change your account e-mail address here.<br /><br />";
 | 
					            var x = "Change your account email address here.<br /><br />";
 | 
				
			||||||
            x += addHtmlValue('Email', '<input id=dp2email style=width:230px maxlength=256 onchange=account_validateEmail() onkeyup=account_validateEmail(event) />');
 | 
					            x += addHtmlValue('Email', '<input id=dp2email style=width:230px maxlength=256 onchange=account_validateEmail() onkeyup=account_validateEmail(event) />');
 | 
				
			||||||
            setDialogMode(2, "Email Address Change", 3, account_changeEmail, x);
 | 
					            setDialogMode(2, "Email Address Change", 3, account_changeEmail, x);
 | 
				
			||||||
            if (userinfo.email != null) { Q('dp2email').value = userinfo.email; }
 | 
					            if (userinfo.email != null) { Q('dp2email').value = userinfo.email; }
 | 
				
			||||||
| 
						 | 
					@ -4737,6 +4740,9 @@
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (currentMesh.mtype == 2) {
 | 
					                if (currentMesh.mtype == 2) {
 | 
				
			||||||
                    x += '<a onclick=addAgentToMesh(\"' + currentMesh._id + '\") style=cursor:pointer;margin-right:10px title="Add a new computer to this mesh by installing the mesh agent."><img src=images/icon-addnew.png border=0 height=12 width=12> Install</a>';
 | 
					                    x += '<a onclick=addAgentToMesh(\"' + currentMesh._id + '\") style=cursor:pointer;margin-right:10px title="Add a new computer to this mesh by installing the mesh agent."><img src=images/icon-addnew.png border=0 height=12 width=12> Install</a>';
 | 
				
			||||||
 | 
					                    if (features & 64) {
 | 
				
			||||||
 | 
					                        x += '<a onclick=inviteAgentToMesh(\"' + currentMesh._id + '\") style=cursor:pointer;margin-right:10px title="Invite someone to install the mesh agent on this mesh."><img src=images/icon-addnew.png border=0 height=12 width=12> Invite</a>';
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue