Mercurial > libervia-backend
annotate sat/plugins/plugin_comp_file_sharing.py @ 3888:aa7197b67c26
component AP gateway: AP <=> XMPP reactions conversions:
- Pubsub Attachments plugin has been renamed to XEP-0470 following publication
- XEP-0470 has been updated to follow 0.2 changes
- AP reactions (as implemented in Pleroma) are converted to XEP-0470
- XEP-0470 events are converted to AP reactions (again, using "EmojiReact" from Pleroma)
- AP activities related to attachments (like/reactions) are cached in Libervia because
it's not possible to retrieve them from Pleroma instances once they have been emitted
(doing an HTTP get on their ID returns a 404). For now those cache are not flushed, this
should be improved in the future.
- `sharedInbox` is used when available. Pleroma returns a 500 HTTP error when ``to`` or
``cc`` are used in a direct inbox.
- reactions and like are not currently used for direct messages, because they can't be
emitted from Pleroma in this case, thus there is no point in implementing them for the
moment.
rel 371
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 31 Aug 2022 17:07:03 +0200 |
parents | 3ef988734869 |
children | 7af29260ecb8 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
3 # Libervia File Sharing component |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
19 import os |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
20 import os.path |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
21 import mimetypes |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
22 import tempfile |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
23 from functools import partial |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
24 import shortuuid |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
25 import unicodedata |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
26 from urllib.parse import urljoin, urlparse, quote, unquote |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
27 from pathlib import Path |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
28 from sat.core.i18n import _, D_ |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from sat.core.constants import Const as C |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from sat.core import exceptions |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 from sat.core.log import getLogger |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
32 from sat.tools import stream |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
33 from sat.tools import video |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
34 from sat.tools.utils import ensure_deferred |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 from sat.tools.common import regex |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
36 from sat.tools.common import uri |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
37 from sat.tools.common import files_utils |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
38 from sat.tools.common import utils |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
39 from sat.tools.common import tls |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
40 from twisted.internet import defer, reactor |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
41 from twisted.words.protocols.jabber import error |
3296 | 42 from twisted.web import server, resource, static, http |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
43 from wokkel import pubsub |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
44 from wokkel import generic |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
3136 | 47 log = getLogger(__name__) |
48 | |
49 | |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 PLUGIN_INFO = { |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 C.PI_NAME: "File sharing component", |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
52 C.PI_IMPORT_NAME: "file-sharing", |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 C.PI_MODES: [C.PLUG_MODE_COMPONENT], |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 C.PI_TYPE: C.PLUG_TYPE_ENTRY_POINT, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 C.PI_PROTOCOLS: [], |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
56 C.PI_DEPENDENCIES: [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
57 "FILE", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
58 "FILE_SHARING_MANAGEMENT", |
3367
90aee1f2d07c
component file sharing: added missing `owner` filtering in `_retrieveFiles`
Goffi <goffi@goffi.org>
parents:
3363
diff
changeset
|
59 "XEP-0106", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
60 "XEP-0234", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
61 "XEP-0260", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
62 "XEP-0261", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
63 "XEP-0264", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
64 "XEP-0329", |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
65 "XEP-0363", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
66 ], |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 C.PI_RECOMMENDATIONS: [], |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 C.PI_MAIN: "FileSharing", |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
69 C.PI_HANDLER: C.BOOL_TRUE, |
3028 | 70 C.PI_DESCRIPTION: _("""Component hosting and sharing files"""), |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 } |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 |
3028 | 73 HASH_ALGO = "sha-256" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
74 NS_COMMENTS = "org.salut-a-toi.comments" |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
75 NS_FS_AFFILIATION = "org.salut-a-toi.file-sharing-affiliation" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
76 COMMENT_NODE_PREFIX = "org.salut-a-toi.file_comments/" |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
77 # Directory used to buffer request body (i.e. file in case of PUT) we use more than one @ |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
78 # there, to be sure than it's not conflicting with a JID |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
79 TMP_BUFFER_DIR = "@@tmp@@" |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
80 OVER_QUOTA_TXT = D_( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
81 "You are over quota, your maximum allowed size is {quota} and you are already using " |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
82 "{used_space}, you can't upload {file_size} more." |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
83 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
84 |
3722
75f8d206e551
component file sharing: set server name at render time
Goffi <goffi@goffi.org>
parents:
3721
diff
changeset
|
85 HTTP_VERSION = unicodedata.normalize( |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
86 'NFKD', |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
87 f"{C.APP_NAME} file sharing {C.APP_VERSION}" |
3722
75f8d206e551
component file sharing: set server name at render time
Goffi <goffi@goffi.org>
parents:
3721
diff
changeset
|
88 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
91 class HTTPFileServer(resource.Resource): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
92 isLeaf = True |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
93 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
94 def errorPage(self, request, code): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
95 request.setResponseCode(code) |
3296 | 96 if code == http.BAD_REQUEST: |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
97 brief = 'Bad Request' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
98 details = "Your request is invalid" |
3296 | 99 elif code == http.FORBIDDEN: |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
100 brief = 'Forbidden' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
101 details = "You're not allowed to use this resource" |
3296 | 102 elif code == http.NOT_FOUND: |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
103 brief = 'Not Found' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
104 details = "No resource found at this URL" |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
105 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
106 brief = 'Error' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
107 details = "This resource can't be used" |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
108 log.error(f"Unexpected return code used: {code}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
109 log.warning( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
110 f'Error returned while trying to access url {request.uri.decode()}: ' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
111 f'"{brief}" ({code}): {details}' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
112 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
113 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
114 return resource.ErrorPage(code, brief, details).render(request) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
115 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
116 def getDispositionType(self, media_type, media_subtype): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
117 if media_type in ('image', 'video'): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
118 return 'inline' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
119 elif media_type == 'application' and media_subtype == 'pdf': |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
120 return 'inline' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
121 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
122 return 'attachment' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
123 |
3296 | 124 def render(self, request): |
3722
75f8d206e551
component file sharing: set server name at render time
Goffi <goffi@goffi.org>
parents:
3721
diff
changeset
|
125 request.setHeader("server", HTTP_VERSION) |
3296 | 126 request.setHeader("Access-Control-Allow-Origin", "*") |
127 request.setHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, PUT") | |
3340
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
128 request.setHeader( |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
129 "Access-Control-Allow-Headers", |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
130 "Content-Type, Range, Xmpp-File-Path, Xmpp-File-No-Http") |
3296 | 131 request.setHeader("Access-Control-Allow-Credentials", "true") |
3340
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
132 request.setHeader("Accept-Ranges", "bytes") |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
133 |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
134 request.setHeader( |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
135 "Access-Control-Expose-Headers", |
2ad14b834730
component file sharing: added `Access-Control-Expose-Headers` CORS header:
Goffi <goffi@goffi.org>
parents:
3331
diff
changeset
|
136 "Date, Content-Length, Content-Range") |
3296 | 137 return super().render(request) |
138 | |
139 def render_OPTIONS(self, request): | |
140 request.setResponseCode(http.OK) | |
141 return b"" | |
142 | |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
143 def render_GET(self, request): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
144 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
145 request.upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
146 except exceptions.DataError: |
3296 | 147 return self.errorPage(request, http.NOT_FOUND) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
148 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
149 defer.ensureDeferred(self.renderGet(request)) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
150 return server.NOT_DONE_YET |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
151 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
152 async def renderGet(self, request): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
153 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
154 upload_id, filename = request.upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
155 except exceptions.DataError: |
3296 | 156 request.write(self.errorPage(request, http.FORBIDDEN)) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
157 request.finish() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
158 return |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
159 found_files = await request.file_sharing.host.memory.getFiles( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
160 client=None, peer_jid=None, perms_to_check=None, public_id=upload_id) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
161 if not found_files: |
3296 | 162 request.write(self.errorPage(request, http.NOT_FOUND)) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
163 request.finish() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
164 return |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
165 if len(found_files) > 1: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
166 log.error(f"more that one files found for public id {upload_id!r}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
167 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
168 found_file = found_files[0] |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
169 file_path = request.file_sharing.files_path/found_file['file_hash'] |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
170 file_res = static.File(file_path) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
171 file_res.type = f'{found_file["media_type"]}/{found_file["media_subtype"]}' |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
172 file_res.encoding = file_res.contentEncodings.get(Path(found_file['name']).suffix) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
173 disp_type = self.getDispositionType( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
174 found_file['media_type'], found_file['media_subtype']) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
175 # the URL is percent encoded, and not all browsers/tools unquote the file name, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
176 # thus we add a content disposition header |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
177 request.setHeader( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
178 'Content-Disposition', |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
179 f"{disp_type}; filename*=UTF-8''{quote(found_file['name'])}" |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
180 ) |
3296 | 181 # cf. https://xmpp.org/extensions/xep-0363.html#server |
182 request.setHeader( | |
183 'Content-Security-Policy', | |
184 "default-src 'none'; frame-ancestors 'none';" | |
185 ) | |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
186 ret = file_res.render(request) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
187 if ret != server.NOT_DONE_YET: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
188 # HEAD returns directly the result (while GET use a produced) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
189 request.write(ret) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
190 request.finish() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
191 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
192 def render_PUT(self, request): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
193 defer.ensureDeferred(self.renderPut(request)) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
194 return server.NOT_DONE_YET |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
195 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
196 async def renderPut(self, request): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
197 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
198 client, upload_request = request.upload_request_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
199 upload_id, filename = request.upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
200 except AttributeError: |
3296 | 201 request.write(self.errorPage(request, http.BAD_REQUEST)) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
202 request.finish() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
203 return |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
204 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
205 # at this point request is checked and file is buffered, we can store it |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
206 # we close the content here, before registering the file |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
207 request.content.close() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
208 tmp_file_path = Path(request.content.name) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
209 request.content = None |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
210 |
3297
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
211 # the 2 following headers are not standard, but useful in the context of file |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
212 # sharing with HTTP Upload: first one allow uploader to specify the path |
3297
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
213 # and second one will disable public exposure of the file through HTTP |
3301
9d1c0feba048
comp file sharing: file paths are now quoted on upload to allow unicode
Goffi <goffi@goffi.org>
parents:
3297
diff
changeset
|
214 path = request.getHeader("Xmpp-File-Path") |
9d1c0feba048
comp file sharing: file paths are now quoted on upload to allow unicode
Goffi <goffi@goffi.org>
parents:
3297
diff
changeset
|
215 if path: |
9d1c0feba048
comp file sharing: file paths are now quoted on upload to allow unicode
Goffi <goffi@goffi.org>
parents:
3297
diff
changeset
|
216 path = unquote(path) |
9d1c0feba048
comp file sharing: file paths are now quoted on upload to allow unicode
Goffi <goffi@goffi.org>
parents:
3297
diff
changeset
|
217 else: |
9d1c0feba048
comp file sharing: file paths are now quoted on upload to allow unicode
Goffi <goffi@goffi.org>
parents:
3297
diff
changeset
|
218 path = "/uploads" |
3297
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
219 if request.getHeader("Xmpp-File-No-Http") is not None: |
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
220 public_id = None |
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
221 else: |
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
222 public_id = upload_id |
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
223 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
224 file_data = { |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
225 "name": unquote(upload_request.filename), |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
226 "mime_type": upload_request.content_type, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
227 "size": upload_request.size, |
3297
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
228 "path": path |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
229 } |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
230 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
231 await request.file_sharing.registerReceivedFile( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
232 client, upload_request.from_, file_data, tmp_file_path, |
3297
91b5ae058c66
comp file sharing: handle upload with headers:
Goffi <goffi@goffi.org>
parents:
3296
diff
changeset
|
233 public_id=public_id, |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
234 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
235 |
3296 | 236 request.setResponseCode(http.CREATED) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
237 request.finish() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
238 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
239 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
240 class FileSharingRequest(server.Request): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
241 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
242 def __init__(self, *args, **kwargs): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
243 super().__init__(*args, **kwargs) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
244 self._upload_data = None |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
245 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
246 @property |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
247 def upload_data(self): |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
248 """A tuple with upload_id and filename retrieved from requested path""" |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
249 if self._upload_data is not None: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
250 return self._upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
251 |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
252 # self.path is not available if we are early in the request (e.g. when gotLength |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
253 # is called), in which case channel._path must be used. On the other hand, when |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
254 # render_[VERB] is called, only self.path is available |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
255 path = self.channel._path if self.path is None else self.path |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
256 # we normalise the path |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
257 path = urlparse(path.decode()).path |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
258 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
259 __, upload_id, filename = path.split('/') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
260 except ValueError: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
261 raise exceptions.DataError("no enought path elements") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
262 if len(upload_id) < 10: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
263 raise exceptions.DataError(f"invalid upload ID received for a PUT: {upload_id!r}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
264 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
265 self._upload_data = (upload_id, filename) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
266 return self._upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
267 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
268 @property |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
269 def file_sharing(self): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
270 return self.channel.site.file_sharing |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
271 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
272 @property |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
273 def file_tmp_dir(self): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
274 return self.channel.site.file_tmp_dir |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
275 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
276 def refuseRequest(self): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
277 if self.content is not None: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
278 self.content.close() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
279 self.content = open(os.devnull, 'w+b') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
280 self.channel._respondToBadRequestAndDisconnect() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
281 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
282 def gotLength(self, length): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
283 if self.channel._command.decode().upper() == 'PUT': |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
284 # for PUT we check early if upload_id is fine, to avoid buffering a file we'll refuse |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
285 # we buffer the file in component's TMP_BUFFER_DIR, so we just have to rename it at the end |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
286 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
287 upload_id, filename = self.upload_data |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
288 except exceptions.DataError as e: |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
289 log.warning(f"Invalid PUT request, we stop here: {e}") |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
290 return self.refuseRequest() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
291 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
292 client, upload_request, timer = self.file_sharing.expected_uploads.pop(upload_id) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
293 except KeyError: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
294 log.warning(f"unknown (expired?) upload ID received for a PUT: {upload_id!r}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
295 return self.refuseRequest() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
296 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
297 if not timer.active: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
298 log.warning(f"upload id {upload_id!r} used for a PUT, but it is expired") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
299 return self.refuseRequest() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
300 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
301 timer.cancel() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
302 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
303 if upload_request.filename != filename: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
304 log.warning( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
305 f"invalid filename for PUT (upload id: {upload_id!r}, URL: {self.channel._path.decode()}). Original " |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
306 f"{upload_request.filename!r} doesn't match {filename!r}" |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
307 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
308 return self.refuseRequest() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
309 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
310 self.upload_request_data = (client, upload_request) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
311 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
312 file_tmp_path = files_utils.get_unique_name( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
313 self.file_tmp_dir/upload_id) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
314 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
315 self.content = open(file_tmp_path, 'w+b') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
316 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
317 return super().gotLength(length) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
318 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
319 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
320 class FileSharingSite(server.Site): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
321 requestFactory = FileSharingRequest |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
322 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
323 def __init__(self, file_sharing): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
324 self.file_sharing = file_sharing |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
325 self.file_tmp_dir = file_sharing.host.getLocalPath( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
326 None, C.FILES_TMP_DIR, TMP_BUFFER_DIR, component=True, profile=False |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
327 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
328 for old_file in self.file_tmp_dir.iterdir(): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
329 log.debug(f"purging old buffer file at {old_file}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
330 old_file.unlink() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
331 super().__init__(HTTPFileServer()) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
332 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
333 def getContentFile(self, length): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
334 file_tmp_path = self.file_tmp_dir/shortuuid.uuid() |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
335 return open(file_tmp_path, 'w+b') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
336 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
337 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
338 class FileSharing: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
339 |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
340 def __init__(self, host): |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
341 self.host = host |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
342 self.initialised = False |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
343 |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
344 def init(self): |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
345 # we init once on first component connection, |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
346 # there is not need to init this plugin if not component use it |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
347 # TODO: this plugin should not be loaded at all if no component uses it |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
348 # and should be loaded dynamically as soon as a suitable profile is created |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
349 if self.initialised: |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
350 return |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
351 self.initialised = True |
3028 | 352 log.info(_("File Sharing initialization")) |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
353 self._f = self.host.plugins["FILE"] |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
354 self._jf = self.host.plugins["XEP-0234"] |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
355 self._h = self.host.plugins["XEP-0300"] |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
356 self._t = self.host.plugins["XEP-0264"] |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
357 self._hu = self.host.plugins["XEP-0363"] |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
358 self._hu.registerHandler(self._onHTTPUpload) |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
359 self.host.trigger.add("FILE_getDestDir", self._getDestDirTrigger) |
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
360 self.host.trigger.add( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
361 "XEP-0234_fileSendingRequest", self._fileSendingRequestTrigger, priority=1000 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
362 ) |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
363 self.host.trigger.add("XEP-0234_buildFileElement", self._addFileMetadataElts) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
364 self.host.trigger.add("XEP-0234_parseFileElement", self._getFileMetadataElts) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
365 self.host.trigger.add("XEP-0329_compGetFilesFromNode", self._addFileMetadata) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
366 self.host.trigger.add( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
367 "XEP-0329_compGetFilesFromNode_build_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
368 self._addDirectoryMetadataElts) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
369 self.host.trigger.add( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
370 "XEP-0329_parseResult_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
371 self._getDirectoryMetadataElts) |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
372 self.files_path = self.host.getLocalPath(None, C.FILES_DIR, profile=False) |
3507 | 373 self.http_port = int(self.host.memory.getConfig( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
374 'component file-sharing', 'http_upload_port', 8888)) |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
375 connection_type = self.host.memory.getConfig( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
376 'component file-sharing', 'http_upload_connection_type', 'https') |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
377 if connection_type not in ('http', 'https'): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
378 raise exceptions.ConfigError( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
379 'bad http_upload_connection_type, you must use one of "http" or "https"' |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
380 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
381 self.server = FileSharingSite(self) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
382 self.expected_uploads = {} |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
383 if connection_type == 'http': |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
384 reactor.listenTCP(self.http_port, self.server) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
385 else: |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
386 options = tls.getOptionsFromConfig( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
387 self.host.memory.config, "component file-sharing") |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
388 tls.TLSOptionsCheck(options) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
389 context_factory = tls.getTLSContextFactory(options) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
390 reactor.listenSSL(self.http_port, self.server, context_factory) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
391 |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
392 def getHandler(self, client): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
393 return Comments_handler(self) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
394 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
395 def profileConnecting(self, client): |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
396 self.init() |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
397 public_base_url = self.host.memory.getConfig( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
398 'component file-sharing', 'http_upload_public_facing_url') |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
399 if public_base_url is None: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
400 client._file_sharing_base_url = f"https://{client.host}:{self.http_port}" |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
401 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
402 client._file_sharing_base_url = public_base_url |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
403 path = client.file_tmp_dir = os.path.join( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
404 self.host.memory.getConfig("", "local_dir"), |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
405 C.FILES_TMP_DIR, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
406 regex.pathEscape(client.profile), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
407 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
408 if not os.path.exists(path): |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
409 os.makedirs(path) |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
411 def getQuota(self, client, entity): |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
412 """Return maximum size allowed for all files for entity""" |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
413 quotas = self.host.memory.getConfig("component file-sharing", "quotas_json", {}) |
3778
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
414 if self.host.memory.isAdminJID(entity): |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
415 quota = quotas.get("admins") |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
416 else: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
417 try: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
418 quota = quotas["jids"][entity.userhost()] |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
419 except KeyError: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
420 quota = quotas.get("users") |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
421 return None if quota is None else utils.parseSize(quota) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
422 |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
423 async def generate_thumbnails(self, extra: dict, image_path: Path): |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
424 thumbnails = extra.setdefault(C.KEY_THUMBNAILS, []) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
425 for max_thumb_size in self._t.SIZES: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
426 try: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
427 thumb_size, thumb_id = await self._t.generateThumbnail( |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
428 image_path, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
429 max_thumb_size, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
430 # we keep thumbnails for 6 months |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
431 60 * 60 * 24 * 31 * 6, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
432 ) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
433 except Exception as e: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
434 log.warning(_("Can't create thumbnail: {reason}").format(reason=e)) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
435 break |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
436 thumbnails.append({"id": thumb_id, "size": thumb_size}) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
437 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
438 async def registerReceivedFile( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
439 self, client, peer_jid, file_data, file_path, public_id=None, extra=None): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
440 """Post file reception tasks |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
441 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
442 once file is received, this method create hash/thumbnails if necessary |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
443 move the file to the right location, and create metadata entry in database |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
444 """ |
3028 | 445 name = file_data["name"] |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
446 if extra is None: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
447 extra = {} |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
448 |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
449 mime_type = file_data.get("mime_type") |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
450 if not mime_type or mime_type == "application/octet-stream": |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
451 mime_type = mimetypes.guess_type(name)[0] |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
452 |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
453 is_image = mime_type is not None and mime_type.startswith("image") |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
454 is_video = mime_type is not None and mime_type.startswith("video") |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
455 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
456 if file_data.get("hash_algo") == HASH_ALGO: |
3028 | 457 log.debug(_("Reusing already generated hash")) |
458 file_hash = file_data["hash_hasher"].hexdigest() | |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
459 else: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
460 hasher = self._h.getHasher(HASH_ALGO) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
461 with file_path.open('rb') as f: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
462 file_hash = await self._h.calculateHash(f, hasher) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
463 final_path = self.files_path/file_hash |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
464 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
465 if final_path.is_file(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
466 log.debug( |
3028 | 467 "file [{file_hash}] already exists, we can remove temporary one".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
468 file_hash=file_hash |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
469 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
470 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
471 file_path.unlink() |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
472 else: |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
473 file_path.rename(final_path) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
474 log.debug( |
3028 | 475 "file [{file_hash}] moved to {files_path}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
476 file_hash=file_hash, files_path=self.files_path |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
477 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
478 ) |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
479 |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
480 if is_image: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
481 await self.generate_thumbnails(extra, final_path) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
482 elif is_video: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
483 with tempfile.TemporaryDirectory() as tmp_dir: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
484 thumb_path = Path(tmp_dir) / "thumbnail.jpg" |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
485 try: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
486 await video.get_thumbnail(final_path, thumb_path) |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
487 except Exception as e: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
488 log.warning(_("Can't get thumbnail for {final_path}: {e}").format( |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
489 final_path=final_path, e=e)) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
490 else: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
491 await self.generate_thumbnails(extra, thumb_path) |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
492 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
493 await self.host.memory.setFile( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
494 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
495 name=name, |
3028 | 496 version="", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
497 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
498 hash_algo=HASH_ALGO, |
3028 | 499 size=file_data["size"], |
500 path=file_data.get("path"), | |
501 namespace=file_data.get("namespace"), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
502 mime_type=mime_type, |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
503 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
504 owner=peer_jid, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
505 extra=extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
506 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
507 |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
508 async def _getDestDirTrigger( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
509 self, client, peer_jid, transfer_data, file_data, stream_object |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
510 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
511 """This trigger accept file sending request, and store file locally""" |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 if not client.is_component: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
513 return True, None |
3532
ab72b8ac3bd2
component file sharing: forbid jingle upload by entities which are not in allowed hosts
Goffi <goffi@goffi.org>
parents:
3528
diff
changeset
|
514 # client._file_sharing_allowed_hosts is set in plugin XEP-0329 |
ab72b8ac3bd2
component file sharing: forbid jingle upload by entities which are not in allowed hosts
Goffi <goffi@goffi.org>
parents:
3528
diff
changeset
|
515 if peer_jid.host not in client._file_sharing_allowed_hosts: |
ab72b8ac3bd2
component file sharing: forbid jingle upload by entities which are not in allowed hosts
Goffi <goffi@goffi.org>
parents:
3528
diff
changeset
|
516 raise error.StanzaError("forbidden") |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
517 assert stream_object |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
518 assert "stream_object" not in transfer_data |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
519 assert C.KEY_PROGRESS_ID in file_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
520 filename = file_data["name"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
521 assert filename and not "/" in filename |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
522 quota = self.getQuota(client, peer_jid) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
523 if quota is not None: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
524 used_space = await self.host.memory.fileGetUsedSpace(client, peer_jid) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
525 |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
526 if (used_space + file_data["size"]) > quota: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
527 raise error.StanzaError( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
528 "not-acceptable", |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
529 text=OVER_QUOTA_TXT.format( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
530 quota=utils.getHumanSize(quota), |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
531 used_space=utils.getHumanSize(used_space), |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
532 file_size=utils.getHumanSize(file_data['size']) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
533 ) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
534 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
535 file_tmp_dir = self.host.getLocalPath( |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
536 None, C.FILES_TMP_DIR, peer_jid.userhost(), component=True, profile=False |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
537 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
538 file_tmp_path = file_data['file_path'] = files_utils.get_unique_name( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
539 file_tmp_dir/filename) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
540 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
541 transfer_data["finished_d"].addCallback( |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
542 lambda __: defer.ensureDeferred( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
543 self.registerReceivedFile(client, peer_jid, file_data, file_tmp_path) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
544 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
545 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
546 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
547 self._f.openFileWrite( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
548 client, file_tmp_path, transfer_data, file_data, stream_object |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
549 ) |
3701
6d298323eed2
plugin comp file sharing: don't use Deferred in return value
Goffi <goffi@goffi.org>
parents:
3677
diff
changeset
|
550 return False, True |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
551 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
552 async def _retrieveFiles( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
553 self, client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
554 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
555 """This method retrieve a file on request, and send if after checking permissions""" |
3028 | 556 peer_jid = session["peer_jid"] |
3514
6d9c9e2dca0a
component (file sharing): fix retrieving owner from jid when user part is not specified
Goffi <goffi@goffi.org>
parents:
3507
diff
changeset
|
557 if session['local_jid'].user: |
6d9c9e2dca0a
component (file sharing): fix retrieving owner from jid when user part is not specified
Goffi <goffi@goffi.org>
parents:
3507
diff
changeset
|
558 owner = client.getOwnerFromJid(session['local_jid']) |
6d9c9e2dca0a
component (file sharing): fix retrieving owner from jid when user part is not specified
Goffi <goffi@goffi.org>
parents:
3507
diff
changeset
|
559 else: |
6d9c9e2dca0a
component (file sharing): fix retrieving owner from jid when user part is not specified
Goffi <goffi@goffi.org>
parents:
3507
diff
changeset
|
560 owner = peer_jid |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
561 try: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
562 found_files = await self.host.memory.getFiles( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
563 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
564 peer_jid=peer_jid, |
3028 | 565 name=file_data.get("name"), |
566 file_hash=file_data.get("file_hash"), | |
567 hash_algo=file_data.get("hash_algo"), | |
568 path=file_data.get("path"), | |
569 namespace=file_data.get("namespace"), | |
3367
90aee1f2d07c
component file sharing: added missing `owner` filtering in `_retrieveFiles`
Goffi <goffi@goffi.org>
parents:
3363
diff
changeset
|
570 owner=owner, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
571 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
572 except exceptions.NotFound: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
573 found_files = None |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
574 except exceptions.PermissionError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
575 log.warning( |
3028 | 576 _("{peer_jid} is trying to access an unauthorized file: {name}").format( |
577 peer_jid=peer_jid, name=file_data.get("name") | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
578 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
579 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
580 return False |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
581 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
582 if not found_files: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
583 log.warning( |
3028 | 584 _("no matching file found ({file_data})").format(file_data=file_data) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
585 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
586 return False |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
587 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
588 # we only use the first found file |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
589 found_file = found_files[0] |
3028 | 590 if found_file['type'] != C.FILE_TYPE_FILE: |
591 raise TypeError("a file was expected, type is {type_}".format( | |
592 type_=found_file['type'])) | |
593 file_hash = found_file["file_hash"] | |
3363
e3bdfecaf1b0
component file sharing: fix used of `self.files_path` in `_retrieveFiles`
Goffi <goffi@goffi.org>
parents:
3359
diff
changeset
|
594 file_path = self.files_path / file_hash |
3028 | 595 file_data["hash_hasher"] = hasher = self._h.getHasher(found_file["hash_algo"]) |
596 size = file_data["size"] = found_file["size"] | |
597 file_data["file_hash"] = file_hash | |
598 file_data["hash_algo"] = found_file["hash_algo"] | |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
599 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
600 # we complete file_elt so peer can have some details on the file |
3028 | 601 if "name" not in file_data: |
602 file_elt.addElement("name", content=found_file["name"]) | |
603 file_elt.addElement("size", content=str(size)) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
604 content_data["stream_object"] = stream.FileStreamObject( |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
605 self.host, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
606 client, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
607 file_path, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
608 uid=self._jf.getProgressId(session, content_name), |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
609 size=size, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
610 data_cb=lambda data: hasher.update(data), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
611 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
612 return True |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
613 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
614 def _fileSendingRequestTrigger( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
615 self, client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
616 ): |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
617 if not client.is_component: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
618 return True, None |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
619 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
620 return ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
621 False, |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
622 defer.ensureDeferred(self._retrieveFiles( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
623 client, session, content_data, content_name, file_data, file_elt |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
624 )), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
625 ) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
626 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
627 ## HTTP Upload ## |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
628 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
629 def _purge_slot(self, upload_id): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
630 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
631 del self.expected_uploads[upload_id] |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
632 except KeyError: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
633 log.error(f"trying to purge an inexisting upload slot ({upload_id})") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
634 |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
635 async def _onHTTPUpload(self, client, request): |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
636 # filename should be already cleaned, but it's better to double check |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
637 assert '/' not in request.filename |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3348
diff
changeset
|
638 # client._file_sharing_allowed_hosts is set in plugin XEP-0329 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
639 if request.from_.host not in client._file_sharing_allowed_hosts: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
640 raise error.StanzaError("forbidden") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
641 |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
642 quota = self.getQuota(client, request.from_) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
643 if quota is not None: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
644 used_space = await self.host.memory.fileGetUsedSpace(client, request.from_) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
645 |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
646 if (used_space + request.size) > quota: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
647 raise error.StanzaError( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
648 "not-acceptable", |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
649 text=OVER_QUOTA_TXT.format( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
650 quota=utils.getHumanSize(quota), |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
651 used_space=utils.getHumanSize(used_space), |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
652 file_size=utils.getHumanSize(request.size) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
653 ), |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
654 appCondition = self._hu.getFileTooLargeElt(max(quota - used_space, 0)) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
655 ) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
656 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
657 upload_id = shortuuid.ShortUUID().random(length=30) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
658 assert '/' not in upload_id |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
659 timer = reactor.callLater(30, self._purge_slot, upload_id) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
660 self.expected_uploads[upload_id] = (client, request, timer) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
661 url = urljoin(client._file_sharing_base_url, f"{upload_id}/{request.filename}") |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
662 slot = self._hu.Slot( |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
663 put=url, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
664 get=url, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
665 headers=[], |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
666 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
667 return slot |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
668 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
669 ## metadata triggers ## |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
670 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
671 def _addFileMetadataElts(self, client, file_elt, extra_args): |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
672 # affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
673 affiliation = extra_args.get('affiliation') |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
674 if affiliation is not None: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
675 file_elt.addElement((NS_FS_AFFILIATION, "affiliation"), content=affiliation) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
676 |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
677 # comments |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
678 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
679 comments_url = extra_args.pop("comments_url") |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
680 except KeyError: |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
681 return |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
682 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
683 comment_elt = file_elt.addElement((NS_COMMENTS, "comments"), content=comments_url) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
684 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
685 try: |
3028 | 686 count = len(extra_args["extra"]["comments"]) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
687 except KeyError: |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
688 count = 0 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
689 |
3028 | 690 comment_elt["count"] = str(count) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
691 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
692 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
693 def _getFileMetadataElts(self, client, file_elt, file_data): |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
694 # affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
695 try: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
696 affiliation_elt = next(file_elt.elements(NS_FS_AFFILIATION, "affiliation")) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
697 except StopIteration: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
698 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
699 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
700 file_data["affiliation"] = str(affiliation_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
701 |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
702 # comments |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
703 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
704 comments_elt = next(file_elt.elements(NS_COMMENTS, "comments")) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
705 except StopIteration: |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
706 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
707 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
708 file_data["comments_url"] = str(comments_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
709 file_data["comments_count"] = comments_elt["count"] |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
710 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
711 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
712 def _addFileMetadata( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
713 self, client, iq_elt, iq_result_elt, owner, node_path, files_data): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
714 for file_data in files_data: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
715 file_data["comments_url"] = uri.buildXMPPUri( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
716 "pubsub", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
717 path=client.jid.full(), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
718 node=COMMENT_NODE_PREFIX + file_data["id"], |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
719 ) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
720 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
721 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
722 def _addDirectoryMetadataElts( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
723 self, client, file_data, directory_elt, owner, node_path): |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
724 affiliation = file_data.get('affiliation') |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
725 if affiliation is not None: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
726 directory_elt.addElement( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
727 (NS_FS_AFFILIATION, "affiliation"), |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
728 content=affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
729 ) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
730 |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
731 def _getDirectoryMetadataElts( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
732 self, client, elt, file_data): |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
733 try: |
3859
3ef988734869
core: fix calls to `domish.Element.elements`:
Goffi <goffi@goffi.org>
parents:
3778
diff
changeset
|
734 affiliation_elt = next(elt.elements(NS_FS_AFFILIATION, "affiliation")) |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
735 except StopIteration: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
736 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
737 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
738 file_data['affiliation'] = str(affiliation_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
739 |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
740 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
741 class Comments_handler(pubsub.PubSubService): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
742 """This class is a minimal Pubsub service handling virtual nodes for comments""" |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
743 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
744 def __init__(self, plugin_parent): |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
745 super(Comments_handler, self).__init__() |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
746 self.host = plugin_parent.host |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
747 self.plugin_parent = plugin_parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
748 self.discoIdentity = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
749 "category": "pubsub", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
750 "type": "virtual", # FIXME: non standard, here to avoid this service being considered as main pubsub one |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
751 "name": "files commenting service", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
752 } |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
753 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
754 def _getFileId(self, nodeIdentifier): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
755 if not nodeIdentifier.startswith(COMMENT_NODE_PREFIX): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
756 raise error.StanzaError("item-not-found") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
757 file_id = nodeIdentifier[len(COMMENT_NODE_PREFIX) :] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
758 if not file_id: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
759 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
760 return file_id |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
761 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
762 async def getFileData(self, requestor, nodeIdentifier): |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
763 file_id = self._getFileId(nodeIdentifier) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
764 try: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
765 files = await self.host.memory.getFiles(self.parent, requestor, file_id) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
766 except (exceptions.NotFound, exceptions.PermissionError): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
767 # we don't differenciate between NotFound and PermissionError |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
768 # to avoid leaking information on existing files |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
769 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
770 if not files: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
771 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
772 if len(files) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
773 raise error.InternalError("there should be only one file") |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
774 return files[0] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
775 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
776 def commentsUpdate(self, extra, new_comments, peer_jid): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
777 """update comments (replace or insert new_comments) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
778 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
779 @param extra(dict): extra data to update |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
780 @param new_comments(list[tuple(unicode, unicode, unicode)]): comments to update or insert |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
781 @param peer_jid(unicode, None): bare jid of the requestor, or None if request is done by owner |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
782 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
783 current_comments = extra.setdefault("comments", []) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
784 new_comments_by_id = {c[0]: c for c in new_comments} |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
785 updated = [] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
786 # we now check every current comment, to see if one id in new ones |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
787 # exist, in which case we must update |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
788 for idx, comment in enumerate(current_comments): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
789 comment_id = comment[0] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
790 if comment_id in new_comments_by_id: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
791 # a new comment has an existing id, update is requested |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
792 if peer_jid and comment[1] != peer_jid: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
793 # requestor has not the right to modify the comment |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
794 raise exceptions.PermissionError |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
795 # we replace old_comment with updated one |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
796 new_comment = new_comments_by_id[comment_id] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
797 current_comments[idx] = new_comment |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
798 updated.append(new_comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
799 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
800 # we now remove every updated comments, to only keep |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
801 # the ones to insert |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
802 for comment in updated: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
803 new_comments.remove(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
804 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
805 current_comments.extend(new_comments) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
806 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
807 def commentsDelete(self, extra, comments): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
808 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
809 comments_dict = extra["comments"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
810 except KeyError: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
811 return |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
812 for comment in comments: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
813 try: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
814 comments_dict.remove(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
815 except ValueError: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
816 continue |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
817 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
818 def _getFrom(self, item_elt): |
3721
6878745a47e8
component file sharing: fix incorrect use of `returnValue` in `items` async method
Goffi <goffi@goffi.org>
parents:
3709
diff
changeset
|
819 """retrieve publisher of an item |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
820 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
821 @param item_elt(domish.element): <item> element |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
822 @return (unicode): full jid as string |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
823 """ |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
824 iq_elt = item_elt |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
825 while iq_elt.parent != None: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
826 iq_elt = iq_elt.parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
827 return iq_elt["from"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
828 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
829 @ensure_deferred |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
830 async def publish(self, requestor, service, nodeIdentifier, items): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
831 # we retrieve file a first time to check authorisations |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
832 file_data = await self.getFileData(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
833 file_id = file_data["id"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
834 comments = [(item["id"], self._getFrom(item), item.toXml()) for item in items] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
835 if requestor.userhostJID() == file_data["owner"]: |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
836 peer_jid = None |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
837 else: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
838 peer_jid = requestor.userhost() |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
839 update_cb = partial(self.commentsUpdate, new_comments=comments, peer_jid=peer_jid) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
840 try: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
841 await self.host.memory.fileUpdate(file_id, "extra", update_cb) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
842 except exceptions.PermissionError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
843 raise error.StanzaError("not-authorized") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
844 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
845 @ensure_deferred |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
846 async def items(self, requestor, service, nodeIdentifier, maxItems, itemIdentifiers): |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
847 file_data = await self.getFileData(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
848 comments = file_data["extra"].get("comments", []) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
849 if itemIdentifiers: |
3721
6878745a47e8
component file sharing: fix incorrect use of `returnValue` in `items` async method
Goffi <goffi@goffi.org>
parents:
3709
diff
changeset
|
850 return [generic.parseXml(c[2]) for c in comments if c[0] in itemIdentifiers] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
851 else: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
852 return [generic.parseXml(c[2]) for c in comments] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
853 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
854 @ensure_deferred |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
855 async def retract(self, requestor, service, nodeIdentifier, itemIdentifiers): |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
856 file_data = await self.getFileData(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
857 file_id = file_data["id"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
858 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
859 comments = file_data["extra"]["comments"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
860 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
861 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
862 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
863 to_remove = [] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
864 for comment in comments: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
865 comment_id = comment[0] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
866 if comment_id in itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
867 to_remove.append(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
868 itemIdentifiers.remove(comment_id) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
869 if not itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
870 break |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
871 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
872 if itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
873 # not all items have been to_remove, we can't continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
874 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
875 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
876 if requestor.userhostJID() != file_data["owner"]: |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
877 if not all([c[1] == requestor.userhost() for c in to_remove]): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
878 raise error.StanzaError("not-authorized") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
879 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
880 remove_cb = partial(self.commentsDelete, comments=to_remove) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
881 await self.host.memory.fileUpdate(file_id, "extra", remove_cb) |