annotate src/memory/memory.py @ 1213:b5928601d7aa

memory: handle the case where an existing session ID is re-used for creating a new session
author souliane <souliane@mailoo.org>
date Mon, 22 Sep 2014 20:26:40 +0200
parents 628e320eab1f
children ed3b01ed70d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
goffi@necton2
parents:
diff changeset
1 #!/usr/bin/python
goffi@necton2
parents:
diff changeset
2 # -*- coding: utf-8 -*-
goffi@necton2
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
4 # SAT: a jabber client
811
1fe00f0c9a91 dates update
Goffi <goffi@goffi.org>
parents: 802
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
0
goffi@necton2
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
10 # (at your option) any later version.
0
goffi@necton2
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
15 # GNU Affero General Public License for more details.
0
goffi@necton2
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 592
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
goffi@necton2
parents:
diff changeset
19
771
bfabeedbf32e core: i18n refactoring:
Goffi <goffi@goffi.org>
parents: 759
diff changeset
20 from sat.core.i18n import _
0
goffi@necton2
parents:
diff changeset
21
goffi@necton2
parents:
diff changeset
22 import os.path
364
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
23 from ConfigParser import SafeConfigParser, NoOptionError, NoSectionError
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
24 from uuid import uuid4
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
25 from sat.core.log import getLogger
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
26 log = getLogger(__name__)
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
27 from twisted.internet import defer, reactor
47
9aa2d9dd4045 memory methods improvement
Goffi <goffi@goffi.org>
parents: 41
diff changeset
28 from twisted.words.protocols.jabber import jid
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
29 from sat.core import exceptions
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
30 from sat.core.constants import Const as C
432
31e8c48b5f5d core: - memory refactoring (moved memory.py and sqlite.py from tools to memory)
Goffi <goffi@goffi.org>
parents: 428
diff changeset
31 from sat.memory.sqlite import SqliteStorage
31e8c48b5f5d core: - memory refactoring (moved memory.py and sqlite.py from tools to memory)
Goffi <goffi@goffi.org>
parents: 428
diff changeset
32 from sat.memory.persistent import PersistentDict
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
33 from sat.memory.params import Params
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
34 from sat.memory.disco import Discovery
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
35 from sat.memory.crypto import BlockCipher
1064
7ee9d9db67b9 memory, tools (config): move special config retrieval from memory to tools
souliane <souliane@mailoo.org>
parents: 1046
diff changeset
36 from sat.tools import config as tools_config
420
acd908528ef7 core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents: 418
diff changeset
37
679
59c9a7ff903d wix, misc: use picture of dimension 32x32 for tray icon + better PEP-8 compliance
souliane <souliane@mailoo.org>
parents: 677
diff changeset
38
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
39 class Sessions(object):
1029
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
40 """Sessions are data associated to key used for a temporary moment, with optional profile checking."""
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
41 DEFAULT_TIMEOUT = 600
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
42
1029
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
43 def __init__(self, timeout=None):
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
44 """
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
45 @param timeout: nb of seconds before session destruction
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
46 """
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
47 self._sessions = dict()
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
48 self.timeout = timeout or Sessions.DEFAULT_TIMEOUT
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
49
1212
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
50 def newSession(self, session_data=None, session_id=None, profile=None):
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
51 """ Create a new session
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
52 @param session_data: mutable data to use, default to a dict
1212
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
53 @param session_id (str): force the session_id to the given string
757
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
54 @param profile: if set, the session is owned by the profile,
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
55 and profileGet must be used instead of __getitem__
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
56 @return: session_id, session_data
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
57 """
1212
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
58 if session_id is None:
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
59 session_id = str(uuid4())
1213
b5928601d7aa memory: handle the case where an existing session ID is re-used for creating a new session
souliane <souliane@mailoo.org>
parents: 1212
diff changeset
60 elif session_id in self._sessions:
b5928601d7aa memory: handle the case where an existing session ID is re-used for creating a new session
souliane <souliane@mailoo.org>
parents: 1212
diff changeset
61 self._sessions[session_id][0].cancel()
b5928601d7aa memory: handle the case where an existing session ID is re-used for creating a new session
souliane <souliane@mailoo.org>
parents: 1212
diff changeset
62 log.warning("Session [{id}] is going to be re-initialised".format(id=session_id))
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
63 timer = reactor.callLater(self.timeout, self._purgeSession, session_id)
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
64 if session_data is None:
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
65 session_data = {}
757
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
66 self._sessions[session_id] = (timer, session_data) if profile is None else (timer, session_data, profile)
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
67 return session_id, session_data
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
68
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
69 def _purgeSession(self, session_id):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
70 del self._sessions[session_id]
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
71 log.debug("Session [%s] purged" % session_id)
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
72
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
73 def __len__(self):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
74 return len(self._sessions)
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
75
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
76 def __contains__(self, session_id):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
77 return session_id in self._sessions
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
78
757
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
79 def profileGet(self, session_id, profile):
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
80 try:
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
81 timer, session_data, profile_set = self._sessions[session_id]
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
82 except ValueError:
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
83 raise exceptions.InternalError("You need to use __getitem__ when profile is not set")
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
84 if profile_set != profile:
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
85 raise exceptions.InternalError("current profile differ from set profile !")
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
86 timer.reset(self.timeout)
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
87 return session_data
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
88
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
89 def __getitem__(self, session_id):
757
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
90 try:
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
91 timer, session_data = self._sessions[session_id]
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
92 except ValueError:
bbe55c7bee43 core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents: 756
diff changeset
93 raise exceptions.InternalError("You need to use profileGet instead of __getitem__ when profile is set")
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
94 timer.reset(self.timeout)
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
95 return session_data
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
96
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
97 def __setitem__(self, key, value):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
98 raise NotImplementedError("You need do use newSession to create a session")
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
99
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
100 def __delitem__(self, session_id):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
101 """ Cancel the timer, then actually delete the session data """
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
102 try:
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
103 timer = self._sessions[session_id][0]
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
104 timer.cancel()
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
105 self._purgeSession(session_id)
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
106 except KeyError:
1029
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
107 log.debug("Session [%s] doesn't exists, timeout expired?" % session_id)
756
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
108
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
109 def keys(self):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
110 return self._sessions.keys()
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
111
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
112 def iterkeys(self):
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
113 return self._sessions.iterkeys()
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
114
efa0e0f57950 core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents: 751
diff changeset
115
1029
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
116 class ProfileSessions(Sessions):
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
117 """ProfileSessions extends the Sessions class, but here the profile can be
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
118 used as the key to retrieve data or delete a session (instead of session id).
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
119 """
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
120
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
121 def _profileGetAllIds(self, profile):
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
122 """Return a list of the sessions ids that are associated to the given profile.
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
123
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
124 @param profile: %(doc_profile)s
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
125 @return: a list containing the sessions ids
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
126 """
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
127 ret = []
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
128 for session_id in self._sessions:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
129 try:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
130 timer, session_data, profile_set = self._sessions[session_id]
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
131 except ValueError:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
132 continue
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
133 if profile == profile_set:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
134 ret.append(session_id)
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
135 return ret
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
136
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
137 def profileGetUnique(self, profile):
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
138 """Return the data of the unique session that is associated to the given profile.
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
139
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
140 @param profile: %(doc_profile)s
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
141 @return:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
142 - mutable data (default: dict) of the unique session
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
143 - None if no session is associated to the profile
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
144 - raise an error if more than one session are found
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
145 """
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
146 ids = self._profileGetAllIds(profile)
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
147 if len(ids) > 1:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
148 raise exceptions.InternalError('profileGetUnique has been used but more than one session has been found!')
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
149 return self._sessions[ids[0]][1] if len(ids) == 1 else None
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
150
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
151 def profileDelUnique(self, profile):
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
152 """Delete the unique session that is associated to the given profile.
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
153
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
154 @param profile: %(doc_profile)s
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
155 @return: None, but raise an error if more than one session are found
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
156 """
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
157 ids = self._profileGetAllIds(profile)
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
158 if len(ids) > 1:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
159 raise exceptions.InternalError('profileDelUnique has been used but more than one session has been found!')
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
160 if len(ids) == 1:
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
161 del self._sessions[ids[0]]
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
162
f6182f6418ea memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents: 1015
diff changeset
163
1003
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
164 # XXX: tmp update code, will be removed in the future
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
165 # When you remove this, please add the default value for
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
166 # 'local_dir' in sat.core.constants.Const.DEFAULT_CONFIG
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
167 def fixLocalDir(silent=True):
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
168 """Retro-compatibility with the previous local_dir default value.
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
169
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
170 @param silent (boolean): toggle logging output (must be True when called from sat.sh)
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
171 """
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
172 user_config = SafeConfigParser()
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
173 try:
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
174 user_config.read(C.CONFIG_FILES)
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
175 except:
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
176 pass # file is readable but its structure if wrong
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
177 try:
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
178 current_value = user_config.get('DEFAULT', 'local_dir')
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
179 except (NoOptionError, NoSectionError):
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
180 current_value = ''
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
181 if current_value:
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
182 return # nothing to do
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
183 old_default = '~/.sat'
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
184 if os.path.isfile(os.path.expanduser(old_default) + '/' + C.SAVEFILE_DATABASE):
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
185 if not silent:
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
186 log.warning(_("A database has been found in the default local_dir for previous versions (< 0.5)"))
1064
7ee9d9db67b9 memory, tools (config): move special config retrieval from memory to tools
souliane <souliane@mailoo.org>
parents: 1046
diff changeset
187 tools_config.fixConfigOption('', 'local_dir', old_default, silent)
1003
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
188
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
189
588
beaf6bec2fcd Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
190 class Memory(object):
1199
96fb74a4714d misc: fixed some typos
Matteo Cypriani <mcy@lm7.fr>
parents: 1097
diff changeset
191 """This class manage all the persistent information"""
0
goffi@necton2
parents:
diff changeset
192
22
bb72c29f3432 added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents: 21
diff changeset
193 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
194 log.info(_("Memory manager init"))
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
195 self.initialized = defer.Deferred()
41
d24629c631fc SàT: new constant management, a local dir (~/.sat) is now used
Goffi <goffi@goffi.org>
parents: 38
diff changeset
196 self.host = host
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
197 self._entities_cache = {} # XXX: keep presence/last resource/other data in cache
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
198 # /!\ an entity is not necessarily in roster
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
199 self.subscriptions = {}
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
200 self.auth_sessions = ProfileSessions() # remember the authenticated profiles
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
201 self.disco = Discovery(host)
1003
52ec79aa5bbe memory: fixes the method fixLocalDir for pid_dir and log_dir to use local_dir as default
souliane <souliane@mailoo.org>
parents: 993
diff changeset
202 fixLocalDir(False) # XXX: tmp update code, will be removed in the future
364
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
203 self.config = self.parseMainConf()
923
e77948faaef3 core: removed default_config:
Goffi <goffi@goffi.org>
parents: 919
diff changeset
204 database_file = os.path.expanduser(os.path.join(self.getConfig('', 'local_dir'), C.SAVEFILE_DATABASE))
853
c2f6ada7858f core (sqlite): automatic database update:
Goffi <goffi@goffi.org>
parents: 844
diff changeset
205 self.storage = SqliteStorage(database_file, host.__version__)
432
31e8c48b5f5d core: - memory refactoring (moved memory.py and sqlite.py from tools to memory)
Goffi <goffi@goffi.org>
parents: 428
diff changeset
206 PersistentDict.storage = self.storage
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
207 self.params = Params(host, self.storage)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
208 log.info(_("Loading default params template"))
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
209 self.params.load_default_params()
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
210 d = self.storage.initialized.addCallback(lambda ignore: self.load())
443
7099ea9c1b12 core: getPrivate/setPrivate removed from memory, private values now use database storage and persistent dicts \o/
Goffi <goffi@goffi.org>
parents: 432
diff changeset
211 self.memory_data = PersistentDict("memory")
7099ea9c1b12 core: getPrivate/setPrivate removed from memory, private values now use database storage and persistent dicts \o/
Goffi <goffi@goffi.org>
parents: 432
diff changeset
212 d.addCallback(lambda ignore: self.memory_data.load())
428
a4a9efadabfc core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents: 425
diff changeset
213 d.chainDeferred(self.initialized)
0
goffi@necton2
parents:
diff changeset
214
364
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
215 def parseMainConf(self):
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
216 """look for main .ini configuration file, and parse it"""
930
cbf4122baae7 core, memory: use XDG recommended paths as the defaults for the config and local directories
souliane <souliane@mailoo.org>
parents: 923
diff changeset
217 config = SafeConfigParser(defaults=C.DEFAULT_CONFIG)
365
efbfccfed623 core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents: 364
diff changeset
218 try:
930
cbf4122baae7 core, memory: use XDG recommended paths as the defaults for the config and local directories
souliane <souliane@mailoo.org>
parents: 923
diff changeset
219 config.read(C.CONFIG_FILES)
365
efbfccfed623 core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents: 364
diff changeset
220 except:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
221 log.error(_("Can't read main config !"))
930
cbf4122baae7 core, memory: use XDG recommended paths as the defaults for the config and local directories
souliane <souliane@mailoo.org>
parents: 923
diff changeset
222 return config
365
efbfccfed623 core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents: 364
diff changeset
223
efbfccfed623 core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents: 364
diff changeset
224 def getConfig(self, section, name):
364
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
225 """Get the main configuration option
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
226 @param section: section of the config file (None or '' for DEFAULT)
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
227 @param name: name of the option
365
efbfccfed623 core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents: 364
diff changeset
228 """
1064
7ee9d9db67b9 memory, tools (config): move special config retrieval from memory to tools
souliane <souliane@mailoo.org>
parents: 1046
diff changeset
229 return tools_config.getConfig(self.config, section, name, default='')
364
312ca6f9d84a core: configuration file
Goffi <goffi@goffi.org>
parents: 346
diff changeset
230
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
231 def load_xml(self, filename):
1015
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
232 """Load parameters template from xml file
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
233
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
234 @param filename (str): input file
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
235 @return: bool: True in case of success
1015
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
236 """
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
237 if not filename:
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
238 return False
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
239 filename = os.path.expanduser(filename)
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
240 if os.path.exists(filename):
0
goffi@necton2
parents:
diff changeset
241 try:
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
242 self.params.load_xml(filename)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
243 log.debug(_("Parameters loaded from file: %s") % filename)
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
244 return True
557
4f856dd4c0d0 core: paramaters are now merged: if a parameter doens't exist in loaded xml but exists in default parameters, it is added
Goffi <goffi@goffi.org>
parents: 556
diff changeset
245 except Exception as e:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
246 log.error(_("Can't load parameters from file: %s") % e)
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
247 return False
0
goffi@necton2
parents:
diff changeset
248
443
7099ea9c1b12 core: getPrivate/setPrivate removed from memory, private values now use database storage and persistent dicts \o/
Goffi <goffi@goffi.org>
parents: 432
diff changeset
249 def load(self):
428
a4a9efadabfc core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents: 425
diff changeset
250 """Load parameters and all memory things from db"""
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
251 #parameters data
428
a4a9efadabfc core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents: 425
diff changeset
252 return self.params.loadGenParams()
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
253
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
254 def loadIndividualParams(self, profile):
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
255 """Load individual parameters for a profile
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
256 @param profile: %(doc_profile)s"""
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
257 return self.params.loadIndParams(profile)
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
258
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
259 def startProfileSession(self, profile):
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
260 """"Iniatialise session for a profile
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
261 @param profile: %(doc_profile)s"""
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
262 log.info(_("[%s] Profile session started" % profile))
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
263 self._entities_cache[profile] = {}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
264
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
265 def newAuthSession(self, key, profile):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
266 """Start a new session for the authenticated profile.
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
267
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
268 The personal key is loaded encrypted from a PersistentDict before being decrypted.
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
269
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
270 @param key: the key to decrypt the personal key
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
271 @param profile: %(doc_profile)s
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
272 @return: a deferred None value
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
273 """
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
274 def gotPersonalKey(personal_key):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
275 """Create the session for this profile and store the personal key"""
1212
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
276 self.auth_sessions.newSession({C.MEMORY_CRYPTO_KEY: personal_key}, profile=profile)
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
277 log.debug('auth session created for profile %s' % profile)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
278
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
279 d = PersistentDict(C.MEMORY_CRYPTO_NAMESPACE, profile).load()
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
280 d.addCallback(lambda data: BlockCipher.decrypt(key, data[C.MEMORY_CRYPTO_KEY]))
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
281 return d.addCallback(gotPersonalKey)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
282
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
283 def purgeProfileSession(self, profile):
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
284 """Delete cache of data of profile
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
285 @param profile: %(doc_profile)s"""
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
286 log.info(_("[%s] Profile session purge" % profile))
416
32dc8b18c2ae core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents: 413
diff changeset
287 self.params.purgeProfile(profile)
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
288 try:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
289 del self._entities_cache[profile]
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
290 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
291 log.error(_("Trying to purge roster status cache for a profile not in memory: [%s]") % profile)
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
292
1015
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
293 def save_xml(self, filename):
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
294 """Save parameters template to xml file
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
295
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
296 @param filename (str): output file
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
297 @return: bool: True in case of success
1015
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
298 """
fee00f2e11c2 memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
299 if not filename:
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
300 return False
38
3e24753b9e0b Fixed parameters loading/saving
Goffi <goffi@goffi.org>
parents: 34
diff changeset
301 #TODO: need to encrypt files (at least passwords !) and set permissions
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
302 filename = os.path.expanduser(filename)
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
303 try:
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
304 self.params.save_xml(filename)
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
305 log.debug(_("Parameters saved to file: %s") % filename)
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
306 return True
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
307 except Exception as e:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
308 log.error(_("Can't save parameters to file: %s") % e)
677
9a50aa7feefb core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents: 669
diff changeset
309 return False
0
goffi@necton2
parents:
diff changeset
310
60
9764e027ecc0 SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents: 57
diff changeset
311 def getProfilesList(self):
412
62b17854254e database integration: first draft
Goffi <goffi@goffi.org>
parents: 399
diff changeset
312 return self.storage.getProfilesList()
60
9764e027ecc0 SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents: 57
diff changeset
313
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
314 def getProfileName(self, profile_key, return_profile_keys=False):
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 61
diff changeset
315 """Return name of profile from keyword
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 61
diff changeset
316 @param profile_key: can be the profile name or a keywork (like @DEFAULT@)
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 61
diff changeset
317 @return: profile name or None if it doesn't exist"""
728
e07afabc4a25 plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents: 722
diff changeset
318 return self.params.getProfileName(profile_key, return_profile_keys)
62
93cb45a7420f SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents: 61
diff changeset
319
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
320 def asyncCreateProfile(self, name, password=''):
420
acd908528ef7 core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents: 418
diff changeset
321 """Create a new profile
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
322 @param name: profile name
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
323 @param password: profile password
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
324 @return: Deferred
420
acd908528ef7 core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents: 418
diff changeset
325 """
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
326 personal_key = BlockCipher.getRandomKey(base64=True) # generated once for all and saved in a PersistentDict
1212
628e320eab1f memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
327 self.auth_sessions.newSession({C.MEMORY_CRYPTO_KEY: personal_key}, profile=name) # will be encrypted by setParam
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
328 d = self.params.asyncCreateProfile(name)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
329 d.addCallback(lambda dummy: self.setParam(C.PROFILE_PASS_PATH[1], password, C.PROFILE_PASS_PATH[0], profile_key=name))
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
330 return d
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
331
894
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
332 def asyncDeleteProfile(self, name, force=False):
68
9b842086d915 multiple profiles update
Goffi <goffi@goffi.org>
parents: 66
diff changeset
333 """Delete an existing profile
894
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
334 @param name: Name of the profile
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
335 @param force: force the deletion even if the profile is connected.
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
336 To be used for direct calls only (not through the bridge).
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
337 @return: a Deferred instance
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
338 """
1097
dace0ede919c memory (memory): delete profile session on profile deletion
souliane <souliane@mailoo.org>
parents: 1090
diff changeset
339 self.auth_sessions.profileDelUnique(name)
894
57c32d8ec847 core (memory): asyncDeleteProfile can force the deletion of a profile, even if it's connected (when called from the backend only)
souliane <souliane@mailoo.org>
parents: 893
diff changeset
340 return self.params.asyncDeleteProfile(name, force)
60
9764e027ecc0 SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents: 57
diff changeset
341
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
342 def addToHistory(self, from_jid, to_jid, message, type_='chat', extra=None, timestamp=None, profile=C.PROF_KEY_NONE):
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
343 assert profile != C.PROF_KEY_NONE
669
ffb716804580 core, bridge: extra parameter is saved in history:
Goffi <goffi@goffi.org>
parents: 662
diff changeset
344 if extra is None:
ffb716804580 core, bridge: extra parameter is saved in history:
Goffi <goffi@goffi.org>
parents: 662
diff changeset
345 extra = {}
722
04aabc3f2684 core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents: 679
diff changeset
346 return self.storage.addToHistory(from_jid, to_jid, message, type_, extra, timestamp, profile)
0
goffi@necton2
parents:
diff changeset
347
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
348 def getHistory(self, from_jid, to_jid, limit=0, between=True, profile=C.PROF_KEY_NONE):
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
349 assert profile != C.PROF_KEY_NONE
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 512
diff changeset
350 return self.storage.getHistory(jid.JID(from_jid), jid.JID(to_jid), limit, between, profile)
0
goffi@necton2
parents:
diff changeset
351
919
ed9841e6d84a core: added IQ_SET to core.constants + getLastResource now manage correctly jid.JID
Goffi <goffi@goffi.org>
parents: 916
diff changeset
352 def _getLastResource(self, jid_s, profile_key):
ed9841e6d84a core: added IQ_SET to core.constants + getLastResource now manage correctly jid.JID
Goffi <goffi@goffi.org>
parents: 916
diff changeset
353 jid_ = jid.JID(jid_s)
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
354 return self.getLastResource(jid_, profile_key) or ""
919
ed9841e6d84a core: added IQ_SET to core.constants + getLastResource now manage correctly jid.JID
Goffi <goffi@goffi.org>
parents: 916
diff changeset
355
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
356 def getLastResource(self, entity_jid, profile_key):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
357 """Return the last resource used by an entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
358 @param entity_jid: entity jid
399
3ed53803b3b3 core: added getLastResource method
Goffi <goffi@goffi.org>
parents: 398
diff changeset
359 @param profile_key: %(doc_profile_key)s"""
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
360 data = self.getEntityData(entity_jid.userhostJID(), [C.ENTITY_LAST_RESOURCE], profile_key)
399
3ed53803b3b3 core: added getLastResource method
Goffi <goffi@goffi.org>
parents: 398
diff changeset
361 try:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
362 return data[C.ENTITY_LAST_RESOURCE]
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
363 except KeyError:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
364 return None
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
365
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
366 def _getPresenceStatuses(self, profile_key):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
367 ret = self.getPresenceStatuses(profile_key)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
368 return {entity.full():data for entity, data in ret.iteritems()}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
369
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
370 def getPresenceStatuses(self, profile_key):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
371 """Get all the presence status of a profile
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
372 @param profile_key: %(doc_profile_key)s
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
373 @return: presence data: key=entity JID, value=presence data for this entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
374 """
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
375 profile = self.getProfileName(profile_key)
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
376 if not profile:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
377 raise exceptions.ProfileUnknownError(_('Trying to get entity data for a non-existant profile'))
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
378 entities_presence = {}
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
379 for entity in self._entities_cache[profile]:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
380 if "presence" in self._entities_cache[profile][entity]:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
381 entities_presence[entity] = self._entities_cache[profile][entity]["presence"]
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
382
1007
a7d33c7a8277 core (log): refactoring + twisted backend:
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
383 log.debug("Memory getPresenceStatus (%s)" % entities_presence)
484
23cbdf0a0777 core: presence status + last resource refactored and kept in entitiesCache in memory.py, profile cache is purged on disconnection
Goffi <goffi@goffi.org>
parents: 480
diff changeset
384 return entities_presence
0
goffi@necton2
parents:
diff changeset
385
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
386 def setPresenceStatus(self, entity_jid, show, priority, statuses, profile_key):
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
387 """Change the presence status of an entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
388 @param entity_jid: jid.JID of the entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
389 @param show: show status
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
390 @param priotity: priotity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
391 @param statuses: dictionary of statuses
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
392 @param profile_key: %(doc_profile_key)s
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
393 """
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
394 profile = self.getProfileName(profile_key)
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
395 if not profile:
656
7d6e5807504a bridge, memory: added the parameter security_limit to asyncGetParamA so it can be used from libervia. refactorization in memory.py are related to that.
souliane <souliane@mailoo.org>
parents: 645
diff changeset
396 raise exceptions.ProfileUnknownError(_('Trying to get entity data for a non-existant profile'))
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
397 entity_data = self._getEntitiesData(entity_jid, profile)[entity_jid]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
398 resource = entity_jid.resource
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
399 if resource:
946
fe181994246a core(memory): fixed last resource
Goffi <goffi@goffi.org>
parents: 944
diff changeset
400 self.updateEntityData(entity_jid.userhostJID(), C.ENTITY_LAST_RESOURCE, resource, profile)
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
401 entity_data.setdefault("presence", {})[resource or ''] = (show, priority, statuses)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
402
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
403 def _getEntitiesData(self, entity_jid, profile):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
404 """Get data dictionary for entities
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
405 @param entity_jid: JID of the entity, or C.ENTITY_ALL for all entities)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
406 @param profile: %(doc_profile)s
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
407 @return: entities_data (key=jid, value=entity_data)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
408 @raise: exceptions.ProfileNotInCacheError if profile is not in cache
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
409 """
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
410 if not profile in self._entities_cache:
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
411 raise exceptions.ProfileNotInCacheError
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
412 if entity_jid == C.ENTITY_ALL:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
413 entities_data = self._entities_cache[profile]
635
eff8772fd472 core: memory's updateEntityData improvments.
souliane <souliane@mailoo.org>
parents: 634
diff changeset
414 else:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
415 entity_data = self._entities_cache[profile].setdefault(entity_jid, {})
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
416 entities_data = {entity_jid: entity_data}
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
417 return entities_data
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
418
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
419 def _updateEntityResources(self, entity_jid, profile):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
420 """Add a known resource to bare entity_jid cache
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
421 @param entity_jid: full entity_jid (with resource)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
422 @param profile: %(doc_profile)s
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
423 """
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
424 assert(entity_jid.resource)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
425 entity_data = self._getEntitiesData(entity_jid.userhostJID(), profile)[entity_jid.userhostJID()]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
426 resources = entity_data.setdefault('resources', set())
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
427 resources.add(entity_jid.resource)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
428
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
429 def updateEntityData(self, entity_jid, key, value, profile_key):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
430 """Set a misc data for an entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
431 @param entity_jid: JID of the entity, or C.ENTITY_ALL to update all entities)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
432 @param key: key to set (eg: "type")
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
433 @param value: value for this key (eg: "chatroom")
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
434 @param profile_key: %(doc_profile_key)s
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
435 """
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
436 profile = self.getProfileName(profile_key)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
437 if not profile:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
438 raise exceptions.ProfileUnknownError(_('Trying to get entity data for a non-existant profile'))
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
439 entities_data = self._getEntitiesData(entity_jid, profile)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
440 if entity_jid.resource and entity_jid != C.ENTITY_ALL:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
441 self._updateEntityResources(entity_jid, profile)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
442
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
443 for jid_ in entities_data:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
444 entity_data = entities_data[jid_]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
445 if value == C.PROF_KEY_NONE and key in entity_data:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
446 del entity_data[key]
635
eff8772fd472 core: memory's updateEntityData improvments.
souliane <souliane@mailoo.org>
parents: 634
diff changeset
447 else:
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
448 entity_data[key] = value
635
eff8772fd472 core: memory's updateEntityData improvments.
souliane <souliane@mailoo.org>
parents: 634
diff changeset
449 if isinstance(value, basestring):
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
450 self.host.bridge.entityDataUpdated(jid_.full(), key, value, profile)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
451
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
452 def delEntityData(self, entity_jid, key, profile_key):
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
453 """Delete data for an entity
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
454 @param entity_jid: JID of the entity, or C.ENTITY_ALL to delete data from all entities)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
455 @param key: key to delete (eg: "type")
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
456 @param profile_key: %(doc_profile_key)s
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
457 """
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
458 entities_data = self._getEntitiesData(entity_jid, profile_key)
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
459 for entity_jid in entities_data:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
460 entity_data = entities_data[entity_jid]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
461 try:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
462 del entity_data[key]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
463 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
464 log.debug("Key [%s] doesn't exist for [%s] in entities_cache" % (key, entity_jid.full()))
399
3ed53803b3b3 core: added getLastResource method
Goffi <goffi@goffi.org>
parents: 398
diff changeset
465
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
466 def getEntityData(self, entity_jid, keys_list, profile_key):
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
467 """Get a list of cached values for entity
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
468
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
469 @param entity_jid: JID of the entity
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
470 @param keys_list (iterable): list of keys to get, empty list for everything
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
471 @param profile_key: %(doc_profile_key)s
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
472 @return: dict withs values for each key in keys_list.
504
65ecbb473cbb core, quick frontend, plugin xep-0054, bridge: use of memory's entities data for vcard:
Goffi <goffi@goffi.org>
parents: 494
diff changeset
473 if there is no value of a given key, resulting dict will
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
474 have nothing with that key nether
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
475 @raise: exceptions.UnknownEntityError if entity is not in cache
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
476 """
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
477 profile = self.getProfileName(profile_key)
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
478 if not profile:
656
7d6e5807504a bridge, memory: added the parameter security_limit to asyncGetParamA so it can be used from libervia. refactorization in memory.py are related to that.
souliane <souliane@mailoo.org>
parents: 645
diff changeset
479 raise exceptions.ProfileUnknownError(_('Trying to get entity data for a non-existant profile'))
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
480 entity_data = self._getEntitiesData(entity_jid, profile)[entity_jid]
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
481 if not keys_list:
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
482 return entity_data
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
483 ret = {}
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
484 for key in keys_list:
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
485 if key in entity_data:
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
486 ret[key] = entity_data[key]
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
487 return ret
47
9aa2d9dd4045 memory methods improvement
Goffi <goffi@goffi.org>
parents: 41
diff changeset
488
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
489 def getEntityDatum(self, entity_jid, key, profile_key):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
490 """Get a datum from entity
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
491
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
492 @param entity_jid: JID of the entity
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
493 @param keys: key to get
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
494 @param profile_key: %(doc_profile_key)s
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
495 @return: requested value
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
496
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
497 @raise: exceptions.UnknownEntityError if entity is not in cache
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
498 @raise: KeyError if there is no value for this key and this entity
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
499 """
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
500 return self.getEntityData(entity_jid, (key,), profile_key)[key]
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 943
diff changeset
501
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
502 def delEntityCache(self, entity_jid, delete_all_resources=True, profile_key=C.PROF_KEY_NONE):
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 504
diff changeset
503 """Remove cached data for entity
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
504 @param entity_jid: JID of the entity to delete
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
505 @param delete_all_resources: if True also delete all known resources form cache
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
506 @param profile_key: %(doc_profile_key)s
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 504
diff changeset
507 """
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 504
diff changeset
508 profile = self.getProfileName(profile_key)
943
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
509 if not profile:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
510 raise exceptions.ProfileUnknownError(_('Trying to get entity data for a non-existant profile'))
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
511 to_delete = set([entity_jid])
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
512
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
513 if delete_all_resources:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
514 if entity_jid.resource:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
515 raise ValueError(_("Need a bare jid to delete all resources"))
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
516 entity_data = self._getEntitiesData(entity_jid, profile)[entity_jid]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
517 resources = entity_data.setdefault('resources', set())
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
518 to_delete.update([jid.JID("%s/%s" % (entity_jid.userhost(), resource)) for resource in resources])
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
519
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
520 for entity in to_delete:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
521 try:
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
522 del self._entities_cache[profile][entity]
71926ec2114d core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents: 935
diff changeset
523 except KeyError:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
524 log.debug("Can't delete entity [%s]: not in cache" % entity.full())
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 504
diff changeset
525
1090
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
526 def encryptValue(self, value, profile):
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
527 """Encrypt a value for the given profile. The personal key must be loaded
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
528 already in the profile session, that should be the case if the profile is
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
529 already authenticated.
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
530
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
531 @param value (str): the value to encrypt
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
532 @param profile (str): %(doc_profile)s
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
533 @return: the deferred encrypted value
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
534 """
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
535 try:
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
536 personal_key = self.host.memory.auth_sessions.profileGetUnique(profile)[C.MEMORY_CRYPTO_KEY]
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
537 except TypeError:
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
538 raise exceptions.InternalError(_('Trying to encrypt a value for %s while the personal key is undefined!') % profile)
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
539 return BlockCipher.encrypt(personal_key, value)
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
540
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
541 def decryptValue(self, value, profile):
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
542 """Decrypt a value for the given profile. The personal key must be loaded
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
543 already in the profile session, that should be the case if the profile is
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
544 already authenticated.
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
545
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
546 @param value (str): the value to decrypt
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
547 @param profile (str): %(doc_profile)s
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
548 @return: the deferred decrypted value
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
549 """
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
550 try:
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
551 personal_key = self.host.memory.auth_sessions.profileGetUnique(profile)[C.MEMORY_CRYPTO_KEY]
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
552 except TypeError:
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
553 raise exceptions.InternalError(_('Trying to decrypt a value for %s while the personal key is undefined!') % profile)
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
554 return BlockCipher.decrypt(personal_key, value)
594fbdda4a87 memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents: 1064
diff changeset
555
1030
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
556 def encryptPersonalData(self, data_key, data_value, crypto_key, profile):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
557 """Re-encrypt a personal data (saved to a PersistentDict).
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
558
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
559 @param data_key: key for the individual PersistentDict instance
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
560 @param data_value: the value to be encrypted
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
561 @param crypto_key: the key to encrypt the value
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
562 @param profile: %(profile_doc)s
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
563 @return: a deferred None value
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
564 """
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
565
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
566 def gotIndMemory(data):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
567 d = BlockCipher.encrypt(crypto_key, data_value)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
568
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
569 def cb(cipher):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
570 data[data_key] = cipher
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
571 return data.force(data_key)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
572
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
573 return d.addCallback(cb)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
574
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
575 def done(dummy):
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
576 log.debug(_('Personal data (%(ns)s, %(key)s) has been successfuly encrypted') %
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
577 {'ns': C.MEMORY_CRYPTO_NAMESPACE, 'key': data_key})
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
578
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
579 d = PersistentDict(C.MEMORY_CRYPTO_NAMESPACE, profile).load()
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
580 return d.addCallback(gotIndMemory).addCallback(done)
15f43b54d697 core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents: 1029
diff changeset
581
722
04aabc3f2684 core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents: 679
diff changeset
582 def addWaitingSub(self, type_, entity_jid, profile_key):
47
9aa2d9dd4045 memory methods improvement
Goffi <goffi@goffi.org>
parents: 41
diff changeset
583 """Called when a subcription request is received"""
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
584 profile = self.getProfileName(profile_key)
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
585 assert profile
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
586 if profile not in self.subscriptions:
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
587 self.subscriptions[profile] = {}
722
04aabc3f2684 core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents: 679
diff changeset
588 self.subscriptions[profile][entity_jid] = type_
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
589
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
590 def delWaitingSub(self, entity_jid, profile_key):
47
9aa2d9dd4045 memory methods improvement
Goffi <goffi@goffi.org>
parents: 41
diff changeset
591 """Called when a subcription request is finished"""
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
592 profile = self.getProfileName(profile_key)
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
593 assert profile
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
594 if profile in self.subscriptions and entity_jid in self.subscriptions[profile]:
486
0d9908ac775e core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents: 484
diff changeset
595 del self.subscriptions[profile][entity_jid]
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
596
346
ca3a041fed30 core: fixed several subscription scheme issues + removed most of profile_key default value in core.sat_main and core.xmmp (source of bugs) + contact update
Goffi <goffi@goffi.org>
parents: 327
diff changeset
597 def getWaitingSub(self, profile_key):
47
9aa2d9dd4045 memory methods improvement
Goffi <goffi@goffi.org>
parents: 41
diff changeset
598 """Called to get a list of currently waiting subscription requests"""
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
599 profile = self.getProfileName(profile_key)
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
600 if not profile:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 946
diff changeset
601 log.error(_('Asking waiting subscriptions for a non-existant profile'))
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
602 return {}
592
e5a875a3311b Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
603 if profile not in self.subscriptions:
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
604 return {}
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
605
65
d35c5edab53f SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents: 64
diff changeset
606 return self.subscriptions[profile]
0
goffi@necton2
parents:
diff changeset
607
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
608 def getStringParamA(self, name, category, attr="value", profile_key=C.PROF_KEY_NONE):
538
2c4016921403 core, frontends, bridgen plugins: fixed methods which were unproperly managing multi-profiles
Goffi <goffi@goffi.org>
parents: 512
diff changeset
609 return self.params.getStringParamA(name, category, attr, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
610
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
611 def getParamA(self, name, category, attr="value", profile_key=C.PROF_KEY_NONE):
64
d46f849664aa SàT: multi-profile, plugins updated
Goffi <goffi@goffi.org>
parents: 63
diff changeset
612 return self.params.getParamA(name, category, attr, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
613
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
614 def asyncGetParamA(self, name, category, attr="value", security_limit=C.NO_SECURITY_LIMIT, profile_key=C.PROF_KEY_NONE):
656
7d6e5807504a bridge, memory: added the parameter security_limit to asyncGetParamA so it can be used from libervia. refactorization in memory.py are related to that.
souliane <souliane@mailoo.org>
parents: 645
diff changeset
615 return self.params.asyncGetParamA(name, category, attr, security_limit, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
616
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
617 def asyncGetStringParamA(self, name, category, attr="value", security_limit=C.NO_SECURITY_LIMIT, profile_key=C.PROF_KEY_NONE):
656
7d6e5807504a bridge, memory: added the parameter security_limit to asyncGetParamA so it can be used from libervia. refactorization in memory.py are related to that.
souliane <souliane@mailoo.org>
parents: 645
diff changeset
618 return self.params.asyncGetStringParamA(name, category, attr, security_limit, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
619
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
620 def getParamsUI(self, security_limit=C.NO_SECURITY_LIMIT, app='', profile_key=C.PROF_KEY_NONE):
777
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 771
diff changeset
621 return self.params.getParamsUI(security_limit, app, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
622
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
623 def getParams(self, security_limit=C.NO_SECURITY_LIMIT, app='', profile_key=C.PROF_KEY_NONE):
777
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 771
diff changeset
624 return self.params.getParams(security_limit, app, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
625
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
626 def getParamsForCategory(self, category, security_limit=C.NO_SECURITY_LIMIT, app='', profile_key=C.PROF_KEY_NONE):
777
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 771
diff changeset
627 return self.params.getParamsForCategory(category, security_limit, app, profile_key)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
628
0
goffi@necton2
parents:
diff changeset
629 def getParamsCategories(self):
17
74a39f40eb6d refactoring: using xml params (not finished yet)
Goffi <goffi@goffi.org>
parents: 14
diff changeset
630 return self.params.getParamsCategories()
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
631
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 914
diff changeset
632 def setParam(self, name, value, category, security_limit=C.NO_SECURITY_LIMIT, profile_key=C.PROF_KEY_NONE):
641
49587e170f53 core: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents: 639
diff changeset
633 return self.params.setParam(name, value, category, security_limit, profile_key)
19
f2a745ca0fbc refactoring: using xml params part III (parameters import)
Goffi <goffi@goffi.org>
parents: 18
diff changeset
634
662
4f747d7fde8c core: importParams renamed to updateParams: it now updates the parameter instead of appending children if it find an existing one.
Goffi <goffi@goffi.org>
parents: 656
diff changeset
635 def updateParams(self, xml):
4f747d7fde8c core: importParams renamed to updateParams: it now updates the parameter instead of appending children if it find an existing one.
Goffi <goffi@goffi.org>
parents: 656
diff changeset
636 return self.params.updateParams(xml)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 574
diff changeset
637
914
1a3ba959f0ab core (memory): moved Params in its own module + introduced a new core/constants module, and moved some constants there
Goffi <goffi@goffi.org>
parents: 909
diff changeset
638 def paramsRegisterApp(self, xml, security_limit=C.NO_SECURITY_LIMIT, app=''):
777
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 771
diff changeset
639 return self.params.paramsRegisterApp(xml, security_limit, app)
5642939d254e core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents: 771
diff changeset
640
20
fc8c202cda87 refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents: 19
diff changeset
641 def setDefault(self, name, category, callback, errback=None):
fc8c202cda87 refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents: 19
diff changeset
642 return self.params.setDefault(name, category, callback, errback)