Comparison

mod_muc_log/mod_muc_log.lua @ 85:83494de806a4

mod_muc_log: Do not log other muc-component's rooms then the module was loaded for. Do neither log nor provide access to possible existing log if a room is private. (thx flo for spotting this)
author Thilo Cestonaro <thilo@cestona.ro>
date Sun, 08 Nov 2009 18:35:53 +0100
parent 81:9ceeab822e40
child 86:fc7055efd568
comparison
equal deleted inserted replaced
84:b47216512a1d 85:83494de806a4
10 local httpserver = require "net.httpserver"; 10 local httpserver = require "net.httpserver";
11 local serialize = require "util.serialization".serialize; 11 local serialize = require "util.serialization".serialize;
12 local datamanager = require "util.datamanager"; 12 local datamanager = require "util.datamanager";
13 local data_load, data_store, data_getpath = datamanager.load, datamanager.store, datamanager.getpath; 13 local data_load, data_store, data_getpath = datamanager.load, datamanager.store, datamanager.getpath;
14 local datastore = "muc_log"; 14 local datastore = "muc_log";
15 local muc_host = module:get_host();
15 local config = {}; 16 local config = {};
16 17
17 18
18 --[[ LuaFileSystem 19 --[[ LuaFileSystem
19 * URL: http://www.keplerproject.org/luafilesystem/index.html 20 * URL: http://www.keplerproject.org/luafilesystem/index.html
98 local function ensureDatastorePathExists(node, host, today) 99 local function ensureDatastorePathExists(node, host, today)
99 local path = data_getpath(node, host, datastore, "dat", true); 100 local path = data_getpath(node, host, datastore, "dat", true);
100 path = path:gsub("/[^/]*$", ""); 101 path = path:gsub("/[^/]*$", "");
101 102
102 -- check existance 103 -- check existance
103 local attributes = lfs.attributes(path); 104 local attributes, err = lfs.attributes(path);
104 if attributes.mode ~= "directory" then 105 if attributes == nil or attributes.mode ~= "directory" then
105 module:log("warn", "muc_log folder isn't a folder: %s", path); 106 module:log("warn", "muc_log folder isn't a folder: %s", path);
106 return false; 107 return false;
107 end 108 end
108 109
109 attributes = lfs.attributes(path .. "/" .. today); 110 attributes, err = lfs.attributes(path .. "/" .. today);
110 if attributes == nil then 111 if attributes == nil then
111 return lfs.mkdir(path .. "/" .. today); 112 return lfs.mkdir(path .. "/" .. today);
112 elseif attributes.mode == "directory" then 113 elseif attributes.mode == "directory" then
113 return true; 114 return true;
114 end 115 end
123 (stanza.name == "message" and tostring(stanza.attr.type) == "groupchat") 124 (stanza.name == "message" and tostring(stanza.attr.type) == "groupchat")
124 then 125 then
125 local node, host, resource = splitJid(stanza.attr.to); 126 local node, host, resource = splitJid(stanza.attr.to);
126 if node ~= nil and host ~= nil then 127 if node ~= nil and host ~= nil then
127 local bare = node .. "@" .. host; 128 local bare = node .. "@" .. host;
128 if prosody.hosts[host] ~= nil and prosody.hosts[host].muc ~= nil and prosody.hosts[host].muc.rooms[bare] ~= nil then 129 if host == muc_host and prosody.hosts[host] ~= nil and prosody.hosts[host].muc ~= nil and prosody.hosts[host].muc.rooms[bare] ~= nil then
129 local room = prosody.hosts[host].muc.rooms[bare] 130 local room = prosody.hosts[host].muc.rooms[bare]
130 local today = os.date("%y%m%d"); 131 local today = os.date("%y%m%d");
131 local now = os.date("%X") 132 local now = os.date("%X")
132 local mucTo = nil 133 local mucTo = nil
133 local mucFrom = nil; 134 local mucFrom = nil;
134 local alreadyJoined = false; 135 local alreadyJoined = false;
135 136
137 if room._data.hidden then -- do not log any data of private rooms
138 return;
139 end
140
136 if stanza.name == "presence" and stanza.attr.type == nil then 141 if stanza.name == "presence" and stanza.attr.type == nil then
137 mucFrom = stanza.attr.to; 142 mucFrom = stanza.attr.to;
138 if room._occupants ~= nil and room._occupants[stanza.attr.to] ~= nil then -- if true, the user has already joined the room 143 if room._occupants ~= nil and room._occupants[stanza.attr.to] ~= nil then -- if true, the user has already joined the room
139 alreadyJoined = true; 144 alreadyJoined = true;
140 stanza:tag("alreadyJoined"):text("true"); -- we need to log the information that the user has already joined, so add this and remove after logging 145 stanza:tag("alreadyJoined"):text("true"); -- we need to log the information that the user has already joined, so add this and remove after logging
246 end 251 end
247 252
248 local function generateRoomListSiteContent() 253 local function generateRoomListSiteContent()
249 local rooms = ""; 254 local rooms = "";
250 for host, config in pairs(prosody.hosts) do 255 for host, config in pairs(prosody.hosts) do
251 if prosody.hosts[host].muc ~= nil then 256 if host == muc_host and prosody.hosts[host].muc ~= nil then
252 for jid, room in pairs(prosody.hosts[host].muc.rooms) do 257 for jid, room in pairs(prosody.hosts[host].muc.rooms) do
253 rooms = rooms .. html.hosts.bit:gsub("###JID###", jid); 258 if not room._data.hidden then
259 rooms = rooms .. html.hosts.bit:gsub("###JID###", jid);
260 end
254 end 261 end
255 end 262 end
256 end 263 end
257 264
258 return html.hosts.body:gsub("###HOSTS_STUFF###", rooms); 265 return html.hosts.body:gsub("###HOSTS_STUFF###", rooms);
261 local function generateDayListSiteContentByRoom(bareRoomJid) 268 local function generateDayListSiteContentByRoom(bareRoomJid)
262 local days = ""; 269 local days = "";
263 local tmp; 270 local tmp;
264 local node, host, resource = splitJid(bareRoomJid); 271 local node, host, resource = splitJid(bareRoomJid);
265 local path = data_getpath(node, host, datastore); 272 local path = data_getpath(node, host, datastore);
273 local room = nil;
274 local attributes = nil;
275
266 path = path:gsub("/[^/]*$", ""); 276 path = path:gsub("/[^/]*$", "");
267 for file in lfs.dir(path) do 277 attributes = lfs.attributes(path);
268 local year, month, day = file:match("^(%d%d)(%d%d)(%d%d)"); 278 if host == muc_host and prosody.hosts[host] ~= nil and prosody.hosts[host].muc ~= nil and prosody.hosts[host].muc.rooms[bareRoomJid] ~= nil then
269 if year ~= nil and month ~= nil and day ~= nil and 279 room = prosody.hosts[host].muc.rooms[bareRoomJid];
270 year ~= "" and month ~= "" and day ~= "" 280 if room._data.hidden then
271 then 281 room = nil
272 tmp = html.days.bit; 282 end
273 tmp = tmp:gsub("###JID###", bareRoomJid); 283 end
274 tmp = tmp:gsub("###YEAR###", year):gsub("###MONTH###", month):gsub("###DAY###", day); 284 if attributes ~= nil and room ~= nil then
275 days = tmp .. days; 285 for file in lfs.dir(path) do
286 local year, month, day = file:match("^(%d%d)(%d%d)(%d%d)");
287 if year ~= nil and month ~= nil and day ~= nil and
288 year ~= "" and month ~= "" and day ~= ""
289 then
290 tmp = html.days.bit;
291 tmp = tmp:gsub("###JID###", bareRoomJid);
292 tmp = tmp:gsub("###YEAR###", year):gsub("###MONTH###", month):gsub("###DAY###", day);
293 days = tmp .. days;
294 end
276 end 295 end
277 end 296 end
278 if days ~= "" then 297 if days ~= "" then
279 tmp = html.days.body:gsub("###DAYS_STUFF###", days); 298 tmp = html.days.body:gsub("###DAYS_STUFF###", days);
280 return tmp:gsub("###JID###", bareRoomJid); 299 return tmp:gsub("###JID###", bareRoomJid);