examples/evil.lua
changeset 62 fb81aeb45e00
child 63 423555c07763
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/evil.lua	Mon Mar 23 08:15:47 2009 +0200
@@ -0,0 +1,136 @@
+
+-- MALICIOUS STANZAS (XEP-0076)
+
+-- FIXME for now we only can send evil messages
+--       also we cannot detect stream-level evil :(
+
+-- library
+
+require 'lm'
+require 'iq'
+
+-- public
+
+evil = {
+	handler =
+		function ( mess )
+			return false
+		end,
+}
+
+function evil.message ( conn, to, mtype, message )
+	conn:send ( lm.message.create { mtype = 'message-' .. mtype, to = to,
+			body = { message },
+			evil = { xmlns = 'http://jabber.org/protocol/evil' },
+		} )
+end
+
+function evil.presence ( conn, to, status, message )
+	local mtype = 'presence-available'
+	if status == 'unavailable' then
+		mtype = 'presence-unavailable'
+		status = ''
+	end
+	conn:send ( lm.message.create { mtype = mtype, from = conn:jid (), to = to,
+			show   = { status },
+			status = { message },
+			evil   = { xmlns = 'http://jabber.org/protocol/evil' },
+		} )
+end
+
+-- private
+
+local evil_incoming_stanza_handler = lm.message_handler.new (
+	function ( conn, mess )
+		local e = mess:child ( 'evil' )
+		if e and e:attribute ( 'xmlns' ) == 'http://jabber.org/protocol/evil' then
+			return evil.handler ( mess )
+		end
+	end )
+
+-- mcabber
+
+evil.handler =
+	function ( mess )
+		local mtype, smtype = mess:type ()
+		main.print_info ( mess:attribute ( 'from' ), 'Evil stanza of type ' .. mtype .. ', ' .. ( smtype or '' ) .. ' detected!' )
+		return main.yesno ( main.option ( 'lua_filter_evil' ) )
+	end
+
+local stat2xmpp = {
+	free     = 'chat',
+	online   = '',
+	away     = 'away',
+	dnd      = 'dnd',
+	notavail = 'xa',
+	offline  = 'unavailable',
+}
+
+
+-- TODO improve interface, check if we sending right thing for offline
+main.command ( 'evil',
+	function ( args )
+		local conn = lm.connection.bless ( main.connection () )
+		if args[1] == 'status' then
+			local text = ''
+			for i, mesg in ipairs ( args ) do
+				if i > 2 then
+					text = text .. ' ' .. mesg
+				end
+			end
+			local st = stat2xmpp[args[2]]
+			if not st then
+				st = ''
+			end
+			evil.presence ( conn, args.t, st, text:sub ( 2 ) )
+		else
+			local text = ''
+			if args[1] == 'message' then
+				for i, mesg in ipairs ( args ) do
+					if i > 1 then
+						text = text .. ' ' .. mesg
+					end
+				end
+			else
+				for i, mesg in ipairs ( args ) do
+					text = text .. ' ' .. mesg
+				end
+			end
+			local mtype = 'chat'
+			if args.k then
+				mtype = args.k
+			end
+			local who
+			if args.t then
+				who = args.t
+			else
+				who = main.current_buddy ()
+			end
+			evil.message ( conn, who, mtype, text:sub ( 2 ) )
+		end
+	end, true )
+
+commands_help['evil'] = "[-t jid] [status stat [message] | [-k message_type] [message] message]\n\nSends evil message or presence.\nmessage_type may be chat, normal, headline.\nNote, that for now it will not change mcabber's status."
+
+local evil_handler_registered = false
+
+hooks_d['hook-post-connect'].evil =
+	function ( args )
+		lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'iq', 'normal' )
+		lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'message', 'normal' )
+		lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'presence', 'normal' )
+		evil_handler_registered = true
+		hooks_d['hook-post-connect'].evil = nil
+		hooks_d['hook-quit'].evil =
+			function ( args )
+				if evil_handler_registered then
+					lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'iq' )
+					lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'message' )
+					lm.connection.bless( main.connection () ):handler ( evil_incoming_stanza_handler, 'presence' )
+				end
+			end
+	end
+
+main.add_feature ( 'http://jabber.org/protocol/evil' )
+
+-- vim: se ts=4: --