annotate mod_message_logging/mod_message_logging.lua @ 1159:c56a1d449cad

mod_auth_external: Add non-blocking mode (requires trunk, libevent and lpty 1.0.1). Our first complete non-blocking auth module!
author Matthew Wild <mwild1@gmail.com>
date Tue, 13 Aug 2013 23:37:31 +0100
parents ba220790a59c
children 7dbde05b48a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1007
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 module:set_global();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local jid_bare = require "util.jid".bare;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local jid_split = require "util.jid".split;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local stat, mkdir = require "lfs".attributes, require "lfs".mkdir;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 -- Get a filesystem-safe string
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local function fsencode_char(c)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 return ("%%%02x"):format(c:byte());
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local function fsencode(s)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 return (s:gsub("[^%w._-@]", fsencode_char):gsub("^%.", "_"));
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local log_base_path = module:get_option("message_logging_dir", prosody.paths.data.."/message_logs");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 mkdir(log_base_path);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local function get_host_path(host)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 return log_base_path.."/"..fsencode(host);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local function get_user_path(jid)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 local username, host = jid_split(jid);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local base = get_host_path(host)..os.date("/%Y-%m-%d");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 if not stat(base) then
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 mkdir(base);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 return base.."/"..fsencode(username)..".msglog";
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local open_files_mt = { __index = function (open_files, jid)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 local f, err = io.open(get_user_path(jid), "a+");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 if not f then
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 module:log("error", "Failed to open message log for writing [%s]: %s", jid, err);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 rawset(open_files, jid, f);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 return f;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 end };
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 -- [user@host] = filehandle
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local open_files = setmetatable({}, open_files_mt);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 function close_open_files()
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 module:log("debug", "Closing all open files");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 for jid, filehandle in pairs(open_files) do
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 filehandle:close();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 open_files[jid] = nil;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 module:hook_global("logging-reloaded", close_open_files);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 local function handle_incoming_message(event)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local origin, stanza = event.origin, event.stanza;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local message_type = stanza.attr.type;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if message_type == "error" then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local body = stanza:get_child("body");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 if not body then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 body = body:get_text();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 local f = open_files[to];
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 if not f then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 if message_type == "groupchat" then
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 -- Add the nickname
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 from = from.." <"..(select(3, jid_split(stanza.attr.from)) or "")..">";
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 body = body:gsub("\n", "\n "); -- Indent newlines
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 f:write("RECV: ", from, ": ", body, "\n");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 f:flush();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 local function handle_outgoing_message(event)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 local origin, stanza = event.origin, event.stanza;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 local message_type = stanza.attr.type;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 if message_type == "error" or message_type == "groupchat" then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 local body = stanza:get_child("body");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 if not body then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 body = body:get_text();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local f = open_files[from];
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 if not f then return; end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 body = body:gsub("\n", "\n "); -- Indent newlines
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 f:write("SEND: ", to, ": ", body, "\n");
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 f:flush();
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 function module.add_host(module)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 local host_base_path = get_host_path(module.host);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 if not stat(host_base_path) then
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 mkdir(host_base_path);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 module:hook("message/bare", handle_incoming_message, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 module:hook("message/full", handle_incoming_message, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 module:hook("pre-message/bare", handle_outgoing_message, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 module:hook("pre-message/full", handle_outgoing_message, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 module:hook("pre-message/host", handle_outgoing_message, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 function module.command(arg)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 local command = table.remove(arg, 1);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 if command == "path" then
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 print(get_user_path(arg[1]));
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 else
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 io.stderr:write("Unrecognised command: ", command);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 return 1;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 return 0;
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 function module.save()
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 return { open_files = open_files };
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 end
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 function module.restore(saved)
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 open_files = setmetatable(saved.open_files or {}, open_files_mt);
ba220790a59c mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 end