Mercurial > xmpp2smtp
view xmpp2smtp.js @ 6:5cf8a08ef7fe
Fix errors in disco#info.
author | Sonny Piers <sonny.piers@gmail.com> |
---|---|
date | Wed, 15 Jun 2011 12:25:18 +0200 |
parents | c1a19866a233 |
children |
line wrap: on
line source
var os = require('os'); var fs = require('fs'); var xmpp = require('node-xmpp'); var ispdb = require('./node-ispdb'); var smtp = require("./Nodemailer/lib/mail"); var config = require("./configuration"); var info = []; //~ info.push(new xmpp.Element("feature", {"var": "http://jabber.org/protocol/caps"})); //~ info.push(new xmpp.Element("feature", {"var": "http://jabber.org/protocol/commands"})); info.push(new xmpp.Element("feature", {"var": "http://jabber.org/protocol/disco#info"})); info.push(new xmpp.Element("feature", {"var": "jabber:iq:register"})); info.push(new xmpp.Element("feature", {"var": "jabber:iq:version"})); info.push(new xmpp.Element("feature", {"var": "jabber:iq:gateway"})); info.push(new xmpp.Element("identity", {category: "gateway", type: "smtp", name: config.XMPP.name})); var cl = new xmpp.Component({ jid: config.XMPP.jid, password: config.XMPP.password, host: config.XMPP.host, port: config.XMPP.port }); cl.on('stanza', function(stanza) { var type = stanza.attrs.type; //jabber:iq:register remove if((stanza.is("iq")) && (type == "set") && (stanza.getChild("query", "jabber:iq:register")) && (stanza.getChild("query").getChild("remove"))) { fs.unlink("storage/"+stanza.attrs['from'].split("/")[0], function() { cl.send(new xmpp.Element( "iq", { id: stanza.attrs.id, to: stanza.attrs.from, from: config.XMPP.jid, type: 'result' } )); } ); } //jabber:iq:register get else if((stanza.is("iq")) && (type == "get") && (stanza.getChild("query", "jabber:iq:register"))) { var result = new xmpp.Element( "iq", { id: stanza.attrs.id, to: stanza.attrs.from, from: config.XMPP.jid, type: 'result' } ) .c("query", {xmlns: "jabber:iq:register"}); fs.readFile("storage/"+stanza.attrs['from'].split("/")[0], function(err, data) { if(config.easySMTPConf && ispdb) { result.c("instructions").t("Please enter your email and password, we will try to find the SMTP configuration for you."); result.c("username"); result.c("password"); } else { result.c("x", {type: "form", xmlns: "jabber:x:data"}); var fields; data ? fields = JSON.parse(data) : fields = {host:"smtp.example.com",use_authentication: "login", port:"465", ssl: false, user: "example(@example.com)", pass: "example", sender: "example@example.com"}; result.c("field", {type: "hidden", "var": "FORM_TYPE"}).c("value").t("jabber:iq:register"); result.c("field", {type: "text-single", label: "Host", "var": "host"}).c("required").up().c("value").t(fields.host); result.c("field", {type: "text-single", label: "Port", "var": "port"}).c("required").up().c("value").t(fields.port); result.c("field", {type: "boolean", label: "Enable SSL", "var": "ssl"}).c("required").up().c("value").t(fields.ssl); result.c("field", {type: "boolean", label: "Use authentication", "var": "authentication"}).c("required").up().c("value").t(fields.user_authentication); result.c("field", {type: "text-single", label: "Email address", "var": "sender"}).c("required").up().c("value").t(fields.from); result.c("field", {type: "text-single", label: "Username", "var": "user"}).c("required").up().c("value").t(fields.username); result.c("field", {type: "text-private", label: "Password", "var": "pass"}).c("required").up().c("value").t(fields.password); } cl.send(result); } ); } //jabber:iq:register set else if((stanza.is("iq")) && (type == "set") && (stanza.getChild("query", "jabber:iq:register"))) { var test = {}; var path = "storage/"+stanza.attrs["from"].split("/")[0]; //easySMTPConfig :) if(stanza.getChild("query").getChild("username")) { var username = stanza.getChild("query").getChild("username").getText(); var password = stanza.getChild("query").getChild("password").getText(); ispdb.get(username.split("@")[1], function(data) { if(data == null) { cl.send(new xmpp.Element("iq", {to: stanza.attrs.from, from: config.XMPP.jid, id: stanza.attrs.id, type: "error"})); } else { var smtp = data.outgoing; test.port = smtp.port; test.host = smtp.hostname; if(smtp.socketType == "SSL") test.ssl = true; if((smtp.authentication == "secure") || (smtp.authentication == "plain")) test.use_authentication = true; test.sender = username; test.user = username; test.pass = password; } fs.writeFile(path, JSON.stringify(test), function () { cl.send(new xmpp.Element("iq", {to: stanza.attrs.from, from: config.XMPP.jid, id: stanza.attrs.id, type: "result"})); }); }); } //not easy else { var fields = stanza.getChild("query").getChild("x").getChildren("field"); for (var i=0;i<fields.length;i++) { if(fields[i].attrs["var"] != "FORM_TYPE") test[fields[i].attrs["var"]] = fields[i].getChild("value").getText(); } fs.writeFile(path, JSON.stringify(test), function () { cl.send(new xmpp.Element("iq", {to: stanza.attrs.from, from: config.XMPP.jid, id: stanza.attrs.id, type: "result"})); }); } } //jabber:iq:version else if((stanza.is("iq")) && (type == "get") && (stanza.getChild("query", "jabber:iq:version"))) { var result = new xmpp.Element( "iq", { to: stanza.attrs.from, from: config.XMPP.jid, id: stanza.attrs.id, type: 'result' } ).c("query", {xmlns: "jabber:iq:version"}) stanza.c("name").t("xmpp2smtp"); stanza.c("version").t("0.1"); stanza.c("os").t(os.type()+" "+os.release()); cl.send(result); } //disco#info else if((stanza.is("iq")) && (type == "get") && (stanza.getChild("query", "http://jabber.org/protocol/disco#info"))) { var stanza = new xmpp.Element( 'iq', { to: stanza.attrs.from, from: config.XMPP.jid, id: stanza.attrs.id, type: 'result' } ); for(var i=0;i<info.length;i++) { stanza.cnode(info[i]); } cl.send(stanza); } //message else if (stanza.is('message') && (type == 'chat')||(type == 'normal')) { fs.readFile("storage/"+stanza.attrs['from'].split("/")[0], function(err, data) { var settings; data ? settings = JSON.parse(data) : settings = config.SMTP; smtp.SMTP = settings; smtp.send_mail( { sender:settings.sender, to: stanza.attrs.to.split("@")[0].replace("%", "@"), subject: (type == "normal" ? stanza.getChildText("subject") : ""), body: stanza.getChildText("body") }, function(error, success){ if(error) { cl.send(new xmpp.Element('message', {type: stanza.attrs.type, to: stanza.attrs.from, from: config.XMPP.jid}).c("body").t("Sorry we haven't been able to deliver the mail, check your settings.")); } } ); } ); } } ); cl.on('error', function(e) { console.log(e); } );