Mercurial > libervia-backend
annotate sat/memory/memory.py @ 3536:0985c47ffd96
doc: config file is now `libervia.conf` (even if `sat.conf` still works, for now)
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 03 Jun 2021 15:15:11 +0200 |
parents | 30779935c0aa |
children | f9a5b810f14d |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
3480
7550ae9cfbac
Renamed the project from "Salut à Toi" to "Libervia":
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
3 # Libervia: an XMPP client |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
0 | 5 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
592
diff
changeset
|
6 # 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
|
7 # 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
|
8 # 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
|
9 # (at your option) any later version. |
0 | 10 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
592
diff
changeset
|
11 # 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
|
12 # 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
|
13 # 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
|
14 # GNU Affero General Public License for more details. |
0 | 15 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
592
diff
changeset
|
16 # 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
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
0 | 18 |
19 import os.path | |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
20 import copy |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
21 import shortuuid |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
22 import mimetypes |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
23 import time |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
24 from functools import partial |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
25 from typing import Optional, Tuple, Dict |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
26 from pathlib import Path |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
27 from uuid import uuid4 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
28 from collections import namedtuple |
1447 | 29 from twisted.python import failure |
30 from twisted.internet import defer, reactor, error | |
47 | 31 from twisted.words.protocols.jabber import jid |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
32 from sat.core.i18n import _ |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
33 from sat.core.log import getLogger |
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
|
34 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
|
35 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
|
36 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
|
37 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
|
38 from sat.memory.params import Params |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
39 from sat.memory.disco import Discovery |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
40 from sat.memory.crypto import BlockCipher |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
41 from sat.memory.crypto import PasswordHasher |
1064
7ee9d9db67b9
memory, tools (config): move special config retrieval from memory to tools
souliane <souliane@mailoo.org>
parents:
1046
diff
changeset
|
42 from sat.tools import config as tools_config |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
43 from sat.tools.common import data_format |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
44 from sat.tools.common import regex |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
45 |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
46 |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
47 log = getLogger(__name__) |
420
acd908528ef7
core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents:
418
diff
changeset
|
48 |
679
59c9a7ff903d
wix, misc: use picture of dimension 32x32 for tray icon + better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
677
diff
changeset
|
49 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
50 PresenceTuple = namedtuple("PresenceTuple", ("show", "priority", "statuses")) |
1447 | 51 MSG_NO_SESSION = "Session id doesn't exist or is finished" |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
52 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
53 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
54 class Sessions(object): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
55 """Sessions are data associated to key used for a temporary moment, with optional profile checking.""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
56 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
57 DEFAULT_TIMEOUT = 600 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
58 |
1215
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
59 def __init__(self, timeout=None, resettable_timeout=True): |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
60 """ |
1215
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
61 @param timeout (int): nb of seconds before session destruction |
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
62 @param resettable_timeout (bool): if True, the timeout is reset on each access |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
63 """ |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
64 self._sessions = dict() |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
65 self.timeout = timeout or Sessions.DEFAULT_TIMEOUT |
1215
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
66 self.resettable_timeout = resettable_timeout |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
67 |
1212
628e320eab1f
memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
68 def newSession(self, session_data=None, session_id=None, profile=None): |
1447 | 69 """Create a new session |
70 | |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
71 @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
|
72 @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
|
73 @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
|
74 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
|
75 @return: session_id, session_data |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
76 """ |
1212
628e320eab1f
memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
77 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
|
78 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
|
79 elif session_id in self._sessions: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
80 raise exceptions.ConflictError( |
3028 | 81 "Session id {} is already used".format(session_id) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
82 ) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
83 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
|
84 if session_data is None: |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
85 session_data = {} |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
86 self._sessions[session_id] = ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
87 (timer, session_data) if profile is None else (timer, session_data, profile) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
88 ) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
89 return session_id, session_data |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
90 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
91 def _purgeSession(self, session_id): |
1447 | 92 try: |
93 timer, session_data, profile = self._sessions[session_id] | |
94 except ValueError: | |
95 timer, session_data = self._sessions[session_id] | |
96 profile = None | |
97 try: | |
98 timer.cancel() | |
99 except error.AlreadyCalled: | |
100 # if the session is time-outed, the timer has been called | |
101 pass | |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
102 del self._sessions[session_id] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
103 log.debug( |
3028 | 104 "Session {} purged{}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
105 session_id, |
3028 | 106 " (profile {})".format(profile) if profile is not None else "", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
107 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
108 ) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
109 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
110 def __len__(self): |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
111 return len(self._sessions) |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
112 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
113 def __contains__(self, session_id): |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
114 return session_id in self._sessions |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
115 |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
116 def profileGet(self, session_id, profile): |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
117 try: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
118 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
|
119 except ValueError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
120 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
121 "You need to use __getitem__ when profile is not set" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
122 ) |
1447 | 123 except KeyError: |
124 raise failure.Failure(KeyError(MSG_NO_SESSION)) | |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
125 if profile_set != profile: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
126 raise exceptions.InternalError("current profile differ from set profile !") |
1215
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
127 if self.resettable_timeout: |
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
128 timer.reset(self.timeout) |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
129 return session_data |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
130 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
131 def __getitem__(self, session_id): |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
132 try: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
133 timer, session_data = self._sessions[session_id] |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
134 except ValueError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
135 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
136 "You need to use profileGet instead of __getitem__ when profile is set" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
137 ) |
1447 | 138 except KeyError: |
139 raise failure.Failure(KeyError(MSG_NO_SESSION)) | |
1215
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
140 if self.resettable_timeout: |
d9c399ec5dd9
memory: session timeout won't be reset on each access if the Sessions() is called with resettable_timeout=False
souliane <souliane@mailoo.org>
parents:
1214
diff
changeset
|
141 timer.reset(self.timeout) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
142 return session_data |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
143 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
144 def __setitem__(self, key, value): |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
145 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
|
146 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
147 def __delitem__(self, session_id): |
1474
c2a498dce4b4
core (memory): fixed a double timer.cancel in Sessions
Goffi <goffi@goffi.org>
parents:
1460
diff
changeset
|
148 """ delete the session data """ |
1447 | 149 self._purgeSession(session_id) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
150 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
151 def keys(self): |
3028 | 152 return list(self._sessions.keys()) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
153 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
154 def iterkeys(self): |
3028 | 155 return iter(self._sessions.keys()) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
156 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
157 |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
158 class ProfileSessions(Sessions): |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
159 """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
|
160 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
|
161 """ |
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 def _profileGetAllIds(self, profile): |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
164 """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
|
165 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
166 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
167 @return: a list containing the sessions ids |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
168 """ |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
169 ret = [] |
3028 | 170 for session_id in self._sessions.keys(): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
171 try: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
172 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
|
173 except ValueError: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
174 continue |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
175 if profile == profile_set: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
176 ret.append(session_id) |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
177 return ret |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
178 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
179 def profileGetUnique(self, profile): |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
180 """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
|
181 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
182 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
183 @return: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
184 - mutable data (default: dict) of the unique session |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
185 - 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
|
186 - 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
|
187 """ |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
188 ids = self._profileGetAllIds(profile) |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
189 if len(ids) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
190 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
191 "profileGetUnique has been used but more than one session has been found!" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
192 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
193 return ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
194 self.profileGet(ids[0], profile) if len(ids) == 1 else None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
195 ) # XXX: timeout might be reset |
1214
ed3b01ed70d7
memory: profileSessions.profileGetUnique was not resetting the timer
souliane <souliane@mailoo.org>
parents:
1213
diff
changeset
|
196 |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
197 def profileDelUnique(self, profile): |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
198 """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
|
199 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
200 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
201 @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
|
202 """ |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
203 ids = self._profileGetAllIds(profile) |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
204 if len(ids) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
205 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
206 "profileDelUnique has been used but more than one session has been found!" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
207 ) |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
208 if len(ids) == 1: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
209 del self._sessions[ids[0]] |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
210 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
211 |
1247
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
212 class PasswordSessions(ProfileSessions): |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
213 |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
214 # FIXME: temporary hack for the user personal key not to be lost. The session |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
215 # must actually be purged and later, when the personal key is needed, the |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
216 # profile password should be asked again in order to decrypt it. |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
217 def __init__(self, timeout=None): |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
218 ProfileSessions.__init__(self, timeout, resettable_timeout=False) |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
219 |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
220 def _purgeSession(self, session_id): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
221 log.debug( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
222 "FIXME: PasswordSessions should ask for the profile password after the session expired" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
223 ) |
1247
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
224 |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
225 |
588
beaf6bec2fcd
Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
226 class Memory(object): |
1199 | 227 """This class manage all the persistent information""" |
0 | 228 |
22
bb72c29f3432
added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents:
21
diff
changeset
|
229 def __init__(self, host): |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
230 log.info(_("Memory manager init")) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
231 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
|
232 self.host = host |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
233 self._entities_cache = {} # XXX: keep presence/last resource/other data in cache |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
234 # /!\ an entity is not necessarily in roster |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
235 # main key is bare jid, value is a dict |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
236 # where main key is resource, or None for bare jid |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
237 self._key_signals = set() # key which need a signal to frontends when updated |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
238 self.subscriptions = {} |
1247
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
239 self.auth_sessions = PasswordSessions() # remember the authenticated profiles |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
240 self.disco = Discovery(host) |
3148
60a9e47ef988
core: log filenames of read config files
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
241 self.config = tools_config.parseMainConf(log_filenames=True) |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
242 self._cache_path = Path(self.getConfig("", "local_dir"), C.CACHE_DIR) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
243 database_file = os.path.expanduser( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
244 os.path.join(self.getConfig("", "local_dir"), C.SAVEFILE_DATABASE) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
245 ) |
1375
3a20312d4012
core: if we are in dev version and it's possible, repository data are now checked and added to SàT version
Goffi <goffi@goffi.org>
parents:
1315
diff
changeset
|
246 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
|
247 PersistentDict.storage = self.storage |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
248 self.params = Params(host, self.storage) |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
249 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
|
250 self.params.load_default_params() |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
251 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
|
252 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
|
253 d.addCallback(lambda ignore: self.memory_data.load()) |
1684
373ce871b0f3
core (disco): disco hashes are now stored in database to avoid doing the same disco request on next load
Goffi <goffi@goffi.org>
parents:
1682
diff
changeset
|
254 d.addCallback(lambda ignore: self.disco.load()) |
428
a4a9efadabfc
core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents:
425
diff
changeset
|
255 d.chainDeferred(self.initialized) |
0 | 256 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
257 ## Configuration ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
258 |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
259 def getConfig(self, section, name, default=None): |
364 | 260 """Get the main configuration option |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
261 |
364 | 262 @param section: section of the config file (None or '' for DEFAULT) |
263 @param name: name of the option | |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
264 @param default: value to use if not found |
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
265 @return: str, list or dict |
365
efbfccfed623
core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents:
364
diff
changeset
|
266 """ |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
267 return tools_config.getConfig(self.config, section, name, default) |
364 | 268 |
677
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
269 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
|
270 """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
|
271 |
fee00f2e11c2
memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents:
1007
diff
changeset
|
272 @param filename (str): input file |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
273 @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
|
274 """ |
fee00f2e11c2
memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents:
1007
diff
changeset
|
275 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
|
276 return False |
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
277 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
|
278 if os.path.exists(filename): |
0 | 279 try: |
677
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
280 self.params.load_xml(filename) |
3028 | 281 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
|
282 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
|
283 except Exception as e: |
3028 | 284 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
|
285 return False |
0 | 286 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
287 def save_xml(self, filename): |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
288 """Save parameters template to xml file |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
289 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
290 @param filename (str): output file |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
291 @return: bool: True in case of success |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
292 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
293 if not filename: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
294 return False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
295 # TODO: need to encrypt files (at least passwords !) and set permissions |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
296 filename = os.path.expanduser(filename) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
297 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
298 self.params.save_xml(filename) |
3028 | 299 log.debug(_("Parameters saved to file: %s") % filename) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
300 return True |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
301 except Exception as e: |
3028 | 302 log.error(_("Can't save parameters to file: %s") % e) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
303 return False |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
304 |
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
|
305 def load(self): |
428
a4a9efadabfc
core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents:
425
diff
changeset
|
306 """Load parameters and all memory things from db""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
307 # parameters data |
428
a4a9efadabfc
core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents:
425
diff
changeset
|
308 return self.params.loadGenParams() |
412 | 309 |
416
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
310 def loadIndividualParams(self, profile): |
412 | 311 """Load individual parameters for a profile |
416
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
312 @param profile: %(doc_profile)s""" |
412 | 313 return self.params.loadIndParams(profile) |
314 | |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
315 ## Profiles/Sessions management ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
316 |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
317 def startSession(self, password, 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
|
318 """"Iniatialise session for a profile |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
319 |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
320 @param password(unicode): profile session password |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
321 or empty string is no password is set |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
322 @param profile: %(doc_profile)s |
1694
3c608d660f0b
core (memory): profile is checked in startSession (an error is raised if it doesn't exist)
Goffi <goffi@goffi.org>
parents:
1693
diff
changeset
|
323 @raise exceptions.ProfileUnknownError if profile doesn't exists |
3c608d660f0b
core (memory): profile is checked in startSession (an error is raised if it doesn't exist)
Goffi <goffi@goffi.org>
parents:
1693
diff
changeset
|
324 @raise exceptions.PasswordError: the password does not match |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
325 """ |
1694
3c608d660f0b
core (memory): profile is checked in startSession (an error is raised if it doesn't exist)
Goffi <goffi@goffi.org>
parents:
1693
diff
changeset
|
326 profile = self.getProfileName(profile) |
3c608d660f0b
core (memory): profile is checked in startSession (an error is raised if it doesn't exist)
Goffi <goffi@goffi.org>
parents:
1693
diff
changeset
|
327 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
328 def createSession(__): |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
329 """Called once params are loaded.""" |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
330 self._entities_cache[profile] = {} |
3028 | 331 log.info("[{}] Profile session started".format(profile)) |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
332 return False |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
333 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
334 def backendInitialised(__): |
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
335 def doStartSession(__=None): |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
336 if self.isSessionStarted(profile): |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
337 log.info("Session already started!") |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
338 return True |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
339 try: |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
340 # if there is a value at this point in self._entities_cache, |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
341 # it is the loadIndividualParams Deferred, the session is starting |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
342 session_d = self._entities_cache[profile] |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
343 except KeyError: |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
344 # else we do request the params |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
345 session_d = self._entities_cache[profile] = self.loadIndividualParams( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
346 profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
347 ) |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
348 session_d.addCallback(createSession) |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
349 finally: |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
350 return session_d |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
351 |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
352 auth_d = defer.ensureDeferred(self.profileAuthenticate(password, profile)) |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
353 auth_d.addCallback(doStartSession) |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
354 return auth_d |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
355 |
1723
5632c5350296
core: avoid initialisation blocking when a long callback is added to backend.initialised (could prevent sessions starting)
Goffi <goffi@goffi.org>
parents:
1704
diff
changeset
|
356 if self.host.initialised.called: |
5632c5350296
core: avoid initialisation blocking when a long callback is added to backend.initialised (could prevent sessions starting)
Goffi <goffi@goffi.org>
parents:
1704
diff
changeset
|
357 return defer.succeed(None).addCallback(backendInitialised) |
5632c5350296
core: avoid initialisation blocking when a long callback is added to backend.initialised (could prevent sessions starting)
Goffi <goffi@goffi.org>
parents:
1704
diff
changeset
|
358 else: |
5632c5350296
core: avoid initialisation blocking when a long callback is added to backend.initialised (could prevent sessions starting)
Goffi <goffi@goffi.org>
parents:
1704
diff
changeset
|
359 return self.host.initialised.addCallback(backendInitialised) |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
360 |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
361 def stopSession(self, profile): |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
362 """Delete a profile session |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
363 |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
364 @param profile: %(doc_profile)s |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
365 """ |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
366 if self.host.isConnected(profile): |
3028 | 367 log.debug("Disconnecting profile because of session stop") |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
368 self.host.disconnect(profile) |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
369 self.auth_sessions.profileDelUnique(profile) |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
370 try: |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
371 self._entities_cache[profile] |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
372 except KeyError: |
3028 | 373 log.warning("Profile was not in cache") |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
374 |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
375 def _isSessionStarted(self, profile_key): |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
376 return self.isSessionStarted(self.getProfileName(profile_key)) |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
377 |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
378 def isSessionStarted(self, profile): |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
379 try: |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
380 # XXX: if the value in self._entities_cache is a Deferred, |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
381 # the session is starting but not started yet |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
382 return not isinstance(self._entities_cache[profile], defer.Deferred) |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
383 except KeyError: |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
384 return False |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
385 |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
386 async def profileAuthenticate(self, password, profile): |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
387 """Authenticate the profile. |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
388 |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
389 @param password (unicode): the SàT profile password |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
390 @return: None in case of success (an exception is raised otherwise) |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
391 @raise exceptions.PasswordError: the password does not match |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
392 """ |
3128
73b5228715e8
core (memory): avoid session locking if profileAuthenticate is called twice quickly
Goffi <goffi@goffi.org>
parents:
3123
diff
changeset
|
393 if not password and self.auth_sessions.profileGetUnique(profile): |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
394 # XXX: this allows any frontend to connect with the empty password as soon as |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
395 # the profile has been authenticated at least once before. It is OK as long as |
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
396 # submitting a form with empty passwords is restricted to local frontends. |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
397 return |
1591
0df9c6247474
core: profile session starting and connection are now separated. Moved profile session starting/authentication to memory module
Goffi <goffi@goffi.org>
parents:
1587
diff
changeset
|
398 |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
399 sat_cipher = await self.asyncGetParamA( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
400 C.PROFILE_PASS_PATH[1], C.PROFILE_PASS_PATH[0], profile_key=profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
401 ) |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
402 valid = PasswordHasher.verify(password, sat_cipher) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
403 if not valid: |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
404 log.warning(_("Authentication failure of profile {profile}").format( |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
405 profile=profile)) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
406 raise exceptions.PasswordError("The provided profile password doesn't match.") |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
407 return await self.newAuthSession(password, profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
408 |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
409 async def newAuthSession(self, key, profile): |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
410 """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
|
411 |
3128
73b5228715e8
core (memory): avoid session locking if profileAuthenticate is called twice quickly
Goffi <goffi@goffi.org>
parents:
3123
diff
changeset
|
412 If there is already an existing session, no new one is created |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
413 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
|
414 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
415 @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
|
416 @param profile: %(doc_profile)s |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
417 """ |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
418 data = await PersistentDict(C.MEMORY_CRYPTO_NAMESPACE, profile).load() |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
419 personal_key = BlockCipher.decrypt(key, data[C.MEMORY_CRYPTO_KEY]) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
420 # Create the session for this profile and store the personal key |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
421 session_data = self.auth_sessions.profileGetUnique(profile) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
422 if not session_data: |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
423 self.auth_sessions.newSession( |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
424 {C.MEMORY_CRYPTO_KEY: personal_key}, profile=profile |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
425 ) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
426 log.debug("auth session created for profile %s" % profile) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
427 |
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
|
428 def purgeProfileSession(self, profile): |
416
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
429 """Delete cache of data of profile |
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
430 @param profile: %(doc_profile)s""" |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
431 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
|
432 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
|
433 try: |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
434 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
|
435 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
436 log.error( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
437 _( |
3028 | 438 "Trying to purge roster status cache for a profile not in memory: [%s]" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
439 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
440 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
441 ) |
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
|
442 |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
443 def getProfilesList(self, clients=True, components=False): |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
444 """retrieve profiles list |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
445 |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
446 @param clients(bool): if True return clients profiles |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
447 @param components(bool): if True return components profiles |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
448 @return (list[unicode]): selected profiles |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
449 """ |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
450 if not clients and not components: |
3028 | 451 log.warning(_("requesting no profiles at all")) |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
452 return [] |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
453 profiles = self.storage.getProfilesList() |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
454 if clients and components: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
455 return sorted(profiles) |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
456 isComponent = self.storage.profileIsComponent |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
457 if clients: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
458 p_filter = lambda p: not isComponent(p) |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
459 else: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
460 p_filter = lambda p: isComponent(p) |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
461 |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
462 return sorted(p for p in profiles if p_filter(p)) |
60
9764e027ecc0
SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
463 |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
464 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
|
465 """Return name of profile from keyword |
1263 | 466 |
1519
fbe86b5d156f
core (memory, params): minor docstrings updates
Goffi <goffi@goffi.org>
parents:
1474
diff
changeset
|
467 @param profile_key: can be the profile name or a keyword (like @DEFAULT@) |
1263 | 468 @param return_profile_keys: if True, return unmanaged profile keys (like "@ALL@"). This keys must be managed by the caller |
1519
fbe86b5d156f
core (memory, params): minor docstrings updates
Goffi <goffi@goffi.org>
parents:
1474
diff
changeset
|
469 @return: requested profile name |
1460
c7fd121a6180
core: getProfileName no raise ProfileUnknownError + minor doc fixes
Goffi <goffi@goffi.org>
parents:
1447
diff
changeset
|
470 @raise exceptions.ProfileUnknownError if profile doesn't exists |
1263 | 471 """ |
728
e07afabc4a25
plugin XEP-0050: Ad-Hoc commands first draft (answering part)
Goffi <goffi@goffi.org>
parents:
722
diff
changeset
|
472 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
|
473 |
1595
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
474 def profileSetDefault(self, profile): |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
475 """Set default profile |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
476 |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
477 @param profile: %(doc_profile)s |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
478 """ |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
479 # we want to be sure that the profile exists |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
480 profile = self.getProfileName(profile) |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
481 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
482 self.memory_data["Profile_default"] = profile |
1595
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
483 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
484 def createProfile(self, name, password, component=None): |
420
acd908528ef7
core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents:
418
diff
changeset
|
485 """Create a new profile |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
486 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
487 @param name(unicode): profile name |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
488 @param password(unicode): profile password |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
489 Can be empty to disable password |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
490 @param component(None, unicode): set to entry point if this is a component |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
491 @return: Deferred |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
492 @raise exceptions.NotFound: component is not a known plugin import name |
420
acd908528ef7
core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents:
418
diff
changeset
|
493 """ |
1263 | 494 if not name: |
3028 | 495 raise ValueError("Empty profile name") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
496 if name[0] == "@": |
3028 | 497 raise ValueError("A profile name can't start with a '@'") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
498 if "\n" in name: |
3028 | 499 raise ValueError("A profile name can't contain line feed ('\\n')") |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1652
diff
changeset
|
500 |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
501 if name in self._entities_cache: |
3028 | 502 raise exceptions.ConflictError("A session for this profile exists") |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
503 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
504 if component: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
505 if not component in self.host.plugins: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
506 raise exceptions.NotFound( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
507 _( |
3028 | 508 "Can't find component {component} entry point".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
509 component=component |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
510 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
511 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
512 ) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
513 # FIXME: PLUGIN_INFO is not currently accessible after import, but type shoul be tested here |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
514 # if self.host.plugins[component].PLUGIN_INFO[u"type"] != C.PLUG_TYPE_ENTRY_POINT: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
515 # raise ValueError(_(u"Plugin {component} is not an entry point !".format( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
516 # component = component))) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
517 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
518 d = self.params.createProfile(name, component) |
1682
61391d863709
plugin XEP-0054: fixed vcard-update callback which was updating avatar when hash was empty, resulting in a really slow start
Goffi <goffi@goffi.org>
parents:
1652
diff
changeset
|
519 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
520 def initPersonalKey(__): |
1652
fd7f41d8cbdf
memory: fixes asyncCreateProfile to not overwrite the personal key
souliane <souliane@mailoo.org>
parents:
1595
diff
changeset
|
521 # be sure to call this after checking that the profile doesn't exist yet |
3040 | 522 |
523 # generated once for all and saved in a PersistentDict | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
524 personal_key = BlockCipher.getRandomKey( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
525 base64=True |
3040 | 526 ).decode('utf-8') |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
527 self.auth_sessions.newSession( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
528 {C.MEMORY_CRYPTO_KEY: personal_key}, profile=name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
529 ) # will be encrypted by setParam |
1652
fd7f41d8cbdf
memory: fixes asyncCreateProfile to not overwrite the personal key
souliane <souliane@mailoo.org>
parents:
1595
diff
changeset
|
530 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
531 def startFakeSession(__): |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
532 # avoid ProfileNotConnected exception in setParam |
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
533 self._entities_cache[name] = None |
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
534 self.params.loadIndParams(name) |
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
535 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
536 def stopFakeSession(__): |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
537 del self._entities_cache[name] |
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
538 self.params.purgeProfile(name) |
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
539 |
1652
fd7f41d8cbdf
memory: fixes asyncCreateProfile to not overwrite the personal key
souliane <souliane@mailoo.org>
parents:
1595
diff
changeset
|
540 d.addCallback(initPersonalKey) |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
541 d.addCallback(startFakeSession) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
542 d.addCallback( |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
543 lambda __: self.setParam( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
544 C.PROFILE_PASS_PATH[1], password, C.PROFILE_PASS_PATH[0], profile_key=name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
545 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
546 ) |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
547 d.addCallback(stopFakeSession) |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
548 d.addCallback(lambda __: self.auth_sessions.profileDelUnique(name)) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
549 return d |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
550 |
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
|
551 def asyncDeleteProfile(self, name, force=False): |
68 | 552 """Delete an existing profile |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
553 |
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
|
554 @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
|
555 @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
|
556 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
|
557 @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
|
558 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
559 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
560 def cleanMemory(__): |
1704
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
561 self.auth_sessions.profileDelUnique(name) |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
562 try: |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
563 del self._entities_cache[name] |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
564 except KeyError: |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
565 pass |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
566 |
1704
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
567 d = self.params.asyncDeleteProfile(name, force) |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
568 d.addCallback(cleanMemory) |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
569 return d |
60
9764e027ecc0
SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
570 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
571 def isComponent(self, profile_name): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
572 """Tell if a profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
573 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
574 @param profile_name(unicode): name of the profile |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
575 @return (bool): True if profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
576 @raise exceptions.NotFound: profile doesn't exist |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
577 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
578 return self.storage.profileIsComponent(profile_name) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
579 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
580 def getEntryPoint(self, profile_name): |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
581 """Get a component entry point |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
582 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
583 @param profile_name(unicode): name of the profile |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
584 @return (bool): True if profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
585 @raise exceptions.NotFound: profile doesn't exist |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
586 """ |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
587 return self.storage.getEntryPoint(profile_name) |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
588 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
589 ## History ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
590 |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
591 def addToHistory(self, client, data): |
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
592 return self.storage.addToHistory(data, client.profile) |
0 | 593 |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
594 def _historyGetSerialise(self, history_data): |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
595 return [ |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
596 (uid, timestamp, from_jid, to_jid, message, subject, mess_type, |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
597 data_format.serialise(extra)) for uid, timestamp, from_jid, to_jid, message, |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
598 subject, mess_type, extra in history_data |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
599 ] |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
600 |
2698 | 601 def _historyGet(self, from_jid_s, to_jid_s, limit=C.HISTORY_LIMIT_NONE, between=True, |
602 filters=None, profile=C.PROF_KEY_NONE): | |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
603 d = self.historyGet(jid.JID(from_jid_s), jid.JID(to_jid_s), limit, between, |
2698 | 604 filters, profile) |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
605 d.addCallback(self._historyGetSerialise) |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
606 return d |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
607 |
2698 | 608 def historyGet(self, from_jid, to_jid, limit=C.HISTORY_LIMIT_NONE, between=True, |
609 filters=None, profile=C.PROF_KEY_NONE): | |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
610 """Retrieve messages in history |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
611 |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
612 @param from_jid (JID): source JID (full, or bare for catchall) |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
613 @param to_jid (JID): dest JID (full, or bare for catchall) |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
614 @param limit (int): maximum number of messages to get: |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
615 - 0 for no message (returns the empty list) |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
616 - C.HISTORY_LIMIT_NONE or None for unlimited |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
617 - C.HISTORY_LIMIT_DEFAULT to use the HISTORY_LIMIT parameter value |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
618 @param between (bool): confound source and dest (ignore the direction) |
2698 | 619 @param filters (dict[unicode, unicode]): pattern to filter the history results |
620 (see bridge API for details) | |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
621 @param profile (str): %(doc_profile)s |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
622 @return (D(list)): list of message data as in [messageNew] |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
623 """ |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
914
diff
changeset
|
624 assert profile != C.PROF_KEY_NONE |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
625 if limit == C.HISTORY_LIMIT_DEFAULT: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
626 limit = int(self.getParamA(C.HISTORY_LIMIT, "General", profile_key=profile)) |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
627 elif limit == C.HISTORY_LIMIT_NONE: |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
628 limit = None |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
629 if limit == 0: |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
630 return defer.succeed([]) |
2013
b536dd121da1
backend (memory), frontends: improved history filtering:
Goffi <goffi@goffi.org>
parents:
1970
diff
changeset
|
631 return self.storage.historyGet(from_jid, to_jid, limit, between, filters, profile) |
0 | 632 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
633 ## Statuses ## |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
634 |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
635 def _getPresenceStatuses(self, profile_key): |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
636 ret = self.getPresenceStatuses(profile_key) |
3028 | 637 return {entity.full(): data for entity, data in ret.items()} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
638 |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
639 def getPresenceStatuses(self, profile_key): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
640 """Get all the presence statuses of a profile |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
641 |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
642 @param profile_key: %(doc_profile_key)s |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
643 @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
|
644 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
645 client = self.host.getClient(profile_key) |
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
646 profile_cache = self._getProfileCache(client) |
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
|
647 entities_presence = {} |
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
|
648 |
3028 | 649 for entity_jid, entity_data in profile_cache.items(): |
650 for resource, resource_data in entity_data.items(): | |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
651 full_jid = copy.copy(entity_jid) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
652 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
653 try: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
654 presence_data = self.getEntityDatum(client, full_jid, "presence") |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
655 except KeyError: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
656 continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
657 entities_presence.setdefault(entity_jid, {})[ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
658 resource or "" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
659 ] = presence_data |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
660 |
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
|
661 return entities_presence |
0 | 662 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
663 def setPresenceStatus(self, entity_jid, show, priority, statuses, profile_key): |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
664 """Change the presence status of an entity |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
665 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
666 @param entity_jid: jid.JID of the entity |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
667 @param show: show status |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
668 @param priority: priority |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
669 @param statuses: dictionary of statuses |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
670 @param profile_key: %(doc_profile_key)s |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
671 """ |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
672 client = self.host.getClient(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
673 presence_data = PresenceTuple(show, priority, statuses) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
674 self.updateEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
675 client, entity_jid, "presence", presence_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
676 ) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
677 if entity_jid.resource and show != C.PRESENCE_UNAVAILABLE: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
678 # If a resource is available, bare jid should not have presence information |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
679 try: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
680 self.delEntityDatum(client, entity_jid.userhostJID(), "presence") |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
681 except (KeyError, exceptions.UnknownEntityError): |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
682 pass |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
683 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
684 ## Resources ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
685 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
686 def _getAllResource(self, jid_s, profile_key): |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
687 client = self.host.getClient(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
688 jid_ = jid.JID(jid_s) |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
689 return self.getAllResources(client, jid_) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
690 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
691 def getAllResources(self, client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
692 """Return all resource from jid for which we have had data in this session |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
693 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
694 @param entity_jid: bare jid of the entity |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
695 return (set[unicode]): set of resources |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
696 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
697 @raise exceptions.UnknownEntityError: if entity is not in cache |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
698 @raise ValueError: entity_jid has a resource |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
699 """ |
2597
9446f1ea9eac
core: discoFindByFeatures now return only available resources
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
700 # FIXME: is there a need to keep cache data for resources which are not connected anymore? |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
701 if entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
702 raise ValueError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
703 "getAllResources must be used with a bare jid (got {})".format(entity_jid) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
704 ) |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
705 profile_cache = self._getProfileCache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
706 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
707 entity_data = profile_cache[entity_jid.userhostJID()] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
708 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
709 raise exceptions.UnknownEntityError( |
3028 | 710 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
711 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
712 resources = set(entity_data.keys()) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
713 resources.discard(None) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
714 return resources |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
715 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
716 def getAvailableResources(self, client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
717 """Return available resource for entity_jid |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
718 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
719 This method differs from getAllResources by returning only available resources |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
720 @param entity_jid: bare jid of the entit |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
721 return (list[unicode]): list of available resources |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
722 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
723 @raise exceptions.UnknownEntityError: if entity is not in cache |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
724 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
725 available = [] |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
726 for resource in self.getAllResources(client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
727 full_jid = copy.copy(entity_jid) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
728 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
729 try: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
730 presence_data = self.getEntityDatum(client, full_jid, "presence") |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
731 except KeyError: |
3028 | 732 log.debug("Can't get presence data for {}".format(full_jid)) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
733 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
734 if presence_data.show != C.PRESENCE_UNAVAILABLE: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
735 available.append(resource) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
736 return available |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
737 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
738 def _getMainResource(self, jid_s, profile_key): |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1963
diff
changeset
|
739 client = self.host.getClient(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
740 jid_ = jid.JID(jid_s) |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1963
diff
changeset
|
741 return self.getMainResource(client, jid_) or "" |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
742 |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1963
diff
changeset
|
743 def getMainResource(self, client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
744 """Return the main resource used by an entity |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
745 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
746 @param entity_jid: bare entity jid |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
747 @return (unicode): main resource or None |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
748 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
749 if entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
750 raise ValueError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
751 "getMainResource must be used with a bare jid (got {})".format(entity_jid) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
752 ) |
1392
c7082457d03f
memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents:
1375
diff
changeset
|
753 try: |
1970
200cd707a46d
plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents:
1963
diff
changeset
|
754 if self.host.plugins["XEP-0045"].isJoinedRoom(client, entity_jid): |
1392
c7082457d03f
memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents:
1375
diff
changeset
|
755 return None # MUC rooms have no main resource |
c7082457d03f
memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents:
1375
diff
changeset
|
756 except KeyError: # plugin not found |
c7082457d03f
memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents:
1375
diff
changeset
|
757 pass |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
758 try: |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
759 resources = self.getAllResources(client, entity_jid) |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
760 except exceptions.UnknownEntityError: |
3028 | 761 log.warning("Entity is not in cache, we can't find any resource") |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
762 return None |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
763 priority_resources = [] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
764 for resource in resources: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
765 full_jid = copy.copy(entity_jid) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
766 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
767 try: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
768 presence_data = self.getEntityDatum(client, full_jid, "presence") |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
769 except KeyError: |
3028 | 770 log.debug("No presence information for {}".format(full_jid)) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
771 continue |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
772 priority_resources.append((resource, presence_data.priority)) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
773 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
774 return max(priority_resources, key=lambda res_tuple: res_tuple[1])[0] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
775 except ValueError: |
3028 | 776 log.warning("No resource found at all for {}".format(entity_jid)) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
777 return None |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
778 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
779 ## Entities data ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
780 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
781 def _getProfileCache(self, client): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
782 """Check profile validity and return its cache |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
783 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
784 @param client: SatXMPPClient |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
785 @return (dict): profile cache |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
786 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
787 return self._entities_cache[client.profile] |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
788 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
789 def setSignalOnUpdate(self, key, signal=True): |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
790 """Set a signal flag on the key |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
791 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
792 When the key will be updated, a signal will be sent to frontends |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
793 @param key: key to signal |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
794 @param signal(boolean): if True, do the signal |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
795 """ |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
796 if signal: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
797 self._key_signals.add(key) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
798 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
799 self._key_signals.discard(key) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
800 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
801 def getAllEntitiesIter(self, client, with_bare=False): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
802 """Return an iterator of full jids of all entities in cache |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
803 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
804 @param with_bare: if True, include bare jids |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
805 @return (list[unicode]): list of jids |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
806 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
807 profile_cache = self._getProfileCache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
808 # we construct a list of all known full jids (bare jid of entities x resources) |
3028 | 809 for bare_jid, entity_data in profile_cache.items(): |
810 for resource in entity_data.keys(): | |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
811 if resource is None: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
812 continue |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
813 full_jid = copy.copy(bare_jid) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
814 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
815 yield full_jid |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
816 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
817 def updateEntityData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
818 self, client, entity_jid, key, value, silent=False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
819 ): |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
820 """Set a misc data for an entity |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
821 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
822 If key was registered with setSignalOnUpdate, a signal will be sent to frontends |
2994
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
823 @param entity_jid: JID of the entity, C.ENTITY_ALL_RESOURCES for all resources of |
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
824 all entities, C.ENTITY_ALL for all entities (all resources + bare jids) |
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
825 @param key: key to set (eg: C.ENTITY_TYPE) |
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
826 @param value: value for this key (eg: C.ENTITY_TYPE_MUC) |
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
827 @param silent(bool): if True, doesn't send signal to frontend, even if there is a |
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
828 signal flag (see setSignalOnUpdate) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
829 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
830 profile_cache = self._getProfileCache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
831 if entity_jid in (C.ENTITY_ALL_RESOURCES, C.ENTITY_ALL): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
832 entities = self.getAllEntitiesIter(client, entity_jid == C.ENTITY_ALL) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
833 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
834 entities = (entity_jid,) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
835 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
836 for jid_ in entities: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
837 entity_data = profile_cache.setdefault(jid_.userhostJID(), {}).setdefault( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
838 jid_.resource, {} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
839 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
840 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
841 entity_data[key] = value |
1315
be3a301540c0
core (memory): updateEntityData now accept a "silent" argument to avoid sending signal to frontends when updating an attribute with "signalOnUpdate" flag.
Goffi <goffi@goffi.org>
parents:
1314
diff
changeset
|
842 if key in self._key_signals and not silent: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
843 self.host.bridge.entityDataUpdated( |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
844 jid_.full(), |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
845 key, |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
846 data_format.serialise(value), |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
847 client.profile |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
848 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
849 |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
850 def delEntityDatum(self, client, entity_jid, key): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
851 """Delete a data for an entity |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
852 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
853 @param entity_jid: JID of the entity, C.ENTITY_ALL_RESOURCES for all resources of all entities, |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
854 C.ENTITY_ALL for all entities (all resources + bare jids) |
2994
94708a7d3ecf
core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents:
2928
diff
changeset
|
855 @param key: key to delete (eg: C.ENTITY_TYPE) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
856 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
857 @raise exceptions.UnknownEntityError: if entity is not in cache |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
858 @raise KeyError: key is not in cache |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
859 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
860 profile_cache = self._getProfileCache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
861 if entity_jid in (C.ENTITY_ALL_RESOURCES, C.ENTITY_ALL): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
862 entities = self.getAllEntitiesIter(client, entity_jid == C.ENTITY_ALL) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
863 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
864 entities = (entity_jid,) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
865 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
866 for jid_ in entities: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
867 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
868 entity_data = profile_cache[jid_.userhostJID()][jid_.resource] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
869 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
870 raise exceptions.UnknownEntityError( |
3028 | 871 "Entity {} not in cache".format(jid_) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
872 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
873 try: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
874 del entity_data[key] |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
875 except KeyError as e: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
876 if entity_jid in (C.ENTITY_ALL_RESOURCES, C.ENTITY_ALL): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
877 continue # we ignore KeyError when deleting keys from several entities |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
878 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
879 raise e |
399 | 880 |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
881 def _getEntitiesData(self, entities_jids, keys_list, profile_key): |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
882 client = self.host.getClient(profile_key) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
883 ret = self.getEntitiesData( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
884 client, [jid.JID(jid_) for jid_ in entities_jids], keys_list |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
885 ) |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
886 return { |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
887 jid_.full(): {k: data_format.serialise(v) for k,v in data.items()} |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
888 for jid_, data in ret.items() |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
889 } |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
890 |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
891 def getEntitiesData(self, client, entities_jids, keys_list=None): |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
892 """Get a list of cached values for several entities at once |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
893 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
894 @param entities_jids: jids of the entities, or empty list for all entities in cache |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
895 @param keys_list (iterable,None): list of keys to get, None for everything |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
896 @param profile_key: %(doc_profile_key)s |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
897 @return: dict withs values for each key in keys_list. |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
898 if there is no value of a given key, resulting dict will |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
899 have nothing with that key nether |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
900 if an entity doesn't exist in cache, it will not appear |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
901 in resulting dict |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
902 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
903 @raise exceptions.UnknownEntityError: if entity is not in cache |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
904 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
905 |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
906 def fillEntityData(entity_cache_data): |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
907 entity_data = {} |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
908 if keys_list is None: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
909 entity_data = entity_cache_data |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
910 else: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
911 for key in keys_list: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
912 try: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
913 entity_data[key] = entity_cache_data[key] |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
914 except KeyError: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
915 continue |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
916 return entity_data |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
917 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
918 profile_cache = self._getProfileCache(client) |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
919 ret_data = {} |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
920 if entities_jids: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
921 for entity in entities_jids: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
922 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
923 entity_cache_data = profile_cache[entity.userhostJID()][ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
924 entity.resource |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
925 ] |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
926 except KeyError: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
927 continue |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
928 ret_data[entity.full()] = fillEntityData(entity_cache_data, keys_list) |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
929 else: |
3028 | 930 for bare_jid, data in profile_cache.items(): |
931 for resource, entity_cache_data in data.items(): | |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
932 full_jid = copy.copy(bare_jid) |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
933 full_jid.resource = resource |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
934 ret_data[full_jid] = fillEntityData(entity_cache_data) |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
935 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
936 return ret_data |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
937 |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
938 def _getEntityData(self, entity_jid_s, keys_list=None, profile=C.PROF_KEY_NONE): |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
939 return self.getEntityData( |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
940 self.host.getClient(profile), jid.JID(entity_jid_s), keys_list) |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
941 |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
942 def getEntityData(self, client, entity_jid, keys_list=None): |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
943 """Get a list of cached values for entity |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
944 |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
945 @param entity_jid: JID of the entity |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
946 @param keys_list (iterable,None): list of keys to get, None 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
|
947 @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
|
948 @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
|
949 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
|
950 have nothing with that key nether |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
951 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
952 @raise exceptions.UnknownEntityError: if entity is not in cache |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
953 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
954 profile_cache = self._getProfileCache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
955 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
956 entity_data = profile_cache[entity_jid.userhostJID()][entity_jid.resource] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
957 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
958 raise exceptions.UnknownEntityError( |
3028 | 959 "Entity {} not in cache (was requesting {})".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
960 entity_jid, keys_list |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
961 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
962 ) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
963 if keys_list is None: |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
964 return entity_data |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
965 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
966 return {key: entity_data[key] for key in keys_list if key in entity_data} |
47 | 967 |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
968 def getEntityDatum(self, client, entity_jid, key): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
969 """Get a datum from entity |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
970 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
971 @param entity_jid: JID of the entity |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
972 @param key: key to get |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
973 @return: requested value |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
974 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
975 @raise exceptions.UnknownEntityError: if entity is not in cache |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
976 @raise KeyError: if there is no value for this key and this entity |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
977 """ |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
978 return self.getEntityData(client, entity_jid, (key,))[key] |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
979 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
980 def delEntityCache( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
981 self, entity_jid, delete_all_resources=True, profile_key=C.PROF_KEY_NONE |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
982 ): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
983 """Remove all cached data for entity |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
984 |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
985 @param entity_jid: JID of the entity to delete |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
986 @param delete_all_resources: if True also delete all known resources from cache (a bare jid must be given in this case) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
987 @param profile_key: %(doc_profile_key)s |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
988 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
989 @raise exceptions.UnknownEntityError: if entity is not in cache |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
504
diff
changeset
|
990 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
991 client = self.host.getClient(profile_key) |
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
992 profile_cache = self._getProfileCache(client) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
993 |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
994 if delete_all_resources: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
995 if entity_jid.resource: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
996 raise ValueError(_("Need a bare jid to delete all resources")) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
997 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
998 del profile_cache[entity_jid] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
999 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1000 raise exceptions.UnknownEntityError( |
3028 | 1001 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1002 ) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1003 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1004 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1005 del profile_cache[entity_jid.userhostJID()][entity_jid.resource] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1006 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1007 raise exceptions.UnknownEntityError( |
3028 | 1008 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1009 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1010 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1011 ## Encryption ## |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
504
diff
changeset
|
1012 |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1013 def encryptValue(self, value, profile): |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1014 """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
|
1015 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
|
1016 already authenticated. |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1017 |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1018 @param value (str): the value to encrypt |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1019 @param profile (str): %(doc_profile)s |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1020 @return: the deferred encrypted value |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1021 """ |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1022 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1023 personal_key = self.auth_sessions.profileGetUnique(profile)[ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1024 C.MEMORY_CRYPTO_KEY |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1025 ] |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1026 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1027 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1028 _("Trying to encrypt a value for %s while the personal key is undefined!") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1029 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1030 ) |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1031 return BlockCipher.encrypt(personal_key, value) |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1032 |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1033 def decryptValue(self, value, profile): |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1034 """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
|
1035 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
|
1036 already authenticated. |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1037 |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1038 @param value (str): the value to decrypt |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1039 @param profile (str): %(doc_profile)s |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1040 @return: the deferred decrypted value |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1041 """ |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1042 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1043 personal_key = self.auth_sessions.profileGetUnique(profile)[ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1044 C.MEMORY_CRYPTO_KEY |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1045 ] |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1046 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1047 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1048 _("Trying to decrypt a value for %s while the personal key is undefined!") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1049 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1050 ) |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1051 return BlockCipher.decrypt(personal_key, value) |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1052 |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1053 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
|
1054 """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
|
1055 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1056 @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
|
1057 @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
|
1058 @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
|
1059 @param profile: %(profile_doc)s |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1060 @return: a deferred None value |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1061 """ |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1062 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1063 def gotIndMemory(data): |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
1064 data[data_key] = BlockCipher.encrypt(crypto_key, data_value) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
1065 return data.force(data_key) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1066 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
1067 def done(__): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1068 log.debug( |
3028 | 1069 _("Personal data (%(ns)s, %(key)s) has been successfuly encrypted") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1070 % {"ns": C.MEMORY_CRYPTO_NAMESPACE, "key": data_key} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1071 ) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1072 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1073 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
|
1074 return d.addCallback(gotIndMemory).addCallback(done) |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1075 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1076 ## Subscription requests ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1077 |
722
04aabc3f2684
core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents:
679
diff
changeset
|
1078 def addWaitingSub(self, type_, entity_jid, profile_key): |
47 | 1079 """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
|
1080 profile = self.getProfileName(profile_key) |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1081 assert profile |
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1082 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
|
1083 self.subscriptions[profile] = {} |
722
04aabc3f2684
core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents:
679
diff
changeset
|
1084 self.subscriptions[profile][entity_jid] = type_ |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1085 |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
1086 def delWaitingSub(self, entity_jid, profile_key): |
47 | 1087 """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
|
1088 profile = self.getProfileName(profile_key) |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1089 assert profile |
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1090 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
|
1091 del self.subscriptions[profile][entity_jid] |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1092 |
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
|
1093 def getWaitingSub(self, profile_key): |
47 | 1094 """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
|
1095 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
|
1096 if not profile: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1097 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
|
1098 return {} |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1099 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
|
1100 return {} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1101 |
65
d35c5edab53f
SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
1102 return self.subscriptions[profile] |
0 | 1103 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1104 ## Parameters ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1105 |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
914
diff
changeset
|
1106 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
|
1107 return self.params.getStringParamA(name, category, attr, profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1108 |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
914
diff
changeset
|
1109 def getParamA(self, name, category, attr="value", profile_key=C.PROF_KEY_NONE): |
1534
a5e0393a06cd
plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
1519
diff
changeset
|
1110 return self.params.getParamA(name, category, attr, profile_key=profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1111 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1112 def asyncGetParamA( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1113 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1114 name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1115 category, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1116 attr="value", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1117 security_limit=C.NO_SECURITY_LIMIT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1118 profile_key=C.PROF_KEY_NONE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1119 ): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1120 return self.params.asyncGetParamA( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1121 name, category, attr, security_limit, profile_key |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1122 ) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1123 |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1124 def _getParamsValuesFromCategory( |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1125 self, category, security_limit, app, extra_s, profile_key |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1126 ): |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1127 return self.params._getParamsValuesFromCategory( |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1128 category, security_limit, app, extra_s, profile_key |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1129 ) |
1587
698d6755d62a
core, bridge (params): added asyncGetParamsValuesFromCategory (yes that's a long name!) method to retrive params names and values for a given category
Goffi <goffi@goffi.org>
parents:
1586
diff
changeset
|
1130 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1131 def asyncGetStringParamA( |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1132 self, name, category, attr="value", security_limit=C.NO_SECURITY_LIMIT, |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1133 profile_key=C.PROF_KEY_NONE): |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1134 |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1135 profile = self.getProfileName(profile_key) |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1136 return defer.ensureDeferred(self.params.asyncGetStringParamA( |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1137 name, category, attr, security_limit, profile |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1138 )) |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1139 |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1140 def _getParamsUI(self, security_limit, app, extra_s, profile_key): |
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1141 return self.params._getParamsUI(security_limit, app, extra_s, profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1142 |
0 | 1143 def getParamsCategories(self): |
17
74a39f40eb6d
refactoring: using xml params (not finished yet)
Goffi <goffi@goffi.org>
parents:
14
diff
changeset
|
1144 return self.params.getParamsCategories() |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1145 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1146 def setParam( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1147 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1148 name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1149 value, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1150 category, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1151 security_limit=C.NO_SECURITY_LIMIT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1152 profile_key=C.PROF_KEY_NONE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1153 ): |
641
49587e170f53
core: added the security_limit to setParam
souliane <souliane@mailoo.org>
parents:
639
diff
changeset
|
1154 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
|
1155 |
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
|
1156 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
|
1157 return self.params.updateParams(xml) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1158 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1159 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
|
1160 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
|
1161 |
20
fc8c202cda87
refactoring: using xml params part IV (default values)
Goffi <goffi@goffi.org>
parents:
19
diff
changeset
|
1162 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
|
1163 return self.params.setDefault(name, category, callback, errback) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1164 |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1165 ## Private Data ## |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1166 |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1167 def _privateDataSet(self, namespace, key, data_s, profile_key): |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1168 client = self.host.getClient(profile_key) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1169 # we accept any type |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1170 data = data_format.deserialise(data_s, type_check=None) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1171 return self.storage.setPrivateValue( |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1172 namespace, key, data, binary=True, profile=client.profile) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1173 |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1174 def _privateDataGet(self, namespace, key, profile_key): |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1175 client = self.host.getClient(profile_key) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1176 d = self.storage.getPrivates( |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1177 namespace, [key], binary=True, profile=client.profile) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1178 d.addCallback(lambda data_dict: data_format.serialise(data_dict.get(key))) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1179 return d |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1180 |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1181 def _privateDataDelete(self, namespace, key, profile_key): |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1182 client = self.host.getClient(profile_key) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1183 return self.storage.delPrivateValue( |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1184 namespace, key, binary=True, profile=client.profile) |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1185 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1186 ## Files ## |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1187 |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1188 def checkFilePermission( |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1189 self, |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1190 file_data: dict, |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1191 peer_jid: Optional[jid.JID], |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1192 perms_to_check: Optional[Tuple[str]], |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1193 set_affiliation: bool = False |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1194 ) -> None: |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1195 """Check that an entity has the right permission on a file |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1196 |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1197 @param file_data: data of one file, as returned by getFiles |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1198 @param peer_jid: entity trying to access the file |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1199 @param perms_to_check: permissions to check |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1200 tuple of C.ACCESS_PERM_* |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1201 @param check_parents: if True, also check all parents until root node |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1202 @parma set_affiliation: if True, "affiliation" metadata will be set |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1203 @raise exceptions.PermissionError: peer_jid doesn't have all permission |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1204 in perms_to_check for file_data |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1205 @raise exceptions.InternalError: perms_to_check is invalid |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1206 """ |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1207 # TODO: knowing if user is owner is not enough, we need to check permission |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1208 # to see if user can modify/delete files, and set corresponding affiliation (publisher, member) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1209 if peer_jid is None and perms_to_check is None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1210 return |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1211 peer_jid = peer_jid.userhostJID() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1212 if peer_jid == file_data["owner"]: |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1213 if set_affiliation: |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1214 file_data['affiliation'] = 'owner' |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1215 # the owner has all rights, nothing to check |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1216 return |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1217 if not C.ACCESS_PERMS.issuperset(perms_to_check): |
3028 | 1218 raise exceptions.InternalError(_("invalid permission")) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1219 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1220 for perm in perms_to_check: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1221 # we check each perm and raise PermissionError as soon as one condition is not valid |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1222 # we must never return here, we only return after the loop if nothing was blocking the access |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1223 try: |
3028 | 1224 perm_data = file_data["access"][perm] |
1225 perm_type = perm_data["type"] | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1226 except KeyError: |
3317
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1227 # No permission is set. |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1228 # If we are in a root file/directory, we deny access |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1229 # otherwise, we use public permission, as the parent directory will |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1230 # block anyway, this avoid to have to recursively change permissions for |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1231 # all sub directories/files when modifying a permission |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1232 if not file_data.get('parent'): |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1233 raise exceptions.PermissionError() |
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1234 else: |
3349
2a7e36b69fd2
core (memory/memory): fixed assignations
Goffi <goffi@goffi.org>
parents:
3346
diff
changeset
|
1235 perm_type = C.ACCESS_TYPE_PUBLIC |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1236 if perm_type == C.ACCESS_TYPE_PUBLIC: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1237 continue |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1238 elif perm_type == C.ACCESS_TYPE_WHITELIST: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1239 try: |
3028 | 1240 jids = perm_data["jids"] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1241 except KeyError: |
2926
4cd7545c4ebb
core (memory): raise PermissionError directly instead of using failureFailure, as it could not be catched correctly in every case.
Goffi <goffi@goffi.org>
parents:
2924
diff
changeset
|
1242 raise exceptions.PermissionError() |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1243 if peer_jid.full() in jids: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1244 continue |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1245 else: |
2926
4cd7545c4ebb
core (memory): raise PermissionError directly instead of using failureFailure, as it could not be catched correctly in every case.
Goffi <goffi@goffi.org>
parents:
2924
diff
changeset
|
1246 raise exceptions.PermissionError() |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1247 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1248 raise exceptions.InternalError( |
3028 | 1249 _("unknown access type: {type}").format(type=perm_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1250 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1251 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1252 @defer.inlineCallbacks |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1253 def checkPermissionToRoot(self, client, file_data, peer_jid, perms_to_check): |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1254 """do checkFilePermission on file_data and all its parents until root""" |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1255 current = file_data |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1256 while True: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1257 self.checkFilePermission(current, peer_jid, perms_to_check) |
3028 | 1258 parent = current["parent"] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1259 if not parent: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1260 break |
3040 | 1261 files_data = yield self.getFiles( |
1262 client, peer_jid=None, file_id=parent, perms_to_check=None | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1263 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1264 try: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1265 current = files_data[0] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1266 except IndexError: |
3028 | 1267 raise exceptions.DataError("Missing parent") |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1268 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1269 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1270 def _getParentDir( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1271 self, client, path, parent, namespace, owner, peer_jid, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1272 ): |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1273 """Retrieve parent node from a path, or last existing directory |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1274 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1275 each directory of the path will be retrieved, until the last existing one |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1276 @return (tuple[unicode, list[unicode])): parent, remaining path elements: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1277 - parent is the id of the last retrieved directory (or u'' for root) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1278 - remaining path elements are the directories which have not been retrieved |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1279 (i.e. which don't exist) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1280 """ |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1281 # if path is set, we have to retrieve parent directory of the file(s) from it |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1282 if parent is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1283 raise exceptions.ConflictError( |
3028 | 1284 _("You can't use path and parent at the same time") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1285 ) |
3028 | 1286 path_elts = [_f for _f in path.split("/") if _f] |
1287 if {"..", "."}.intersection(path_elts): | |
1288 raise ValueError(_('".." or "." can\'t be used in path')) | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1289 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1290 # we retrieve all directories from path until we get the parent container |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1291 # non existing directories will be created |
3028 | 1292 parent = "" |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1293 for idx, path_elt in enumerate(path_elts): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1294 directories = yield self.storage.getFiles( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1295 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1296 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1297 type_=C.FILE_TYPE_DIRECTORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1298 name=path_elt, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1299 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1300 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1301 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1302 if not directories: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1303 defer.returnValue((parent, path_elts[idx:])) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1304 # from this point, directories don't exist anymore, we have to create them |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1305 elif len(directories) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1306 raise exceptions.InternalError( |
3028 | 1307 _("Several directories found, this should not happen") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1308 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1309 else: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1310 directory = directories[0] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1311 self.checkFilePermission(directory, peer_jid, perms_to_check) |
3028 | 1312 parent = directory["id"] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1313 defer.returnValue((parent, [])) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1314 |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1315 def getFileAffiliations(self, file_data: dict) -> Dict[jid.JID, str]: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1316 """Convert file access to pubsub like affiliations""" |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1317 affiliations = {} |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1318 access_data = file_data['access'] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1319 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1320 read_data = access_data.get(C.ACCESS_PERM_READ, {}) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1321 if read_data.get('type') == C.ACCESS_TYPE_WHITELIST: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1322 for entity_jid_s in read_data['jids']: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1323 entity_jid = jid.JID(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1324 affiliations[entity_jid] = 'member' |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1325 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1326 write_data = access_data.get(C.ACCESS_PERM_WRITE, {}) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1327 if write_data.get('type') == C.ACCESS_TYPE_WHITELIST: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1328 for entity_jid_s in write_data['jids']: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1329 entity_jid = jid.JID(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1330 affiliations[entity_jid] = 'publisher' |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1331 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1332 owner = file_data.get('owner') |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1333 if owner: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1334 affiliations[owner] = 'owner' |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1335 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1336 return affiliations |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1337 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1338 def _setFileAffiliationsUpdate( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1339 self, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1340 access: dict, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1341 file_data: dict, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1342 affiliations: Dict[jid.JID, str] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1343 ) -> None: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1344 read_data = access.setdefault(C.ACCESS_PERM_READ, {}) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1345 if read_data.get('type') != C.ACCESS_TYPE_WHITELIST: |
3349
2a7e36b69fd2
core (memory/memory): fixed assignations
Goffi <goffi@goffi.org>
parents:
3346
diff
changeset
|
1346 read_data['type'] = C.ACCESS_TYPE_WHITELIST |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1347 if 'jids' not in read_data: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1348 read_data['jids'] = [] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1349 read_whitelist = read_data['jids'] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1350 write_data = access.setdefault(C.ACCESS_PERM_WRITE, {}) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1351 if write_data.get('type') != C.ACCESS_TYPE_WHITELIST: |
3349
2a7e36b69fd2
core (memory/memory): fixed assignations
Goffi <goffi@goffi.org>
parents:
3346
diff
changeset
|
1352 write_data['type'] = C.ACCESS_TYPE_WHITELIST |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1353 if 'jids' not in write_data: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1354 write_data['jids'] = [] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1355 write_whitelist = write_data['jids'] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1356 for entity_jid, affiliation in affiliations.items(): |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1357 entity_jid_s = entity_jid.full() |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1358 if affiliation == "none": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1359 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1360 read_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1361 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1362 log.warning( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1363 "removing affiliation from an entity without read permission: " |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1364 f"{entity_jid}" |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1365 ) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1366 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1367 write_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1368 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1369 pass |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1370 elif affiliation == "publisher": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1371 if entity_jid_s not in read_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1372 read_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1373 if entity_jid_s not in write_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1374 write_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1375 elif affiliation == "member": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1376 if entity_jid_s not in read_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1377 read_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1378 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1379 write_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1380 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1381 pass |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1382 elif affiliation == "owner": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1383 raise NotImplementedError('"owner" affiliation can\'t be set') |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1384 else: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1385 raise ValueError(f"unknown affiliation: {affiliation!r}") |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1386 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1387 async def setFileAffiliations( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1388 self, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1389 client, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1390 file_data: dict, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1391 affiliations: Dict[jid.JID, str] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1392 ) -> None: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1393 """Apply pubsub like affiliation to file_data |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1394 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1395 Affiliations are converted to access types, then set in a whitelist. |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1396 Affiliation are mapped as follow: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1397 - "owner" can't be set (for now) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1398 - "publisher" gives read and write permissions |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1399 - "member" gives read permission only |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1400 - "none" removes both read and write permissions |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1401 """ |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1402 file_id = file_data['id'] |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1403 await self.fileUpdate( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1404 file_id, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1405 'access', |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1406 update_cb=partial( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1407 self._setFileAffiliationsUpdate, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1408 file_data=file_data, |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1409 affiliations=affiliations |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1410 ), |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1411 ) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1412 |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1413 def _setFileAccessModelUpdate( |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1414 self, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1415 access: dict, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1416 file_data: dict, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1417 access_model: str |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1418 ) -> None: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1419 read_data = access.setdefault(C.ACCESS_PERM_READ, {}) |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1420 if access_model == "open": |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1421 requested_type = C.ACCESS_TYPE_PUBLIC |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1422 elif access_model == "whitelist": |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1423 requested_type = C.ACCESS_TYPE_WHITELIST |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1424 else: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1425 raise ValueError(f"unknown access model: {access_model}") |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1426 |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1427 read_data['type'] = requested_type |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1428 if requested_type == C.ACCESS_TYPE_WHITELIST and 'jids' not in read_data: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1429 read_data['jids'] = [] |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1430 |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1431 async def setFileAccessModel( |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1432 self, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1433 client, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1434 file_data: dict, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1435 access_model: str, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1436 ) -> None: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1437 """Apply pubsub like access_model to file_data |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1438 |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1439 Only 2 access models are supported so far: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1440 - "open": set public access to file/dir |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1441 - "whitelist": set whitelist to file/dir |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1442 """ |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1443 file_id = file_data['id'] |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1444 await self.fileUpdate( |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1445 file_id, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1446 'access', |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1447 update_cb=partial( |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1448 self._setFileAccessModelUpdate, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1449 file_data=file_data, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1450 access_model=access_model |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1451 ), |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1452 ) |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1453 |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1454 def getFilesOwner( |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1455 self, |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1456 client, |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1457 owner: Optional[jid.JID], |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1458 peer_jid: Optional[jid.JID], |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1459 file_id: Optional[str] = None, |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1460 parent: Optional[str] = None |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1461 ) -> jid.JID: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1462 """Get owner to use for a file operation |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1463 |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1464 if owner is not explicitely set, a suitable one will be used (client.jid for |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1465 clients, peer_jid for components). |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1466 @raise exception.InternalError: we are one a component, and neither owner nor |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1467 peer_jid are set |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1468 """ |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1469 if owner is not None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1470 return owner.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1471 if client is None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1472 # client may be None when looking for file with public_id |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1473 return None |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1474 if file_id or parent: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1475 # owner has already been filtered on parent file |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1476 return None |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1477 if not client.is_component: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1478 return client.jid.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1479 if peer_jid is None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1480 raise exceptions.InternalError( |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1481 "Owner must be set for component if peer_jid is None" |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1482 ) |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1483 return peer_jid.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1484 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1485 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1486 def getFiles( |
2924 | 1487 self, client, peer_jid, file_id=None, version=None, parent=None, path=None, |
1488 type_=None, file_hash=None, hash_algo=None, name=None, namespace=None, | |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1489 mime_type=None, public_id=None, owner=None, access=None, projection=None, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1490 unique=False, perms_to_check=(C.ACCESS_PERM_READ,)): |
2924 | 1491 """Retrieve files with with given filters |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1492 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1493 @param peer_jid(jid.JID, None): jid trying to access the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1494 needed to check permission. |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1495 Use None to ignore permission (perms_to_check must be None too) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1496 @param file_id(unicode, None): id of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1497 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1498 @param version(unicode, None): version of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1499 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1500 empty string to look for current version |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1501 @param parent(unicode, None): id of the directory containing the files |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1502 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1503 empty string to look for root files/directories |
3358
b14e95f7034f
core (memory/memory): use `str` for `path` in `getFiles` and `setFile` to allow use of `Path` instances
Goffi <goffi@goffi.org>
parents:
3349
diff
changeset
|
1504 @param path(Path, unicode, None): path to the directory containing the files |
2924 | 1505 @param type_(unicode, None): type of file filter, can be one of C.FILE_TYPE_* |
1506 @param file_hash(unicode, None): hash of the file to retrieve | |
1507 @param hash_algo(unicode, None): algorithm use for file_hash | |
1508 @param name(unicode, None): name of the file to retrieve | |
1509 @param namespace(unicode, None): namespace of the files to retrieve | |
1510 @param mime_type(unicode, None): filter on this mime type | |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1511 @param public_id(unicode, None): filter on this public id |
2924 | 1512 @param owner(jid.JID, None): if not None, only get files from this owner |
1513 @param access(dict, None): get file with given access (see [setFile]) | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1514 @param projection(list[unicode], None): name of columns to retrieve |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1515 None to retrieve all |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1516 @param unique(bool): if True will remove duplicates |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1517 @param perms_to_check(tuple[unicode],None): permission to check |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1518 must be a tuple of C.ACCESS_PERM_* or None |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1519 if None, permission will no be checked (peer_jid must be None too in this |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1520 case) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1521 other params are the same as for [setFile] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1522 @return (list[dict]): files corresponding to filters |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1523 @raise exceptions.NotFound: parent directory not found (when path is specified) |
2924 | 1524 @raise exceptions.PermissionError: peer_jid can't use perms_to_check for one of |
1525 the file | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1526 on the path |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1527 """ |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1528 if peer_jid is None and perms_to_check or perms_to_check is None and peer_jid: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1529 raise exceptions.InternalError( |
3028 | 1530 "if you want to disable permission check, both peer_jid and " |
1531 "perms_to_check must be None" | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1532 ) |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1533 owner = self.getFilesOwner(client, owner, peer_jid, file_id, parent) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1534 if path is not None: |
3358
b14e95f7034f
core (memory/memory): use `str` for `path` in `getFiles` and `setFile` to allow use of `Path` instances
Goffi <goffi@goffi.org>
parents:
3349
diff
changeset
|
1535 path = str(path) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1536 # permission are checked by _getParentDir |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1537 parent, remaining_path_elts = yield self._getParentDir( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1538 client, path, parent, namespace, owner, peer_jid, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1539 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1540 if remaining_path_elts: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1541 # if we have remaining path elements, |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1542 # the parent directory is not found |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1543 raise failure.Failure(exceptions.NotFound()) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1544 if parent and peer_jid: |
2924 | 1545 # if parent is given directly and permission check is requested, |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1546 # we need to check all the parents |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1547 parent_data = yield self.storage.getFiles(client, file_id=parent) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1548 try: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1549 parent_data = parent_data[0] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1550 except IndexError: |
3028 | 1551 raise exceptions.DataError("mising parent") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1552 yield self.checkPermissionToRoot( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1553 client, parent_data, peer_jid, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1554 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1555 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1556 files = yield self.storage.getFiles( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1557 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1558 file_id=file_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1559 version=version, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1560 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1561 type_=type_, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1562 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1563 hash_algo=hash_algo, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1564 name=name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1565 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1566 mime_type=mime_type, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1567 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1568 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1569 access=access, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1570 projection=projection, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1571 unique=unique, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1572 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1573 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1574 if peer_jid: |
2924 | 1575 # if permission are checked, we must remove all file that user can't access |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1576 to_remove = [] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1577 for file_data in files: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1578 try: |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1579 self.checkFilePermission(file_data, peer_jid, perms_to_check, set_affiliation=True) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1580 except exceptions.PermissionError: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1581 to_remove.append(file_data) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1582 for file_data in to_remove: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1583 files.remove(file_data) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1584 defer.returnValue(files) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1585 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1586 @defer.inlineCallbacks |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1587 def setFile( |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1588 self, client, name, file_id=None, version="", parent=None, path=None, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1589 type_=C.FILE_TYPE_FILE, file_hash=None, hash_algo=None, size=None, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1590 namespace=None, mime_type=None, public_id=None, created=None, modified=None, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1591 owner=None, access=None, extra=None, peer_jid=None, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1592 perms_to_check=(C.ACCESS_PERM_WRITE,) |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1593 ): |
2924 | 1594 """Set a file metadata |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1595 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1596 @param name(unicode): basename of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1597 @param file_id(unicode): unique id of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1598 @param version(unicode): version of this file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1599 empty string for current version or when there is no versioning |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1600 @param parent(unicode, None): id of the directory containing the files |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1601 @param path(unicode, None): virtual path of the file in the namespace |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1602 if set, parent must be None. All intermediate directories will be created |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1603 if needed, using current access. |
3361
43e60c40de65
core (memory/memory): fixed directory creation in setFile
Goffi <goffi@goffi.org>
parents:
3358
diff
changeset
|
1604 @param type_(str, None): type of file filter, can be one of C.FILE_TYPE_* |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1605 @param file_hash(unicode): unique hash of the payload |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1606 @param hash_algo(unicode): algorithm used for hashing the file (usually sha-256) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1607 @param size(int): size in bytes |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1608 @param namespace(unicode, None): identifier (human readable is better) to group |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1609 files |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1610 For instance, namespace could be used to group files in a specific photo album |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1611 @param mime_type(unicode): MIME type of the file, or None if not known/guessed |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1612 @param public_id(unicode): id used to share publicly the file via HTTP |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1613 @param created(int): UNIX time of creation |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1614 @param modified(int,None): UNIX time of last modification, or None to use |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1615 created date |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1616 @param owner(jid.JID, None): jid of the owner of the file (mainly useful for |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1617 component) |
2518
e4de2f16a284
core (memory): use bare jid for owner in setFiles:
Goffi <goffi@goffi.org>
parents:
2508
diff
changeset
|
1618 will be used to check permission (only bare jid is used, don't use with MUC). |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1619 Use None to ignore permission (perms_to_check must be None too) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1620 @param access(dict, None): serialisable dictionary with access rules. |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1621 None (or empty dict) to use private access, i.e. allow only profile's jid to |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1622 access the file |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1623 key can be on on C.ACCESS_PERM_*, |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1624 then a sub dictionary with a type key is used (one of C.ACCESS_TYPE_*). |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1625 According to type, extra keys can be used: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1626 - C.ACCESS_TYPE_PUBLIC: the permission is granted for everybody |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1627 - C.ACCESS_TYPE_WHITELIST: the permission is granted for jids (as unicode) |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1628 in the 'jids' key |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1629 will be encoded to json in database |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1630 @param extra(dict, None): serialisable dictionary of any extra data |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1631 will be encoded to json in database |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1632 @param perms_to_check(tuple[unicode],None): permission to check |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1633 must be a tuple of C.ACCESS_PERM_* or None |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1634 if None, permission will not be checked (peer_jid must be None too in this |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1635 case) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1636 @param profile(unicode): profile owning the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1637 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1638 if "/" in name: |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1639 raise ValueError('name must not contain a slash ("/")') |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1640 if file_id is None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1641 file_id = shortuuid.uuid() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1642 if ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1643 file_hash is not None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1644 and hash_algo is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1645 or hash_algo is not None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1646 and file_hash is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1647 ): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1648 raise ValueError("file_hash and hash_algo must be set at the same time") |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1649 if mime_type is None: |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1650 mime_type, __ = mimetypes.guess_type(name) |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1651 else: |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1652 mime_type = mime_type.lower() |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1653 if public_id is not None: |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1654 assert len(public_id)>0 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1655 if created is None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1656 created = time.time() |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1657 if namespace is not None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1658 namespace = namespace.strip() or None |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1659 if type_ == C.FILE_TYPE_DIRECTORY: |
3361
43e60c40de65
core (memory/memory): fixed directory creation in setFile
Goffi <goffi@goffi.org>
parents:
3358
diff
changeset
|
1660 if any((version, file_hash, size, mime_type)): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1661 raise ValueError( |
3028 | 1662 "version, file_hash, size and mime_type can't be set for a directory" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1663 ) |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1664 owner = self.getFilesOwner(client, owner, peer_jid, file_id, parent) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1665 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1666 if path is not None: |
3358
b14e95f7034f
core (memory/memory): use `str` for `path` in `getFiles` and `setFile` to allow use of `Path` instances
Goffi <goffi@goffi.org>
parents:
3349
diff
changeset
|
1667 path = str(path) |
2518
e4de2f16a284
core (memory): use bare jid for owner in setFiles:
Goffi <goffi@goffi.org>
parents:
2508
diff
changeset
|
1668 # _getParentDir will check permissions if peer_jid is set, so we use owner |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1669 parent, remaining_path_elts = yield self._getParentDir( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1670 client, path, parent, namespace, owner, owner, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1671 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1672 # if remaining directories don't exist, we have to create them |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1673 for new_dir in remaining_path_elts: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1674 new_dir_id = shortuuid.uuid() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1675 yield self.storage.setFile( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1676 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1677 name=new_dir, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1678 file_id=new_dir_id, |
3028 | 1679 version="", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1680 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1681 type_=C.FILE_TYPE_DIRECTORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1682 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1683 created=time.time(), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1684 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1685 access=access, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1686 extra={}, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1687 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1688 parent = new_dir_id |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1689 elif parent is None: |
3028 | 1690 parent = "" |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1691 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1692 yield self.storage.setFile( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1693 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1694 file_id=file_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1695 version=version, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1696 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1697 type_=type_, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1698 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1699 hash_algo=hash_algo, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1700 name=name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1701 size=size, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1702 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1703 mime_type=mime_type, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1704 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1705 created=created, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1706 modified=modified, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1707 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1708 access=access, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1709 extra=extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1710 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1711 |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1712 async def fileGetUsedSpace( |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1713 self, |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1714 client, |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1715 peer_jid: jid.JID, |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1716 owner: Optional[jid.JID] = None |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1717 ) -> int: |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1718 """Get space taken by all files owned by an entity |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1719 |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1720 @param peer_jid: entity requesting the size |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1721 @param owner: entity owning the file to check. If None, will be determined by |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1722 getFilesOwner |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1723 @return: size of total space used by files of this owner |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1724 """ |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1725 owner = self.getFilesOwner(client, owner, peer_jid) |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1726 if peer_jid.userhostJID() != owner and client.profile not in self.admins: |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1727 raise exceptions.PermissionError("You are not allowed to check this size") |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1728 return await self.storage.fileGetUsedSpace(client, owner) |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1729 |
2526
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1730 def fileUpdate(self, file_id, column, update_cb): |
2926
4cd7545c4ebb
core (memory): raise PermissionError directly instead of using failureFailure, as it could not be catched correctly in every case.
Goffi <goffi@goffi.org>
parents:
2924
diff
changeset
|
1731 """Update a file column taking care of race condition |
2526
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1732 |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1733 access is NOT checked in this method, it must be checked beforehand |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1734 @param file_id(unicode): id of the file to update |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1735 @param column(unicode): one of "access" or "extra" |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1736 @param update_cb(callable): method to update the value of the colum |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1737 the method will take older value as argument, and must update it in place |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1738 Note that the callable must be thread-safe |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1739 """ |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1740 return self.storage.fileUpdate(file_id, column, update_cb) |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1741 |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1742 @defer.inlineCallbacks |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1743 def _deleteFile( |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1744 self, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1745 client, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1746 peer_jid: jid.JID, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1747 recursive: bool, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1748 files_path: Path, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1749 file_data: dict |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1750 ): |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1751 """Internal method to delete files/directories recursively |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1752 |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1753 @param peer_jid(jid.JID): entity requesting the deletion (must be owner of files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1754 to delete) |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1755 @param recursive(boolean): True if recursive deletion is needed |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1756 @param files_path(unicode): path of the directory containing the actual files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1757 @param file_data(dict): data of the file to delete |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1758 """ |
3028 | 1759 if file_data['owner'] != peer_jid: |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1760 raise exceptions.PermissionError( |
3028 | 1761 "file {file_name} can't be deleted, {peer_jid} is not the owner" |
1762 .format(file_name=file_data['name'], peer_jid=peer_jid.full())) | |
1763 if file_data['type'] == C.FILE_TYPE_DIRECTORY: | |
1764 sub_files = yield self.getFiles(client, peer_jid, parent=file_data['id']) | |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1765 if sub_files and not recursive: |
3028 | 1766 raise exceptions.DataError(_("Can't delete directory, it is not empty")) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1767 # we first delete the sub-files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1768 for sub_file_data in sub_files: |
3300
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1769 if sub_file_data['type'] == C.FILE_TYPE_DIRECTORY: |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1770 sub_file_path = files_path / sub_file_data['name'] |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1771 else: |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1772 sub_file_path = files_path |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1773 yield self._deleteFile( |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1774 client, peer_jid, recursive, sub_file_path, sub_file_data) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1775 # then the directory itself |
3028 | 1776 yield self.storage.fileDelete(file_data['id']) |
1777 elif file_data['type'] == C.FILE_TYPE_FILE: | |
1778 log.info(_("deleting file {name} with hash {file_hash}").format( | |
1779 name=file_data['name'], file_hash=file_data['file_hash'])) | |
1780 yield self.storage.fileDelete(file_data['id']) | |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1781 references = yield self.getFiles( |
3028 | 1782 client, peer_jid, file_hash=file_data['file_hash']) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1783 if references: |
3028 | 1784 log.debug("there are still references to the file, we keep it") |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1785 else: |
3028 | 1786 file_path = os.path.join(files_path, file_data['file_hash']) |
1787 log.info(_("no reference left to {file_path}, deleting").format( | |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1788 file_path=file_path)) |
3300
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1789 try: |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1790 os.unlink(file_path) |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1791 except FileNotFoundError: |
b56e4c6b13fc
core (memory): fixed recursive file deletion + log an error and continue when deleting a missing file
Goffi <goffi@goffi.org>
parents:
3288
diff
changeset
|
1792 log.error(f"file at {file_path!r} doesn't exist but it was referenced in files database") |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1793 else: |
3028 | 1794 raise exceptions.InternalError('Unexpected file type: {file_type}' |
1795 .format(file_type=file_data['type'])) | |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1796 |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1797 @defer.inlineCallbacks |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1798 def fileDelete(self, client, peer_jid, file_id, recursive=False): |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1799 """Delete a single file or a directory and all its sub-files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1800 |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1801 @param file_id(unicode): id of the file to delete |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1802 @param peer_jid(jid.JID): entity requesting the deletion, |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1803 must be owner of all files to delete |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1804 @param recursive(boolean): must be True to delete a directory and all sub-files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1805 """ |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1806 # FIXME: we only allow owner of file to delete files for now, but WRITE access |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1807 # should be checked too |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1808 files_data = yield self.getFiles(client, peer_jid, file_id) |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1809 if not files_data: |
3028 | 1810 raise exceptions.NotFound("Can't find the file with id {file_id}".format( |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1811 file_id=file_id)) |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1812 file_data = files_data[0] |
3028 | 1813 if file_data["type"] != C.FILE_TYPE_DIRECTORY and recursive: |
1814 raise ValueError("recursive can only be set for directories") | |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1815 files_path = self.host.getLocalPath(None, C.FILES_DIR, profile=False) |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1816 yield self._deleteFile(client, peer_jid, recursive, files_path, file_data) |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1817 |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1818 ## Cache ## |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1819 |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1820 def getCachePath(self, namespace: str, *args: str) -> Path: |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1821 """Get path to use to get a common path for a namespace |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1822 |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1823 This can be used by plugins to manage permanent data. It's the responsability |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1824 of plugins to clean this directory from unused data. |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1825 @param namespace: unique namespace to use |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1826 @param args: extra identifier which will be added to the path |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1827 """ |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1828 namespace = namespace.strip().lower() |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1829 return Path( |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1830 self._cache_path, |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1831 regex.pathEscape(namespace), |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1832 *(regex.pathEscape(a) for a in args) |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1833 ) |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1834 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1835 ## Misc ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1836 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
1837 def isEntityAvailable(self, client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1838 """Tell from the presence information if the given entity is available. |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1839 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1840 @param entity_jid (JID): the entity to check (if bare jid is used, all resources are tested) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1841 @return (bool): True if entity is available |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1842 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1843 if not entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1844 return bool( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1845 self.getAvailableResources(client, entity_jid) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1846 ) # is any resource is available, entity is available |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1847 try: |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
1848 presence_data = self.getEntityDatum(client, entity_jid, "presence") |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1849 except KeyError: |
3028 | 1850 log.debug("No presence information for {}".format(entity_jid)) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1851 return False |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1852 return presence_data.show != C.PRESENCE_UNAVAILABLE |