Software /
code /
prosody
Comparison
core/rostermanager.lua @ 176:e5cd2a03891d
Outbound presence subscription
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 25 Oct 2008 21:16:08 +0500 |
parent | 174:f9aff1fc7e99 |
child | 177:606c433955e7 |
comparison
equal
deleted
inserted
replaced
175:5f71d290bb44 | 176:e5cd2a03891d |
---|---|
94 end | 94 end |
95 | 95 |
96 function process_inbound_subscription_approval(username, host, jid) | 96 function process_inbound_subscription_approval(username, host, jid) |
97 local roster = load_roster(username, host); | 97 local roster = load_roster(username, host); |
98 local item = roster[jid]; | 98 local item = roster[jid]; |
99 if item and item.ask and (item.subscription == "none" or item.subscription == "from") then | 99 if item and item.ask then |
100 if item.subscription == "none" then | 100 if item.subscription == "none" then |
101 item.subscription = "to"; | 101 item.subscription = "to"; |
102 else | 102 else -- subscription == from |
103 item.subscription = "both"; | 103 item.subscription = "both"; |
104 end | 104 end |
105 item.ask = nil; | 105 item.ask = nil; |
106 return datamanager.store(username, host, "roster", roster); | 106 return datamanager.store(username, host, "roster", roster); |
107 end | 107 end |
108 end | 108 end |
109 | 109 |
110 function process_inbound_subscription_cancellation(username, host, jid) | 110 function process_inbound_subscription_cancellation(username, host, jid) |
111 local roster = load_roster(username, host); | 111 local roster = load_roster(username, host); |
112 local item = roster[jid]; | 112 local item = roster[jid]; |
113 if item and (item.subscription == "to" or item.subscription == "both") then | 113 local changed = nil; |
114 if is_contact_pending_out(username, host, jid) then | |
115 item.ask = nil; | |
116 changed = true; | |
117 end | |
118 if item then | |
114 if item.subscription == "to" then | 119 if item.subscription == "to" then |
115 item.subscription = "none"; | 120 item.subscription = "none"; |
116 else | 121 changed = true; |
122 elseif item.subscription == "both" then | |
117 item.subscription = "from"; | 123 item.subscription = "from"; |
118 end | 124 changed = true; |
119 -- FIXME do we need to item.ask = nil;? | 125 end |
126 end | |
127 if changed then | |
120 return datamanager.store(username, host, "roster", roster); | 128 return datamanager.store(username, host, "roster", roster); |
121 end | 129 end |
122 end | 130 end |
123 | 131 |
124 function process_inbound_unsubscribe(username, host, jid) | 132 function process_inbound_unsubscribe(username, host, jid) |
125 local roster = load_roster(username, host); | 133 local roster = load_roster(username, host); |
126 local item = roster[jid]; | 134 local item = roster[jid]; |
127 if item and (item.subscription == "from" or item.subscription == "both") then | 135 local changed = nil; |
136 if is_contact_pending_in(username, host, jid) then | |
137 roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? | |
138 changed = true; | |
139 end | |
140 if item then | |
128 if item.subscription == "from" then | 141 if item.subscription == "from" then |
129 item.subscription = "none"; | 142 item.subscription = "none"; |
130 else | 143 changed = true; |
144 elseif item.subscription == "both" then | |
131 item.subscription = "to"; | 145 item.subscription = "to"; |
132 end | 146 changed = true; |
133 item.ask = nil; | 147 end |
148 end | |
149 if changed then | |
134 return datamanager.store(username, host, "roster", roster); | 150 return datamanager.store(username, host, "roster", roster); |
135 end | 151 end |
136 end | 152 end |
137 | 153 |
138 function is_contact_subscribed(username, host, jid) | 154 function is_contact_subscribed(username, host, jid) |
139 local roster = load_roster(username, host); | 155 local roster = load_roster(username, host); |
140 local item = roster[jid]; | 156 local item = roster[jid]; |
141 return item and (item.subscription == "from" or item.subscription == "both"); | 157 return item and (item.subscription == "from" or item.subscription == "both"); |
142 end | 158 end |
143 | 159 |
160 function is_contact_pending_in(username, host, jid) | |
161 local roster = load_roster(username, host); | |
162 return roster.pending or roster.pending[jid]; | |
163 end | |
164 function set_contact_pending_in(username, host, jid, pending) | |
165 local roster = load_roster(username, host); | |
166 local item = roster[jid]; | |
167 if item and (item.subscription == "from" or item.subscription == "both") then | |
168 return; -- false | |
169 end | |
170 if not roster.pending then roster.pending = {}; end | |
171 roster.pending[jid] = true; | |
172 return datamanager.store(username, host, "roster", roster); | |
173 end | |
174 function is_contact_pending_out(username, host, jid) | |
175 local roster = load_roster(username, host); | |
176 local item = roster[jid]; | |
177 return item and item.ask; | |
178 end | |
179 function set_contact_pending_out(username, host, jid) -- subscribe | |
180 local roster = load_roster(username, host); | |
181 local item = roster[jid]; | |
182 if item and (item.ask or item.subscription == "to" or item.subscription == "both") then | |
183 return true; | |
184 end | |
185 if not item then | |
186 item = {subscription = "none"}; | |
187 roster[jid] = item; | |
188 end | |
189 item.ask = "subscribe"; | |
190 return datamanager.store(username, host, "roster", roster); | |
191 end | |
192 function unsubscribe(username, host, jid) | |
193 local roster = load_roster(username, host); | |
194 local item = roster[jid]; | |
195 if not item then return false; end | |
196 if (item.subscription == "from" or item.subscription == "none") and not item.ask then | |
197 return true; | |
198 end | |
199 item.ask = nil; | |
200 if item.subscription == "both" then | |
201 item.subscription = "from"; | |
202 elseif item.subscription == "to" then | |
203 item.subscription = "none"; | |
204 end | |
205 return datamanager.store(username, host, "roster", roster); | |
206 end | |
207 function subscribed(username, host, jid) | |
208 if is_contact_pending_in(username, host, jid) then | |
209 local roster = load_roster(username, host); | |
210 local item = roster[jid]; | |
211 if item.subscription == "none" then | |
212 item.subscription = "from"; | |
213 else -- subscription == to | |
214 item.subsctiption = "both"; | |
215 end | |
216 roster.pending[jid] = nil; | |
217 -- TODO maybe remove roster.pending if empty | |
218 return datamanager.store(username, host, "roster", roster); | |
219 end -- TODO else implement optional feature pre-approval (ask = subscribed) | |
220 end | |
221 function unsubscribed(username, host, jid) | |
222 local roster = load_roster(username, host); | |
223 local item = roster[jid]; | |
224 local pending = is_contact_pending_in(username, host, jid); | |
225 local changed = nil; | |
226 if is_contact_pending_in(username, host, jid) then | |
227 roster.pending[jid] = nil; -- TODO maybe delete roster.pending if empty? | |
228 changed = true; | |
229 end | |
230 if item then | |
231 if item.subscription == "from" then | |
232 item.subscription = "none"; | |
233 changed = true; | |
234 elseif item.subscription == both then | |
235 item.subscription = "to"; | |
236 changed = true; | |
237 end | |
238 end | |
239 if changed then | |
240 return datamanager.store(username, host, "roster", roster); | |
241 end | |
242 end | |
243 | |
244 function process_outbound_subscription_request(username, host, jid) | |
245 local roster = load_roster(username, host); | |
246 local item = roster[jid]; | |
247 if item and (item.subscription == "none" or item.subscription == "from") then | |
248 item.ask = "subscribe"; | |
249 return datamanager.store(username, host, "roster", roster); | |
250 end | |
251 end | |
252 | |
253 --[[function process_outbound_subscription_approval(username, host, jid) | |
254 local roster = load_roster(username, host); | |
255 local item = roster[jid]; | |
256 if item and (item.subscription == "none" or item.subscription == "from" then | |
257 item.ask = "subscribe"; | |
258 return datamanager.store(username, host, "roster", roster); | |
259 end | |
260 end]] | |
261 | |
262 | |
263 | |
144 return _M; | 264 return _M; |