Mercurial > prosody-hg
annotate core/rostermanager.lua @ 14217:7eb0e47418ab 13.0
util.human.io: Add simple version comparison
This is a small helper function that compares version string (it can be passed
to table.sort() as a comparator).
Full version sorts (e.g. semver, and natural/alphanumeric sort in general) are
more complex, and I would like to eventually support those. But this is a
stable branch and we don't need it for anything just yet.
Regarding justification for the stable branch:
The function is being committed with extensive tests, and isn't currently used
anywhere. The plan is to use it in an upcoming update of how TLS profiles are
configured, but the inputs in that case will be fixed (meaning that the risk
of breakage is lower than if we were running it against arbitrary data).
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 12 Jun 2026 11:38:39 +0100 |
| parents | 0ff587d7c742 |
| children |
| rev | line source |
|---|---|
|
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
1380
diff
changeset
|
1 -- Prosody IM |
|
2923
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2050
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
|
b7049746bd29
Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents:
2050
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
|
5776
bd0ff8ae98a8
Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
5747
diff
changeset
|
4 -- |
| 758 | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
268
diff
changeset
|
7 -- |
|
7949
8acc35b5355a
core: Allow select core modules to mutate some globals (needs luacheck 1.19)
Kim Alvefur <zash@zash.se>
parents:
7779
diff
changeset
|
8 -- luacheck: globals prosody.bare_sessions.?.roster |
|
519
cccd610a0ef9
Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents:
268
diff
changeset
|
9 |
| 0 | 10 |
|
263
75275b6b4e03
Update rostermanager to use new logger
Matthew Wild <mwild1@gmail.com>
parents:
193
diff
changeset
|
11 |
|
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
12 local log = require "prosody.util.logger".init("rostermanager"); |
| 0 | 13 |
|
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
14 local new_id = require "prosody.util.id".short; |
|
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
15 local new_cache = require "prosody.util.cache".new; |
|
9303
72f0862978ef
rostermanager: Use util.id to generate ids for roster pushed
Matthew Wild <mwild1@gmail.com>
parents:
8717
diff
changeset
|
16 |
|
5348
ca0d820e9318
rostermanager: Remove unused imports
Kim Alvefur <zash@zash.se>
parents:
5060
diff
changeset
|
17 local pairs = pairs; |
|
916
f0743928ef7e
core.rostermanager/mod_roster: Support for roster versioning
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
18 local tostring = tostring; |
|
6622
fb60cee2144e
rostermanager: Add missing import of `type()`
Florian Zeitz <florob@babelmonkeys.de>
parents:
6616
diff
changeset
|
19 local type = type; |
| 0 | 20 |
|
8717
9ddd0fbbe53a
core: Use prosody.hosts instead of _G.hosts for consistency
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
21 local hosts = prosody.hosts; |
|
6550
a335d02951b3
rostermanager: Access bare_sessions through prosody.bare_sessions
Matthew Wild <mwild1@gmail.com>
parents:
5776
diff
changeset
|
22 local bare_sessions = prosody.bare_sessions; |
|
103
ebdb7875443e
Fixed: Typos caused by lack of sleep.
Waqas Hussain <waqas20@gmail.com>
parents:
101
diff
changeset
|
23 |
|
12972
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
24 local um_user_exists = require "prosody.core.usermanager".user_exists; |
|
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
25 local st = require "prosody.util.stanza"; |
|
ead41e25ebc0
core: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12387
diff
changeset
|
26 local storagemanager = require "prosody.core.storagemanager"; |
| 0 | 27 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
28 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8496
diff
changeset
|
29 -- luacheck: std none |
| 0 | 30 |
|
6787
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
31 local save_roster; -- forward declaration |
|
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
32 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
33 local function add_to_roster(session, jid, item) |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
34 if session.roster then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
35 local old_item = session.roster[jid]; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
36 session.roster[jid] = item; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
37 if save_roster(session.username, session.host, nil, jid) then |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
38 return true; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
39 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
40 session.roster[jid] = old_item; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
41 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
|
42 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
43 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
44 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
|
45 end |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
46 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
47 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
48 local function remove_from_roster(session, jid) |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
49 if session.roster then |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
50 local old_item = session.roster[jid]; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
51 session.roster[jid] = nil; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
52 if save_roster(session.username, session.host, nil, jid) then |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
53 return true; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
54 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
55 session.roster[jid] = old_item; |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
56 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
|
57 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
58 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
59 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
|
60 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
61 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
62 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
63 local function roster_push(username, host, jid) |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
64 local roster = jid and hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; |
|
916
f0743928ef7e
core.rostermanager/mod_roster: Support for roster versioning
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
65 if roster then |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
66 local item = hosts[host].sessions[username].roster[jid]; |
|
9303
72f0862978ef
rostermanager: Use util.id to generate ids for roster pushed
Matthew Wild <mwild1@gmail.com>
parents:
8717
diff
changeset
|
67 local stanza = st.iq({type="set", id=new_id()}); |
|
916
f0743928ef7e
core.rostermanager/mod_roster: Support for roster versioning
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
68 stanza:tag("query", {xmlns = "jabber:iq:roster", ver = tostring(roster[false].version or "1") }); |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
69 if item then |
|
14203
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
70 stanza:tag("item", { |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
71 jid = jid; |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
72 subscription = item.subscription; |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
73 name = item.name; |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
74 ask = item.ask; |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
75 approved = item.approved; |
|
0ff587d7c742
rostermanager, mod_roster: Include 'approved' attribute in roster items (thanks singpolyma)
Matthew Wild <mwild1@gmail.com>
parents:
12972
diff
changeset
|
76 }); |
| 110 | 77 for group in pairs(item.groups) do |
| 78 stanza:tag("group"):text(group):up(); | |
| 79 end | |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
80 else |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
81 stanza:tag("item", {jid = jid, subscription = "remove"}); |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
82 end |
| 193 | 83 stanza:up(); -- move out from item |
| 84 stanza:up(); -- move out from stanza | |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
85 -- stanza ready |
| 110 | 86 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
|
87 if session.interested then |
| 110 | 88 session.send(stanza); |
|
107
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
89 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
90 end |
|
8d8debda3df2
Added: Roster manipulation functions to core.rostermanager
Waqas Hussain <waqas20@gmail.com>
parents:
103
diff
changeset
|
91 end |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
92 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
93 |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
94 local function roster_metadata(roster, err) |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
95 local metadata = roster[false]; |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
96 if not metadata then |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
97 metadata = { broken = err or nil }; |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
98 roster[false] = metadata; |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
99 end |
|
6624
7f9b49f2758a
rostermanager: Fix roster upgrade code (thanks mva)
Kim Alvefur <zash@zash.se>
parents:
6622
diff
changeset
|
100 if roster.pending and type(roster.pending.subscription) ~= "string" then |
|
7f9b49f2758a
rostermanager: Fix roster upgrade code (thanks mva)
Kim Alvefur <zash@zash.se>
parents:
6622
diff
changeset
|
101 metadata.pending = roster.pending; |
|
7f9b49f2758a
rostermanager: Fix roster upgrade code (thanks mva)
Kim Alvefur <zash@zash.se>
parents:
6622
diff
changeset
|
102 roster.pending = nil; |
|
7f9b49f2758a
rostermanager: Fix roster upgrade code (thanks mva)
Kim Alvefur <zash@zash.se>
parents:
6622
diff
changeset
|
103 elseif not metadata.pending then |
|
7f9b49f2758a
rostermanager: Fix roster upgrade code (thanks mva)
Kim Alvefur <zash@zash.se>
parents:
6622
diff
changeset
|
104 metadata.pending = {}; |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
105 end |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
106 return metadata; |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
107 end |
|
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
108 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
109 local function load_roster(username, host) |
|
2048
d420722519e1
rostermanager: Log a warning when a self-contact is detected.
Waqas Hussain <waqas20@gmail.com>
parents:
2047
diff
changeset
|
110 local jid = username.."@"..host; |
|
4993
5243b74a4cbb
Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents:
3129
diff
changeset
|
111 log("debug", "load_roster: asked for: %s", jid); |
|
2049
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
112 local user = bare_sessions[jid]; |
|
1380
9b3b43b8963a
rostermanager: Fire event on roster load
Matthew Wild <mwild1@gmail.com>
parents:
925
diff
changeset
|
113 local roster; |
|
2049
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
114 if user then |
|
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
115 roster = user.roster; |
|
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
116 if roster then return roster; end |
|
8356
bbd18b617296
rostermanager: Simplify logging.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8147
diff
changeset
|
117 log("debug", "load_roster: loading for new user: %s", jid); |
|
2049
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
118 else -- Attempt to load roster for non-loaded user |
|
8356
bbd18b617296
rostermanager: Simplify logging.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
8147
diff
changeset
|
119 log("debug", "load_roster: loading for offline user: %s", jid); |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
120 end |
|
10569
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
121 local roster_cache = hosts[host] and hosts[host].roster_cache; |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
122 if not roster_cache then |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
123 if hosts[host] then |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
124 roster_cache = new_cache(1024); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
125 hosts[host].roster_cache = roster_cache; |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
126 end |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
127 else |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
128 roster = roster_cache:get(jid); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
129 if roster then |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
130 log("debug", "load_roster: cache hit"); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
131 roster_cache:set(jid, roster); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
132 if user then user.roster = roster; end |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
133 return roster; |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
134 else |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
135 log("debug", "load_roster: cache miss, loading from storage"); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
136 end |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
137 end |
|
7167
7ae430fecf12
rostermanager: Require storagemanager at the top, fixes traceback on Lua 5.2
Matthew Wild <mwild1@gmail.com>
parents:
7155
diff
changeset
|
138 local roster_store = storagemanager.open(host, "roster", "keyval"); |
|
7154
b3b92204802f
rostermanager: Use storagemanager
Kim Alvefur <zash@zash.se>
parents:
7064
diff
changeset
|
139 local data, err = roster_store:get(username); |
|
3087
9b31e36528e0
rostermanager: When loading the roster, also return a datamanager error if available.
Waqas Hussain <waqas20@gmail.com>
parents:
2925
diff
changeset
|
140 roster = data or {}; |
|
2049
227f3fd2caaf
rostermanager: Refactored roster loading to remove duplicate code.
Waqas Hussain <waqas20@gmail.com>
parents:
2048
diff
changeset
|
141 if user then user.roster = roster; end |
|
8496
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
142 local legacy_pending = roster.pending and type(roster.pending.subscription) ~= "string"; |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
143 roster_metadata(roster, err); |
|
8496
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
144 if legacy_pending then |
|
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
145 -- Due to map store use, we need to manually delete this entry |
|
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
146 log("debug", "Removing legacy 'pending' entry"); |
|
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
147 if not save_roster(username, host, roster, "pending") then |
|
12387
05c250fa335a
Spelling: Fix various spelling mistakes (thanks timeless)
Kim Alvefur <zash@zash.se>
parents:
10570
diff
changeset
|
148 log("warn", "Could not remove legacy 'pending' entry"); |
|
8496
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
149 end |
|
9b81c22d5b54
rostermanager: Explicitly remove old-style 'pending' table from rosters (or it stays forever due to map stores)
Kim Alvefur <zash@zash.se>
parents:
8361
diff
changeset
|
150 end |
|
2048
d420722519e1
rostermanager: Log a warning when a self-contact is detected.
Waqas Hussain <waqas20@gmail.com>
parents:
2047
diff
changeset
|
151 if roster[jid] then |
|
d420722519e1
rostermanager: Log a warning when a self-contact is detected.
Waqas Hussain <waqas20@gmail.com>
parents:
2047
diff
changeset
|
152 roster[jid] = nil; |
|
8359
467ca83e6c0e
rostermanager: Demote warning to debug message
Kim Alvefur <zash@zash.se>
parents:
8358
diff
changeset
|
153 log("debug", "Roster for %s had a self-contact, removing", jid); |
|
8361
6af950b834a6
rostermanager: Log warning if removal self-contact failed
Kim Alvefur <zash@zash.se>
parents:
8360
diff
changeset
|
154 if not save_roster(username, host, roster, jid) then |
|
6af950b834a6
rostermanager: Log warning if removal self-contact failed
Kim Alvefur <zash@zash.se>
parents:
8360
diff
changeset
|
155 log("warn", "Could not remove self-contact from roster for %s", jid); |
|
6af950b834a6
rostermanager: Log warning if removal self-contact failed
Kim Alvefur <zash@zash.se>
parents:
8360
diff
changeset
|
156 end |
|
2048
d420722519e1
rostermanager: Log a warning when a self-contact is detected.
Waqas Hussain <waqas20@gmail.com>
parents:
2047
diff
changeset
|
157 end |
|
3090
f14d2962f32c
rostermanager: Don't fire roster-load event if there was an error loading the roster
Matthew Wild <mwild1@gmail.com>
parents:
3087
diff
changeset
|
158 if not err then |
|
5747
23076ee191d3
rostermanager, mod_groups: Change roster-load event to pass an event table for consistency
Matthew Wild <mwild1@gmail.com>
parents:
5429
diff
changeset
|
159 hosts[host].events.fire_event("roster-load", { username = username, host = host, roster = roster }); |
|
3090
f14d2962f32c
rostermanager: Don't fire roster-load event if there was an error loading the roster
Matthew Wild <mwild1@gmail.com>
parents:
3087
diff
changeset
|
160 end |
|
10569
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
161 if roster_cache and not user then |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
162 log("debug", "load_roster: caching loaded roster"); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
163 roster_cache:set(jid, roster); |
|
fdc2bae50100
core.rostermanager: Cache rosters of offline users for faster access (fixes #1233)
Kim Alvefur <zash@zash.se>
parents:
9303
diff
changeset
|
164 end |
|
3087
9b31e36528e0
rostermanager: When loading the roster, also return a datamanager error if available.
Waqas Hussain <waqas20@gmail.com>
parents:
2925
diff
changeset
|
165 return roster, err; |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
166 end |
|
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
167 |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
168 function save_roster(username, host, roster, jid) |
|
5429
25333de6e7c7
rostermanager: do not save rosters for unexistant users.
Marco Cirillo <maranda@lightwitch.org>
parents:
5348
diff
changeset
|
169 if not um_user_exists(username, host) then |
|
25333de6e7c7
rostermanager: do not save rosters for unexistant users.
Marco Cirillo <maranda@lightwitch.org>
parents:
5348
diff
changeset
|
170 log("debug", "not saving roster for %s@%s: the user doesn't exist", username, host); |
|
25333de6e7c7
rostermanager: do not save rosters for unexistant users.
Marco Cirillo <maranda@lightwitch.org>
parents:
5348
diff
changeset
|
171 return nil; |
|
25333de6e7c7
rostermanager: do not save rosters for unexistant users.
Marco Cirillo <maranda@lightwitch.org>
parents:
5348
diff
changeset
|
172 end |
|
25333de6e7c7
rostermanager: do not save rosters for unexistant users.
Marco Cirillo <maranda@lightwitch.org>
parents:
5348
diff
changeset
|
173 |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
174 log("debug", "save_roster: saving roster for %s@%s, (%s)", username, host, jid or "all contacts"); |
|
1897
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
175 if not roster then |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
176 roster = hosts[host] and hosts[host].sessions[username] and hosts[host].sessions[username].roster; |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
177 --if not roster then |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
178 -- --roster = load_roster(username, host); |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
179 -- return true; -- roster unchanged, no reason to save |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
180 --end |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
181 end |
|
6d81e74310a7
rostermanager: Added support for saving rosters of offline users to the save_roster function.
Waqas Hussain <waqas20@gmail.com>
parents:
1523
diff
changeset
|
182 if roster then |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
183 local metadata = roster_metadata(roster); |
|
2909
bcfd76cc9b7d
rostermanager: Don't bump the roster version if it is == true (ie. we are not versioning the roster)
Matthew Wild <mwild1@gmail.com>
parents:
2050
diff
changeset
|
184 if metadata.version ~= true then |
|
bcfd76cc9b7d
rostermanager: Don't bump the roster version if it is == true (ie. we are not versioning the roster)
Matthew Wild <mwild1@gmail.com>
parents:
2050
diff
changeset
|
185 metadata.version = (metadata.version or 0) + 1; |
|
bcfd76cc9b7d
rostermanager: Don't bump the roster version if it is == true (ie. we are not versioning the roster)
Matthew Wild <mwild1@gmail.com>
parents:
2050
diff
changeset
|
186 end |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
187 if metadata.broken then return nil, "Not saving broken roster" end |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
188 if jid == nil then |
|
7167
7ae430fecf12
rostermanager: Require storagemanager at the top, fixes traceback on Lua 5.2
Matthew Wild <mwild1@gmail.com>
parents:
7155
diff
changeset
|
189 local roster_store = storagemanager.open(host, "roster", "keyval"); |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
190 return roster_store:set(username, roster); |
|
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
191 else |
|
7167
7ae430fecf12
rostermanager: Require storagemanager at the top, fixes traceback on Lua 5.2
Matthew Wild <mwild1@gmail.com>
parents:
7155
diff
changeset
|
192 local roster_store = storagemanager.open(host, "roster", "map"); |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
193 return roster_store:set_keys(username, { [false] = metadata, [jid] = roster[jid] or roster_store.remove }); |
|
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
194 end |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
195 end |
|
916
f0743928ef7e
core.rostermanager/mod_roster: Support for roster versioning
Matthew Wild <mwild1@gmail.com>
parents:
896
diff
changeset
|
196 log("warn", "save_roster: user had no roster to save"); |
|
101
c690fa382743
Added some roster management functions
Waqas Hussain <waqas20@gmail.com>
parents:
80
diff
changeset
|
197 return nil; |
| 0 | 198 end |
|
80
523ac742cc19
Fixed: rostermanager.lua now returns the module
Waqas Hussain <waqas20@gmail.com>
parents:
6
diff
changeset
|
199 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
200 local function process_inbound_subscription_approval(username, host, jid) |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
201 local roster = load_roster(username, host); |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
202 local item = roster[jid]; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
203 if item and item.ask then |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
204 if item.subscription == "none" then |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
205 item.subscription = "to"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
206 else -- subscription == from |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
207 item.subscription = "both"; |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
208 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
209 item.ask = nil; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
210 return save_roster(username, host, roster, jid); |
|
171
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
211 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
212 end |
|
28f420d057a0
Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents:
132
diff
changeset
|
213 |
|
6787
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
214 local is_contact_pending_out -- forward declaration |
|
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
215 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
216 local function process_inbound_subscription_cancellation(username, host, jid) |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
217 local roster = load_roster(username, host); |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
218 local item = roster[jid]; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
219 local changed = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
220 if is_contact_pending_out(username, host, jid) then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
221 item.ask = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
222 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
223 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
224 if item then |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
225 if item.subscription == "to" then |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
226 item.subscription = "none"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
227 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
228 elseif item.subscription == "both" then |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
229 item.subscription = "from"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
230 changed = true; |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
231 end |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
232 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
233 if changed then |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
234 return save_roster(username, host, roster, jid); |
|
172
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
235 end |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
236 end |
|
71247788c7c7
Inbound subscription cancellation
Waqas Hussain <waqas20@gmail.com>
parents:
171
diff
changeset
|
237 |
|
6787
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
238 local is_contact_pending_in -- forward declaration |
|
ad64e2eacd0e
rostermanager: Add forward declarations
Kim Alvefur <zash@zash.se>
parents:
6779
diff
changeset
|
239 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
240 local function process_inbound_unsubscribe(username, host, jid) |
| 173 | 241 local roster = load_roster(username, host); |
| 242 local item = roster[jid]; | |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
243 local changed = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
244 if is_contact_pending_in(username, host, jid) then |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
245 roster[false].pending[jid] = nil; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
246 changed = true; |
|
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 if item then |
| 173 | 249 if item.subscription == "from" then |
| 250 item.subscription = "none"; | |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
251 changed = true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
252 elseif item.subscription == "both" then |
| 173 | 253 item.subscription = "to"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
254 changed = true; |
| 173 | 255 end |
|
176
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 if changed then |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
258 return save_roster(username, host, roster, jid); |
| 173 | 259 end |
| 260 end | |
| 261 | |
|
3129
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
262 local function _get_online_roster_subscription(jidA, jidB) |
|
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
263 local user = bare_sessions[jidA]; |
|
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
264 local item = user and (user.roster[jidB] or { subscription = "none" }); |
|
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
265 return item and item.subscription; |
|
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
266 end |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
267 local function is_contact_subscribed(username, host, jid) |
|
3129
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
268 do |
|
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
269 local selfjid = username.."@"..host; |
|
6662
5ef319efedba
rostermanager: Variable rename for clarity and to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6624
diff
changeset
|
270 local user_subscription = _get_online_roster_subscription(selfjid, jid); |
|
5ef319efedba
rostermanager: Variable rename for clarity and to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6624
diff
changeset
|
271 if user_subscription then return (user_subscription == "both" or user_subscription == "from"); end |
|
5ef319efedba
rostermanager: Variable rename for clarity and to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6624
diff
changeset
|
272 local contact_subscription = _get_online_roster_subscription(jid, selfjid); |
|
5ef319efedba
rostermanager: Variable rename for clarity and to avoid name clash [luacheck]
Matthew Wild <mwild1@gmail.com>
parents:
6624
diff
changeset
|
273 if contact_subscription then return (contact_subscription == "both" or contact_subscription == "to"); end |
|
3129
125f03db0b1a
rostermanager: Optimisation to avoid unnecessarily loading rosters for offline contacts on probes, etc.
Waqas Hussain <waqas20@gmail.com>
parents:
3111
diff
changeset
|
274 end |
|
3111
826cb5f1859b
rostermanager: Return an error string when subscription test fails due to an error.
Waqas Hussain <waqas20@gmail.com>
parents:
3110
diff
changeset
|
275 local roster, err = load_roster(username, host); |
|
174
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
276 local item = roster[jid]; |
|
3111
826cb5f1859b
rostermanager: Return an error string when subscription test fails due to an error.
Waqas Hussain <waqas20@gmail.com>
parents:
3110
diff
changeset
|
277 return item and (item.subscription == "from" or item.subscription == "both"), err; |
|
174
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
278 end |
| 7779 | 279 local function is_user_subscribed(username, host, jid) |
|
7777
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
280 do |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
281 local selfjid = username.."@"..host; |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
282 local user_subscription = _get_online_roster_subscription(selfjid, jid); |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
283 if user_subscription then return (user_subscription == "both" or user_subscription == "to"); end |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
284 local contact_subscription = _get_online_roster_subscription(jid, selfjid); |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
285 if contact_subscription then return (contact_subscription == "both" or contact_subscription == "from"); end |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
286 end |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
287 local roster, err = load_roster(username, host); |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
288 local item = roster[jid]; |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
289 return item and (item.subscription == "to" or item.subscription == "both"), err; |
|
65836cf2d057
core.rostermanager: Add method for checking if the user is subscribed to a contact
Kim Alvefur <zash@zash.se>
parents:
5429
diff
changeset
|
290 end |
|
174
f9aff1fc7e99
Inbound subscription request
Waqas Hussain <waqas20@gmail.com>
parents:
173
diff
changeset
|
291 |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
292 function is_contact_pending_in(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
293 local roster = load_roster(username, host); |
|
9671
e50559a42dfe
rostermanager, mod_presence: Store stanza for incoming subscription requests (fixes #689) (thanks Zash, Ge0rG)
Matthew Wild <mwild1@gmail.com>
parents:
9303
diff
changeset
|
294 return roster[false].pending[jid] ~= nil; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
295 end |
|
9671
e50559a42dfe
rostermanager, mod_presence: Store stanza for incoming subscription requests (fixes #689) (thanks Zash, Ge0rG)
Matthew Wild <mwild1@gmail.com>
parents:
9303
diff
changeset
|
296 local function set_contact_pending_in(username, host, jid, stanza) |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
297 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
298 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
299 if item and (item.subscription == "from" or item.subscription == "both") then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
300 return; -- false |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
301 end |
|
9671
e50559a42dfe
rostermanager, mod_presence: Store stanza for incoming subscription requests (fixes #689) (thanks Zash, Ge0rG)
Matthew Wild <mwild1@gmail.com>
parents:
9303
diff
changeset
|
302 roster[false].pending[jid] = st.is_stanza(stanza) and st.preserialize(stanza) or true; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
303 return save_roster(username, host, roster, jid); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
304 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
305 function is_contact_pending_out(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
306 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
307 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
308 return item and item.ask; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
309 end |
|
10514
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
310 local function is_contact_preapproved(username, host, jid) |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
311 local roster = load_roster(username, host); |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
312 local item = roster[jid]; |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
313 return item and (item.approved == "true"); |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
314 end |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
315 local function set_contact_pending_out(username, host, jid) -- subscribe |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
316 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
317 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
318 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
|
319 return true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
320 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
321 if not item then |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
322 item = {subscription = "none", groups = {}}; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
323 roster[jid] = item; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
324 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
325 item.ask = "subscribe"; |
|
4993
5243b74a4cbb
Hopefully inert commit to clean up logging across a number of modules, removing all cases of concatenation when building log messages
Matthew Wild <mwild1@gmail.com>
parents:
3129
diff
changeset
|
326 log("debug", "set_contact_pending_out: saving roster; set %s@%s.roster[%q].ask=subscribe", username, host, jid); |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
327 return save_roster(username, host, roster, jid); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
328 end |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
329 local function unsubscribe(username, host, jid) |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
330 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
331 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
332 if not item then return false; end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
333 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
|
334 return true; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
335 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
336 item.ask = nil; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
337 if item.subscription == "both" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
338 item.subscription = "from"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
339 elseif item.subscription == "to" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
340 item.subscription = "none"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
341 end |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
342 return save_roster(username, host, roster, jid); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
343 end |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
344 local function subscribed(username, host, jid) |
|
10514
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
345 local roster = load_roster(username, host); |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
346 local item = roster[jid]; |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
347 |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
348 if is_contact_pending_in(username, host, jid) then |
|
925
4861bcf0afa4
Fixed: rostermanager: Create new roster item if one doesn't exist on subscription approval (fixes issue #77)
Waqas Hussain <waqas20@gmail.com>
parents:
916
diff
changeset
|
349 if not item then -- FIXME should roster item be auto-created? |
|
4861bcf0afa4
Fixed: rostermanager: Create new roster item if one doesn't exist on subscription approval (fixes issue #77)
Waqas Hussain <waqas20@gmail.com>
parents:
916
diff
changeset
|
350 item = {subscription = "none", groups = {}}; |
|
4861bcf0afa4
Fixed: rostermanager: Create new roster item if one doesn't exist on subscription approval (fixes issue #77)
Waqas Hussain <waqas20@gmail.com>
parents:
916
diff
changeset
|
351 roster[jid] = item; |
|
4861bcf0afa4
Fixed: rostermanager: Create new roster item if one doesn't exist on subscription approval (fixes issue #77)
Waqas Hussain <waqas20@gmail.com>
parents:
916
diff
changeset
|
352 end |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
353 if item.subscription == "none" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
354 item.subscription = "from"; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
355 else -- subscription == to |
|
177
606c433955e7
Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents:
176
diff
changeset
|
356 item.subscription = "both"; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
357 end |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
358 roster[false].pending[jid] = nil; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
359 return save_roster(username, host, roster, jid); |
|
10514
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
360 elseif not item or item.subscription == "none" or item.subscription == "to" then |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
361 -- Contact is not subscribed and has not sent a subscription request. |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
362 -- We store a pre-approval as per RFC6121 3.4 |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
363 if not item then |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
364 item = {subscription = "none", groups = {}}; |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
365 roster[jid] = item; |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
366 end |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
367 item.approved = "true"; |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
368 log("debug", "Storing preapproval for %s", jid); |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
369 return save_roster(username, host, roster, jid); |
|
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
370 end |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
371 end |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
372 local function unsubscribed(username, host, jid) |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
373 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
374 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
375 local pending = is_contact_pending_in(username, host, jid); |
|
5060
b0e36777f715
mod_presence, rostermanager: Bring outbound subscription cancellation in line with RFC6121.
Waqas Hussain <waqas20@gmail.com>
parents:
5024
diff
changeset
|
376 if pending then |
|
6613
2aae36312eb9
rostermanager, mod_roster, mod_presence: Move pending roster items to roster metadata field
Kim Alvefur <zash@zash.se>
parents:
6550
diff
changeset
|
377 roster[false].pending[jid] = nil; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
378 end |
|
7064
b98006bfd97a
rostermanager: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6787
diff
changeset
|
379 local is_subscribed; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
380 if item then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
381 if item.subscription == "from" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
382 item.subscription = "none"; |
|
7064
b98006bfd97a
rostermanager: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6787
diff
changeset
|
383 is_subscribed = true; |
| 267 | 384 elseif item.subscription == "both" then |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
385 item.subscription = "to"; |
|
7064
b98006bfd97a
rostermanager: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
6787
diff
changeset
|
386 is_subscribed = true; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
387 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
388 end |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
389 local success = (pending or is_subscribed) and save_roster(username, host, roster, jid); |
|
8147
d44c6582059d
rostermanager: Use correct variable (missed one place while renaming variable in b98006bfd97a)
Kim Alvefur <zash@zash.se>
parents:
7949
diff
changeset
|
390 return success, pending, is_subscribed; |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
391 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
392 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
393 local function process_outbound_subscription_request(username, host, jid) |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
394 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
395 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
396 if item and (item.subscription == "none" or item.subscription == "from") then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
397 item.ask = "subscribe"; |
|
7155
4a0825984e42
rostermanager: Use map stores when only one contact is changed
Kim Alvefur <zash@zash.se>
parents:
7154
diff
changeset
|
398 return save_roster(username, host, roster, jid); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
399 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
400 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
401 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
402 --[[function process_outbound_subscription_approval(username, host, jid) |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
403 local roster = load_roster(username, host); |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
404 local item = roster[jid]; |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
405 if item and (item.subscription == "none" or item.subscription == "from" then |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
406 item.ask = "subscribe"; |
|
1898
1ce02e2f5a3f
rostermanager: Fixed: Roster version was not being properly updated in some edge cases.
Waqas Hussain <waqas20@gmail.com>
parents:
1897
diff
changeset
|
407 return save_roster(username, host, roster); |
|
176
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
408 end |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
409 end]] |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
410 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
411 |
|
e5cd2a03891d
Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents:
174
diff
changeset
|
412 |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
413 return { |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
414 add_to_roster = add_to_roster; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
415 remove_from_roster = remove_from_roster; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
416 roster_push = roster_push; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
417 load_roster = load_roster; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
418 save_roster = save_roster; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
419 process_inbound_subscription_approval = process_inbound_subscription_approval; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
420 process_inbound_subscription_cancellation = process_inbound_subscription_cancellation; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
421 process_inbound_unsubscribe = process_inbound_unsubscribe; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
422 is_contact_subscribed = is_contact_subscribed; |
| 7779 | 423 is_user_subscribed = is_user_subscribed; |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
424 is_contact_pending_in = is_contact_pending_in; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
425 set_contact_pending_in = set_contact_pending_in; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
426 is_contact_pending_out = is_contact_pending_out; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
427 set_contact_pending_out = set_contact_pending_out; |
|
10514
f0e9e5bda415
rostermanager, mod_presence: Support for subscription preapproval (fixes #686)
Matthew Wild <mwild1@gmail.com>
parents:
9705
diff
changeset
|
428 is_contact_preapproved = is_contact_preapproved; |
|
6779
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
429 unsubscribe = unsubscribe; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
430 subscribed = subscribed; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
431 unsubscribed = unsubscribed; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
432 process_outbound_subscription_request = process_outbound_subscription_request; |
|
6236668da30a
core.*: Remove use of module() function
Kim Alvefur <zash@zash.se>
parents:
6662
diff
changeset
|
433 }; |
