mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Migrate email node to credentials system
This commit is contained in:
		@@ -53,26 +53,25 @@
 | 
			
		||||
        <input type="text" id="node-input-port" placeholder="465">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-config-input-userid"><i class="icon-user"></i> Userid</label>
 | 
			
		||||
        <input type="text" id="node-config-input-userid">
 | 
			
		||||
        <label for="node-input-userid"><i class="icon-user"></i> Userid</label>
 | 
			
		||||
        <input type="text" id="node-input-userid">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-config-input-password"><i class="icon-lock"></i> Password</label>
 | 
			
		||||
        <input type="password" id="node-config-input-password">
 | 
			
		||||
        <label for="node-input-password"><i class="icon-lock"></i> Password</label>
 | 
			
		||||
        <input type="password" id="node-input-password">
 | 
			
		||||
    </div>
 | 
			
		||||
    <br/>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-input-dname"><i class="icon-tag"></i> Name</label>
 | 
			
		||||
        <input type="text" id="node-input-dname" placeholder="Name">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-tips" id="node-tip"><b>Note:</b> Using credentials from global emailkeys.js file.</div>
 | 
			
		||||
    <div class="form-tips" id="node-tip"><b>Note:</b> Copied credentials from global emailkeys.js file.</div>
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script type="text/x-red" data-help-name="e-mail">
 | 
			
		||||
    <p>Sends the <b>msg.payload</b> as an email, with a subject of <b>msg.topic</b>.</p>
 | 
			
		||||
    <p>It sends the message to the configured recipient <i>only</i>.</p>
 | 
			
		||||
    <p><b>msg.topic</b> is used to set the subject of the email, and <b>msg.payload</b> is the body text.</p>
 | 
			
		||||
    <p>Uses the nodemailer module.</p>
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
@@ -86,6 +85,12 @@
 | 
			
		||||
            name: {value:"",required:true},
 | 
			
		||||
            dname: {value:""}
 | 
			
		||||
        },
 | 
			
		||||
        credentials: {
 | 
			
		||||
            userid: {type:"text"},
 | 
			
		||||
            password: {type: "password"},
 | 
			
		||||
            global: { type:"boolean"}
 | 
			
		||||
        },  
 | 
			
		||||
        
 | 
			
		||||
        inputs:1,
 | 
			
		||||
        outputs:0,
 | 
			
		||||
        icon: "envelope.png",
 | 
			
		||||
