134 bare_sessions[session.username..'@'..session.host] = sessions; |
134 bare_sessions[session.username..'@'..session.host] = sessions; |
135 else |
135 else |
136 local sessions = hosts[session.host].sessions[session.username].sessions; |
136 local sessions = hosts[session.host].sessions[session.username].sessions; |
137 local limit = config_get(session.host, "core", "max_resources") or 10; |
137 local limit = config_get(session.host, "core", "max_resources") or 10; |
138 if #sessions >= limit then |
138 if #sessions >= limit then |
139 return nil, "cancel", "conflict", "Resource limit reached; only "..limit.." resources allowed"; |
139 return nil, "cancel", "resource-constraint", "Resource limit reached; only "..limit.." resources allowed"; |
140 end |
140 end |
141 if sessions[resource] then |
141 if sessions[resource] then |
142 -- Resource conflict |
142 -- Resource conflict |
143 local policy = config_get(session.host, "core", "conflict_resolve"); |
143 local policy = config_get(session.host, "core", "conflict_resolve"); |
144 local increment; |
144 local increment; |
172 session.resource = resource; |
172 session.resource = resource; |
173 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource; |
173 session.full_jid = session.username .. '@' .. session.host .. '/' .. resource; |
174 hosts[session.host].sessions[session.username].sessions[resource] = session; |
174 hosts[session.host].sessions[session.username].sessions[resource] = session; |
175 full_sessions[session.full_jid] = session; |
175 full_sessions[session.full_jid] = session; |
176 |
176 |
177 session.roster = rm_load_roster(session.username, session.host); |
177 local err; |
|
178 session.roster, err = rm_load_roster(session.username, session.host); |
|
179 if err then |
|
180 full_sessions[session.full_jid] = nil; |
|
181 hosts[session.host].sessions[session.username].sessions[resource] = nil; |
|
182 session.full_jid = nil; |
|
183 session.resource = nil; |
|
184 if next(bare_sessions[session.username..'@'..session.host].sessions) == nil then |
|
185 bare_sessions[session.username..'@'..session.host] = nil; |
|
186 hosts[session.host].sessions[session.username] = nil; |
|
187 end |
|
188 return nil, "cancel", "internal-server-error", "Error loading roster"; |
|
189 end |
178 |
190 |
179 hosts[session.host].events.fire_event("resource-bind", {session=session}); |
191 hosts[session.host].events.fire_event("resource-bind", {session=session}); |
180 |
192 |
181 return true; |
193 return true; |
182 end |
194 end |