Mercurial > libervia-backend
annotate libervia/backend/memory/memory.py @ 4340:ea72364131d5 default tip @
doc (components): Update Email Gateway documentation:
A section has been added to explain how attachments are handled.
fix 453
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 03 Dec 2024 00:53:18 +0100 |
parents | e94799a0908f |
children |
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 |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
19 from collections import namedtuple |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
20 import copy |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
21 from dataclasses import dataclass |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
22 from functools import partial |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
23 import mimetypes |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
24 import os.path |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
25 from pathlib import Path |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
26 import time |
4266
9fc3d28bc3f6
core (main): add a mechanism to have a shared temp directory:
Goffi <goffi@goffi.org>
parents:
4193
diff
changeset
|
27 from typing import Any, Dict, Optional, Tuple |
3206
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
28 from uuid import uuid4 |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
29 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
30 import shortuuid |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
31 from twisted.internet import defer, error, reactor |
1447 | 32 from twisted.python import failure |
47 | 33 from twisted.words.protocols.jabber import jid |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
34 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
35 from libervia.backend.core import exceptions |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
36 from libervia.backend.core.constants import Const as C |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
37 from libervia.backend.core.core_types import SatXMPPEntity |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
38 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
39 from libervia.backend.core.log import getLogger |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
40 from libervia.backend.memory.crypto import BlockCipher |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
41 from libervia.backend.memory.crypto import PasswordHasher |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
42 from libervia.backend.memory.disco import Discovery |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
43 from libervia.backend.memory.params import Params |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
44 from libervia.backend.memory.persistent import PersistentDict |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
45 from libervia.backend.memory.sqla import ( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
46 Notification, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
47 NotificationPriority, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
48 NotificationStatus, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
49 NotificationType, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
50 Storage, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
51 ) |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
52 from libervia.backend.tools import config as tools_config |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
53 from libervia.backend.tools.common import data_format |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
54 from libervia.backend.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
|
55 |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
56 |
ae09989e9feb
core, bridge: new `devicesInfosGet` method to get infos on known devices of an entity
Goffi <goffi@goffi.org>
parents:
3170
diff
changeset
|
57 log = getLogger(__name__) |
420
acd908528ef7
core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents:
418
diff
changeset
|
58 |
679
59c9a7ff903d
wix, misc: use picture of dimension 32x32 for tray icon + better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
677
diff
changeset
|
59 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
60 PresenceTuple = namedtuple("PresenceTuple", ("show", "priority", "statuses")) |
1447 | 61 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
|
62 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
63 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
64 class Sessions(object): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
65 """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
|
66 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
67 DEFAULT_TIMEOUT = 600 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
68 |
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
|
69 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
|
70 """ |
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
|
71 @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
|
72 @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
|
73 """ |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
74 self._sessions = dict() |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
75 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
|
76 self.resettable_timeout = resettable_timeout |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
77 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
78 def new_session(self, session_data=None, session_id=None, profile=None): |
1447 | 79 """Create a new session |
80 | |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
81 @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
|
82 @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
|
83 @param profile: if set, the session is owned by the profile, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
84 and profile_get 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
|
85 @return: session_id, session_data |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
86 """ |
1212
628e320eab1f
memory: Sessions.newSession can be called with a forced session ID
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
87 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
|
88 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
|
89 elif session_id in self._sessions: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
90 raise exceptions.ConflictError( |
3028 | 91 "Session id {} is already used".format(session_id) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
92 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
93 timer = reactor.callLater(self.timeout, self._purge_session, session_id) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
94 if session_data is None: |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
95 session_data = {} |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
96 self._sessions[session_id] = ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
97 (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
|
98 ) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
99 return session_id, session_data |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
100 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
101 def _purge_session(self, session_id): |
1447 | 102 try: |
103 timer, session_data, profile = self._sessions[session_id] | |
104 except ValueError: | |
105 timer, session_data = self._sessions[session_id] | |
106 profile = None | |
107 try: | |
108 timer.cancel() | |
109 except error.AlreadyCalled: | |
110 # if the session is time-outed, the timer has been called | |
111 pass | |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
112 del self._sessions[session_id] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
113 log.debug( |
3028 | 114 "Session {} purged{}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
115 session_id, |
3028 | 116 " (profile {})".format(profile) if profile is not None else "", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
117 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
118 ) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
119 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
120 def __len__(self): |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
121 return len(self._sessions) |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
122 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
123 def __contains__(self, session_id): |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
124 return session_id in self._sessions |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
125 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
126 def profile_get(self, session_id, profile): |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
127 try: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
128 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
|
129 except ValueError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
130 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
131 "You need to use __getitem__ when profile is not set" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
132 ) |
1447 | 133 except KeyError: |
134 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
|
135 if profile_set != profile: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
136 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
|
137 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
|
138 timer.reset(self.timeout) |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
139 return session_data |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
140 |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
141 def __getitem__(self, session_id): |
757
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
142 try: |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
143 timer, session_data = self._sessions[session_id] |
bbe55c7bee43
core (memory): added optional profile checking in Sessions:
Goffi <goffi@goffi.org>
parents:
756
diff
changeset
|
144 except ValueError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
145 raise exceptions.InternalError( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
146 "You need to use profile_get instead of __getitem__ when profile is set" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
147 ) |
1447 | 148 except KeyError: |
149 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
|
150 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
|
151 timer.reset(self.timeout) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
152 return session_data |
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 __setitem__(self, key, value): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
155 raise NotImplementedError("You need do use new_session to create a session") |
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 def __delitem__(self, session_id): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
158 """delete the session data""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
159 self._purge_session(session_id) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
160 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
161 def keys(self): |
3028 | 162 return list(self._sessions.keys()) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
163 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
164 def iterkeys(self): |
3028 | 165 return iter(self._sessions.keys()) |
756
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
166 |
efa0e0f57950
core (memory): new Sessions management class (similar to dict)
Goffi <goffi@goffi.org>
parents:
751
diff
changeset
|
167 |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
168 class ProfileSessions(Sessions): |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
169 """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
|
170 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
|
171 """ |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
172 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
173 def _profile_get_all_ids(self, profile): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
174 """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
|
175 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
176 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
177 @return: a list containing the sessions ids |
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 ret = [] |
3028 | 180 for session_id in self._sessions.keys(): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
181 try: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
182 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
|
183 except ValueError: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
184 continue |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
185 if profile == profile_set: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
186 ret.append(session_id) |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
187 return ret |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
188 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
189 def profile_get_unique(self, profile): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
190 """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
|
191 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
192 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
193 @return: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
194 - mutable data (default: dict) of the unique session |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
195 - 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
|
196 - 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
|
197 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
198 ids = self._profile_get_all_ids(profile) |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
199 if len(ids) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
200 raise exceptions.InternalError( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
201 "profile_get_unique has been used but more than one session has been found!" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
202 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
203 return ( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
204 self.profile_get(ids[0], profile) if len(ids) == 1 else None |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
205 ) # XXX: timeout might be reset |
1214
ed3b01ed70d7
memory: profileSessions.profileGetUnique was not resetting the timer
souliane <souliane@mailoo.org>
parents:
1213
diff
changeset
|
206 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
207 def profile_del_unique(self, profile): |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
208 """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
|
209 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
210 @param profile: %(doc_profile)s |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
211 @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
|
212 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
213 ids = self._profile_get_all_ids(profile) |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
214 if len(ids) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
215 raise exceptions.InternalError( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
216 "profile_del_unique has been used but more than one session has been found!" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
217 ) |
1029
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
218 if len(ids) == 1: |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
219 del self._sessions[ids[0]] |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
220 |
f6182f6418ea
memory: add class ProfileSessions based on Sessions
souliane <souliane@mailoo.org>
parents:
1015
diff
changeset
|
221 |
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
|
222 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
|
223 |
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 # 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
|
225 # 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
|
226 # 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
|
227 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
|
228 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
|
229 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
230 def _purge_session(self, session_id): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
231 log.debug( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
232 "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
|
233 ) |
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
|
234 |
c6cf44e6330b
memory: temporary dirty hack to fix the personnal key issue after the auth session expired
souliane <souliane@mailoo.org>
parents:
1240
diff
changeset
|
235 |
3582
71516731d0aa
core (memory/sqla): database migration using Alembic:
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
236 class Memory: |
1199 | 237 """This class manage all the persistent information""" |
0 | 238 |
22
bb72c29f3432
added action cb mechanism for buttons. Tested with a temporary new user registration button.
Goffi <goffi@goffi.org>
parents:
21
diff
changeset
|
239 def __init__(self, host): |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
240 log.info(_("Memory manager init")) |
41
d24629c631fc
SàT: new constant management, a local dir (~/.sat) is now used
Goffi <goffi@goffi.org>
parents:
38
diff
changeset
|
241 self.host = host |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
242 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
|
243 # /!\ an entity is not necessarily in roster |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
244 # main key is bare jid, value is a dict |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
245 # where main key is resource, or None for bare jid |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
246 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
|
247 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
|
248 self.auth_sessions = PasswordSessions() # remember the authenticated profiles |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
249 self.disco = Discovery(host) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
250 self.config = tools_config.parse_main_conf(log_filenames=True) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
251 self._cache_path = Path(self.config_get("", "local_dir"), C.CACHE_DIR) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
252 self.admins = self.config_get("", "admins_list", []) |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
253 self.admin_jids = set() |
4269
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
254 self._file_path_lock = defer.DeferredLock() |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
255 |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
256 async def initialise(self): |
3582
71516731d0aa
core (memory/sqla): database migration using Alembic:
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
257 self.storage = Storage() |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
258 await self.storage.initialise() |
432
31e8c48b5f5d
core: - memory refactoring (moved memory.py and sqlite.py from tools to memory)
Goffi <goffi@goffi.org>
parents:
428
diff
changeset
|
259 PersistentDict.storage = self.storage |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
260 self.params = Params(self.host, self.storage) |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
261 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
|
262 self.params.load_default_params() |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
263 await 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
|
264 self.memory_data = PersistentDict("memory") |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
265 await self.memory_data.load() |
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
266 await self.disco.load() |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
267 for admin in self.admins: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
268 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
269 admin_jid_s = await self.param_get_a_async( |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
270 "JabberID", "Connection", profile_key=admin |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
271 ) |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
272 except Exception as e: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
273 log.warning(f"Can't retrieve jid of admin {admin!r}: {e}") |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
274 else: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
275 if admin_jid_s is not None: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
276 try: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
277 admin_jid = jid.JID(admin_jid_s).userhostJID() |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
278 except RuntimeError: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
279 log.warning(f"Invalid JID for admin {admin}: {admin_jid_s}") |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
280 else: |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
281 self.admin_jids.add(admin_jid) |
3537
f9a5b810f14d
core (memory/storage): backend storage is now based on SQLAlchemy
Goffi <goffi@goffi.org>
parents:
3523
diff
changeset
|
282 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
283 ## Configuration ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
284 |
4266
9fc3d28bc3f6
core (main): add a mechanism to have a shared temp directory:
Goffi <goffi@goffi.org>
parents:
4193
diff
changeset
|
285 def config_get( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
286 self, section: str | None, name: str, default: Any = None |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
287 ) -> str | list | dict: |
364 | 288 """Get the main configuration option |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
289 |
364 | 290 @param section: section of the config file (None or '' for DEFAULT) |
291 @param name: name of the option | |
1234
9c17bd37e6e5
core: better management of default value in getConfig
Goffi <goffi@goffi.org>
parents:
1224
diff
changeset
|
292 @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
|
293 @return: str, list or dict |
365
efbfccfed623
core: local_dir moved to config file
Goffi <goffi@goffi.org>
parents:
364
diff
changeset
|
294 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
295 return tools_config.config_get(self.config, section, name, default) |
364 | 296 |
677
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
297 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
|
298 """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
|
299 |
fee00f2e11c2
memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents:
1007
diff
changeset
|
300 @param filename (str): input file |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
301 @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
|
302 """ |
fee00f2e11c2
memory, jp: added jp commands to load/save parameters template
souliane <souliane@mailoo.org>
parents:
1007
diff
changeset
|
303 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
|
304 return False |
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
305 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
|
306 if os.path.exists(filename): |
0 | 307 try: |
677
9a50aa7feefb
core (memory): cleaned the part for load/save to xml (not used)
souliane <souliane@mailoo.org>
parents:
669
diff
changeset
|
308 self.params.load_xml(filename) |
3028 | 309 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
|
310 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
|
311 except Exception as e: |
3028 | 312 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
|
313 return False |
0 | 314 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
315 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
|
316 """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
|
317 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
318 @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
|
319 @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
|
320 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
321 if not filename: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
322 return False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
323 # 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
|
324 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
|
325 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
326 self.params.save_xml(filename) |
3028 | 327 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
|
328 return True |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
329 except Exception as e: |
3028 | 330 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
|
331 return False |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
332 |
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
|
333 def load(self): |
428
a4a9efadabfc
core: fixed memory initialisation sequence
Goffi <goffi@goffi.org>
parents:
425
diff
changeset
|
334 """Load parameters and all memory things from db""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
335 # parameters data |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
336 return self.params.load_gen_params() |
412 | 337 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
338 def load_individual_params(self, profile): |
412 | 339 """Load individual parameters for a profile |
416
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
340 @param profile: %(doc_profile)s""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
341 return self.params.load_ind_params(profile) |
412 | 342 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
343 ## Profiles/Sessions management ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
344 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
345 def start_session(self, password, profile): |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
346 """ "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
|
347 |
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 @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
|
349 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
|
350 @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
|
351 @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
|
352 @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
|
353 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
354 profile = self.get_profile_name(profile) |
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
|
355 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
356 def create_session(__): |
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
|
357 """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
|
358 self._entities_cache[profile] = {} |
3028 | 359 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
|
360 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
|
361 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
362 def backend_initialised(__): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
363 def do_start_session(__=None): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
364 if self.is_session_started(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
|
365 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
|
366 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
|
367 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
|
368 # if there is a value at this point in self._entities_cache, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
369 # it is the load_individual_params Deferred, the session is starting |
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
|
370 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
|
371 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
|
372 # else we do request the params |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
373 session_d = self._entities_cache[profile] = ( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
374 self.load_individual_params(profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
375 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
376 session_d.addCallback(create_session) |
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
|
377 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
|
378 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
|
379 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
380 auth_d = defer.ensureDeferred(self.profile_authenticate(password, profile)) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
381 auth_d.addCallback(do_start_session) |
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
|
382 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
|
383 |
4193
730f542e4ad0
core: add new `init_script_path` option:
Goffi <goffi@goffi.org>
parents:
4159
diff
changeset
|
384 if self.host.init_pre_script.called: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
385 return defer.succeed(None).addCallback(backend_initialised) |
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
|
386 else: |
4193
730f542e4ad0
core: add new `init_script_path` option:
Goffi <goffi@goffi.org>
parents:
4159
diff
changeset
|
387 return self.host.init_pre_script.addCallback(backend_initialised) |
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
|
388 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
389 def stop_session(self, profile): |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
390 """Delete a profile session |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
391 |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
392 @param profile: %(doc_profile)s |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
393 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
394 if self.host.is_connected(profile): |
3028 | 395 log.debug("Disconnecting profile because of session stop") |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
396 self.host.disconnect(profile) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
397 self.auth_sessions.profile_del_unique(profile) |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
398 try: |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
399 self._entities_cache[profile] |
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
400 except KeyError: |
3028 | 401 log.warning("Profile was not in cache") |
1693
35426d58471c
core (memory): stopSession implementation
Goffi <goffi@goffi.org>
parents:
1689
diff
changeset
|
402 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
403 def _is_session_started(self, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
404 return self.is_session_started(self.get_profile_name(profile_key)) |
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
|
405 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
406 def is_session_started(self, 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
|
407 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
|
408 # 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
|
409 # 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
|
410 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
|
411 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
|
412 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
|
413 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
414 async def profile_authenticate(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
|
415 """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
|
416 |
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
|
417 @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
|
418 @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
|
419 @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
|
420 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
421 if not password and self.auth_sessions.profile_get_unique(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
|
422 # 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
|
423 # 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
|
424 # 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
|
425 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
|
426 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
427 sat_cipher = await self.param_get_a_async( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
428 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
|
429 ) |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
430 valid = PasswordHasher.verify(password, sat_cipher) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
431 if not valid: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
432 log.warning( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
433 _("Authentication failure of profile {profile}").format(profile=profile) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
434 ) |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
435 raise exceptions.PasswordError("The provided profile password doesn't match.") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
436 return await self.new_auth_session(password, profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
437 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
438 async def new_auth_session(self, key, profile): |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
439 """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
|
440 |
3128
73b5228715e8
core (memory): avoid session locking if profileAuthenticate is called twice quickly
Goffi <goffi@goffi.org>
parents:
3123
diff
changeset
|
441 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
|
442 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
|
443 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
444 @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
|
445 @param profile: %(doc_profile)s |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
446 """ |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
447 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
|
448 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
|
449 # Create the session for this profile and store the personal key |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
450 session_data = self.auth_sessions.profile_get_unique(profile) |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
451 if not session_data: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
452 self.auth_sessions.new_session( |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
453 {C.MEMORY_CRYPTO_KEY: personal_key}, profile=profile |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
454 ) |
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
455 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
|
456 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
457 def purge_profile_session(self, profile): |
416
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
458 """Delete cache of data of profile |
32dc8b18c2ae
core: param loading/purging on profile connection/disconnection
Goffi <goffi@goffi.org>
parents:
413
diff
changeset
|
459 @param profile: %(doc_profile)s""" |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
946
diff
changeset
|
460 log.info(_("[%s] Profile session purge" % profile)) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
461 self.params.purge_profile(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
|
462 try: |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
463 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
|
464 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
465 log.error( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
466 _("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
|
467 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
468 ) |
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
|
469 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
470 def get_profiles_list(self, clients=True, components=False): |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
471 """retrieve profiles list |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
472 |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
473 @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
|
474 @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
|
475 @return (list[unicode]): selected profiles |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
476 """ |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
477 if not clients and not components: |
3028 | 478 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
|
479 return [] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
480 profiles = self.storage.get_profiles_list() |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
481 if clients and components: |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
482 return sorted(profiles) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
483 is_component = self.storage.profile_is_component |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
484 if clients: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
485 p_filter = lambda p: not is_component(p) |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
486 else: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
487 p_filter = lambda p: is_component(p) |
2146
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
488 |
1bb9bf1b4150
core, frontends: getProfilesList renamed to profilesGetList + behaviour change:
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
489 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
|
490 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
491 def get_profile_name(self, profile_key, return_profile_keys=False): |
62
93cb45a7420f
SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
492 """Return name of profile from keyword |
1263 | 493 |
1519
fbe86b5d156f
core (memory, params): minor docstrings updates
Goffi <goffi@goffi.org>
parents:
1474
diff
changeset
|
494 @param profile_key: can be the profile name or a keyword (like @DEFAULT@) |
1263 | 495 @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
|
496 @return: requested profile name |
1460
c7fd121a6180
core: getProfileName no raise ProfileUnknownError + minor doc fixes
Goffi <goffi@goffi.org>
parents:
1447
diff
changeset
|
497 @raise exceptions.ProfileUnknownError if profile doesn't exists |
1263 | 498 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
499 return self.params.get_profile_name(profile_key, return_profile_keys) |
62
93cb45a7420f
SàT multi-profile: connection using profiles
Goffi <goffi@goffi.org>
parents:
61
diff
changeset
|
500 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
501 def profile_set_default(self, profile): |
1595
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
502 """Set default profile |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
503 |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
504 @param profile: %(doc_profile)s |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
505 """ |
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
506 # we want to be sure that the profile exists |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
507 profile = self.get_profile_name(profile) |
1595
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
508 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
509 self.memory_data["Profile_default"] = profile |
1595
a3d0cfa5b7a6
core, bridge: added a profileSetDefault method
Goffi <goffi@goffi.org>
parents:
1591
diff
changeset
|
510 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
511 def create_profile(self, name, password, component=None): |
420
acd908528ef7
core: profile creation/deletion through database
Goffi <goffi@goffi.org>
parents:
418
diff
changeset
|
512 """Create a new profile |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
513 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
514 @param name(unicode): profile name |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
515 @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
|
516 Can be empty to disable password |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
517 @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
|
518 @return: Deferred |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
519 @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
|
520 """ |
1263 | 521 if not name: |
3028 | 522 raise ValueError("Empty profile name") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
523 if name[0] == "@": |
3028 | 524 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
|
525 if "\n" in name: |
3028 | 526 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
|
527 |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
528 if name in self._entities_cache: |
3028 | 529 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
|
530 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
531 if component: |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
532 if not component in self.host.plugins: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
533 raise exceptions.NotFound( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
534 _( |
3028 | 535 "Can't find component {component} entry point".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
536 component=component |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
537 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
538 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
539 ) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
540 # 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
|
541 # 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
|
542 # 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
|
543 # component = component))) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
544 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
545 d = self.params.create_profile(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
|
546 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
547 def init_personal_key(__): |
1652
fd7f41d8cbdf
memory: fixes asyncCreateProfile to not overwrite the personal key
souliane <souliane@mailoo.org>
parents:
1595
diff
changeset
|
548 # be sure to call this after checking that the profile doesn't exist yet |
3040 | 549 |
550 # generated once for all and saved in a PersistentDict | |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
551 personal_key = BlockCipher.get_random_key(base64=True).decode("utf-8") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
552 self.auth_sessions.new_session( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
553 {C.MEMORY_CRYPTO_KEY: personal_key}, profile=name |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
554 ) # will be encrypted by param_set |
1652
fd7f41d8cbdf
memory: fixes asyncCreateProfile to not overwrite the personal key
souliane <souliane@mailoo.org>
parents:
1595
diff
changeset
|
555 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
556 def start_fake_session(__): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
557 # avoid ProfileNotConnected exception in param_set |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
558 self._entities_cache[name] = None |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
559 self.params.load_ind_params(name) |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
560 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
561 def stop_fake_session(__): |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
562 del self._entities_cache[name] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
563 self.params.purge_profile(name) |
1695
5a93f13c1e76
core (memory): asyncCreateProfile fix: a fake session is created to set general password param
Goffi <goffi@goffi.org>
parents:
1694
diff
changeset
|
564 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
565 d.addCallback(init_personal_key) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
566 d.addCallback(start_fake_session) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
567 d.addCallback( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
568 lambda __: self.param_set( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
569 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
|
570 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
571 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
572 d.addCallback(stop_fake_session) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
573 d.addCallback(lambda __: self.auth_sessions.profile_del_unique(name)) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
574 return d |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
575 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
576 def profile_delete_async(self, name, force=False): |
68 | 577 """Delete an existing profile |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
578 |
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
|
579 @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
|
580 @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
|
581 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
|
582 @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
|
583 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
584 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
585 def clean_memory(__): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
586 self.auth_sessions.profile_del_unique(name) |
1704
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
587 try: |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
588 del self._entities_cache[name] |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
589 except KeyError: |
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
590 pass |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
591 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
592 d = self.params.profile_delete_async(name, force) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
593 d.addCallback(clean_memory) |
1704
292f9c2712f2
core (memory): fixed bad memory cleaning on asyncDeleteProfile
Goffi <goffi@goffi.org>
parents:
1695
diff
changeset
|
594 return d |
60
9764e027ecc0
SàT: multi-profile parameters, first draft
Goffi <goffi@goffi.org>
parents:
57
diff
changeset
|
595 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
596 def is_component(self, profile_name): |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
597 """Tell if a profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
598 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
599 @param profile_name(unicode): name of the profile |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
600 @return (bool): True if profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
601 @raise exceptions.NotFound: profile doesn't exist |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
602 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
603 return self.storage.profile_is_component(profile_name) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
604 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
605 def get_entry_point(self, profile_name): |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
606 """Get a component entry point |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
607 |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
608 @param profile_name(unicode): name of the profile |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
609 @return (bool): True if profile is a component |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
610 @raise exceptions.NotFound: profile doesn't exist |
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
611 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
612 return self.storage.get_entry_point(profile_name) |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
2052
diff
changeset
|
613 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
614 ## History ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
615 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
616 def add_to_history(self, client, data): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
617 return self.storage.add_to_history(data, client.profile) |
0 | 618 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
619 def _history_get_serialise(self, history_data): |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
620 return [ |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
621 ( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
622 uid, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
623 timestamp, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
624 from_jid, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
625 to_jid, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
626 message, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
627 subject, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
628 mess_type, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
629 data_format.serialise(extra), |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
630 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
631 for uid, timestamp, from_jid, to_jid, message, subject, mess_type, extra in history_data |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
632 ] |
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
633 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
634 def _history_get( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
635 self, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
636 from_jid_s, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
637 to_jid_s, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
638 limit=C.HISTORY_LIMIT_NONE, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
639 between=True, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
640 filters=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
641 profile=C.PROF_KEY_NONE, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
642 ): |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
643 from_jid = jid.JID(from_jid_s) if from_jid_s else None |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
644 to_jid = jid.JID(to_jid_s) if to_jid_s else None |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
645 d = self.history_get(from_jid, to_jid, limit, between, filters, profile) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
646 d.addCallback(self._history_get_serialise) |
3170
39d7327583e1
core: use serialised dict for `extra` in messageNew and historyGet
Goffi <goffi@goffi.org>
parents:
3163
diff
changeset
|
647 return d |
1963
a2bc5089c2eb
backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents:
1955
diff
changeset
|
648 |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
649 def history_get( |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
650 self, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
651 from_jid: jid.JID | None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
652 to_jid: jid.JID | None, |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
653 limit: int = C.HISTORY_LIMIT_NONE, |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
654 between: bool = True, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
655 filters: dict[str, str] | None = None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
656 profile: str = C.PROF_KEY_NONE, |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
657 ) -> defer.Deferred[list]: |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
658 """Retrieve messages in history |
1955
633b5c21aefd
backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
659 |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
660 @param from_jid: source JID (full, or bare for catchall) |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
661 @param to_jid: dest JID (full, or bare for catchall) |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
662 @param limit: maximum number of messages to get: |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
663 - 0 for no message (returns the empty list) |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
664 - C.HISTORY_LIMIT_NONE or None for unlimited |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
665 - C.HISTORY_LIMIT_DEFAULT to use the HISTORY_LIMIT parameter value |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
666 @param between: confound source and dest (ignore the direction) |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
667 @param filters: pattern to filter the history results |
2698 | 668 (see bridge API for details) |
4159
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
669 @param profile: %(doc_profile)s |
54b8cf8c8daf
core (memory/memory): fix the use of empty `from_jid` and `to_jid` in `history_get`
Goffi <goffi@goffi.org>
parents:
4130
diff
changeset
|
670 @return: list of message data as in [message_new] |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
671 """ |
916
1a759096ccbd
core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents:
914
diff
changeset
|
672 assert profile != C.PROF_KEY_NONE |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
673 if limit == C.HISTORY_LIMIT_DEFAULT: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
674 limit = int(self.param_get_a(C.HISTORY_LIMIT, "General", profile_key=profile)) |
1222
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
675 elif limit == C.HISTORY_LIMIT_NONE: |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
676 limit = None |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
677 if limit == 0: |
e6e0ea4dc835
memory: add Parameter "Chat history limit"
souliane <souliane@mailoo.org>
parents:
1221
diff
changeset
|
678 return defer.succeed([]) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
679 return self.storage.history_get( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
680 from_jid, to_jid, limit, between, filters, profile |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
681 ) |
0 | 682 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
683 ## Statuses ## |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
684 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
685 def _get_presence_statuses(self, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
686 ret = self.presence_statuses_get(profile_key) |
3028 | 687 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
|
688 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
689 def presence_statuses_get(self, profile_key): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
690 """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
|
691 |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
692 @param profile_key: %(doc_profile_key)s |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
693 @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
|
694 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
695 client = self.host.get_client(profile_key) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
696 profile_cache = self._get_profile_cache(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
|
697 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
|
698 |
3028 | 699 for entity_jid, entity_data in profile_cache.items(): |
700 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
|
701 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
|
702 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
703 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
704 presence_data = self.get_entity_datum(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
|
705 except KeyError: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
706 continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
707 entities_presence.setdefault(entity_jid, {})[ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
708 resource or "" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
709 ] = presence_data |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
710 |
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
|
711 return entities_presence |
0 | 712 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
713 def set_presence_status(self, entity_jid, show, priority, statuses, profile_key): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
714 """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
|
715 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
716 @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
|
717 @param show: show status |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
718 @param priority: priority |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
719 @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
|
720 @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
|
721 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
722 client = self.host.get_client(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
723 presence_data = PresenceTuple(show, priority, statuses) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
724 self.update_entity_data(client, entity_jid, "presence", presence_data) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
725 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
|
726 # 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
|
727 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
728 self.del_entity_datum(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
|
729 except (KeyError, exceptions.UnknownEntityError): |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
730 pass |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
731 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
732 ## Resources ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
733 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
734 def _get_all_resource(self, jid_s, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
735 client = self.host.get_client(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
736 jid_ = jid.JID(jid_s) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
737 return self.get_all_resources(client, jid_) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
738 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
739 def get_all_resources(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
|
740 """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
|
741 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
742 @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
|
743 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
|
744 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
745 @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
|
746 @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
|
747 """ |
2597
9446f1ea9eac
core: discoFindByFeatures now return only available resources
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
748 # 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
|
749 if entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
750 raise ValueError( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
751 "get_all_resources must be used with a bare jid (got {})".format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
752 entity_jid |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
753 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
754 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
755 profile_cache = self._get_profile_cache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
756 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
757 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
|
758 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
759 raise exceptions.UnknownEntityError( |
3028 | 760 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
761 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
762 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
|
763 resources.discard(None) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
764 return resources |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
765 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
766 def get_available_resources(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
|
767 """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
|
768 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
769 This method differs from get_all_resources by returning only available resources |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
770 @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
|
771 return (list[unicode]): list of available resources |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
772 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
773 @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
|
774 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
775 available = [] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
776 for resource in self.get_all_resources(client, entity_jid): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
777 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
|
778 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
779 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
780 presence_data = self.get_entity_datum(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
|
781 except KeyError: |
3028 | 782 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
|
783 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
784 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
|
785 available.append(resource) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
786 return available |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
787 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
788 def _get_main_resource(self, jid_s, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
789 client = self.host.get_client(profile_key) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
790 jid_ = jid.JID(jid_s) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
791 return self.main_resource_get(client, jid_) or "" |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
792 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
793 def main_resource_get(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
|
794 """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
|
795 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
796 @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
|
797 @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
|
798 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
799 if entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
800 raise ValueError( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
801 "main_resource_get must be used with a bare jid (got {})".format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
802 entity_jid |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
803 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
804 ) |
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
|
805 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
806 if self.host.plugins["XEP-0045"].is_joined_room(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
|
807 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
|
808 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
|
809 pass |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
810 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
811 resources = self.get_all_resources(client, entity_jid) |
1689
a40124e03baf
core (memory): catch exceptions.UnknownEntityError in getMainResource
Goffi <goffi@goffi.org>
parents:
1684
diff
changeset
|
812 except exceptions.UnknownEntityError: |
3028 | 813 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
|
814 return None |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
815 priority_resources = [] |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
816 for resource in resources: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
817 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
|
818 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
819 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
820 presence_data = self.get_entity_datum(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
|
821 except KeyError: |
3028 | 822 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
|
823 continue |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
824 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
|
825 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
826 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
|
827 except ValueError: |
3028 | 828 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
|
829 return None |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
830 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
831 ## Entities data ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
832 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
833 def _get_profile_cache(self, client): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
834 """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
|
835 |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
836 @param client: SatXMPPClient |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
837 @return (dict): profile cache |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
838 """ |
2533
8d82a62fa098
core (disco), plugin XEP-0115: client use + capabilities hash improvment:
Goffi <goffi@goffi.org>
parents:
2526
diff
changeset
|
839 return self._entities_cache[client.profile] |
1251
51a85e8f599a
memory: add method isContactConnected
souliane <souliane@mailoo.org>
parents:
1247
diff
changeset
|
840 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
841 def set_signal_on_update(self, key, signal=True): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
842 """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
|
843 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
844 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
|
845 @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
|
846 @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
|
847 """ |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
848 if signal: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
849 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
|
850 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
851 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
|
852 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
853 def get_all_entities_iter(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
|
854 """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
|
855 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
856 @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
|
857 @return (list[unicode]): list of jids |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
858 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
859 profile_cache = self._get_profile_cache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
860 # we construct a list of all known full jids (bare jid of entities x resources) |
3028 | 861 for bare_jid, entity_data in profile_cache.items(): |
862 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
|
863 if resource is None: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
864 continue |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
865 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
|
866 full_jid.resource = resource |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
867 yield full_jid |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
868 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
869 def update_entity_data(self, client, entity_jid, key, value, silent=False): |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
870 """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
|
871 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
872 If key was registered with set_signal_on_update, 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
|
873 @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
|
874 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
|
875 @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
|
876 @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
|
877 @param silent(bool): if True, doesn't send signal to frontend, even if there is a |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
878 signal flag (see set_signal_on_update) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
879 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
880 profile_cache = self._get_profile_cache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
881 if entity_jid in (C.ENTITY_ALL_RESOURCES, C.ENTITY_ALL): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
882 entities = self.get_all_entities_iter(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
|
883 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
884 entities = (entity_jid,) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
885 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
886 for jid_ in entities: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
887 entity_data = profile_cache.setdefault(jid_.userhostJID(), {}).setdefault( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
888 jid_.resource, {} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
889 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
890 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
891 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
|
892 if key in self._key_signals and not silent: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
893 self.host.bridge.entity_data_updated( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
894 jid_.full(), key, data_format.serialise(value), client.profile |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
895 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
896 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
897 def del_entity_datum(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
|
898 """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
|
899 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
900 @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
|
901 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
|
902 @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
|
903 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
904 @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
|
905 @raise KeyError: key is not in cache |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
906 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
907 profile_cache = self._get_profile_cache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
908 if entity_jid in (C.ENTITY_ALL_RESOURCES, C.ENTITY_ALL): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
909 entities = self.get_all_entities_iter(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
|
910 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
911 entities = (entity_jid,) |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
912 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
913 for jid_ in entities: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
914 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
915 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
|
916 except KeyError: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
917 raise exceptions.UnknownEntityError("Entity {} not in cache".format(jid_)) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
918 try: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
919 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
|
920 except KeyError as e: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
921 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
|
922 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
|
923 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
924 raise e |
399 | 925 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
926 def _get_entities_data(self, entities_jids, keys_list, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
927 client = self.host.get_client(profile_key) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
928 ret = self.entities_data_get( |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
929 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
|
930 ) |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
931 return { |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
932 jid_.full(): {k: data_format.serialise(v) for k, v in data.items()} |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
933 for jid_, data in ret.items() |
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
934 } |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
935 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
936 def entities_data_get(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
|
937 """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
|
938 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
939 @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
|
940 @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
|
941 @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
|
942 @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
|
943 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
|
944 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
|
945 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
|
946 in resulting dict |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
947 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
948 @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
|
949 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
950 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
951 def fill_entity_data(entity_cache_data): |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
952 entity_data = {} |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
953 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
|
954 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
|
955 else: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
956 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
|
957 try: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
958 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
|
959 except KeyError: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
960 continue |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
961 return entity_data |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
962 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
963 profile_cache = self._get_profile_cache(client) |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
964 ret_data = {} |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
965 if entities_jids: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
966 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
|
967 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
968 entity_cache_data = profile_cache[entity.userhostJID()][ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
969 entity.resource |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
970 ] |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
971 except KeyError: |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
972 continue |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
973 ret_data[entity.full()] = fill_entity_data(entity_cache_data, keys_list) |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
974 else: |
3028 | 975 for bare_jid, data in profile_cache.items(): |
976 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
|
977 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
|
978 full_jid.resource = resource |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
979 ret_data[full_jid] = fill_entity_data(entity_cache_data) |
1314
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
980 |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
981 return ret_data |
bb9c32249778
core: added getEntitiesData which get cache data for several entities at once
Goffi <goffi@goffi.org>
parents:
1290
diff
changeset
|
982 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
983 def _get_entity_data(self, entity_jid_s, keys_list=None, profile=C.PROF_KEY_NONE): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
984 return self.entity_data_get( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
985 self.host.get_client(profile), jid.JID(entity_jid_s), keys_list |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
986 ) |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
987 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
988 def entity_data_get(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
|
989 """Get a list of cached values for entity |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
990 |
486
0d9908ac775e
core: entity cache misc data management + error moved to core.exceptions in memory
Goffi <goffi@goffi.org>
parents:
484
diff
changeset
|
991 @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
|
992 @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
|
993 @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
|
994 @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
|
995 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
|
996 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
|
997 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
998 @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
|
999 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1000 profile_cache = self._get_profile_cache(client) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1001 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1002 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
|
1003 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1004 raise exceptions.UnknownEntityError( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1005 "Entity {} not in cache (was requesting {})".format(entity_jid, keys_list) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1006 ) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1007 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
|
1008 return entity_data |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1009 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1010 return {key: entity_data[key] for key in keys_list if key in entity_data} |
47 | 1011 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1012 def get_entity_datum(self, client, entity_jid, key): |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1013 """Get a datum from entity |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1014 |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1015 @param entity_jid: JID of the entity |
3254
6cf4bd6972c2
core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents:
3206
diff
changeset
|
1016 @param key: key to get |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1017 @return: requested value |
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1018 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1019 @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
|
1020 @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
|
1021 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1022 return self.entity_data_get(client, entity_jid, (key,))[key] |
944
e1842ebcb2f3
core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents:
943
diff
changeset
|
1023 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1024 def del_entity_cache( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1025 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
|
1026 ): |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1027 """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
|
1028 |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1029 @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
|
1030 @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
|
1031 @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
|
1032 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1033 @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
|
1034 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1035 client = self.host.get_client(profile_key) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1036 profile_cache = self._get_profile_cache(client) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1037 |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1038 if delete_all_resources: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1039 if entity_jid.resource: |
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1040 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
|
1041 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1042 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
|
1043 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1044 raise exceptions.UnknownEntityError( |
3028 | 1045 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1046 ) |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1047 else: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1048 try: |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1049 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
|
1050 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1051 raise exceptions.UnknownEntityError( |
3028 | 1052 "Entity {} not in cache".format(entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1053 ) |
943
71926ec2114d
core (memory): entities cache improvments:
Goffi <goffi@goffi.org>
parents:
935
diff
changeset
|
1054 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1055 ## Encryption ## |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
504
diff
changeset
|
1056 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1057 def encrypt_value(self, value, profile): |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1058 """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
|
1059 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
|
1060 already authenticated. |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1061 |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1062 @param value (str): the value to encrypt |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1063 @param profile (str): %(doc_profile)s |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1064 @return: the deferred encrypted value |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1065 """ |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1066 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1067 personal_key = self.auth_sessions.profile_get_unique(profile)[ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1068 C.MEMORY_CRYPTO_KEY |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1069 ] |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1070 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1071 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1072 _("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
|
1073 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1074 ) |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1075 return BlockCipher.encrypt(personal_key, value) |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1076 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1077 def decrypt_value(self, value, profile): |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1078 """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
|
1079 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
|
1080 already authenticated. |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1081 |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1082 @param value (str): the value to decrypt |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1083 @param profile (str): %(doc_profile)s |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1084 @return: the deferred decrypted value |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1085 """ |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1086 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1087 personal_key = self.auth_sessions.profile_get_unique(profile)[ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1088 C.MEMORY_CRYPTO_KEY |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1089 ] |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1090 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1091 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1092 _("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
|
1093 % profile |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1094 ) |
1090
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1095 return BlockCipher.decrypt(personal_key, value) |
594fbdda4a87
memory: add helper methods encryptValue and decryptValue
souliane <souliane@mailoo.org>
parents:
1064
diff
changeset
|
1096 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1097 def encrypt_personal_data(self, data_key, data_value, crypto_key, profile): |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1098 """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
|
1099 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1100 @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
|
1101 @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
|
1102 @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
|
1103 @param profile: %(profile_doc)s |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1104 @return: a deferred None value |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1105 """ |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1106 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1107 def got_ind_memory(data): |
3160
330a5f1d9eea
core (memory/crypto): replaced `PyCrypto` by `cryptography`:
Goffi <goffi@goffi.org>
parents:
3148
diff
changeset
|
1108 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
|
1109 return data.force(data_key) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1110 |
2765
378188abe941
misc: replaced all "dummy" by the more conventional and readable "__" ("_" being used for gettext)
Goffi <goffi@goffi.org>
parents:
2698
diff
changeset
|
1111 def done(__): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1112 log.debug( |
3028 | 1113 _("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
|
1114 % {"ns": C.MEMORY_CRYPTO_NAMESPACE, "key": data_key} |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1115 ) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1116 |
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1117 d = PersistentDict(C.MEMORY_CRYPTO_NAMESPACE, profile).load() |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1118 return d.addCallback(got_ind_memory).addCallback(done) |
1030
15f43b54d697
core, memory, bridge: added profile password + password encryption:
souliane <souliane@mailoo.org>
parents:
1029
diff
changeset
|
1119 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1120 ## Subscription requests ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1121 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1122 def add_waiting_sub(self, type_, entity_jid, profile_key): |
47 | 1123 """Called when a subcription request is received""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1124 profile = self.get_profile_name(profile_key) |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1125 assert profile |
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1126 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
|
1127 self.subscriptions[profile] = {} |
722
04aabc3f2684
core (memory): fixed setDefault behaviour + minor refactoring
Goffi <goffi@goffi.org>
parents:
679
diff
changeset
|
1128 self.subscriptions[profile][entity_jid] = type_ |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1129 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1130 def del_waiting_sub(self, entity_jid, profile_key): |
47 | 1131 """Called when a subcription request is finished""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1132 profile = self.get_profile_name(profile_key) |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1133 assert profile |
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1134 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
|
1135 del self.subscriptions[profile][entity_jid] |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1136 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1137 def sub_waiting_get(self, profile_key): |
47 | 1138 """Called to get a list of currently waiting subscription requests""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1139 profile = self.get_profile_name(profile_key) |
65
d35c5edab53f
SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
1140 if not profile: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1141 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
|
1142 return {} |
592
e5a875a3311b
Fix pep8 support in src/memory.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1143 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
|
1144 return {} |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1145 |
65
d35c5edab53f
SàT: multi-profile: memory & dbus bridge's methods profile management
Goffi <goffi@goffi.org>
parents:
64
diff
changeset
|
1146 return self.subscriptions[profile] |
0 | 1147 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1148 ## Parameters ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
1149 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1150 def get_string_param_a( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1151 self, name, category, attr="value", profile_key=C.PROF_KEY_NONE |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1152 ): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1153 return self.params.get_string_param_a(name, category, attr, profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1154 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1155 def param_get_a(self, name, category, attr="value", profile_key=C.PROF_KEY_NONE): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1156 return self.params.param_get_a(name, category, attr, profile_key=profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1157 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1158 def param_get_a_async( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1159 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1160 name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1161 category, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1162 attr="value", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1163 security_limit=C.NO_SECURITY_LIMIT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1164 profile_key=C.PROF_KEY_NONE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1165 ): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1166 return self.params.param_get_a_async( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1167 name, category, attr, security_limit, profile_key |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1168 ) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1169 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1170 def _get_params_values_from_category( |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1171 self, category, security_limit, app, extra_s, profile_key |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1172 ): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1173 return self.params._get_params_values_from_category( |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1174 category, security_limit, app, extra_s, profile_key |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1175 ) |
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
|
1176 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1177 def async_get_string_param_a( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1178 self, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1179 name, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1180 category, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1181 attribute="value", |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1182 security_limit=C.NO_SECURITY_LIMIT, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1183 profile_key=C.PROF_KEY_NONE, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1184 ): |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1185 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1186 profile = self.get_profile_name(profile_key) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1187 return defer.ensureDeferred( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1188 self.params.async_get_string_param_a( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1189 name, category, attribute, security_limit, profile |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1190 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1191 ) |
3123
130f9cb6e0ab
core (memory/params): added `extra` argument to filter out params notably in `getParamsUI`:
Goffi <goffi@goffi.org>
parents:
3053
diff
changeset
|
1192 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1193 def _get_params_ui(self, security_limit, app, extra_s, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1194 return self.params._get_params_ui(security_limit, app, extra_s, profile_key) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1195 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1196 def params_categories_get(self): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1197 return self.params.params_categories_get() |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1198 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1199 def param_set( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1200 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1201 name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1202 value, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1203 category, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1204 security_limit=C.NO_SECURITY_LIMIT, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1205 profile_key=C.PROF_KEY_NONE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1206 ): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1207 return self.params.param_set(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
|
1208 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1209 def update_params(self, xml): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1210 return self.params.update_params(xml) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
574
diff
changeset
|
1211 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1212 def params_register_app(self, xml, security_limit=C.NO_SECURITY_LIMIT, app=""): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1213 return self.params.params_register_app(xml, security_limit, app) |
777
5642939d254e
core, bridge: new method paramsRegisterApp to register frontend's specific parameters
souliane <souliane@mailoo.org>
parents:
771
diff
changeset
|
1214 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1215 def set_default(self, name, category, callback, errback=None): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1216 return self.params.set_default(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
|
1217 |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1218 ## Private Data ## |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1219 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1220 def _private_data_set(self, namespace, key, data_s, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1221 client = self.host.get_client(profile_key) |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1222 # we accept any type |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1223 data = data_format.deserialise(data_s, type_check=None) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1224 return defer.ensureDeferred( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1225 self.storage.set_private_value( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1226 namespace, key, data, binary=True, profile=client.profile |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1227 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1228 ) |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1229 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1230 def _private_data_get(self, namespace, key, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1231 client = self.host.get_client(profile_key) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1232 d = defer.ensureDeferred( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1233 self.storage.get_privates( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1234 namespace, [key], binary=True, profile=client.profile |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1235 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1236 ) |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1237 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
|
1238 return d |
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1239 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1240 def _private_data_delete(self, namespace, key, profile_key): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1241 client = self.host.get_client(profile_key) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1242 return defer.ensureDeferred( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1243 self.storage.del_private_value( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1244 namespace, key, binary=True, profile=client.profile |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1245 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1246 ) |
3163
d10b2368684e
bridge: added methods to let frontends store/retrieve/delete private data
Goffi <goffi@goffi.org>
parents:
3160
diff
changeset
|
1247 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1248 ## Files ## |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1249 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1250 def check_file_permission( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1251 self, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1252 file_data: dict, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1253 peer_jid: Optional[jid.JID], |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1254 perms_to_check: Optional[Tuple[str]], |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1255 set_affiliation: bool = False, |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1256 ) -> None: |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1257 """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
|
1258 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1259 @param file_data: data of one file, as returned by get_files |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1260 @param peer_jid: entity trying to access the file |
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1261 @param perms_to_check: permissions to check |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1262 tuple of C.ACCESS_PERM_* |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1263 @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
|
1264 @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
|
1265 @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
|
1266 in perms_to_check for file_data |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1267 @raise exceptions.InternalError: perms_to_check is invalid |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1268 """ |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1269 # 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
|
1270 # 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
|
1271 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
|
1272 return |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1273 peer_jid = peer_jid.userhostJID() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1274 if peer_jid == file_data["owner"]: |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1275 if set_affiliation: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1276 file_data["affiliation"] = "owner" |
3313
624c60293deb
memory: new "affiliation" metadata for files:
Goffi <goffi@goffi.org>
parents:
3300
diff
changeset
|
1277 # the owner has all rights, nothing to check |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1278 return |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1279 if not C.ACCESS_PERMS.issuperset(perms_to_check): |
3028 | 1280 raise exceptions.InternalError(_("invalid permission")) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1281 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1282 for perm in perms_to_check: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1283 # 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
|
1284 # 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
|
1285 try: |
3028 | 1286 perm_data = file_data["access"][perm] |
1287 perm_type = perm_data["type"] | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1288 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
|
1289 # 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
|
1290 # 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
|
1291 # 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
|
1292 # 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
|
1293 # all sub directories/files when modifying a permission |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1294 if not file_data.get("parent"): |
3317
83f25da66bec
core (memory): files are now public by default except for those in root directory:
Goffi <goffi@goffi.org>
parents:
3313
diff
changeset
|
1295 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
|
1296 else: |
3349
2a7e36b69fd2
core (memory/memory): fixed assignations
Goffi <goffi@goffi.org>
parents:
3346
diff
changeset
|
1297 perm_type = C.ACCESS_TYPE_PUBLIC |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1298 if perm_type == C.ACCESS_TYPE_PUBLIC: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1299 continue |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1300 elif perm_type == C.ACCESS_TYPE_WHITELIST: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1301 try: |
3028 | 1302 jids = perm_data["jids"] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1303 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
|
1304 raise exceptions.PermissionError() |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1305 if peer_jid.full() in jids: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1306 continue |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1307 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
|
1308 raise exceptions.PermissionError() |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1309 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1310 raise exceptions.InternalError( |
3028 | 1311 _("unknown access type: {type}").format(type=perm_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1312 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1313 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1314 async def check_permission_to_root(self, client, file_data, peer_jid, perms_to_check): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1315 """do check_file_permission on file_data and all its parents until root""" |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1316 current = file_data |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1317 while True: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1318 self.check_file_permission(current, peer_jid, perms_to_check) |
3028 | 1319 parent = current["parent"] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1320 if not parent: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1321 break |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1322 files_data = await self.get_files( |
3040 | 1323 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
|
1324 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1325 try: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1326 current = files_data[0] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1327 except IndexError: |
3028 | 1328 raise exceptions.DataError("Missing parent") |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1329 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1330 async def _get_parent_dir( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1331 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
|
1332 ): |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1333 """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
|
1334 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1335 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
|
1336 @return (tuple[unicode, list[unicode])): parent, remaining path elements: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1337 - 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
|
1338 - 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
|
1339 (i.e. which don't exist) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1340 """ |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1341 # 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
|
1342 if parent is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1343 raise exceptions.ConflictError( |
3028 | 1344 _("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
|
1345 ) |
3028 | 1346 path_elts = [_f for _f in path.split("/") if _f] |
1347 if {"..", "."}.intersection(path_elts): | |
1348 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
|
1349 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1350 # 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
|
1351 # non existing directories will be created |
3028 | 1352 parent = "" |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1353 for idx, path_elt in enumerate(path_elts): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1354 directories = await self.storage.get_files( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1355 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1356 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1357 type_=C.FILE_TYPE_DIRECTORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1358 name=path_elt, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1359 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1360 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1361 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1362 if not directories: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1363 return (parent, path_elts[idx:]) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1364 # 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
|
1365 elif len(directories) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1366 raise exceptions.InternalError( |
3028 | 1367 _("Several directories found, this should not happen") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1368 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1369 else: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1370 directory = directories[0] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1371 self.check_file_permission(directory, peer_jid, perms_to_check) |
3028 | 1372 parent = directory["id"] |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1373 return (parent, []) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1374 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1375 def get_file_affiliations(self, file_data: dict) -> Dict[jid.JID, str]: |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1376 """Convert file access to pubsub like affiliations""" |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1377 affiliations = {} |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1378 access_data = file_data["access"] |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1379 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1380 read_data = access_data.get(C.ACCESS_PERM_READ, {}) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1381 if read_data.get("type") == C.ACCESS_TYPE_WHITELIST: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1382 for entity_jid_s in read_data["jids"]: |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1383 entity_jid = jid.JID(entity_jid_s) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1384 affiliations[entity_jid] = "member" |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1385 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1386 write_data = access_data.get(C.ACCESS_PERM_WRITE, {}) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1387 if write_data.get("type") == C.ACCESS_TYPE_WHITELIST: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1388 for entity_jid_s in write_data["jids"]: |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1389 entity_jid = jid.JID(entity_jid_s) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1390 affiliations[entity_jid] = "publisher" |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1391 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1392 owner = file_data.get("owner") |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1393 if owner: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1394 affiliations[owner] = "owner" |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1395 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1396 return affiliations |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1397 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1398 def _set_file_affiliations_update( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1399 self, access: dict, file_data: dict, affiliations: Dict[jid.JID, str] |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1400 ) -> None: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1401 read_data = access.setdefault(C.ACCESS_PERM_READ, {}) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1402 if read_data.get("type") != C.ACCESS_TYPE_WHITELIST: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1403 read_data["type"] = C.ACCESS_TYPE_WHITELIST |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1404 if "jids" not in read_data: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1405 read_data["jids"] = [] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1406 read_whitelist = read_data["jids"] |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1407 write_data = access.setdefault(C.ACCESS_PERM_WRITE, {}) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1408 if write_data.get("type") != C.ACCESS_TYPE_WHITELIST: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1409 write_data["type"] = C.ACCESS_TYPE_WHITELIST |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1410 if "jids" not in write_data: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1411 write_data["jids"] = [] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1412 write_whitelist = write_data["jids"] |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1413 for entity_jid, affiliation in affiliations.items(): |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1414 entity_jid_s = entity_jid.full() |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1415 if affiliation == "none": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1416 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1417 read_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1418 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1419 log.warning( |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1420 "removing affiliation from an entity without read permission: " |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1421 f"{entity_jid}" |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1422 ) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1423 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1424 write_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1425 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1426 pass |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1427 elif affiliation == "publisher": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1428 if entity_jid_s not in read_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1429 read_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1430 if entity_jid_s not in write_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1431 write_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1432 elif affiliation == "member": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1433 if entity_jid_s not in read_whitelist: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1434 read_whitelist.append(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1435 try: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1436 write_whitelist.remove(entity_jid_s) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1437 except ValueError: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1438 pass |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1439 elif affiliation == "owner": |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1440 raise NotImplementedError('"owner" affiliation can\'t be set') |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1441 else: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1442 raise ValueError(f"unknown affiliation: {affiliation!r}") |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1443 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1444 async def set_file_affiliations( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1445 self, client, file_data: dict, affiliations: Dict[jid.JID, str] |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1446 ) -> None: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1447 """Apply pubsub like affiliation to file_data |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1448 |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1449 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
|
1450 Affiliation are mapped as follow: |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1451 - "owner" can't be set (for now) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1452 - "publisher" gives read and write permissions |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1453 - "member" gives read permission only |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1454 - "none" removes both read and write permissions |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1455 """ |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1456 file_id = file_data["id"] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1457 await self.file_update( |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1458 file_id, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1459 "access", |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1460 update_cb=partial( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1461 self._set_file_affiliations_update, |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1462 file_data=file_data, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1463 affiliations=affiliations, |
3318
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1464 ), |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1465 ) |
460606155bec
core (memory): `getFileAffiliations` and `setFileAffiliations` implementations:
Goffi <goffi@goffi.org>
parents:
3317
diff
changeset
|
1466 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1467 def _set_file_access_model_update( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1468 self, access: dict, file_data: dict, access_model: str |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1469 ) -> None: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1470 read_data = access.setdefault(C.ACCESS_PERM_READ, {}) |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1471 if access_model == "open": |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1472 requested_type = C.ACCESS_TYPE_PUBLIC |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1473 elif access_model == "whitelist": |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1474 requested_type = C.ACCESS_TYPE_WHITELIST |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1475 else: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1476 raise ValueError(f"unknown access model: {access_model}") |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1477 |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1478 read_data["type"] = requested_type |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1479 if requested_type == C.ACCESS_TYPE_WHITELIST and "jids" not in read_data: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1480 read_data["jids"] = [] |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1481 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1482 async def set_file_access_model( |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1483 self, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1484 client, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1485 file_data: dict, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1486 access_model: str, |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1487 ) -> None: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1488 """Apply pubsub like access_model to file_data |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1489 |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1490 Only 2 access models are supported so far: |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1491 - "open": set public access to file/dir |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1492 - "whitelist": set whitelist to file/dir |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1493 """ |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1494 file_id = file_data["id"] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1495 await self.file_update( |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1496 file_id, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1497 "access", |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1498 update_cb=partial( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1499 self._set_file_access_model_update, |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1500 file_data=file_data, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1501 access_model=access_model, |
3319
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1502 ), |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1503 ) |
3a15e76a694e
core (memory): `setFileAccessModel` implementation:
Goffi <goffi@goffi.org>
parents:
3318
diff
changeset
|
1504 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1505 def get_files_owner( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1506 self, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1507 client, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1508 owner: Optional[jid.JID], |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1509 peer_jid: Optional[jid.JID], |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1510 file_id: Optional[str] = None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1511 parent: Optional[str] = None, |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1512 ) -> jid.JID: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1513 """Get owner to use for a file operation |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1514 |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1515 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
|
1516 clients, peer_jid for components). |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1517 @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
|
1518 peer_jid are set |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1519 """ |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1520 if owner is not None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1521 return owner.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1522 if client is None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1523 # client may be None when looking for file with public_id |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1524 return None |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1525 if file_id or parent: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1526 # owner has already been filtered on parent file |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1527 return None |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1528 if not client.is_component: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1529 return client.jid.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1530 if peer_jid is None: |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1531 raise exceptions.InternalError( |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1532 "Owner must be set for component if peer_jid is None" |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1533 ) |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1534 return peer_jid.userhostJID() |
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1535 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1536 async def get_files( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1537 self, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1538 client, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1539 peer_jid, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1540 file_id=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1541 version=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1542 parent=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1543 path=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1544 type_=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1545 file_hash=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1546 hash_algo=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1547 name=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1548 namespace=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1549 mime_type=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1550 public_id=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1551 owner=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1552 access=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1553 projection=None, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1554 unique=False, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1555 perms_to_check=(C.ACCESS_PERM_READ,), |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1556 ): |
2924 | 1557 """Retrieve files with with given filters |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1558 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1559 @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
|
1560 needed to check permission. |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1561 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
|
1562 @param file_id(unicode, None): id of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1563 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1564 @param version(unicode, None): version of the file |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1565 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1566 empty string to look for current version |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1567 @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
|
1568 None to ignore |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1569 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
|
1570 @param path(Path, unicode, None): path to the directory containing the files |
2924 | 1571 @param type_(unicode, None): type of file filter, can be one of C.FILE_TYPE_* |
1572 @param file_hash(unicode, None): hash of the file to retrieve | |
1573 @param hash_algo(unicode, None): algorithm use for file_hash | |
1574 @param name(unicode, None): name of the file to retrieve | |
1575 @param namespace(unicode, None): namespace of the files to retrieve | |
1576 @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
|
1577 @param public_id(unicode, None): filter on this public id |
2924 | 1578 @param owner(jid.JID, None): if not None, only get files from this owner |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1579 @param access(dict, None): get file with given access (see [set_file]) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1580 @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
|
1581 None to retrieve all |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1582 @param unique(bool): if True will remove duplicates |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1583 @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
|
1584 must be a tuple of C.ACCESS_PERM_* or None |
3499
a83a04b7394b
memory: new `getFilesOwner` method:
Goffi <goffi@goffi.org>
parents:
3480
diff
changeset
|
1585 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
|
1586 case) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1587 other params are the same as for [set_file] |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1588 @return (list[dict]): files corresponding to filters |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1589 @raise exceptions.NotFound: parent directory not found (when path is specified) |
2924 | 1590 @raise exceptions.PermissionError: peer_jid can't use perms_to_check for one of |
1591 the file | |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1592 on the path |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1593 """ |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1594 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
|
1595 raise exceptions.InternalError( |
3028 | 1596 "if you want to disable permission check, both peer_jid and " |
1597 "perms_to_check must be None" | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1598 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1599 owner = self.get_files_owner(client, owner, peer_jid, file_id, parent) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1600 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
|
1601 path = str(path) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1602 # permission are checked by _get_parent_dir |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1603 parent, remaining_path_elts = await self._get_parent_dir( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1604 client, path, parent, namespace, owner, peer_jid, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1605 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1606 if remaining_path_elts: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1607 # if we have remaining path elements, |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1608 # the parent directory is not found |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1609 raise failure.Failure(exceptions.NotFound()) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1610 if parent and peer_jid: |
2924 | 1611 # 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
|
1612 # we need to check all the parents |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1613 parent_data = await self.storage.get_files(client, file_id=parent) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1614 try: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1615 parent_data = parent_data[0] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1616 except IndexError: |
3028 | 1617 raise exceptions.DataError("mising parent") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1618 await self.check_permission_to_root( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1619 client, parent_data, peer_jid, perms_to_check |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1620 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1621 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1622 files = await self.storage.get_files( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1623 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1624 file_id=file_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1625 version=version, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1626 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1627 type_=type_, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1628 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1629 hash_algo=hash_algo, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1630 name=name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1631 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1632 mime_type=mime_type, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1633 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1634 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1635 access=access, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1636 projection=projection, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1637 unique=unique, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1638 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1639 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1640 if peer_jid: |
2924 | 1641 # 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
|
1642 to_remove = [] |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1643 for file_data in files: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1644 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1645 self.check_file_permission( |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1646 file_data, peer_jid, perms_to_check, set_affiliation=True |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1647 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1648 except exceptions.PermissionError: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1649 to_remove.append(file_data) |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1650 for file_data in to_remove: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1651 files.remove(file_data) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3537
diff
changeset
|
1652 return files |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1653 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1654 async def set_file( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1655 self, |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1656 client: SatXMPPEntity, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1657 name: str, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1658 file_id: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1659 version: str = "", |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1660 parent: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1661 path: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1662 type_: str = C.FILE_TYPE_FILE, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1663 file_hash: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1664 hash_algo: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1665 size: int | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1666 namespace: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1667 mime_type: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1668 public_id: str | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1669 created: float | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1670 modified: int | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1671 owner: jid.JID | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1672 access: dict | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1673 extra: dict | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1674 peer_jid: Any | None = None, |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1675 perms_to_check: tuple[str]|None = (C.ACCESS_PERM_WRITE,), |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1676 ) -> None: |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1677 """Set a file metadata. |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1678 |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1679 @param name: basename of the file |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1680 @param file_id: unique id of the file |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1681 @param version: version of this file, empty string for current version or when |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1682 there is no versioning |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1683 @param parent: id of the directory containing the files |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1684 @param path: virtual path of the file in the namespace, if set, parent must be |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1685 None. All intermediate directories will be created if needed, using current |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1686 access. |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1687 @param type_: type of file filter, can be one of C.FILE_TYPE_* |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1688 @param file_hash: unique hash of the payload |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1689 @param hash_algo: algorithm used for hashing the file (usually sha-256) |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1690 @param size: size in bytes |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1691 @param namespace: identifier (human readable is better) to group files. For |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1692 instance, namespace could be used to group files in a specific photo album. |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1693 @param mime_type: MIME type of the file, or None if not known/guessed |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1694 @param public_id: id used to share publicly the file via HTTP |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1695 @param created: UNIX time of creation |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1696 @param modified: UNIX time of last modification, or None to use created date |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1697 @param owner: jid of the owner of the file (mainly useful for component). will be |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1698 used to check permission (only bare jid is used, don't use with MUC). Use None |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1699 to ignore permission (perms_to_check must be None too) |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1700 @param access: 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
|
1701 None (or empty dict) to use private access, i.e. allow only profile's jid to |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1702 access the file. |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1703 Key can be on on C.ACCESS_PERM_*, then a sub dictionary with a type key is |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1704 used (one of C.ACCESS_TYPE_*). |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1705 According to type, extra keys can be used: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1706 - 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
|
1707 - C.ACCESS_TYPE_WHITELIST: the permission is granted for jids (as unicode) |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1708 in the 'jids' key. will be encoded to json in database |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1709 @param extra: serialisable dictionary of any extra data. will be encoded to json |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1710 in database |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1711 @param perms_to_check: permission to check. must be a tuple of C.ACCESS_PERM_* or |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1712 None. if None, permission will not be checked (peer_jid must be None too in |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1713 this case) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1714 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1715 if "/" in name: |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1716 raise ValueError('name must not contain a slash ("/")') |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1717 if file_id is None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1718 file_id = shortuuid.uuid() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1719 if ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1720 file_hash is not None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1721 and hash_algo is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1722 or hash_algo is not None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1723 and file_hash is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1724 ): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1725 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
|
1726 if mime_type is None: |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1727 mime_type, __ = mimetypes.guess_type(name) |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1728 else: |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1729 mime_type = mime_type.lower() |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1730 if public_id is not None: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1731 assert len(public_id) > 0 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1732 if created is None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1733 created = time.time() |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1734 if namespace is not None: |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1735 namespace = namespace.strip() or None |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1736 if type_ == C.FILE_TYPE_DIRECTORY: |
3361
43e60c40de65
core (memory/memory): fixed directory creation in setFile
Goffi <goffi@goffi.org>
parents:
3358
diff
changeset
|
1737 if any((version, file_hash, size, mime_type)): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1738 raise ValueError( |
3028 | 1739 "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
|
1740 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1741 owner = self.get_files_owner(client, owner, peer_jid, file_id, parent) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1742 |
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1743 if path is not None: |
4269
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1744 # We use a lock to avoid race condition leading to duplicate directories with |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1745 # same name and parent. |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1746 await self._file_path_lock.acquire() |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1747 try: |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1748 |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1749 path = str(path) |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1750 # _get_parent_dir will check permissions if peer_jid is set, so we use owner |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1751 parent, remaining_path_elts = await self._get_parent_dir( |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1752 client, path, parent, namespace, owner, owner, perms_to_check |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1753 ) |
4269
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1754 # if remaining directories don't exist, we have to create them |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1755 for new_dir in remaining_path_elts: |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1756 new_dir_id = shortuuid.uuid() |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1757 await self.storage.set_file( |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1758 client, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1759 name=new_dir, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1760 file_id=new_dir_id, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1761 version="", |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1762 parent=parent, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1763 type_=C.FILE_TYPE_DIRECTORY, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1764 namespace=namespace, |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1765 created=created, |
4269
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1766 owner=owner, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1767 access=access, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1768 extra={}, |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1769 ) |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1770 parent = new_dir_id |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1771 finally: |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1772 self._file_path_lock.release() |
64a85ce8be70
memory (file): avoid race condition when creating parent path directories.
Goffi <goffi@goffi.org>
parents:
4266
diff
changeset
|
1773 |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1774 elif parent is None: |
3028 | 1775 parent = "" |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1776 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1777 await self.storage.set_file( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1778 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1779 file_id=file_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1780 version=version, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1781 parent=parent, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1782 type_=type_, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1783 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1784 hash_algo=hash_algo, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1785 name=name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1786 size=size, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1787 namespace=namespace, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1788 mime_type=mime_type, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1789 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1790 created=created, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1791 modified=modified, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1792 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1793 access=access, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1794 extra=extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
1795 ) |
2501
3b67fe672206
core (memory): file metadata handling methods:
Goffi <goffi@goffi.org>
parents:
2483
diff
changeset
|
1796 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1797 async def file_get_used_space( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1798 self, client, peer_jid: jid.JID, owner: Optional[jid.JID] = None |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1799 ) -> int: |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1800 """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
|
1801 |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1802 @param peer_jid: entity requesting the size |
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1803 @param owner: entity owning the file to check. If None, will be determined by |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1804 get_files_owner |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1805 @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
|
1806 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1807 owner = self.get_files_owner(client, owner, peer_jid) |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1808 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
|
1809 raise exceptions.PermissionError("You are not allowed to check this size") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1810 return await self.storage.file_get_used_space(client, owner) |
3523
30779935c0aa
core (memory, sqlite): new `fileGetUsedSpace` method
Goffi <goffi@goffi.org>
parents:
3499
diff
changeset
|
1811 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1812 def file_update(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
|
1813 """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
|
1814 |
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1815 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
|
1816 @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
|
1817 @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
|
1818 @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
|
1819 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
|
1820 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
|
1821 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1822 return self.storage.file_update(file_id, column, update_cb) |
2526
35d591086974
core (memory, sqlite): added fileUpdate method to update "extra" and "access" avoiding race condition
Goffi <goffi@goffi.org>
parents:
2518
diff
changeset
|
1823 |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1824 async def _delete_file( |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1825 self, |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1826 client: SatXMPPEntity, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1827 peer_jid: jid.JID, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1828 recursive: bool, |
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1829 files_path: Path, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1830 file_data: dict, |
3288
780fb8dd07ef
core (memory/sqlite): new database schema (v9):
Goffi <goffi@goffi.org>
parents:
3281
diff
changeset
|
1831 ): |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1832 """Internal method to delete files/directories recursively |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1833 |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1834 @param peer_jid: entity requesting the deletion (must be owner of files |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1835 to delete) |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1836 @param recursive: True if recursive deletion is needed |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1837 @param files_path: path of the directory containing the actual files |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1838 @param file_data: data of the file to delete |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1839 """ |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1840 if file_data["owner"] != peer_jid: |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1841 raise exceptions.PermissionError( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1842 "file {file_name} can't be deleted, {peer_jid} is not the owner".format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1843 file_name=file_data["name"], peer_jid=peer_jid.full() |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1844 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1845 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1846 if file_data["type"] == C.FILE_TYPE_DIRECTORY: |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1847 sub_files = await self.get_files(client, peer_jid, parent=file_data["id"]) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1848 if sub_files and not recursive: |
3028 | 1849 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
|
1850 # we first delete the sub-files |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1851 for sub_file_data in sub_files: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1852 if sub_file_data["type"] == C.FILE_TYPE_DIRECTORY: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1853 sub_file_path = files_path / sub_file_data["name"] |
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
|
1854 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
|
1855 sub_file_path = files_path |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1856 await self._delete_file( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1857 client, peer_jid, recursive, sub_file_path, sub_file_data |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1858 ) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1859 # then the directory itself |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1860 await self.storage.file_delete(file_data["id"]) |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1861 elif file_data["type"] == C.FILE_TYPE_FILE: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1862 log.info( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1863 _("deleting file {name} with hash {file_hash}").format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1864 name=file_data["name"], file_hash=file_data["file_hash"] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1865 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1866 ) |
4333
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1867 await self.storage.file_delete(file_data["id"]) |
e94799a0908f
core (main): Let plugins have several handlers + various improvements:
Goffi <goffi@goffi.org>
parents:
4270
diff
changeset
|
1868 references = await self.get_files( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1869 client, peer_jid, file_hash=file_data["file_hash"] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1870 ) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1871 if references: |
3028 | 1872 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
|
1873 else: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1874 file_path = os.path.join(files_path, file_data["file_hash"]) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1875 log.info( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1876 _("no reference left to {file_path}, deleting").format( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1877 file_path=file_path |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1878 ) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1879 ) |
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
|
1880 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
|
1881 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
|
1882 except FileNotFoundError: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1883 log.error( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1884 f"file at {file_path!r} doesn't exist but it was referenced in files database" |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1885 ) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1886 else: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1887 raise exceptions.InternalError( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1888 "Unexpected file type: {file_type}".format(file_type=file_data["type"]) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1889 ) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1890 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1891 async def file_delete(self, client, peer_jid, file_id, recursive=False): |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1892 """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
|
1893 |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1894 @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
|
1895 @param peer_jid(jid.JID): entity requesting the deletion, |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1896 must be owner of all files to delete |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1897 @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
|
1898 """ |
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1899 # 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
|
1900 # should be checked too |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1901 files_data = await self.get_files(client, peer_jid, file_id) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1902 if not files_data: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1903 raise exceptions.NotFound( |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1904 "Can't find the file with id {file_id}".format(file_id=file_id) |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1905 ) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1906 file_data = files_data[0] |
3028 | 1907 if file_data["type"] != C.FILE_TYPE_DIRECTORY and recursive: |
1908 raise ValueError("recursive can only be set for directories") | |
3932
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3782
diff
changeset
|
1909 files_path = self.host.get_local_path(None, C.FILES_DIR) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1910 await self._delete_file(client, peer_jid, recursive, files_path, file_data) |
2928
c0f6fd75af5f
core (memory, memory/sqlite): implemented fileDelete
Goffi <goffi@goffi.org>
parents:
2926
diff
changeset
|
1911 |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1912 ## Cache ## |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1913 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1914 def get_cache_path(self, namespace: str, *args: str) -> Path: |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1915 """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
|
1916 |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1917 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
|
1918 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
|
1919 @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
|
1920 @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
|
1921 """ |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1922 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
|
1923 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
|
1924 self._cache_path, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
1925 regex.path_escape(namespace), |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1926 *(regex.path_escape(a) for a in args), |
3371
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1927 ) |
e8d74ac7c479
core (memory/memory): added `getCachePath` method to get a cache dir from a namespace.
Goffi <goffi@goffi.org>
parents:
3364
diff
changeset
|
1928 |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1929 ## Notifications ## |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1930 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1931 def _add_notification( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1932 self, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1933 type_: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1934 body_plain: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1935 body_rich: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1936 title: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1937 is_global: bool, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1938 requires_action: bool, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1939 priority: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1940 expire_at: float, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1941 extra_s: str, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1942 profile_key: str, |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1943 ) -> defer.Deferred: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1944 client = self.host.get_client(profile_key) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1945 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1946 if not client.is_admin: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1947 raise exceptions.PermissionError("Only admins can add a notification") |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1948 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1949 try: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1950 notification_type = NotificationType[type_] |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1951 notification_priority = NotificationPriority[priority] |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1952 except KeyError as e: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1953 raise exceptions.DataError(f"invalid notification type or priority data: {e}") |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1954 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1955 return defer.ensureDeferred( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1956 self.add_notification( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1957 client, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1958 notification_type, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1959 body_plain, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1960 body_rich or None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1961 title or None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1962 is_global, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1963 requires_action, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1964 notification_priority, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1965 expire_at or None, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1966 data_format.deserialise(extra_s), |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1967 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1968 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1969 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1970 async def add_notification( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1971 self, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1972 client: SatXMPPEntity, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1973 type_: NotificationType, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1974 body_plain: str, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1975 body_rich: Optional[str] = None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1976 title: Optional[str] = None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1977 is_global: bool = False, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1978 requires_action: bool = False, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1979 priority: NotificationPriority = NotificationPriority.MEDIUM, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1980 expire_at: Optional[float] = None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1981 extra: Optional[dict] = None, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1982 ) -> None: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1983 """Create and broadcast a new notification. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1984 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1985 @param client: client associated with the notification. If None, the notification |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1986 will be global (i.e. for all profiles). |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1987 @param type_: type of the notification. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1988 @param body_plain: plain text body. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1989 @param body_rich: rich text (XHTML) body. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1990 @param title: optional title. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1991 @param is_global: True if the notification is for all profiles. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1992 @param requires_action: True if the notification requires user action (e.g. a |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1993 dialog need to be answered). |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1994 @priority: how urgent the notification is |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1995 @param expire_at: expiration timestamp for the notification. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1996 @param extra: additional data. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1997 """ |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1998 notification = await self.storage.add_notification( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
1999 None if is_global else client, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2000 type_, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2001 body_plain, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2002 body_rich, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2003 title, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2004 requires_action, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2005 priority, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2006 expire_at, |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2007 extra, |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2008 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2009 self.host.bridge.notification_new( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2010 str(notification.id), |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2011 notification.timestamp, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2012 type_.value, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2013 body_plain, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2014 body_rich or "", |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2015 title or "", |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2016 requires_action, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2017 priority.value, |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2018 expire_at or 0, |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2019 data_format.serialise(extra) if extra else "", |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2020 C.PROF_KEY_ALL if is_global else client.profile, |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2021 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2022 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2023 def _get_notifications(self, filters_s: str, profile_key: str) -> defer.Deferred: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2024 """Fetch notifications for bridge with given filters and profile key. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2025 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2026 @param filters_s: serialized filter conditions. Keys can be: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2027 :type_ (str): |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2028 Filter by type of the notification. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2029 :status (str): |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2030 Filter by status of the notification. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2031 :requires_action (bool): |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2032 Filter by notifications that require user action. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2033 :min_priority (str): |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2034 Filter by minimum priority value. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2035 @param profile_key: key of the profile to fetch notifications for. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2036 @return: Deferred which fires with a list of serialised notifications. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2037 """ |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2038 client = self.host.get_client(profile_key) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2039 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2040 filters = data_format.deserialise(filters_s) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2041 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2042 try: |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2043 if "type" in filters: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2044 filters["type_"] = NotificationType[filters.pop("type")] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2045 if "status" in filters: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2046 filters["status"] = NotificationStatus[filters["status"]] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2047 if "min_priority" in filters: |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2048 filters["min_priority"] = NotificationPriority[ |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2049 filters["min_priority"] |
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2050 ].value |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2051 except KeyError as e: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2052 raise exceptions.DataError(f"invalid filter data: {e}") |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2053 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2054 d = defer.ensureDeferred(self.storage.get_notifications(client, **filters)) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2055 d.addCallback( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2056 lambda notifications: data_format.serialise( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2057 [notification.serialise() for notification in notifications] |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2058 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2059 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2060 return d |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2061 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2062 def _delete_notification( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2063 self, id_: str, is_global: bool, profile_key: str |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2064 ) -> defer.Deferred: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2065 client = self.host.get_client(profile_key) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2066 if is_global and not client.is_admin: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2067 raise exceptions.PermissionError( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2068 "Only admins can delete global notifications" |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2069 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2070 return defer.ensureDeferred(self.delete_notification(client, id_, is_global)) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2071 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2072 async def delete_notification( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2073 self, client: SatXMPPEntity, id_: str, is_global: bool = False |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2074 ) -> None: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2075 """Delete a notification |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2076 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2077 the notification must be from the requesting profile. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2078 @param id_: ID of the notification |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2079 is_global: if True, a global notification will be removed. |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2080 """ |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2081 await self.storage.delete_notification(None if is_global else client, id_) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2082 self.host.bridge.notification_deleted( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2083 id_, C.PROF_KEY_ALL if is_global else client.profile |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2084 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2085 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2086 def _notifications_expired_clean( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2087 self, limit_timestamp: float, profile_key: str |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2088 ) -> defer.Deferred: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2089 if profile_key == C.PROF_KEY_NONE: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2090 client = None |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2091 else: |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2092 client = self.host.get_client(profile_key) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2093 |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2094 return defer.ensureDeferred( |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2095 self.storage.clean_expired_notifications( |
4270
0d7bb4df2343
Reformatted code base using black.
Goffi <goffi@goffi.org>
parents:
4269
diff
changeset
|
2096 client, None if limit_timestamp == -1.0 else limit_timestamp |
4130
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2097 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2098 ) |
02f0adc745c6
core: notifications implementation, first draft:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
2099 |
1290
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
2100 ## Misc ## |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
2101 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
2102 def is_entity_available(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
|
2103 """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
|
2104 |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
2105 @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
|
2106 @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
|
2107 """ |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
2108 if not entity_jid.resource: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
2109 return bool( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
2110 self.get_available_resources(client, entity_jid) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2597
diff
changeset
|
2111 ) # 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
|
2112 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
2113 presence_data = self.get_entity_datum(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
|
2114 except KeyError: |
3028 | 2115 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
|
2116 return False |
faa1129559b8
core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents:
1263
diff
changeset
|
2117 return presence_data.show != C.PRESENCE_UNAVAILABLE |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2118 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
2119 def is_admin(self, profile: str) -> bool: |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2120 """Tell if given profile has administrator privileges""" |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2121 return profile in self.admins |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2122 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
2123 def is_admin_jid(self, entity: jid.JID) -> bool: |
3777
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2124 """Tells if an entity jid correspond to an admin one |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2125 |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2126 It is sometime not possible to use the profile alone to check if an entity is an |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2127 admin (e.g. a request managed by a component). In this case we check if the JID |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2128 correspond to an admin profile |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2129 """ |
001ea5f4a2f9
core: method to know if a profile/entity is an admin:
Goffi <goffi@goffi.org>
parents:
3582
diff
changeset
|
2130 return entity.userhostJID() in self.admin_jids |