Mercurial > prosody-hg
annotate core/rostermanager.lua @ 177:606c433955e7
Bug fixes and checks for presence subscriptions, etc
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sun, 26 Oct 2008 00:22:18 +0500 |
| parents | e5cd2a03891d |
| children | 403db3b5c3c2 |
| rev | line source |
|---|---|
| 0 | 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; | |
| 110 | 10 local pairs, ipairs = pairs, ipairs; |
| 0 | 11 |
|
103
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
12 local hosts = hosts; |
|
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
13 |
| 0 | 14 require "util.datamanager" |
| 15 | |
| 16 local datamanager = datamanager; | |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
17 local st = require "util.stanza"; |
| 0 | 18 |
| 19 module "rostermanager" | |
| 20 | |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
21 function add_to_roster(session, jid, item) |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
22 if session.roster then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
23 local old_item = session.roster[jid]; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
24 session.roster[jid] = item; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
25 if save_roster(session.username, session.host) then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
26 return true; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
27 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
28 session.roster[jid] = old_item; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
29 return nil, "wait", "internal-server-error", "Unable to save roster"; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
30 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
31 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
32 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
33 end |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
34 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
35 |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
36 function remove_from_roster(session, jid) |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
37 if session.roster then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
38 local old_item = session.roster[jid]; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
39 session.roster[jid] = nil; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
40 if save_roster(session.username, session.host) then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
41 return true; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
42 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
43 session.roster[jid] = old_item; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
44 return nil, "wait", "internal-server-error", "Unable to save roster"; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
45 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
46 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
47 return nil, "auth", "not-authorized", "Session's roster not loaded"; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
48 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
49 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
50 |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
51 function roster_push(username, host, jid) |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
52 if jid ~= "pending" and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
53 local item = hosts[host].sessions[username].roster[jid]; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
54 local stanza = st.iq({type="set"}); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
55 stanza:tag("query", {xmlns = "jabber:iq:roster"}); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
56 if item then |
| 132 | 57 stanza:tag("item", {jid = jid, subscription = item.subscription, name = item.name, ask = item.ask}); |
| 110 | 58 for group in pairs(item.groups) do |
| 59 stanza:tag("group"):text(group):up(); | |
| 60 end | |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
61 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
62 stanza:tag("item", {jid = jid, subscription = "remove"}); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
63 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
64 stanza:up(); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
65 stanza:up(); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
66 -- stanza ready |
| 110 | 67 for _, session in pairs(hosts[host].sessions[username].sessions) do |
|
114
bed2a8508cf5
Added session property for interested resources
Waqas Hussain <waqas20@gmail.com>
parents:
110
diff
changeset
|
68 if session.interested then |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
69 -- FIXME do we need to set stanza.attr.to? |
| 110 | 70 session.send(stanza); |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
71 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
72 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
73 end |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
74 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
75 |
|
103
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
76 function load_roster(username, host) |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
77 log("debug", "load_roster: asked for: "..username.."@"..host); |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
78 if hosts[host] and hosts[host].sessions[username] then |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
79 local roster = hosts[host].sessions[username].roster; |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
80 if not roster then |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
81 log("debug", "load_roster: loading for new user: "..username.."@"..host); |
|
103
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
82 roster = datamanager.load(username, host, "roster") or {}; |
|
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
83 hosts[host].sessions[username].roster = roster; |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
84 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
85 return roster; |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
86 end |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
87 -- Attempt to load roster for non-loaded user |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
88 log("debug", "load_roster: loading for offline user: "..username.."@"..host); |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
89 return datamanager.load(username, host, "roster") or {}; |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
90 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
91 |
|
103
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
92 function save_roster(username, host) |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
93 log("debug", "save_roster: saving roster for "..username.."@"..host); |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
94 if hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster then |
| 110 | 95 return datamanager.store(username, host, "roster", hosts[host].sessions[username].roster); |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
96 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
97 return nil; |
| 0 | 98 end |
|
80
523ac742cc19
Fixed: rostermanager.lua now returns the module
Waqas Hussain <waqas20@gmail.com>
parents:
6
diff
changeset
|
99 |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
100 function process_inbound_subscription_approval(username, host, jid) |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
101 local roster = load_roster(username, host); |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
102 local item = roster[jid]; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
103 if item and item.ask then |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
104 if item.subscription == "none" then |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
105 item.subscription = "to"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
106 else -- subscription == from |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
107 item.subscription = "both"; |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
108 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
109 item.ask = nil; |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
110 return datamanager.store(username, host, "roster", roster); |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
111 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
112 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
113 |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
114 function process_inbound_subscription_cancellation(username, host, jid) |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
115 local roster = load_roster(username, host); |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
116 local item = roster[jid]; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
117 local changed = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
118 if is_contact_pending_out(username, host, jid) then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
119 item.ask = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
120 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
121 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
122 if item then |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
123 if item.subscription == "to" then |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
124 item.subscription = "none"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
125 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
126 elseif item.subscription == "both" then |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
127 item.subscription = "from"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
128 changed = true; |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
129 end |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
130 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
131 if changed then |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
132 return datamanager.store(username, host, "roster", roster); |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
133 end |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
134 end |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
135 |
| 173 | 136 function process_inbound_unsubscribe(username, host, jid) |
| 137 local roster = load_roster(username, host); | |
| 138 local item = roster[jid]; | |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
139 local changed = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
140 if is_contact_pending_in(username, host, jid) then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
141 roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
142 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
143 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
144 if item then |
| 173 | 145 if item.subscription == "from" then |
| 146 item.subscription = "none"; | |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
147 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
148 elseif item.subscription == "both" then |
| 173 | 149 item.subscription = "to"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
150 changed = true; |
| 173 | 151 end |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
152 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
153 if changed then |
| 173 | 154 return datamanager.store(username, host, "roster", roster); |
| 155 end | |
| 156 end | |
| 157 | |
|
174
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
158 function is_contact_subscribed(username, host, jid) |
|
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
159 local roster = load_roster(username, host); |
|
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
160 local item = roster[jid]; |
|
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
161 return item and (item.subscription == "from" or item.subscription == "both"); |
|
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
162 end |
|
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
163 |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
164 function is_contact_pending_in(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
165 local roster = load_roster(username, host); |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
166 return roster.pending and roster.pending[jid]; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
167 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
168 function set_contact_pending_in(username, host, jid, pending) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
169 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
170 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
171 if item and (item.subscription == "from" or item.subscription == "both") then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
172 return; -- false |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
173 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
174 if not roster.pending then roster.pending = {}; end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
175 roster.pending[jid] = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
176 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
177 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
178 function is_contact_pending_out(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
179 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
180 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
181 return item and item.ask; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
182 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
183 function set_contact_pending_out(username, host, jid) -- subscribe |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
184 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
185 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
186 if item and (item.ask or item.subscription == "to" or item.subscription == "both") then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
187 return true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
188 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
189 if not item then |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
190 item = {subscription = "none", groups = {}}; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
191 roster[jid] = item; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
192 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
193 item.ask = "subscribe"; |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
194 log("debug", "set_contact_pending_out: saving roster; set "..username.."@"..host..".roster["..jid.."].ask=subscribe"); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
195 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
196 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
197 function unsubscribe(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
198 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
199 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
200 if not item then return false; end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
201 if (item.subscription == "from" or item.subscription == "none") and not item.ask then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
202 return true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
203 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
204 item.ask = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
205 if item.subscription == "both" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
206 item.subscription = "from"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
207 elseif item.subscription == "to" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
208 item.subscription = "none"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
209 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
210 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
211 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
212 function subscribed(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
213 if is_contact_pending_in(username, host, jid) then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
214 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
215 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
216 if item.subscription == "none" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
217 item.subscription = "from"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
218 else -- subscription == to |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
219 item.subscription = "both"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
220 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
221 roster.pending[jid] = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
222 -- TODO maybe remove roster.pending if empty |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
223 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
224 end -- TODO else implement optional feature pre-approval (ask = subscribed) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
225 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
226 function unsubscribed(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
227 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
228 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
229 local pending = is_contact_pending_in(username, host, jid); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
230 local changed = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
231 if is_contact_pending_in(username, host, jid) then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
232 roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
233 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
234 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
235 if item then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
236 if item.subscription == "from" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
237 item.subscription = "none"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
238 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
239 elseif item.subscription == both then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
240 item.subscription = "to"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
241 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
242 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
243 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
244 if changed then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
245 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
246 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
247 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
248 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
249 function process_outbound_subscription_request(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
250 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
251 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
252 if item and (item.subscription == "none" or item.subscription == "from") then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
253 item.ask = "subscribe"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
254 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
255 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
256 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
257 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
258 --[[function process_outbound_subscription_approval(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
259 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
260 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
261 if item and (item.subscription == "none" or item.subscription == "from" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
262 item.ask = "subscribe"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
263 return datamanager.store(username, host, "roster", roster); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
264 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
265 end]] |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
266 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
267 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
268 |
|
80
523ac742cc19
Fixed: rostermanager.lua now returns the module
Waqas Hussain <waqas20@gmail.com>
parents:
6
diff
changeset
|
269 return _M; |
