Software / code / prosody
Comparison
core/rostermanager.lua @ 6779:6236668da30a
core.*: Remove use of module() function
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 21 Feb 2015 10:42:19 +0100 |
| parent | 6662:5ef319efedba |
| child | 6787:ad64e2eacd0e |
comparison
equal
deleted
inserted
replaced
| 6778:4009ae66e0f0 | 6779:6236668da30a |
|---|---|
| 20 | 20 |
| 21 local datamanager = require "util.datamanager" | 21 local datamanager = require "util.datamanager" |
| 22 local um_user_exists = require "core.usermanager".user_exists; | 22 local um_user_exists = require "core.usermanager".user_exists; |
| 23 local st = require "util.stanza"; | 23 local st = require "util.stanza"; |
| 24 | 24 |
| 25 module "rostermanager" | 25 local _ENV = nil; |
| 26 | 26 |
| 27 function add_to_roster(session, jid, item) | 27 local function add_to_roster(session, jid, item) |
| 28 if session.roster then | 28 if session.roster then |
| 29 local old_item = session.roster[jid]; | 29 local old_item = session.roster[jid]; |
| 30 session.roster[jid] = item; | 30 session.roster[jid] = item; |
| 31 if save_roster(session.username, session.host) then | 31 if save_roster(session.username, session.host) then |
| 32 return true; | 32 return true; |
| 37 else | 37 else |
| 38 return nil, "auth", "not-authorized", "Session's roster not loaded"; | 38 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
| 39 end | 39 end |
| 40 end | 40 end |
| 41 | 41 |
| 42 function remove_from_roster(session, jid) | 42 local function remove_from_roster(session, jid) |
| 43 if session.roster then | 43 if session.roster then |
| 44 local old_item = session.roster[jid]; | 44 local old_item = session.roster[jid]; |
| 45 session.roster[jid] = nil; | 45 session.roster[jid] = nil; |
| 46 if save_roster(session.username, session.host) then | 46 if save_roster(session.username, session.host) then |
| 47 return true; | 47 return true; |
| 52 else | 52 else |
| 53 return nil, "auth", "not-authorized", "Session's roster not loaded"; | 53 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
| 54 end | 54 end |
| 55 end | 55 end |
| 56 | 56 |
| 57 function roster_push(username, host, jid) | 57 local function roster_push(username, host, jid) |
| 58 local roster = jid and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; | 58 local roster = jid and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; |
| 59 if roster then | 59 if roster then |
| 60 local item = hosts[host].sessions[username].roster[jid]; | 60 local item = hosts[host].sessions[username].roster[jid]; |
| 61 local stanza = st.iq({type="set"}); | 61 local stanza = st.iq({type="set"}); |
| 62 stanza:tag("query", {xmlns = "jabber:iq:roster", ver = tostring(roster[false].version or "1") }); | 62 stanza:tag("query", {xmlns = "jabber:iq:roster", ver = tostring(roster[false].version or "1") }); |
| 93 metadata.pending = {}; | 93 metadata.pending = {}; |
| 94 end | 94 end |
| 95 return metadata; | 95 return metadata; |
| 96 end | 96 end |
| 97 | 97 |
| 98 function load_roster(username, host) | 98 local function load_roster(username, host) |
| 99 local jid = username.."@"..host; | 99 local jid = username.."@"..host; |
| 100 log("debug", "load_roster: asked for: %s", jid); | 100 log("debug", "load_roster: asked for: %s", jid); |
| 101 local user = bare_sessions[jid]; | 101 local user = bare_sessions[jid]; |
| 102 local roster; | 102 local roster; |
| 103 if user then | 103 if user then |
| 119 hosts[host].events.fire_event("roster-load", { username = username, host = host, roster = roster }); | 119 hosts[host].events.fire_event("roster-load", { username = username, host = host, roster = roster }); |
| 120 end | 120 end |
| 121 return roster, err; | 121 return roster, err; |
| 122 end | 122 end |
| 123 | 123 |
| 124 function save_roster(username, host, roster) | 124 local function save_roster(username, host, roster) |
| 125 if not um_user_exists(username, host) then | 125 if not um_user_exists(username, host) then |
| 126 log("debug", "not saving roster for %s@%s: the user doesn't exist", username, host); | 126 log("debug", "not saving roster for %s@%s: the user doesn't exist", username, host); |
| 127 return nil; | 127 return nil; |
| 128 end | 128 end |
| 129 | 129 |
| 145 end | 145 end |
| 146 log("warn", "save_roster: user had no roster to save"); | 146 log("warn", "save_roster: user had no roster to save"); |
| 147 return nil; | 147 return nil; |
| 148 end | 148 end |
| 149 | 149 |
| 150 function process_inbound_subscription_approval(username, host, jid) | 150 local function process_inbound_subscription_approval(username, host, jid) |
| 151 local roster = load_roster(username, host); | 151 local roster = load_roster(username, host); |
| 152 local item = roster[jid]; | 152 local item = roster[jid]; |
| 153 if item and item.ask then | 153 if item and item.ask then |
| 154 if item.subscription == "none" then | 154 if item.subscription == "none" then |
| 155 item.subscription = "to"; | 155 item.subscription = "to"; |
| 159 item.ask = nil; | 159 item.ask = nil; |
| 160 return save_roster(username, host, roster); | 160 return save_roster(username, host, roster); |
| 161 end | 161 end |
| 162 end | 162 end |
| 163 | 163 |
| 164 function process_inbound_subscription_cancellation(username, host, jid) | 164 local function process_inbound_subscription_cancellation(username, host, jid) |
| 165 local roster = load_roster(username, host); | 165 local roster = load_roster(username, host); |
| 166 local item = roster[jid]; | 166 local item = roster[jid]; |
| 167 local changed = nil; | 167 local changed = nil; |
| 168 if is_contact_pending_out(username, host, jid) then | 168 if is_contact_pending_out(username, host, jid) then |
| 169 item.ask = nil; | 169 item.ask = nil; |
| 181 if changed then | 181 if changed then |
| 182 return save_roster(username, host, roster); | 182 return save_roster(username, host, roster); |
| 183 end | 183 end |
| 184 end | 184 end |
| 185 | 185 |
| 186 function process_inbound_unsubscribe(username, host, jid) | 186 local function process_inbound_unsubscribe(username, host, jid) |
| 187 local roster = load_roster(username, host); | 187 local roster = load_roster(username, host); |
| 188 local item = roster[jid]; | 188 local item = roster[jid]; |
| 189 local changed = nil; | 189 local changed = nil; |
| 190 if is_contact_pending_in(username, host, jid) then | 190 if is_contact_pending_in(username, host, jid) then |
| 191 roster[false].pending[jid] = nil; | 191 roster[false].pending[jid] = nil; |
| 208 local function _get_online_roster_subscription(jidA, jidB) | 208 local function _get_online_roster_subscription(jidA, jidB) |
| 209 local user = bare_sessions[jidA]; | 209 local user = bare_sessions[jidA]; |
| 210 local item = user and (user.roster[jidB] or { subscription = "none" }); | 210 local item = user and (user.roster[jidB] or { subscription = "none" }); |
| 211 return item and item.subscription; | 211 return item and item.subscription; |
| 212 end | 212 end |
| 213 function is_contact_subscribed(username, host, jid) | 213 local function is_contact_subscribed(username, host, jid) |
| 214 do | 214 do |
| 215 local selfjid = username.."@"..host; | 215 local selfjid = username.."@"..host; |
| 216 local user_subscription = _get_online_roster_subscription(selfjid, jid); | 216 local user_subscription = _get_online_roster_subscription(selfjid, jid); |
| 217 if user_subscription then return (user_subscription == "both" or user_subscription == "from"); end | 217 if user_subscription then return (user_subscription == "both" or user_subscription == "from"); end |
| 218 local contact_subscription = _get_online_roster_subscription(jid, selfjid); | 218 local contact_subscription = _get_online_roster_subscription(jid, selfjid); |
| 221 local roster, err = load_roster(username, host); | 221 local roster, err = load_roster(username, host); |
| 222 local item = roster[jid]; | 222 local item = roster[jid]; |
| 223 return item and (item.subscription == "from" or item.subscription == "both"), err; | 223 return item and (item.subscription == "from" or item.subscription == "both"), err; |
| 224 end | 224 end |
| 225 | 225 |
| 226 function is_contact_pending_in(username, host, jid) | 226 local function is_contact_pending_in(username, host, jid) |
| 227 local roster = load_roster(username, host); | 227 local roster = load_roster(username, host); |
| 228 return roster[false].pending[jid]; | 228 return roster[false].pending[jid]; |
| 229 end | 229 end |
| 230 function set_contact_pending_in(username, host, jid) | 230 local function set_contact_pending_in(username, host, jid) |
| 231 local roster = load_roster(username, host); | 231 local roster = load_roster(username, host); |
| 232 local item = roster[jid]; | 232 local item = roster[jid]; |
| 233 if item and (item.subscription == "from" or item.subscription == "both") then | 233 if item and (item.subscription == "from" or item.subscription == "both") then |
| 234 return; -- false | 234 return; -- false |
| 235 end | 235 end |
| 236 roster[false].pending[jid] = true; | 236 roster[false].pending[jid] = true; |
| 237 return save_roster(username, host, roster); | 237 return save_roster(username, host, roster); |
| 238 end | 238 end |
| 239 function is_contact_pending_out(username, host, jid) | 239 local function is_contact_pending_out(username, host, jid) |
| 240 local roster = load_roster(username, host); | 240 local roster = load_roster(username, host); |
| 241 local item = roster[jid]; | 241 local item = roster[jid]; |
| 242 return item and item.ask; | 242 return item and item.ask; |
| 243 end | 243 end |
| 244 function set_contact_pending_out(username, host, jid) -- subscribe | 244 local function set_contact_pending_out(username, host, jid) -- subscribe |
| 245 local roster = load_roster(username, host); | 245 local roster = load_roster(username, host); |
| 246 local item = roster[jid]; | 246 local item = roster[jid]; |
| 247 if item and (item.ask or item.subscription == "to" or item.subscription == "both") then | 247 if item and (item.ask or item.subscription == "to" or item.subscription == "both") then |
| 248 return true; | 248 return true; |
| 249 end | 249 end |
| 253 end | 253 end |
| 254 item.ask = "subscribe"; | 254 item.ask = "subscribe"; |
| 255 log("debug", "set_contact_pending_out: saving roster; set %s@%s.roster[%q].ask=subscribe", username, host, jid); | 255 log("debug", "set_contact_pending_out: saving roster; set %s@%s.roster[%q].ask=subscribe", username, host, jid); |
| 256 return save_roster(username, host, roster); | 256 return save_roster(username, host, roster); |
| 257 end | 257 end |
| 258 function unsubscribe(username, host, jid) | 258 local function unsubscribe(username, host, jid) |
| 259 local roster = load_roster(username, host); | 259 local roster = load_roster(username, host); |
| 260 local item = roster[jid]; | 260 local item = roster[jid]; |
| 261 if not item then return false; end | 261 if not item then return false; end |
| 262 if (item.subscription == "from" or item.subscription == "none") and not item.ask then | 262 if (item.subscription == "from" or item.subscription == "none") and not item.ask then |
| 263 return true; | 263 return true; |
| 268 elseif item.subscription == "to" then | 268 elseif item.subscription == "to" then |
| 269 item.subscription = "none"; | 269 item.subscription = "none"; |
| 270 end | 270 end |
| 271 return save_roster(username, host, roster); | 271 return save_roster(username, host, roster); |
| 272 end | 272 end |
| 273 function subscribed(username, host, jid) | 273 local function subscribed(username, host, jid) |
| 274 if is_contact_pending_in(username, host, jid) then | 274 if is_contact_pending_in(username, host, jid) then |
| 275 local roster = load_roster(username, host); | 275 local roster = load_roster(username, host); |
| 276 local item = roster[jid]; | 276 local item = roster[jid]; |
| 277 if not item then -- FIXME should roster item be auto-created? | 277 if not item then -- FIXME should roster item be auto-created? |
| 278 item = {subscription = "none", groups = {}}; | 278 item = {subscription = "none", groups = {}}; |
| 285 end | 285 end |
| 286 roster[false].pending[jid] = nil; | 286 roster[false].pending[jid] = nil; |
| 287 return save_roster(username, host, roster); | 287 return save_roster(username, host, roster); |
| 288 end -- TODO else implement optional feature pre-approval (ask = subscribed) | 288 end -- TODO else implement optional feature pre-approval (ask = subscribed) |
| 289 end | 289 end |
| 290 function unsubscribed(username, host, jid) | 290 local function unsubscribed(username, host, jid) |
| 291 local roster = load_roster(username, host); | 291 local roster = load_roster(username, host); |
| 292 local item = roster[jid]; | 292 local item = roster[jid]; |
| 293 local pending = is_contact_pending_in(username, host, jid); | 293 local pending = is_contact_pending_in(username, host, jid); |
| 294 if pending then | 294 if pending then |
| 295 roster[false].pending[jid] = nil; | 295 roster[false].pending[jid] = nil; |
| 306 end | 306 end |
| 307 local success = (pending or subscribed) and save_roster(username, host, roster); | 307 local success = (pending or subscribed) and save_roster(username, host, roster); |
| 308 return success, pending, subscribed; | 308 return success, pending, subscribed; |
| 309 end | 309 end |
| 310 | 310 |
| 311 function process_outbound_subscription_request(username, host, jid) | 311 local function process_outbound_subscription_request(username, host, jid) |
| 312 local roster = load_roster(username, host); | 312 local roster = load_roster(username, host); |
| 313 local item = roster[jid]; | 313 local item = roster[jid]; |
| 314 if item and (item.subscription == "none" or item.subscription == "from") then | 314 if item and (item.subscription == "none" or item.subscription == "from") then |
| 315 item.ask = "subscribe"; | 315 item.ask = "subscribe"; |
| 316 return save_roster(username, host, roster); | 316 return save_roster(username, host, roster); |
| 326 end | 326 end |
| 327 end]] | 327 end]] |
| 328 | 328 |
| 329 | 329 |
| 330 | 330 |
| 331 return _M; | 331 return { |
| 332 add_to_roster = add_to_roster; | |
| 333 remove_from_roster = remove_from_roster; | |
| 334 roster_push = roster_push; | |
| 335 load_roster = load_roster; | |
| 336 save_roster = save_roster; | |
| 337 process_inbound_subscription_approval = process_inbound_subscription_approval; | |
| 338 process_inbound_subscription_cancellation = process_inbound_subscription_cancellation; | |
| 339 process_inbound_unsubscribe = process_inbound_unsubscribe; | |
| 340 is_contact_subscribed = is_contact_subscribed; | |
| 341 is_contact_pending_in = is_contact_pending_in; | |
| 342 set_contact_pending_in = set_contact_pending_in; | |
| 343 is_contact_pending_out = is_contact_pending_out; | |
| 344 set_contact_pending_out = set_contact_pending_out; | |
| 345 unsubscribe = unsubscribe; | |
| 346 subscribed = subscribed; | |
| 347 unsubscribed = unsubscribed; | |
| 348 process_outbound_subscription_request = process_outbound_subscription_request; | |
| 349 }; |