view xmpp2smtp.js @ 0:e459f344d8bd

First commit.
author Sonny Piers <sonny.piers@gmail.com>
date Wed, 15 Jun 2011 06:10:47 +0200
parents
children c1a19866a233
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("identity", {category: "gateway", type: "irc", 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",authentication: "login", port:"465", ssl: true, username: "example(@example.com)",password: "example", from: "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: "list-single", label: "Authentication method", "var": "authentication"}).c("required").up().c("value").t(fields.authentication).up().c("option", {label: "login"}).c("value").t("login").up().up().c("option", {label: "anonymous"}).c("value").t("anonymous");
						result.c("field", {type: "text-single", label: "Email address", "var": "from"}).c("required").up().c("value").t(fields.from);
						result.c("field", {type: "text-single", label: "Username", "var": "username"}).c("required").up().c("value").t(fields.username);
						result.c("field", {type: "text-private", label: "Password", "var": "password"}).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 = 1;
						else
							test.ssl = 0;
						test.authentication = "login";
						test.from = username;
						test.username = username;
						test.password = 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 = {
						host: settings.host,
						port: settings.port,
						use_authentication: true,
						user: settings.username,
						pass: settings.password
					}
					smtp.send_mail(
						{
							sender: settings.from, 
							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);
  }
);