Mercurial > prosody-modules
annotate mod_mam_muc/mod_mam_muc.lua @ 1382:ba17268490b7
mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 08 Apr 2014 17:28:08 +0200 |
parents | 8be609f5610e |
children | da9469e68dee |
rev | line source |
---|---|
1313 | 1 -- XEP-0313: Message Archive Management for Prosody MUC |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
2 -- Copyright (C) 2011-2013 Kim Alvefur |
820 | 3 -- |
4 -- This file is MIT/X11 licensed. | |
5 | |
6 local xmlns_mam = "urn:xmpp:mam:tmp"; | |
7 local xmlns_delay = "urn:xmpp:delay"; | |
8 local xmlns_forward = "urn:xmpp:forward:0"; | |
1313 | 9 local muc_form_enable_logging = "muc#roomconfig_enablelogging" |
820 | 10 |
11 local st = require "util.stanza"; | |
12 local rsm = module:require "mod_mam/rsm"; | |
13 local jid_bare = require "util.jid".bare; | |
14 local jid_split = require "util.jid".split; | |
1278
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
15 local room_mt = module:depends"muc".room_mt; |
820 | 16 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
17 local getmetatable = getmetatable; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
18 local function is_stanza(x) |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
19 return getmetatable(x) == st.stanza_mt; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
20 end |
820 | 21 |
22 local tostring = tostring; | |
23 local time_now = os.time; | |
24 local m_min = math.min; | |
25 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse; | |
26 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50); | |
1278
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
27 local max_history_length = module:get_option_number("max_history_messages", 1000); |
820 | 28 |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
29 local log_all_rooms = module:get_option_boolean("muc_log_all_rooms", false); |
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
30 local log_by_default = module:get_option_boolean("muc_log_by_default", true); |
1142
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
31 local advertise_archive = module:get_option_boolean("muc_log_advertise", true); |
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
32 |
1311
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
33 local archive_store = "archive2"; |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
34 local archive = module:open_store(archive_store, "archive"); |
1369
8be609f5610e
mod_mam, mod_mam_muc: Check that storagemanager didn't return an instance of the null storage method (Thanks Jonathan)
Kim Alvefur <zash@zash.se>
parents:
1325
diff
changeset
|
35 if not archive or archive.name == "null" then |
1311
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
36 module:log("error", "Could not open archive storage"); |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
37 return |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
38 elseif not archive.find then |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
39 module:log("error", "mod_%s does not support archiving, switch to mod_storage_sql2", archive._provided_by); |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
40 return |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
41 end |
27b2a357c73c
mod_mam_muc: porting archive checks from mod_mam (to avoid tracebacks about calling null functions)
Vadim Misbakh-Soloviov <mva@mva.name>
parents:
1279
diff
changeset
|
42 |
1139
b32d65e41755
mod_mam_muc: Get room objects in a less awkward fashion
Kim Alvefur <zash@zash.se>
parents:
1138
diff
changeset
|
43 local rooms = hosts[module.host].modules.muc.rooms; |
820 | 44 |
1314
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
45 local send_history, save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
46 |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
47 if log_all_rooms then |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
48 -- Override history methods for all rooms. |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
49 local _send_history = room_mt.send_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
50 local _save_to_history = room_mt.save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
51 function module.load() |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
52 room_mt.send_history = send_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
53 room_mt.save_to_history = save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
54 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
55 function module.unload() |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
56 room_mt.send_history = _send_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
57 room_mt.save_to_history = _save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
58 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
59 else |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
60 -- Only override histary on rooms with logging enabled |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
61 function module.load() |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
62 for _, room in pairs(rooms) do |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
63 if room._data.logging then |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
64 room.send_history = send_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
65 room.save_to_history = save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
66 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
67 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
68 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
69 function module.unload() |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
70 for _, room in pairs(rooms) do |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
71 if room.send_history == send_history then |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
72 room.send_history = nil; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
73 room.save_to_history = nil; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
74 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
75 end |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
76 end |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
77 module:hook("muc-config-form", function(event) |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
78 local room, form = event.room, event.form; |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
79 local logging_enabled = room._data.logging; |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
80 if logging_enabled == nil then |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
81 logging_enabled = log_by_default; |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
82 end |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
83 table.insert(form, |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
84 { |
1313 | 85 name = muc_form_enable_logging, |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
86 type = "boolean", |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
87 label = "Enable Logging?", |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
88 value = logging_enabled, |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
89 } |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
90 ); |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
91 end); |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
92 |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
93 module:hook("muc-config-submitted", function(event) |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
94 local room, fields, changed = event.room, event.fields, event.changed; |
1313 | 95 local new = fields[muc_form_enable_logging]; |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
96 if new ~= room._data.logging then |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
97 room._data.logging = new; |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
98 if type(changed) == "table" then |
1313 | 99 changed[muc_form_enable_logging] = true; |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
100 else |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
101 event.changed = true; |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
102 end |
1314
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
103 if new then |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
104 room.send_history = send_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
105 room.save_to_history = save_to_history; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
106 else |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
107 room.send_history = nil; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
108 room.save_to_history = nil; |
cc9831033f5d
mod_mam_muc: Add and remove method overrides based on configuration instead of modifying room metatable
Kim Alvefur <zash@zash.se>
parents:
1313
diff
changeset
|
109 end |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
110 end |
1276
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
111 end); |
01dfaf2f2782
mod_mam_muc: Hide logging option from room configuration if set to log all rooms
Kim Alvefur <zash@zash.se>
parents:
1275
diff
changeset
|
112 end |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
113 |
820 | 114 -- Handle archive queries |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
115 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) |
820 | 116 local origin, stanza = event.origin, event.stanza; |
1144
ccb0c5afe658
mod_mam_muc: Fix room lookup, should be indexed by bare jid
Kim Alvefur <zash@zash.se>
parents:
1143
diff
changeset
|
117 local room = stanza.attr.to; |
1146
9fa89dc7a86f
mod_mam_muc: Search the rooms archive correctly (copypaste error from mod_mam)
Kim Alvefur <zash@zash.se>
parents:
1145
diff
changeset
|
118 local room_node = jid_split(room); |
1382
ba17268490b7
mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
1369
diff
changeset
|
119 local orig_from = stanza.attr.from; |
820 | 120 local query = stanza.tags[1]; |
121 | |
1139
b32d65e41755
mod_mam_muc: Get room objects in a less awkward fashion
Kim Alvefur <zash@zash.se>
parents:
1138
diff
changeset
|
122 local room_obj = rooms[room]; |
820 | 123 if not room_obj then |
1145
5a00f9bec6e7
mod_mam_muc: Send item-not-found if the requested room does not exist
Kim Alvefur <zash@zash.se>
parents:
1144
diff
changeset
|
124 return origin.send(st.error_reply(stanza, "cancel", "item-not-found")) |
820 | 125 end |
1382
ba17268490b7
mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
1369
diff
changeset
|
126 local from = jid_bare(orig_from); |
820 | 127 |
1140
402cb9b604eb
mod_mam_muc: Send proper error reply when one is not allowed to query archive
Kim Alvefur <zash@zash.se>
parents:
1139
diff
changeset
|
128 -- Banned or not a member of a members-only room? |
1312
a48cf3ccdf9c
mod_mam_muc: Use public API of rooms for authorization check
Kim Alvefur <zash@zash.se>
parents:
1311
diff
changeset
|
129 local from_affiliation = room_obj:get_affiliation(from); |
a48cf3ccdf9c
mod_mam_muc: Use public API of rooms for authorization check
Kim Alvefur <zash@zash.se>
parents:
1311
diff
changeset
|
130 if from_affiliation == "outcast" -- banned |
1325
b21236b6b8d8
Backed out changeset 853a382c9bd6
Kim Alvefur <zash@zash.se>
parents:
1324
diff
changeset
|
131 or room_obj:get_members_only() and not from_affiliation then -- members-only, not a member |
1140
402cb9b604eb
mod_mam_muc: Send proper error reply when one is not allowed to query archive
Kim Alvefur <zash@zash.se>
parents:
1139
diff
changeset
|
132 return origin.send(st.error_reply(stanza, "auth", "forbidden")) |
820 | 133 end |
134 | |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
135 local qid = query.attr.queryid; |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
136 |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
137 -- Search query parameters |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
138 local qstart = query:get_child_text("start"); |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
139 local qend = query:get_child_text("end"); |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
140 module:log("debug", "Archive query, id %s from %s until %s)", |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
141 tostring(qid), qstart or "the dawn of time", qend or "now"); |
820 | 142 |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
143 if qstart or qend then -- Validate timestamps |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
144 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend)) |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
145 if (qstart and not vstart) or (qend and not vend) then |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
146 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp")) |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
147 return true |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
148 end |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
149 qstart, qend = vstart, vend; |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
150 end |
820 | 151 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
152 -- RSM stuff |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
153 local qset = rsm.get(query); |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
154 local qmax = m_min(qset and qset.max or default_max_items, max_max_items); |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
155 local reverse = qset and qset.before or false; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
156 |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
157 local before, after = qset and qset.before, qset and qset.after; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
158 if type(before) ~= "string" then before = nil; end |
820 | 159 |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
160 -- Load all the data! |
1146
9fa89dc7a86f
mod_mam_muc: Search the rooms archive correctly (copypaste error from mod_mam)
Kim Alvefur <zash@zash.se>
parents:
1145
diff
changeset
|
161 local data, err = archive:find(room_node, { |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
162 start = qstart; ["end"] = qend; -- Time range |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
163 limit = qmax; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
164 before = before; after = after; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
165 reverse = reverse; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
166 total = true; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
167 }); |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
168 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
169 if not data then |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
170 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
171 end |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
172 local count = err; |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
173 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
174 -- Wrap it in stuff and deliver |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
175 local first, last; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
176 for id, item, when in data do |
1382
ba17268490b7
mod_mam_muc: Fix to, from on result messages (thanks daurnimator)
Kim Alvefur <zash@zash.se>
parents:
1369
diff
changeset
|
177 local fwd_st = st.message{ to = orig_from, from = room } |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
178 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }) |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
179 :tag("forwarded", { xmlns = xmlns_forward }) |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
180 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
181 |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
182 if not is_stanza(item) then |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
183 item = st.deserialize(item); |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
184 end |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
185 item.attr.xmlns = "jabber:client"; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
186 fwd_st:add_child(item); |
820 | 187 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
188 if not first then first = id; end |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
189 last = id; |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
190 |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
191 origin.send(fwd_st); |
1138
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
192 end |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
193 -- That's all folks! |
5c97ee75cadb
mod_mam_muc: Switch to iq-get hook and drop some indentation
Kim Alvefur <zash@zash.se>
parents:
820
diff
changeset
|
194 module:log("debug", "Archive query %s completed", tostring(qid)); |
820 | 195 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
196 if reverse then first, last = last, first; end |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
197 return origin.send(st.reply(stanza) |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
198 :query(xmlns_mam):add_child(rsm.generate { |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
199 first = first, last = last, count = count })); |
820 | 200 end); |
201 | |
1278
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
202 function room_mt:send_history(to, stanza) |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
203 local maxchars, maxstanzas, seconds, since; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
204 local history_tag = stanza:find("{http://jabber.org/protocol/muc}x/history") |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
205 if history_tag then |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
206 module:log("debug", tostring(history_tag)); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
207 local history_attr = history_tag.attr; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
208 maxchars = tonumber(history_attr.maxchars); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
209 maxstanzas = tonumber(history_attr.maxstanzas); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
210 seconds = tonumber(history_attr.seconds); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
211 since = history_attr.since; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
212 if since then |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
213 since = timestamp_parse(since); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
214 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
215 if seconds then |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
216 since = math.max(os.time() - seconds, since or 0); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
217 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
218 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
219 |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
220 -- Load all the data! |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
221 local data, err = archive:find(jid_split(self.jid), { |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
222 limit = m_min(maxstanzas or 20, max_history_length); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
223 after = since; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
224 reverse = true; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
225 }); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
226 |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
227 if not data then |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
228 module:log("error", "Could not fetch history: %s", tostring(err)); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
229 return |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
230 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
231 |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
232 local to_send = {}; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
233 local charcount = 0; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
234 local chars; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
235 for id, item, when in data do |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
236 item.attr.to = to; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
237 item:tag("delay", { xmlns = "urn:xmpp:delay", from = self.jid, stamp = timestamp(when) }):up(); -- XEP-0203 |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
238 if maxchars then |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
239 chars = #tostring(item); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
240 if chars + charcount > maxchars then break end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
241 charcount = charcount + chars; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
242 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
243 to_send[1+#to_send] = item; |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
244 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
245 for i = #to_send,1,-1 do |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
246 self:_route_stanza(to_send[i]); |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
247 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
248 end |
40f077b18dfe
mod_mam_muc: Override sending of room history and use archives
Kim Alvefur <zash@zash.se>
parents:
1277
diff
changeset
|
249 |
820 | 250 -- Handle messages |
1279
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
251 function room_mt:save_to_history(stanza) |
820 | 252 local orig_to = stanza.attr.to; |
1279
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
253 local room = jid_split(self.jid); |
820 | 254 |
1279
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
255 -- Policy check |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
256 if not ( log_all_rooms == true -- Logging forced on all rooms |
1279
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
257 or (self._data.logging == nil and log_by_default == true) |
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
258 or self._data.logging ) then return end -- Don't log |
1143
8098683b6d6f
mod_mam_muc: Allow archiving to be enabled trough in the room configuration
Kim Alvefur <zash@zash.se>
parents:
1142
diff
changeset
|
259 |
1279
2118a2eeb1d5
mod_mam_muc: Override method for storing history messages instead of hooking stanza events
Kim Alvefur <zash@zash.se>
parents:
1278
diff
changeset
|
260 module:log("debug", "We're logging this") |
820 | 261 -- And stash it |
1142
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
262 local ok, id = archive:append(room, time_now(), "", stanza); |
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
263 if ok and advertise_archive then |
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
264 stanza:tag("archived", { xmlns = xmlns_mam, by = jid_bare(orig_to), id = id }):up(); |
fabdaa0d99e3
mod_mam_muc: Stap archived messages
Kim Alvefur <zash@zash.se>
parents:
1141
diff
changeset
|
265 end |
820 | 266 end |
267 | |
1277
999891a9ae5d
mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents:
1276
diff
changeset
|
268 module:hook("muc-room-destroyed", function(event) |
999891a9ae5d
mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents:
1276
diff
changeset
|
269 archive:delete(jid_split(event.room.jid)); |
999891a9ae5d
mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents:
1276
diff
changeset
|
270 end); |
999891a9ae5d
mod_mam_muc: Remove archives when a room is destroyed
Kim Alvefur <zash@zash.se>
parents:
1276
diff
changeset
|
271 |
1141
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
272 -- TODO should we perhaps log presence as well? |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
273 -- And role/affiliation changes? |
1091be1c3aba
mod_mam_muc: Switch to new stanza storage API
Kim Alvefur <zash@zash.se>
parents:
1140
diff
changeset
|
274 |
820 | 275 module:add_feature(xmlns_mam); |