main.lua
changeset 99 ba08b8a4eeef
parent 97 c3f12fd0c823
child 133 b92493ea6fd7
child 145 fbb3a4ff9cf1
equal deleted inserted replaced
98:3a2d327c4856 99:ba08b8a4eeef
     1 require "luarocks.require"
     1 require "luarocks.require"
     2 
     2 
     3 local server = require "net.server"
     3 local server = require "net.server"
       
     4 require "lxp"
     4 require "socket"
     5 require "socket"
     5 require "ssl"
     6 require "ssl"
     6 require "lxp"
       
     7 
     7 
     8 function log(type, area, message)
     8 function log(type, area, message)
     9 	print(type, area, message);
     9 	print(type, area, message);
    10 end
    10 end
    11 
    11 
    12 dofile "lxmppd.cfg"
    12 dofile "lxmppd.cfg"
    13  
    13  
       
    14 -- Maps connections to sessions --
    14 sessions = {};
    15 sessions = {};
       
    16  
       
    17 -- Load and initialise core modules --
    15  
    18  
    16 require "util.import"
    19 require "util.import"
    17 require "core.stanza_dispatch"
    20 require "core.stanza_dispatch"
    18 require "core.xmlhandlers"
    21 require "core.xmlhandlers"
    19 require "core.rostermanager"
    22 require "core.rostermanager"
    20 require "core.offlinemessage"
    23 require "core.offlinemessage"
    21 require "core.modulemanager"
    24 require "core.modulemanager"
    22 require "core.usermanager"
    25 require "core.usermanager"
    23 require "core.sessionmanager"
    26 require "core.sessionmanager"
    24 require "core.stanza_router"
    27 require "core.stanza_router"
    25 require "net.connhandlers"
    28 
       
    29 local start = require "net.connlisteners".start;
    26 require "util.stanza"
    30 require "util.stanza"
    27 require "util.jid"
    31 require "util.jid"
    28 
    32 
       
    33 ------------------------------------------------------------------------
    29  
    34  
    30 -- Locals for faster access --
    35 -- Locals for faster access --
    31 local t_insert = table.insert;
    36 local t_insert = table.insert;
    32 local t_concat = table.concat;
    37 local t_concat = table.concat;
    33 local t_concatall = function (t, sep) local tt = {}; for _, s in ipairs(t) do t_insert(tt, tostring(s)); end return t_concat(tt, sep); end
    38 local t_concatall = function (t, sep) local tt = {}; for _, s in ipairs(t) do t_insert(tt, tostring(s)); end return t_concat(tt, sep); end
    35 local format = string.format;
    40 local format = string.format;
    36 local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; --import("core.sessionmanager", "new_session", "destroy_session");
    41 local sm_new_session, sm_destroy_session = sessionmanager.new_session, sessionmanager.destroy_session; --import("core.sessionmanager", "new_session", "destroy_session");
    37 local st = stanza;
    42 local st = stanza;
    38 ------------------------------
    43 ------------------------------
    39 
    44 
    40 
       
    41 
       
    42 local hosts, sessions = hosts, sessions;
    45 local hosts, sessions = hosts, sessions;
    43 
    46 
    44 function connect_host(host)
    47 -- Initialise modules
    45 	hosts[host] = { type = "remote", sendbuffer = {} };
       
    46 end
       
    47 
       
    48 function handler(conn, data, err)
       
    49 	local session = sessions[conn];
       
    50 
       
    51 	if not session then
       
    52 		sessions[conn] = sm_new_session(conn);
       
    53 		session = sessions[conn];
       
    54 
       
    55 		-- Logging functions --
       
    56 
       
    57 		local mainlog, log = log;
       
    58 		do
       
    59 			local conn_name = tostring(conn):match("%w+$");
       
    60 			log = function (type, area, message) mainlog(type, conn_name, message); end
       
    61 			--log = function () end
       
    62 		end
       
    63 		local print = function (...) log("info", "core", t_concatall({...}, "\t")); end
       
    64 		session.log = log;
       
    65 
       
    66 		print("Client connected");
       
    67 		
       
    68 		session.stanza_dispatch = function (stanza) return core_process_stanza(session, stanza); end
       
    69 		
       
    70 		session.connhandler = connhandlers.new("xmpp-client", session);
       
    71 			
       
    72 		function session.disconnect(err)
       
    73 			if session.last_presence and session.last_presence.attr.type ~= "unavailable" then
       
    74 				local pres = st.presence{ type = "unavailable" };
       
    75 				if err == "closed" then err = "connection closed"; end
       
    76 				pres:tag("status"):text("Disconnected: "..err);
       
    77 				session.stanza_dispatch(pres);
       
    78 			end
       
    79 			session = nil;
       
    80 			print("Disconnected: "..tostring(err));
       
    81 			collectgarbage("collect");
       
    82 		end
       
    83 	end
       
    84 	if data then
       
    85 		session.connhandler:data(data);
       
    86 	end
       
    87 	
       
    88 	--log("info", "core", "Client disconnected, connection closed");
       
    89 end
       
    90 
       
    91 function disconnect(conn, err)
       
    92 	sm_destroy_session(sessions[conn]);
       
    93 	sessions[conn] = nil;
       
    94 end
       
    95 
       
    96 modulemanager.loadall();
    48 modulemanager.loadall();
    97 
    49 
    98 setmetatable(_G, { __index = function (t, k) print("WARNING: ATTEMPT TO READ A NIL GLOBAL!!!", k); error("Attempt to read a non-existent global. Naughty boy.", 2); end, __newindex = function (t, k, v) print("ATTEMPT TO SET A GLOBAL!!!!", tostring(k).." = "..tostring(v)); error("Attempt to set a global. Naughty boy.", 2); end }) --]][][[]][];
    50 setmetatable(_G, { __index = function (t, k) print("WARNING: ATTEMPT TO READ A NIL GLOBAL!!!", k); error("Attempt to read a non-existent global. Naughty boy.", 2); end, __newindex = function (t, k, v) print("ATTEMPT TO SET A GLOBAL!!!!", tostring(k).." = "..tostring(v)); error("Attempt to set a global. Naughty boy.", 2); end }) --]][][[]][];
    99 
    51 
   100 
    52 
   101 local protected_handler = function (conn, data, err) local success, ret = pcall(handler, conn, data, err); if not success then print("ERROR on "..tostring(conn)..": "..ret); conn:close(); end end;
    53 local protected_handler = function (conn, data, err) local success, ret = pcall(handler, conn, data, err); if not success then print("ERROR on "..tostring(conn)..": "..ret); conn:close(); end end;
   102 local protected_disconnect = function (conn, err) local success, ret = pcall(disconnect, conn, err); if not success then print("ERROR on "..tostring(conn).." disconnect: "..ret); conn:close(); end end;
    54 local protected_disconnect = function (conn, err) local success, ret = pcall(disconnect, conn, err); if not success then print("ERROR on "..tostring(conn).." disconnect: "..ret); conn:close(); end end;
   103 
    55 
   104 server.add( { listener = protected_handler, disconnect = protected_disconnect }, 5222, "*", 1, ssl_ctx ) -- server.add will send a status message
    56 start("xmppclient", { ssl = ssl_ctx })
   105 --server.add( { listener = protected_handler, disconnect = protected_disconnect }, 5223, "*", 1, ssl_ctx ) -- server.add will send a status message
       
   106 
    57 
   107 server.loop();
    58 server.loop();