File

mod_tcpproxy/web/xmpp.io.js @ 4409:44f6537f6427

mod_invites_adhoc: Fail contact invite if user is not on current host Only the username was being used, and the host of the requester ignored. Luckily this only affects admins of the host. If they want to create an account they can use the other command. If they want to create a contact they should request from their account on this host.
author Matthew Wild <mwild1@gmail.com>
date Thu, 28 Jan 2021 07:04:11 +0000
parent 1343:7dbde05b48a9
line wrap: on
line source

var xmlns_ibb = "http://jabber.org/protocol/ibb";
var xmlns_tcp = "http://prosody.im/protocol/tcpproxy";

function XMPPIO(xmppconn, xmpptcp_host)
{
	this.xmppconn = xmppconn;
	this.xmpphost = xmpptcp_host;
	this.sid = "FIXME";

	this.listeners = [];
	return this;
}

XMPPIO.prototype = {
	connect: function (host, port)
	{
		var conn = this;
		console.log("Connecting...");

		function onConnect()
		{
			this.xmppconn.addHandler(function (stanza)
			{
				var data = stanza.getElementsByTagName("data")[0];
				if(data)
					conn.emit("data", Strophe.Base64.decode(Strophe.getText(data)));
			}, null, "message", null, null, this.xmpphost, {});
			this.xmppconn.addHandler(function (stanza)
			{
				var data = stanza.getElementsByTagName("close")[0];
				if(close)
				{
					conn.write = function () { throw "Connection closed"; };
					conn.emit("end");
				}
			}, xmlns_ibb, "iq", "set", null, this.xmpphost, {});
			conn.emit("connect");
		}

		this.xmppconn.sendIQ($iq({to:this.xmpphost,type:"set"})
			.c("open", {
				"xmlns": xmlns_ibb,
				"xmlns:tcp": xmlns_tcp,
				"tcp:host": host,
				"tcp:port": port.toString(),
				"block-size": "4096",
				"sid": this.sid.toString(),
				"stanza": "message"
			}), onConnect,
			function () { conn.emit("error"); });
	},
	emit: function ()
	{
		console.log("xmpp.io: Emitting "+arguments[0]);
		var args = Array.prototype.slice.call(arguments, 1);
		var listeners = this.listeners[arguments[0]];
		if(listeners)
		{
			for(var i=0;i<listeners.length;i++)
			{
				listeners[i][1].apply(listeners[i][0], args);
			}
		}
	},
	addListener: function (event, method, obj)
	{
		if(typeof(obj)=="undefined")
			obj = this;
		if(!(event in this.listeners))
			this.listeners[event] = [];
		this.listeners[event].push([obj, method]);
	},
	write: function (data)
	{
		return this.xmppconn.send($msg({to:this.xmpphost})
			.c("data", {xmlns:xmlns_ibb, sid:this.sid.toString()})
				.t(Strophe.Base64.encode(data)));
	},
	end: function ()
	{
		return this.xmppconn.send($iq({to:this.xmpphost})
			.c("close", {xmlns:xmlns_ibb, sid:this.sid.toString()}));
	}
};