diff 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 diff
new file mode 100755
--- /dev/null
+++ b/xmpp2smtp.js
@@ -0,0 +1,189 @@
+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);
+  }
+);
+