aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/configmanager.lua14
-rw-r--r--core/loggingmanager.lua22
-rw-r--r--plugins/muc/muc.lib.lua110
3 files changed, 101 insertions, 45 deletions
diff --git a/core/configmanager.lua b/core/configmanager.lua
index 6b181443..87c78aee 100644
--- a/core/configmanager.lua
+++ b/core/configmanager.lua
@@ -137,6 +137,12 @@ do
rawset(env, "__currenthost", name);
-- Needs at least one setting to logically exist :)
set(name or "*", "core", "defined", true);
+ return function (config_options)
+ rawset(env, "__currenthost", "*"); -- Return to global scope
+ for option_name, option_value in pairs(config_options) do
+ set(name or "*", "core", option_name, option_value);
+ end
+ end;
end
env.Host, env.host = env.VirtualHost, env.VirtualHost;
@@ -149,11 +155,19 @@ do
-- Don't load the global modules by default
set(name, "core", "load_global_modules", false);
rawset(env, "__currenthost", name);
+ local function handle_config_options(config_options)
+ rawset(env, "__currenthost", "*"); -- Return to global scope
+ for option_name, option_value in pairs(config_options) do
+ set(name or "*", "core", option_name, option_value);
+ end
+ end
return function (module)
if type(module) == "string" then
set(name, "core", "component_module", module);
+ return handle_config_options;
end
+ return handle_config_options(module);
end
end
env.component = env.Component;
diff --git a/core/loggingmanager.lua b/core/loggingmanager.lua
index f8cba059..96cd32dc 100644
--- a/core/loggingmanager.lua
+++ b/core/loggingmanager.lua
@@ -89,9 +89,25 @@ end
-- the log_sink_types table.
function apply_sink_rules(sink_type)
if type(logging_config) == "table" then
+
+ if sink_type == "file" then
+ for _, level in ipairs(logging_levels) do
+ if type(logging_config[level]) == "string" then
+ add_rule({
+ to = "file",
+ filename = logging_config[level],
+ timestamps = true,
+ levels = { min = level },
+ });
+ end
+ end
+ end
+
for _, sink_config in pairs(logging_config) do
- if sink_config.to == sink_type then
+ if (type(sink_config) == "table" and sink_config.to == sink_type) then
add_rule(sink_config);
+ elseif (type(sink_config) == "string" and sink_config:match("^%*(.+)") == sink_type) then
+ add_rule({ levels = { min = "debug" }, to = sink_type });
end
end
elseif type(logging_config) == "string" and (not logging_config:match("^%*")) and sink_type == "file" then
@@ -151,7 +167,9 @@ function reload_logging()
logger.reset();
default_logging = { { to = "console" , levels = { min = (debug_mode and "debug") or "info" } } };
- default_file_logging = { { to = "file", levels = { min = (debug_mode and "debug") or "info" }, timestamps = true } };
+ default_file_logging = {
+ { to = "file", levels = { min = (debug_mode and "debug") or "info" }, timestamps = true }
+ };
default_timestamp = "%b %d %H:%M:%S";
logging_config = config.get("*", "core", "log") or default_logging;
diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua
index a3163349..4a8ad922 100644
--- a/plugins/muc/muc.lib.lua
+++ b/plugins/muc/muc.lib.lua
@@ -12,6 +12,8 @@ local pairs, ipairs = pairs, ipairs;
local datamanager = require "util.datamanager";
local datetime = require "util.datetime";
+local dataform = require "util.dataforms";
+
local jid_split = require "util.jid".split;
local jid_bare = require "util.jid".bare;
local jid_prep = require "util.jid".prep;
@@ -178,7 +180,7 @@ function room_mt:send_history(to, stanza)
if seconds then seconds = datetime.datetime(os.time() - math.floor(seconds)); end
local since = history_tag and history_tag.attr.since;
- if since and not since:match("^%d%d%d%d%-%d%d%-%d%dT%d%d:%d%d:%d%dZ$") then since = nil; end -- FIXME timezone support
+ if since then since = datetime.parse(since); since = since and datetime.datetime(since); end
if seconds and (not since or since < seconds) then since = seconds; end
local n = 0;
@@ -220,14 +222,10 @@ function room_mt:get_disco_info(stanza)
:tag("feature", {var=self:is_persistent() and "muc_persistent" or "muc_temporary"}):up()
:tag("feature", {var=self:is_hidden() and "muc_hidden" or "muc_public"}):up()
:tag("feature", {var=self._data.whois ~= "anyone" and "muc_semianonymous" or "muc_nonanonymous"}):up()
- :tag("x", {xmlns="jabber:x:data", type="result"})
- :tag("field", {var="FORM_TYPE", type="hidden"})
- :tag("value"):text("http://jabber.org/protocol/muc#roominfo"):up()
- :up()
- :tag("field", {var="muc#roominfo_description", label="Description"})
- :tag("value"):text(self:get_description()):up()
- :up()
- :up()
+ :add_child(dataform.new({
+ { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#roominfo" },
+ { name = "muc#roominfo_description", label = "Description"}
+ }):form({["muc#roominfo_description"] = self:get_description()}, 'result'))
;
end
function room_mt:get_disco_items(stanza)
@@ -526,40 +524,66 @@ end
function room_mt:send_form(origin, stanza)
local title = "Configuration for "..self.jid;
origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner")
- :tag("x", {xmlns='jabber:x:data', type='form'})
- :tag("title"):text(title):up()
- :tag("instructions"):text(title):up()
- :tag("field", {type='hidden', var='FORM_TYPE'}):tag("value"):text("http://jabber.org/protocol/muc#roomconfig"):up():up()
- :tag("field", {type='text-single', label='Name', var='muc#roomconfig_roomname'})
- :tag("value"):text(self:get_name() or ""):up()
- :up()
- :tag("field", {type='text-single', label='Description', var='muc#roomconfig_roomdesc'})
- :tag("value"):text(self:get_description() or ""):up()
- :up()
- :tag("field", {type='boolean', label='Make Room Persistent?', var='muc#roomconfig_persistentroom'})
- :tag("value"):text(self:is_persistent() and "1" or "0"):up()
- :up()
- :tag("field", {type='boolean', label='Make Room Publicly Searchable?', var='muc#roomconfig_publicroom'})
- :tag("value"):text(self:is_hidden() and "0" or "1"):up()
- :up()
- :tag("field", {type='list-single', label='Who May Discover Real JIDs?', var='muc#roomconfig_whois'})
- :tag("value"):text(self._data.whois or 'moderators'):up()
- :tag("option", {label = 'Moderators Only'})
- :tag("value"):text('moderators'):up()
- :up()
- :tag("option", {label = 'Anyone'})
- :tag("value"):text('anyone'):up()
- :up()
- :up()
- :tag("field", {type='text-private', label='Password', var='muc#roomconfig_roomsecret'})
- :tag("value"):text(self:get_password() or ""):up()
- :up()
- :tag("field", {type='boolean', label='Make Room Moderated?', var='muc#roomconfig_moderatedroom'})
- :tag("value"):text(self:is_moderated() and "1" or "0"):up()
- :up()
- :tag("field", {type='boolean', label='Make Room Members-Only?', var='muc#roomconfig_membersonly'})
- :tag("value"):text(self:is_members_only() and "1" or "0"):up()
- :up()
+ :add_child(dataform.new({
+ title = title,
+ instructions = title,
+ {
+ name = 'FORM_TYPE',
+ type = 'hidden',
+ value = 'http://jabber.org/protocol/muc#roomconfig'
+ },
+ {
+ name = 'muc#roomconfig_roomname',
+ type = 'text-single',
+ label = 'Name',
+ value = self:get_name() or "",
+ },
+ {
+ name = 'muc#roomconfig_roomdesc',
+ type = 'text-single',
+ label = 'Description',
+ value = self:get_description() or "",
+ },
+ {
+ name = 'muc#roomconfig_persistentroom',
+ type = 'boolean',
+ label = 'Make Room Persistent?',
+ value = self:is_persistent()
+ },
+ {
+ name = 'muc#roomconfig_publicroom',
+ type = 'boolean',
+ label = 'Make Room Publicly Searchable?',
+ value = not self:is_hidden()
+ },
+ {
+ name = 'muc#roomconfig_whois',
+ type = 'list-single',
+ label = 'Who May Discover Real JIDs?',
+ value = {
+ { value = 'moderators', label = 'Moderators Only', default = self._data.whois == 'moderators' },
+ { value = 'anyone', label = 'Anyone', default = self._data.whois == 'anyone' }
+ }
+ },
+ {
+ name = 'muc#roomconfig_roomsecret',
+ type = 'text-private',
+ label = 'Password',
+ value = self:get_password() or "",
+ },
+ {
+ name = 'muc#roomconfig_moderatedroom',
+ type = 'boolean',
+ label = 'Make Room Moderated?',
+ value = self:is_moderated()
+ },
+ {
+ name = 'muc#roomconfig_membersonly',
+ type = 'boolean',
+ label = 'Make Room Members-Only?',
+ value = self:is_members_only()
+ }
+ }):form())
);
end