aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mod_announce.lua37
-rw-r--r--plugins/mod_groups.lua93
-rw-r--r--plugins/mod_httpserver.lua13
3 files changed, 142 insertions, 1 deletions
diff --git a/plugins/mod_announce.lua b/plugins/mod_announce.lua
new file mode 100644
index 00000000..992410f3
--- /dev/null
+++ b/plugins/mod_announce.lua
@@ -0,0 +1,37 @@
+local st, jid, set = require "util.stanza", require "util.jid", require "util.set";
+
+local admins = set.new(config.get(module:get_host(), "core", "admins"));
+
+function handle_announcement(data)
+ local origin, stanza = data.origin, data.stanza;
+ local host, resource = select(2, jid.split(stanza.attr.to));
+
+ if resource ~= "announce/online" then
+ return; -- Not an announcement
+ end
+
+ if not admins:contains(jid.bare(origin.full_jid)) then
+ -- Not an admin? Not allowed!
+ module:log("warn", "Non-admin %s tried to send server announcement", tostring(jid.bare(origin.full_jid)));
+ origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+ return;
+ end
+
+ module:log("info", "Sending server announcement to all online users");
+ local host_session = hosts[host];
+ local message = st.clone(stanza);
+ message.attr.type = "headline";
+ message.attr.from = host;
+
+ local c = 0;
+ for user in pairs(host_session.sessions) do
+ c = c + 1;
+ message.attr.to = user.."@"..host;
+ core_post_stanza(host_session, message);
+ end
+
+ module:log("info", "Announcement sent to %d online users", c);
+ return true;
+end
+
+module:hook("message/host", handle_announcement);
diff --git a/plugins/mod_groups.lua b/plugins/mod_groups.lua
new file mode 100644
index 00000000..7a581717
--- /dev/null
+++ b/plugins/mod_groups.lua
@@ -0,0 +1,93 @@
+
+local groups = { default = {} };
+local members = { [false] = {} };
+
+local groups_file;
+
+local jid, datamanager = require "util.jid", require "util.datamanager";
+local jid_bare, jid_prep = jid.bare, jid.prep;
+
+local module_host = module:get_host();
+
+function inject_roster_contacts(username, host, roster)
+ module:log("warn", "Injecting group members to roster");
+ local bare_jid = username.."@"..host;
+ if not members[bare_jid] then return; end -- Not a member of any groups
+
+ local function import_jids_to_roster(group_name)
+ for jid in pairs(groups[group_name]) do
+ -- Add them to roster
+ --module:log("debug", "processing jid %s in group %s", tostring(jid), tostring(group_name));
+ if jid ~= bare_jid then
+ if not roster[jid] then roster[jid] = {}; end
+ roster[jid].subscription = "both";
+ if not roster[jid].groups then
+ roster[jid].groups = { [group_name] = true };
+ end
+ roster[jid].groups[group_name] = true;
+ roster[jid].persist = false;
+ end
+ end
+ end
+
+ -- Find groups this JID is a member of
+ for _, group_name in ipairs(members[bare_jid]) do
+ import_jids_to_roster(group_name);
+ end
+
+ -- Import public groups
+ for _, group_name in ipairs(members[false]) do
+ import_jids_to_roster(group_name);
+ end
+end
+
+function remove_virtual_contacts(username, host, datastore, data)
+ if host == module_host and datastore == "roster" then
+ local new_roster = {};
+ for jid, contact in pairs(data) do
+ if contact.persist ~= false then
+ new_roster[jid] = contact;
+ end
+ end
+ return username, host, datastore, new_roster;
+ end
+
+ return username, host, datastore, data;
+end
+
+function module.load()
+ groups_file = config.get(module:get_host(), "core", "groups_file");
+ if not groups_file then return; end
+
+ module:hook("roster-load", inject_roster_contacts);
+ datamanager.add_callback(remove_virtual_contacts);
+
+ groups = { default = {} };
+ members = { [false] = {} };
+ local curr_group = "default";
+ for line in io.lines(groups_file) do
+ if line:match("^%s*%[.-%]%s*$") then
+ curr_group = line:match("^%s*%[(.-)%]%s*$");
+ if curr_group:match("^%+") then
+ curr_group = curr_group:gsub("^%+", "");
+ members[false][#members[false]+1] = curr_group; -- Is a public group
+ end
+ module:log("debug", "New group: %s", tostring(curr_group));
+ groups[curr_group] = groups[curr_group] or {};
+ else
+ -- Add JID
+ local jid = jid_prep(line);
+ if jid then
+ module:log("debug", "New member of %s: %s", tostring(curr_group), tostring(jid));
+ groups[curr_group][jid] = true;
+ members[jid] = members[jid] or {};
+ members[jid][#members[jid]+1] = curr_group;
+ end
+ end
+ end
+ module:log("info", "Groups loaded successfully");
+end
+
+function module.unload()
+ datamanager.remove_callback(remove_virtual_contacts);
+end
diff --git a/plugins/mod_httpserver.lua b/plugins/mod_httpserver.lua
index 2bcdab43..ec22a4bf 100644
--- a/plugins/mod_httpserver.lua
+++ b/plugins/mod_httpserver.lua
@@ -19,4 +19,15 @@ local function handle_request(method, body, request)
return data;
end
-httpserver.new{ port = 5280, base = "files", handler = handle_request, ssl = false} \ No newline at end of file
+local ports = config.get(module.host, "core", "http_ports") or { 5280 };
+for _, options in ipairs(ports) do
+ local port, base, ssl, interface = 5280, "files", false, nil;
+ if type(options) == "number" then
+ port = options;
+ elseif type(options) == "table" then
+ port, base, ssl, interface = options.port or 5280, options.path or "files", options.ssl or false, options.interface;
+ elseif type(options) == "string" then
+ base = options;
+ end
+ httpserver.new{ port = port, base = base, handler = handle_request, ssl = ssl }
+end