@@ -97,40 +102,11 @@
 | 
			
		||||
            return (this.dname||!this.topic)?"node_label_italic":"";
 | 
			
		||||
        },
 | 
			
		||||
        oneditprepare: function() {
 | 
			
		||||
            $.getJSON('email/'+this.id,function(data) {
 | 
			
		||||
                if (data.userid) {
 | 
			
		||||
                    $('#node-config-input-userid').val(data.userid);
 | 
			
		||||
                }
 | 
			
		||||
                if (data.hasPassword) {
 | 
			
		||||
                    $('#node-config-input-password').val('__PWRD__');
 | 
			
		||||
                } else {
 | 
			
		||||
                    $('#node-config-input-password').val('');
 | 
			
		||||
                }
 | 
			
		||||
                if (data.global) $('#node-tip').show();
 | 
			
		||||
                else $('#node-tip').hide();
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
        oneditsave: function() {
 | 
			
		||||
            var credentials = {};
 | 
			
		||||
            var newUser = $('#node-config-input-userid').val();
 | 
			
		||||
            var newPass = $('#node-config-input-password').val();
 | 
			
		||||
            credentials.userid = newUser;
 | 
			
		||||
            if (newPass != '__PWRD__') {
 | 
			
		||||
                credentials.password = newPass;
 | 
			
		||||
            }
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: 'email/'+this.id,
 | 
			
		||||
                type: 'POST',
 | 
			
		||||
                data: credentials,
 | 
			
		||||
                success: function(result){}
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
        ondelete: function() {
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: 'email/'+this.id,
 | 
			
		||||
                type: 'DELETE',
 | 
			
		||||
                success: function(result) {}
 | 
			
		||||
            });
 | 
			
		||||
            if (this.credentials.global) {
 | 
			
		||||
                $('#node-tip').show();
 | 
			
		||||
            } else {
 | 
			
		||||
                $('#node-tip').hide();
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})();
 | 
			
		||||
@@ -151,19 +127,19 @@
 | 
			
		||||
        <input type="text" id="node-input-port" placeholder="993">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-config-input-userid"><i class="icon-user"></i> Userid</label>
 | 
			
		||||
        <input type="text" id="node-config-input-userid">
 | 
			
		||||
        <label for="node-input-userid"><i class="icon-user"></i> Userid</label>
 | 
			
		||||
        <input type="text" id="node-input-userid">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-config-input-password"><i class="icon-lock"></i> Password</label>
 | 
			
		||||
        <input type="password" id="node-config-input-password">
 | 
			
		||||
        <input type="password" id="node-input-password">
 | 
			
		||||
    </div>
 | 
			
		||||
    <br/>
 | 
			
		||||
    <div class="form-row">
 | 
			
		||||
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
 | 
			
		||||
        <input type="text" id="node-input-name" placeholder="Name">
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="form-tips" id="node-tip"><b>Note:</b> Using credentials from global emailkeys.js file.</div>
 | 
			
		||||
    <div class="form-tips" id="node-tip"><b>Note:</b> Copied credentials from global emailkeys.js file.</div>
 | 
			
		||||
    <div id="node-input-tip" class="form-tips">Tip: <b>ONLY</b> retrieves the single most recent email.</div>
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
@@ -186,6 +162,11 @@
 | 
			
		||||
            port: {value:"993",required:true},
 | 
			
		||||
            name: {value:""}
 | 
			
		||||
        },
 | 
			
		||||
        credentials: {
 | 
			
		||||
            userid: {type:"text"},
 | 
			
		||||
            password: {type: "password"},
 | 
			
		||||
            global: { type:"boolean"}
 | 
			
		||||
        },
 | 
			
		||||
        inputs:0,
 | 
			
		||||
        outputs:1,
 | 
			
		||||
        icon: "envelope.png",
 | 
			
		||||
@@ -196,40 +177,11 @@
 | 
			
		||||
            return (this.name||!this.topic)?"node_label_italic":"";
 | 
			
		||||
        },
 | 
			
		||||
        oneditprepare: function() {
 | 
			
		||||
            $.getJSON('email/'+this.id,function(data) {
 | 
			
		||||
                if (data.userid) {
 | 
			
		||||
                    $('#node-config-input-userid').val(data.userid);
 | 
			
		||||
                }
 | 
			
		||||
                if (data.hasPassword) {
 | 
			
		||||
                    $('#node-config-input-password').val('__PWRD__');
 | 
			
		||||
                } else {
 | 
			
		||||
                    $('#node-config-input-password').val('');
 | 
			
		||||
                }
 | 
			
		||||
                if (data.global) $('#node-tip').show();
 | 
			
		||||
                else $('#node-tip').hide();
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
        oneditsave: function() {
 | 
			
		||||
            var credentials = {};
 | 
			
		||||
            var newUser = $('#node-config-input-userid').val();
 | 
			
		||||
            var newPass = $('#node-config-input-password').val();
 | 
			
		||||
            credentials.userid = newUser;
 | 
			
		||||
            if (newPass != '__PWRD__') {
 | 
			
		||||
                credentials.password = newPass;
 | 
			
		||||
            }
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: 'email/'+this.id,
 | 
			
		||||
                type: 'POST',
 | 
			
		||||
                data: credentials,
 | 
			
		||||
                success: function(result){}
 | 
			
		||||
            });
 | 
			
		||||
        },
 | 
			
		||||
        ondelete: function() {
 | 
			
		||||
            $.ajax({
 | 
			
		||||
                url: 'email/'+this.id,
 | 
			
		||||
                type: 'DELETE',
 | 
			
		||||
                success: function(result) {}
 | 
			
		||||
            });
 | 
			
		||||
            if (this.credentials.global) {
 | 
			
		||||
                $('#node-tip').show();
 | 
			
		||||
            } else {
 | 
			
		||||
                $('#node-tip').hide();
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})();
 | 
			
		||||
 
 | 
			
		||||
@@ -22,8 +22,10 @@ module.exports = function(RED) {
 | 
			
		||||
 | 
			
		||||
    //console.log(nodemailer.Transport.transports.SMTP.wellKnownHosts);
 | 
			
		||||
 | 
			
		||||
    try { var globalkeys = RED.settings.email || require(process.env.NODE_RED_HOME+"/../emailkeys.js"); }
 | 
			
		||||
    catch(err) { }
 | 
			
		||||
    try {
 | 
			
		||||
        var globalkeys = RED.settings.email || require(process.env.NODE_RED_HOME+"/../emailkeys.js");
 | 
			
		||||
    } catch(err) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function EmailNode(n) {
 | 
			
		||||
        RED.nodes.createNode(this,n);
 | 
			
		||||
@@ -32,18 +34,29 @@ module.exports = function(RED) {
 | 
			
		||||
        this.outserver = n.server;
 | 
			
		||||
        this.outport = n.port;
 | 
			
		||||
        var flag = false;
 | 
			
		||||
        var credentials = RED.nodes.getCredentials(n.id);
 | 
			
		||||
        if ((credentials) && (credentials.hasOwnProperty("userid"))) { this.userid = credentials.userid; }
 | 
			
		||||
        else {
 | 
			
		||||
            if (globalkeys) { this.userid = globalkeys.user; flag = true; }
 | 
			
		||||
            else { this.error("No e-mail userid set"); }
 | 
			
		||||
        if (this.credentials && this.credentials.hasOwnProperty("userid")) {
 | 
			
		||||
            this.userid = this.credentials.userid;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (globalkeys) {
 | 
			
		||||
                this.userid = globalkeys.user;
 | 
			
		||||
                flag = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.error("No e-mail userid set");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if ((credentials) && (credentials.hasOwnProperty("password"))) { this.password = credentials.password; }
 | 
			
		||||
        else {
 | 
			
		||||
            if (globalkeys) { this.password = globalkeys.pass; flag = true; }
 | 
			
		||||
            else { this.error("No e-mail password set"); }
 | 
			
		||||
        if (this.credentials && this.credentials.hasOwnProperty("password")) {
 | 
			
		||||
            this.password = this.credentials.password;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (globalkeys) {
 | 
			
		||||
                this.password = globalkeys.pass;
 | 
			
		||||
                flag = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.error("No e-mail password set");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (flag) {
 | 
			
		||||
            RED.nodes.addCredentials(n.id,{userid:this.userid, password:this.password, global:true});
 | 
			
		||||
        }
 | 
			
		||||
        if (flag) { RED.nodes.addCredentials(n.id,{userid:this.userid, password:this.password, global:true}); }
 | 
			
		||||
        var node = this;
 | 
			
		||||
 | 
			
		||||
        var smtpTransport = nodemailer.createTransport({
 | 
			
		||||
@@ -88,7 +101,13 @@ module.exports = function(RED) {
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    RED.nodes.registerType("e-mail",EmailNode);
 | 
			
		||||
    RED.nodes.registerType("e-mail",EmailNode,{
 | 
			
		||||
        credentials: {
 | 
			
		||||
            userid: {type:"text"},
 | 
			
		||||
            password: {type: "password"},
 | 
			
		||||
            global: { type:"boolean"}
 | 
			
		||||
        }       
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function EmailInNode(n) {
 | 
			
		||||
        RED.nodes.createNode(this,n);
 | 
			
		||||
@@ -97,18 +116,31 @@ module.exports = function(RED) {
 | 
			
		||||
        this.inserver = n.server || emailkey.server || "imap.gmail.com";
 | 
			
		||||
        this.inport = n.port || emailkey.port || "993";
 | 
			
		||||
        var flag = false;
 | 
			
		||||
        var credentials = RED.nodes.getCredentials(n.id);
 | 
			
		||||
        if ((credentials) && (credentials.hasOwnProperty("userid"))) { this.userid = credentials.userid; }
 | 
			
		||||
        else {
 | 
			
		||||
            if (globalkeys) { this.userid = globalkeys.user; flag = true; }
 | 
			
		||||
            else { this.error("No e-mail userid set"); }
 | 
			
		||||
        
 | 
			
		||||
        if (this.credentials && this.credentials.hasOwnProperty("userid")) {
 | 
			
		||||
            this.userid = this.credentials.userid;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (globalkeys) {
 | 
			
		||||
                this.userid = globalkeys.user;
 | 
			
		||||
                flag = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.error("No e-mail userid set");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if ((credentials) && (credentials.hasOwnProperty("password"))) { this.password = credentials.password; }
 | 
			
		||||
        else {
 | 
			
		||||
            if (globalkeys) { this.password = globalkeys.pass; flag = true; }
 | 
			
		||||
            else { this.error("No e-mail password set"); }
 | 
			
		||||
        if (this.credentials && this.credentials.hasOwnProperty("password")) {
 | 
			
		||||
            this.password = this.credentials.password;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (globalkeys) {
 | 
			
		||||
                this.password = globalkeys.pass;
 | 
			
		||||
                flag = true;
 | 
			
		||||
            } else {
 | 
			
		||||
                this.error("No e-mail password set");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (flag) { RED.nodes.addCredentials(n.id,{userid:this.userid, password:this.password, global:true}); }
 | 
			
		||||
        if (flag) {
 | 
			
		||||
            RED.nodes.addCredentials(n.id,{userid:this.userid, password:this.password, global:true});
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        var node = this;
 | 
			
		||||
        this.interval_id = null;
 | 
			
		||||
        var oldmail = {};
 | 
			
		||||
@@ -215,54 +247,11 @@ module.exports = function(RED) {
 | 
			
		||||
 | 
			
		||||
        node.emit("input",{});
 | 
			
		||||
    }
 | 
			
		||||
    RED.nodes.registerType("e-mail in",EmailInNode);
 | 
			
		||||
 | 
			
		||||
    var querystring = require('querystring');
 | 
			
		||||
 | 
			
		||||
    RED.httpAdmin.get('/email/global',function(req,res) {
 | 
			
		||||
        res.send(JSON.stringify({hasToken:!(globalkeys && globalkeys.userid && globalkeys.password)}));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    RED.httpAdmin.get('/email/:id',function(req,res) {
 | 
			
		||||
        var credentials = RED.nodes.getCredentials(req.params.id);
 | 
			
		||||
        if (credentials) {
 | 
			
		||||
            res.send(JSON.stringify({userid:credentials.userid,hasPassword:(credentials.password&&credentials.password!="")}));
 | 
			
		||||
        }
 | 
			
		||||
        else if (globalkeys && globalkeys.user && globalkeys.pass) {
 | 
			
		||||
            RED.nodes.addCredentials(req.params.id,{userid:globalkeys.user, password:globalkeys.pass, global:true});
 | 
			
		||||
            credentials = RED.nodes.getCredentials(req.params.id);
 | 
			
		||||
            res.send(JSON.stringify({userid:credentials.userid,global:credentials.global,hasPassword:(credentials.password&&credentials.password!="")}));
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            res.send(JSON.stringify({}));
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    RED.httpAdmin.delete('/email/:id',function(req,res) {
 | 
			
		||||
        RED.nodes.deleteCredentials(req.params.id);
 | 
			
		||||
        res.send(200);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    RED.httpAdmin.post('/email/:id',function(req,res) {
 | 
			
		||||
        var body = "";
 | 
			
		||||
        req.on('data', function(chunk) {
 | 
			
		||||
            body+=chunk;
 | 
			
		||||
        });
 | 
			
		||||
        req.on('end', function(){
 | 
			
		||||
            var newCreds = querystring.parse(body);
 | 
			
		||||
            var credentials = RED.nodes.getCredentials(req.params.id)||{};
 | 
			
		||||
            if (newCreds.userid == null || newCreds.userid == "") {
 | 
			
		||||
                delete credentials.userid;
 | 
			
		||||
            } else {
 | 
			
		||||
                credentials.userid = newCreds.userid;
 | 
			
		||||
            }
 | 
			
		||||
            if (newCreds.password == "") {
 | 
			
		||||
                delete credentials.password;
 | 
			
		||||
            } else {
 | 
			
		||||
                credentials.password = newCreds.password||credentials.password;
 | 
			
		||||
            }
 | 
			
		||||
            RED.nodes.addCredentials(req.params.id,credentials);
 | 
			
		||||
            res.send(200);
 | 
			
		||||
        });
 | 
			
		||||
    RED.nodes.registerType("e-mail in",EmailInNode,{
 | 
			
		||||
        credentials: {
 | 
			
		||||
            userid: {type:"text"},
 | 
			
		||||
            password: {type: "password"},
 | 
			
		||||
            global: { type:"boolean"}
 | 
			
		||||
        }       
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user