13 |
13 |
14 local setmetatable = setmetatable; |
14 local setmetatable = setmetatable; |
15 local format = string.format; |
15 local format = string.format; |
16 local loadfile, setfenv, pcall = loadfile, setfenv, pcall; |
16 local loadfile, setfenv, pcall = loadfile, setfenv, pcall; |
17 local pairs, ipairs = pairs, ipairs; |
17 local pairs, ipairs = pairs, ipairs; |
|
18 local tostring = tostring; |
18 |
19 |
19 local hosts = hosts; |
20 local hosts = hosts; |
20 |
21 |
21 local datamanager = require "util.datamanager" |
22 local datamanager = require "util.datamanager" |
22 local st = require "util.stanza"; |
23 local st = require "util.stanza"; |
52 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
53 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
53 end |
54 end |
54 end |
55 end |
55 |
56 |
56 function roster_push(username, host, jid) |
57 function roster_push(username, host, jid) |
57 if jid ~= "pending" and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then |
58 local roster = jid and jid ~= "pending" and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; |
|
59 if roster then |
58 local item = hosts[host].sessions[username].roster[jid]; |
60 local item = hosts[host].sessions[username].roster[jid]; |
59 local stanza = st.iq({type="set"}); |
61 local stanza = st.iq({type="set"}); |
60 stanza:tag("query", {xmlns = "jabber:iq:roster"}); |
62 stanza:tag("query", {xmlns = "jabber:iq:roster", ver = tostring(roster[false].version or "1") }); |
61 if item then |
63 if item then |
62 stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name, ask = item.ask}); |
64 stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name, ask = item.ask}); |
63 for group in pairs(item.groups) do |
65 for group in pairs(item.groups) do |
64 stanza:tag("group"):text(group):up(); |
66 stanza:tag("group"):text(group):up(); |
65 end |
67 end |
83 if hosts[host] and hosts[host].sessions[username] then |
85 if hosts[host] and hosts[host].sessions[username] then |
84 local roster = hosts[host].sessions[username].roster; |
86 local roster = hosts[host].sessions[username].roster; |
85 if not roster then |
87 if not roster then |
86 log("debug", "load_roster: loading for new user: "..username.."@"..host); |
88 log("debug", "load_roster: loading for new user: "..username.."@"..host); |
87 roster = datamanager.load(username, host, "roster") or {}; |
89 roster = datamanager.load(username, host, "roster") or {}; |
|
90 if not roster[false] then roster[false] = { }; end |
88 hosts[host].sessions[username].roster = roster; |
91 hosts[host].sessions[username].roster = roster; |
89 end |
92 end |
90 return roster; |
93 return roster; |
91 end |
94 end |
92 -- Attempt to load roster for non-loaded user |
95 -- Attempt to load roster for non-loaded user |
95 end |
98 end |
96 |
99 |
97 function save_roster(username, host) |
100 function save_roster(username, host) |
98 log("debug", "save_roster: saving roster for "..username.."@"..host); |
101 log("debug", "save_roster: saving roster for "..username.."@"..host); |
99 if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then |
102 if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then |
|
103 local roster = hosts[host].sessions[username].roster; |
|
104 roster[false].version = (roster[false].version or 1) + 1; |
100 return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster); |
105 return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster); |
101 end |
106 end |
|
107 log("warn", "save_roster: user had no roster to save"); |
102 return nil; |
108 return nil; |
103 end |
109 end |
104 |
110 |
105 function process_inbound_subscription_approval(username, host, jid) |
111 function process_inbound_subscription_approval(username, host, jid) |
106 local roster = load_roster(username, host); |
112 local roster = load_roster(username, host); |