mod_ipcheck/mod_ipcheck.lua
changeset 1593 3e4d15ae2133
parent 1245 a1287d1f8a1f
equal deleted inserted replaced
1592:47fb4f36dacd 1593:3e4d15ae2133
     4 
     4 
     5 local st = require "util.stanza";
     5 local st = require "util.stanza";
     6 
     6 
     7 module:add_feature("urn:xmpp:sic:0");
     7 module:add_feature("urn:xmpp:sic:0");
     8 
     8 
     9 module:hook("iq/bare/urn:xmpp:sic:0:ip", function(event)
     9 module:hook("iq-get/bare/urn:xmpp:sic:0:ip", function(event)
    10 	local origin, stanza = event.origin, event.stanza;
    10 	local origin, stanza = event.origin, event.stanza;
    11 	if stanza.attr.type == "get" then
    11 	if stanza.attr.to then
    12 		if stanza.attr.to then
    12 		origin.send(st.error_reply(stanza, "auth", "forbidden", "You can only ask about your own IP address"));
    13 			origin.send(st.error_reply(stanza, "auth", "forbidden", "You can only ask about your own IP address"));
    13 	elseif origin.ip then
    14 		elseif origin.ip then
    14 		origin.send(st.reply(stanza):tag("ip", {xmlns='urn:xmpp:sic:0'}):text(origin.ip));
    15 			origin.send(st.reply(stanza):tag("ip", {xmlns='urn:xmpp:sic:0'}):text(origin.ip));
    15 	else
    16 		else
    16 		-- IP addresses should normally be available, but in case they are not
    17 			-- IP addresses should normally be available, but in case they are not
    17 		origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "IP address for this session is not available"));
    18 			origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "IP address for this session is not available"));
       
    19 		end
       
    20 		return true;
       
    21 	end
    18 	end
       
    19 	return true;
    22 end);
    20 end);
    23 
    21 
    24 module:add_feature("urn:xmpp:sic:1");
    22 module:add_feature("urn:xmpp:sic:1");
    25 
    23 
    26 module:hook("iq/bare/urn:xmpp:sic:1:address", function(event)
    24 module:hook("iq-get/bare/urn:xmpp:sic:1:address", function(event)
    27 	local origin, stanza = event.origin, event.stanza;
    25 	local origin, stanza = event.origin, event.stanza;
    28 	if stanza.attr.type == "get" then
    26 	if stanza.attr.to then
    29 		if stanza.attr.to then
    27 		origin.send(st.error_reply(stanza, "auth", "forbidden", "You can only ask about your own IP address"));
    30 			origin.send(st.error_reply(stanza, "auth", "forbidden", "You can only ask about your own IP address"));
    28 	elseif origin.ip then
    31 		elseif origin.ip then
    29 		local reply = st.reply(stanza):tag("address", {xmlns='urn:xmpp:sic:0'})
    32 			local reply = st.reply(stanza):tag("address", {xmlns='urn:xmpp:sic:0'})
    30 		:tag("ip"):text(origin.ip):up()
    33 				:tag("ip"):text(origin.ip):up()
    31 		if origin.conn and origin.conn.port then -- server_event
    34 			if origin.conn and origin.conn.port then -- server_event
    32 			reply:tag("port"):text(tostring(origin.conn:port()))
    35 				reply:tag("port"):text(tostring(origin.conn:port()))
    33 		elseif origin.conn and origin.conn.clientport then -- server_select
    36 			elseif origin.conn and origin.conn.clientport then -- server_select
    34 			reply:tag("port"):text(tostring(origin.conn:clientport()))
    37 				reply:tag("port"):text(tostring(origin.conn:clientport()))
       
    38 			end
       
    39 			origin.send(reply);
       
    40 		else
       
    41 			-- IP addresses should normally be available, but in case they are not
       
    42 			origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "IP address for this session is not available"));
       
    43 		end
    35 		end
    44 		return true;
    36 		origin.send(reply);
       
    37 	else
       
    38 		-- IP addresses should normally be available, but in case they are not
       
    39 		origin.send(st.error_reply(stanza, "cancel", "service-unavailable", "IP address for this session is not available"));
    45 	end
    40 	end
       
    41 	return true;
    46 end);
    42 end);