mod_tls: Don't advertise TLS after authentication.
[prosody.git] / plugins / mod_groups.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2009 Matthew Wild
3 -- Copyright (C) 2008-2009 Waqas Hussain
4 -- 
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9
10 local groups = { default = {} };
11 local members = { [false] = {} };
12
13 local groups_file;
14
15 local jid, datamanager = require "util.jid", require "util.datamanager";
16 local jid_bare, jid_prep = jid.bare, jid.prep;
17
18 local module_host = module:get_host();
19
20 function inject_roster_contacts(username, host, roster)
21         module:log("warn", "Injecting group members to roster");
22         local bare_jid = username.."@"..host;
23         if not members[bare_jid] then return; end -- Not a member of any groups
24         
25         local function import_jids_to_roster(group_name)
26                 for jid in pairs(groups[group_name]) do
27                         -- Add them to roster
28                         --module:log("debug", "processing jid %s in group %s", tostring(jid), tostring(group_name));
29                         if jid ~= bare_jid then
30                                 if not roster[jid] then roster[jid] = {}; end
31                                 roster[jid].subscription = "both";
32                                 if not roster[jid].groups then
33                                         roster[jid].groups = { [group_name] = true };
34                                 end
35                                 roster[jid].groups[group_name] = true;
36                                 roster[jid].persist = false;
37                         end
38                 end
39         end
40
41         -- Find groups this JID is a member of
42         for _, group_name in ipairs(members[bare_jid]) do
43                 import_jids_to_roster(group_name);
44         end
45         
46         -- Import public groups
47         for _, group_name in ipairs(members[false]) do
48                 import_jids_to_roster(group_name);
49         end
50 end
51
52 function remove_virtual_contacts(username, host, datastore, data)
53         if host == module_host and datastore == "roster" then
54                 local new_roster = {};
55                 for jid, contact in pairs(data) do
56                         if contact.persist ~= false then
57                                 new_roster[jid] = contact;
58                         end
59                 end
60                 return username, host, datastore, new_roster;
61         end
62
63         return username, host, datastore, data;
64 end
65
66 function module.load()
67         groups_file = config.get(module:get_host(), "core", "groups_file");
68         if not groups_file then return; end
69         
70         module:hook("roster-load", inject_roster_contacts);
71         datamanager.add_callback(remove_virtual_contacts);
72         
73         groups = { default = {} };
74         members = { [false] = {} };
75         local curr_group = "default";
76         for line in io.lines(groups_file) do
77                 if line:match("^%s*%[.-%]%s*$") then
78                         curr_group = line:match("^%s*%[(.-)%]%s*$");
79                         if curr_group:match("^%+") then
80                                 curr_group = curr_group:gsub("^%+", "");
81                                 members[false][#members[false]+1] = curr_group; -- Is a public group
82                         end
83                         module:log("debug", "New group: %s", tostring(curr_group));
84                         groups[curr_group] = groups[curr_group] or {};
85                 else
86                         -- Add JID
87                         local jid = jid_prep(line);
88                         if jid then
89                                 module:log("debug", "New member of %s: %s", tostring(curr_group), tostring(jid));
90                                 groups[curr_group][jid] = true;
91                                 members[jid] = members[jid] or {};
92                                 members[jid][#members[jid]+1] = curr_group;
93                         end
94                 end
95         end
96         module:log("info", "Groups loaded successfully");
97 end
98
99 function module.unload()
100         datamanager.remove_callback(remove_virtual_contacts);
101 end