26a142568fa247388634dc034144bf45f45bcf47
[prosody.git] / core / rostermanager.lua
1
2 local mainlog = log;
3 local function log(type, message)
4         mainlog(type, "rostermanager", message);
5 end
6
7 local setmetatable = setmetatable;
8 local format = string.format;
9 local loadfile, setfenv, pcall = loadfile, setfenv, pcall;
10 local pairs, ipairs = pairs, ipairs;
11
12 local hosts = hosts;
13
14 require "util.datamanager"
15
16 local datamanager = datamanager;
17 local st = require "util.stanza";
18
19 module "rostermanager"
20
21 --[[function getroster(username, host)
22         return { 
23                         ["mattj@localhost"] = true,
24                         ["tobias@getjabber.ath.cx"] = true,
25                         ["waqas@getjabber.ath.cx"] = true,
26                         ["thorns@getjabber.ath.cx"] = true, 
27                         ["idw@getjabber.ath.cx"] = true, 
28                 }
29         --return datamanager.load(username, host, "roster") or {};
30 end]]
31
32 function add_to_roster(session, jid, item)
33         if session.roster then
34                 local old_item = session.roster[jid];
35                 session.roster[jid] = item;
36                 if save_roster(session.username, session.host) then
37                         return true;
38                 else
39                         session.roster[jid] = old_item;
40                         return nil, "wait", "internal-server-error", "Unable to save roster";
41                 end
42         else
43                 return nil, "auth", "not-authorized", "Session's roster not loaded";
44         end
45 end
46
47 function remove_from_roster(session, jid)
48         if session.roster then
49                 local old_item = session.roster[jid];
50                 session.roster[jid] = nil;
51                 if save_roster(session.username, session.host) then
52                         return true;
53                 else
54                         session.roster[jid] = old_item;
55                         return nil, "wait", "internal-server-error", "Unable to save roster";
56                 end
57         else
58                 return nil, "auth", "not-authorized", "Session's roster not loaded";
59         end
60 end
61
62 function roster_push(username, host, jid)
63         if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
64                 local item = hosts[host].sessions[username].roster[jid];
65                 local stanza = st.iq({type="set"});
66                 stanza:tag("query", {xmlns = "jabber:iq:roster"});
67                 if item then
68                         stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name});
69                         for group in pairs(item.groups) do
70                                 stanza:tag("group"):text(group):up();
71                         end
72                 else
73                         stanza:tag("item", {jid = jid, subscription = "remove"});
74                 end
75                 stanza:up();
76                 stanza:up();
77                 -- stanza ready
78                 for _, session in pairs(hosts[host].sessions[username].sessions) do
79                         if session.interested then
80                                 -- FIXME do we need to set stanza.attr.to?
81                                 session.send(stanza);
82                         end
83                 end
84         end
85 end
86
87 function load_roster(username, host)
88         if hosts[host] and hosts[host].sessions[username] then
89                 local roster = hosts[host].sessions[username].roster;
90                 if not roster then
91                         roster = datamanager.load(username, host, "roster") or {};
92                         hosts[host].sessions[username].roster = roster;
93                 end
94                 return roster;
95         end
96         -- Attempt to load roster for non-loaded user
97 end
98
99 function save_roster(username, host)
100         if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then
101                 return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster);
102         end
103         return nil;
104 end
105
106 return _M;