diff options
-rw-r--r-- | core/configmanager.lua | 14 | ||||
-rw-r--r-- | core/loggingmanager.lua | 22 | ||||
-rw-r--r-- | plugins/muc/muc.lib.lua | 110 |
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 |