242
|
1 #!/usr/bin/python |
|
2 #-*- coding: utf-8 -*- |
|
3 # |
|
4 """ |
|
5 Copyright (c) 2003-2011 Ralph Meijer |
|
6 Copyright (c) 2012 Jérôme Poisson |
|
7 |
|
8 |
|
9 This program is free software: you can redistribute it and/or modify |
|
10 it under the terms of the GNU Affero General Public License as published by |
|
11 the Free Software Foundation, either version 3 of the License, or |
|
12 (at your option) any later version. |
|
13 |
|
14 This program is distributed in the hope that it will be useful, |
|
15 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 GNU Affero General Public License for more details. |
|
18 |
|
19 You should have received a copy of the GNU Affero General Public License |
|
20 along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
21 -- |
|
22 |
|
23 This program is based on Idavoll (http://idavoll.ik.nu/), |
|
24 originaly written by Ralph Meijer (http://ralphm.net/blog/) |
|
25 It is sublicensed under AGPL v3 (or any later version) as allowed by the original |
|
26 license. |
|
27 |
|
28 -- |
|
29 |
|
30 Here is a copy of the original license: |
|
31 |
|
32 Copyright (c) 2003-2011 Ralph Meijer |
|
33 |
|
34 Permission is hereby granted, free of charge, to any person obtaining |
|
35 a copy of this software and associated documentation files (the |
|
36 "Software"), to deal in the Software without restriction, including |
|
37 without limitation the rights to use, copy, modify, merge, publish, |
|
38 distribute, sublicense, and/or sell copies of the Software, and to |
|
39 permit persons to whom the Software is furnished to do so, subject to |
|
40 the following conditions: |
|
41 |
|
42 The above copyright notice and this permission notice shall be |
|
43 included in all copies or substantial portions of the Software. |
|
44 |
|
45 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
46 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
47 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
48 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
|
49 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
|
50 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
51 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
52 |
|
53 """ |
|
54 |
|
55 """ |
|
56 Remote roster client. |
|
57 |
|
58 This module access roster throught a hacked version of |
|
59 remote roster management http://jkaluza.fedorapeople.org/remote-roster.html |
|
60 """ |
|
61 |
|
62 from wokkel import xmppim |
|
63 from wokkel.compat import IQ |
|
64 from twisted.words.xish import domish |
|
65 |
|
66 NS_ROSTER = 'jabber:iq:roster' |
|
67 |
|
68 class RosterClient(xmppim.RosterClientProtocol): |
|
69 """Similar to classic RosterClient, but we can get any jid managed by the host server""" |
|
70 #FIXME: need to manage updates, and database sync |
|
71 #TODO: cache |
|
72 |
|
73 def getRoster(self, to_jid): |
|
74 """ |
|
75 Retrieve contact list. |
|
76 |
|
77 @return: Roster as a mapping from L{JID} to L{RosterItem}. |
|
78 @rtype: L{twisted.internet.defer.Deferred} |
|
79 """ |
|
80 |
|
81 def processRoster(result): |
|
82 roster = {} |
|
83 for element in domish.generateElementsQNamed(result.query.children, |
|
84 'item', NS_ROSTER): |
|
85 item = self._parseRosterItem(element) |
|
86 roster[item.jid.userhost()] = item |
|
87 |
|
88 return roster |
|
89 |
|
90 iq = IQ(self.xmlstream, 'get') |
|
91 iq.addElement((NS_ROSTER, 'query')) |
|
92 iq["to"] = to_jid.userhost() |
|
93 d = iq.send() |
|
94 d.addCallback(processRoster) |
|
95 return d |
|
96 |
|
97 |