Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_comp_file_sharing.py @ 4197:9cda0347e0ac
plugin XEP-0359: if no origin ID is found, use <message> ID instead:
This way, we always have the right ID to check for non groupchat message in
`History.origin_id`.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 13 Dec 2023 22:00:25 +0100 |
parents | 6784d07b99c8 |
children | 0d7bb4df2343 |
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 |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
28 from libervia.backend.core.i18n import _, D_ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
29 from libervia.backend.core.constants import Const as C |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
30 from libervia.backend.core import exceptions |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
31 from libervia.backend.core.log import getLogger |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
32 from libervia.backend.tools import stream |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
33 from libervia.backend.tools import video |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
34 from libervia.backend.tools.utils import ensure_deferred |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
35 from libervia.backend.tools.common import regex |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
36 from libervia.backend.tools.common import uri |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
37 from libervia.backend.tools.common import files_utils |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
38 from libervia.backend.tools.common import utils |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
39 from libervia.backend.tools.common import tls |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
116 def get_disposition_type(self, media_type, media_subtype): |
3289
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 | |
4097
0f6fd28fde0d
component file sharing: fix method name case:
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
139 def render_OPTIONS(self, request): |
3296 | 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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
149 defer.ensureDeferred(self.render_get(request)) |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
152 async def render_get(self, request): |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
159 found_files = await request.file_sharing.host.memory.get_files( |
3289
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) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
173 disp_type = self.get_disposition_type( |
3289
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): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
193 defer.ensureDeferred(self.render_put(request)) |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
196 async def render_put(self, request): |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
231 await request.file_sharing.register_received_file( |
3289
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 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
276 def refuse_request(self): |
3289
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}") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
290 return self.refuse_request() |
3289
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}") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
295 return self.refuse_request() |
3289
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") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
299 return self.refuse_request() |
3289
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 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
308 return self.refuse_request() |
3289
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 |
3932
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3859
diff
changeset
|
325 self.file_tmp_dir = file_sharing.host.get_local_path( |
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3859
diff
changeset
|
326 None, C.FILES_TMP_DIR, TMP_BUFFER_DIR, component=True |
3289
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"] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
358 self._hu.register_handler(self._on_http_upload) |
4183
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
359 self.host.trigger.add_with_check("FILE_getDestDir", self, self._get_dest_dir_trigger) |
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
360 self.host.trigger.add_with_check( |
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
361 "XEP-0234_fileSendingRequest", self, self._file_sending_request_trigger, priority=1000 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
362 ) |
4183
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
363 self.host.trigger.add_with_check("XEP-0234_buildFileElement", self, self._add_file_metadata_elts) |
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
364 self.host.trigger.add_with_check("XEP-0234_parseFileElement", self, self._get_file_metadata_elts) |
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
365 self.host.trigger.add_with_check("XEP-0329_compGetFilesFromNode", self, self._add_file_metadata) |
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
366 self.host.trigger.add_with_check( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
367 "XEP-0329_compGetFilesFromNode_build_directory", |
4183
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
368 self, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
369 self._add_directory_metadata_elts) |
4183
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
370 self.host.trigger.add_with_check( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
371 "XEP-0329_parseResult_directory", |
4183
6784d07b99c8
plugin XEP-053, component AP gateway: use the new `trigger.add_with_check` method
Goffi <goffi@goffi.org>
parents:
4097
diff
changeset
|
372 self, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
373 self._get_directory_metadata_elts) |
3932
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3859
diff
changeset
|
374 self.files_path = self.host.get_local_path(None, C.FILES_DIR) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
375 self.http_port = int(self.host.memory.config_get( |
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_port', 8888)) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
377 connection_type = self.host.memory.config_get( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
378 '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
|
379 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
|
380 raise exceptions.ConfigError( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
381 '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
|
382 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
383 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
|
384 self.expected_uploads = {} |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
385 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
|
386 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
|
387 else: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
388 options = tls.get_options_from_config( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
389 self.host.memory.config, "component file-sharing") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
390 tls.tls_options_check(options) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
391 context_factory = tls.get_tls_context_factory(options) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
392 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
|
393 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
394 def get_handler(self, client): |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
395 return Comments_handler(self) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
396 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
397 def profile_connecting(self, client): |
4021
412b99c29d83
core (xmpp), component file sharing, plugin XEP-0363: `enabled_features` + HTTP Upload:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
398 # we activate HTTP upload |
412b99c29d83
core (xmpp), component file sharing, plugin XEP-0363: `enabled_features` + HTTP Upload:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
399 client.enabled_features.add("XEP-0363") |
412b99c29d83
core (xmpp), component file sharing, plugin XEP-0363: `enabled_features` + HTTP Upload:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
400 |
3291
449dfbfcdbcc
component file sharing: don't initialise the plugin if not component use it
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
401 self.init() |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
402 public_base_url = self.host.memory.config_get( |
3677
02e5e2385a30
component (file-sharing): use `file-sharing` instead of `file_sharing`:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
403 '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
|
404 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
|
405 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
|
406 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
407 client._file_sharing_base_url = public_base_url |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
408 path = client.file_tmp_dir = os.path.join( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
409 self.host.memory.config_get("", "local_dir"), |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 C.FILES_TMP_DIR, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
411 regex.path_escape(client.profile), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
412 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
413 if not os.path.exists(path): |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
414 os.makedirs(path) |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
415 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
416 def get_quota(self, client, entity): |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
417 """Return maximum size allowed for all files for entity""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
418 quotas = self.host.memory.config_get("component file-sharing", "quotas_json", {}) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
419 if self.host.memory.is_admin_jid(entity): |
3778
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
420 quota = quotas.get("admins") |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
421 else: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
422 try: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
423 quota = quotas["jids"][entity.userhost()] |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
424 except KeyError: |
7b90d7c474fa
comp file sharing: handle `admins` in quotas
Goffi <goffi@goffi.org>
parents:
3722
diff
changeset
|
425 quota = quotas.get("users") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
426 return None if quota is None else utils.parse_size(quota) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
427 |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
428 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
|
429 thumbnails = extra.setdefault(C.KEY_THUMBNAILS, []) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
430 for max_thumb_size in self._t.SIZES: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
431 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
432 thumb_size, thumb_id = await self._t.generate_thumbnail( |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
433 image_path, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
434 max_thumb_size, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
435 # we keep thumbnails for 6 months |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
436 60 * 60 * 24 * 31 * 6, |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
437 ) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
438 except Exception as e: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
439 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
|
440 break |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
441 thumbnails.append({"id": thumb_id, "size": thumb_size}) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
442 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
443 async def register_received_file( |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
444 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
|
445 """Post file reception tasks |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
446 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
447 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
|
448 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
|
449 """ |
3028 | 450 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
|
451 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
|
452 extra = {} |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
453 |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
454 mime_type = file_data.get("mime_type") |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
455 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
|
456 mime_type = mimetypes.guess_type(name)[0] |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
457 |
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
458 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
|
459 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
|
460 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
461 if file_data.get("hash_algo") == HASH_ALGO: |
3028 | 462 log.debug(_("Reusing already generated hash")) |
463 file_hash = file_data["hash_hasher"].hexdigest() | |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
464 else: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
465 hasher = self._h.get_hasher(HASH_ALGO) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
466 with file_path.open('rb') as f: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
467 file_hash = await self._h.calculate_hash(f, hasher) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
468 final_path = self.files_path/file_hash |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
469 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
470 if final_path.is_file(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
471 log.debug( |
3028 | 472 "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
|
473 file_hash=file_hash |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
474 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
475 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
476 file_path.unlink() |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
477 else: |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
478 file_path.rename(final_path) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
479 log.debug( |
3028 | 480 "file [{file_hash}] moved to {files_path}".format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
481 file_hash=file_hash, files_path=self.files_path |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
482 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
483 ) |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
484 |
3331
b1e9f17fbb5a
comp file sharing: minor core re-organisation
Goffi <goffi@goffi.org>
parents:
3329
diff
changeset
|
485 if is_image: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
486 await self.generate_thumbnails(extra, final_path) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
487 elif is_video: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
488 with tempfile.TemporaryDirectory() as tmp_dir: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
489 thumb_path = Path(tmp_dir) / "thumbnail.jpg" |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
490 try: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
491 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
|
492 except Exception as e: |
3348
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
493 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
|
494 final_path=final_path, e=e)) |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
495 else: |
12c427156cac
component file sharing: generate thumbnails for videos
Goffi <goffi@goffi.org>
parents:
3340
diff
changeset
|
496 await self.generate_thumbnails(extra, thumb_path) |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
497 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
498 await self.host.memory.set_file( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
499 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
500 name=name, |
3028 | 501 version="", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
502 file_hash=file_hash, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
503 hash_algo=HASH_ALGO, |
3028 | 504 size=file_data["size"], |
505 path=file_data.get("path"), | |
506 namespace=file_data.get("namespace"), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
507 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
|
508 public_id=public_id, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
509 owner=peer_jid, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
510 extra=extra, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
511 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
513 async def _get_dest_dir_trigger( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
514 self, client, peer_jid, transfer_data, file_data, stream_object |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
515 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
516 """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
|
517 if not client.is_component: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
518 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
|
519 # 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
|
520 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
|
521 raise error.StanzaError("forbidden") |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
522 assert stream_object |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
523 assert "stream_object" not in transfer_data |
2514
4440ea7047bd
file sharing component: thumbnails integration first draft:
Goffi <goffi@goffi.org>
parents:
2504
diff
changeset
|
524 assert C.KEY_PROGRESS_ID in file_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
525 filename = file_data["name"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
526 assert filename and not "/" in filename |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
527 quota = self.get_quota(client, peer_jid) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
528 if quota is not None: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
529 used_space = await self.host.memory.file_get_used_space(client, peer_jid) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
530 |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
531 if (used_space + file_data["size"]) > quota: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
532 raise error.StanzaError( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
533 "not-acceptable", |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
534 text=OVER_QUOTA_TXT.format( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
535 quota=utils.get_human_size(quota), |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
536 used_space=utils.get_human_size(used_space), |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
537 file_size=utils.get_human_size(file_data['size']) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
538 ) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
539 ) |
3932
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3859
diff
changeset
|
540 file_tmp_dir = self.host.get_local_path( |
7af29260ecb8
core: fix and renamed getLocalPath -> get_local_path:
Goffi <goffi@goffi.org>
parents:
3859
diff
changeset
|
541 None, C.FILES_TMP_DIR, peer_jid.userhost(), component=True |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
542 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
543 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
|
544 file_tmp_dir/filename) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
545 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
546 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
|
547 lambda __: defer.ensureDeferred( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
548 self.register_received_file(client, peer_jid, file_data, file_tmp_path) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
549 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
550 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
551 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
552 self._f.open_file_write( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
553 client, file_tmp_path, transfer_data, file_data, stream_object |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
554 ) |
3701
6d298323eed2
plugin comp file sharing: don't use Deferred in return value
Goffi <goffi@goffi.org>
parents:
3677
diff
changeset
|
555 return False, True |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
556 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
557 async def _retrieve_files( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
558 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
|
559 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
560 """This method retrieve a file on request, and send if after checking permissions""" |
3028 | 561 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
|
562 if session['local_jid'].user: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
563 owner = client.get_owner_from_jid(session['local_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
|
564 else: |
6d9c9e2dca0a
component (file sharing): fix retrieving owner from jid when user part is not specified
Goffi <goffi@goffi.org>
parents:
3507
diff
changeset
|
565 owner = peer_jid |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
566 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
567 found_files = await self.host.memory.get_files( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
568 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
569 peer_jid=peer_jid, |
3028 | 570 name=file_data.get("name"), |
571 file_hash=file_data.get("file_hash"), | |
572 hash_algo=file_data.get("hash_algo"), | |
573 path=file_data.get("path"), | |
574 namespace=file_data.get("namespace"), | |
3367
90aee1f2d07c
component file sharing: added missing `owner` filtering in `_retrieveFiles`
Goffi <goffi@goffi.org>
parents:
3363
diff
changeset
|
575 owner=owner, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
576 ) |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
577 except exceptions.NotFound: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
578 found_files = None |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
579 except exceptions.PermissionError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
580 log.warning( |
3028 | 581 _("{peer_jid} is trying to access an unauthorized file: {name}").format( |
582 peer_jid=peer_jid, name=file_data.get("name") | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
583 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
584 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
585 return False |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
586 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
587 if not found_files: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
588 log.warning( |
3028 | 589 _("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
|
590 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
591 return False |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
592 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
593 # we only use the first found file |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
594 found_file = found_files[0] |
3028 | 595 if found_file['type'] != C.FILE_TYPE_FILE: |
596 raise TypeError("a file was expected, type is {type_}".format( | |
597 type_=found_file['type'])) | |
598 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
|
599 file_path = self.files_path / file_hash |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
600 file_data["hash_hasher"] = hasher = self._h.get_hasher(found_file["hash_algo"]) |
3028 | 601 size = file_data["size"] = found_file["size"] |
602 file_data["file_hash"] = file_hash | |
603 file_data["hash_algo"] = found_file["hash_algo"] | |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
604 |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
605 # we complete file_elt so peer can have some details on the file |
3028 | 606 if "name" not in file_data: |
607 file_elt.addElement("name", content=found_file["name"]) | |
608 file_elt.addElement("size", content=str(size)) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
609 content_data["stream_object"] = stream.FileStreamObject( |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
610 self.host, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
611 client, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
612 file_path, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
613 uid=self._jf.get_progress_id(session, content_name), |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
614 size=size, |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
615 data_cb=lambda data: hasher.update(data), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
616 ) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
617 return True |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
618 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
619 def _file_sending_request_trigger( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
620 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
|
621 ): |
2504
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
622 if not client.is_component: |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
623 return True, None |
67cc54b01a12
plugin file sharing component: first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
624 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
625 return ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
626 False, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
627 defer.ensureDeferred(self._retrieve_files( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
628 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
|
629 )), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
630 ) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
631 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
632 ## HTTP Upload ## |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
633 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
634 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
|
635 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
636 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
|
637 except KeyError: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
638 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
|
639 |
4021
412b99c29d83
core (xmpp), component file sharing, plugin XEP-0363: `enabled_features` + HTTP Upload:
Goffi <goffi@goffi.org>
parents:
3932
diff
changeset
|
640 async def _on_http_upload(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
|
641 # 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
|
642 assert '/' not in request.filename |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3348
diff
changeset
|
643 # 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
|
644 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
|
645 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
|
646 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
647 quota = self.get_quota(client, request.from_) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
648 if quota is not None: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
649 used_space = await self.host.memory.file_get_used_space(client, request.from_) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
650 |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
651 if (used_space + request.size) > quota: |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
652 raise error.StanzaError( |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
653 "not-acceptable", |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
654 text=OVER_QUOTA_TXT.format( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
655 quota=utils.get_human_size(quota), |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
656 used_space=utils.get_human_size(used_space), |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
657 file_size=utils.get_human_size(request.size) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
658 ), |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
659 appCondition = self._hu.get_file_too_large_elt(max(quota - used_space, 0)) |
3528
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
660 ) |
849374e59178
component file sharing: quotas implementation:
Goffi <goffi@goffi.org>
parents:
3514
diff
changeset
|
661 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
662 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
|
663 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
|
664 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
|
665 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
|
666 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
|
667 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
|
668 put=url, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
669 get=url, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
670 headers=[], |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
671 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
672 return slot |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
673 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
674 ## metadata triggers ## |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
675 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
676 def _add_file_metadata_elts(self, client, file_elt, extra_args): |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
677 # affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
678 affiliation = extra_args.get('affiliation') |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
679 if affiliation is not None: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
680 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
|
681 |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
682 # comments |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
683 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
684 comments_url = extra_args.pop("comments_url") |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
685 except KeyError: |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
686 return |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
687 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
688 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
|
689 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
690 try: |
3028 | 691 count = len(extra_args["extra"]["comments"]) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
692 except KeyError: |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
693 count = 0 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
694 |
3028 | 695 comment_elt["count"] = str(count) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
696 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
697 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
698 def _get_file_metadata_elts(self, client, file_elt, file_data): |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
699 # affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
700 try: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
701 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
|
702 except StopIteration: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
703 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
704 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
705 file_data["affiliation"] = str(affiliation_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
706 |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
707 # comments |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
708 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
709 comments_elt = next(file_elt.elements(NS_COMMENTS, "comments")) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
710 except StopIteration: |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
711 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
712 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
713 file_data["comments_url"] = str(comments_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
714 file_data["comments_count"] = comments_elt["count"] |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
715 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
716 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
717 def _add_file_metadata( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
718 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
|
719 for file_data in files_data: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
720 file_data["comments_url"] = uri.build_xmpp_uri( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
721 "pubsub", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
722 path=client.jid.full(), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
723 node=COMMENT_NODE_PREFIX + file_data["id"], |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
724 ) |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
725 return True |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
726 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
727 def _add_directory_metadata_elts( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
728 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
|
729 affiliation = file_data.get('affiliation') |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
730 if affiliation is not None: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
731 directory_elt.addElement( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
732 (NS_FS_AFFILIATION, "affiliation"), |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
733 content=affiliation |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
734 ) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
735 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
736 def _get_directory_metadata_elts( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
737 self, client, elt, file_data): |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
738 try: |
3859
3ef988734869
core: fix calls to `domish.Element.elements`:
Goffi <goffi@goffi.org>
parents:
3778
diff
changeset
|
739 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
|
740 except StopIteration: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
741 pass |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
742 else: |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
743 file_data['affiliation'] = str(affiliation_elt) |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
744 |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
745 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
746 class Comments_handler(pubsub.PubSubService): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
747 """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
|
748 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
749 def __init__(self, plugin_parent): |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3301
diff
changeset
|
750 super(Comments_handler, self).__init__() |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
751 self.host = plugin_parent.host |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
752 self.plugin_parent = plugin_parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
753 self.discoIdentity = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
754 "category": "pubsub", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
755 "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
|
756 "name": "files commenting service", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
757 } |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
758 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
759 def _get_file_id(self, nodeIdentifier): |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
760 if not nodeIdentifier.startswith(COMMENT_NODE_PREFIX): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
761 raise error.StanzaError("item-not-found") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
762 file_id = nodeIdentifier[len(COMMENT_NODE_PREFIX) :] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
763 if not file_id: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
764 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
765 return file_id |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
766 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
767 async def get_file_data(self, requestor, nodeIdentifier): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
768 file_id = self._get_file_id(nodeIdentifier) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
769 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
770 files = await self.host.memory.get_files(self.parent, requestor, file_id) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
771 except (exceptions.NotFound, exceptions.PermissionError): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
772 # we don't differenciate between NotFound and PermissionError |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
773 # to avoid leaking information on existing files |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
774 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
775 if not files: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
776 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
777 if len(files) > 1: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
778 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
|
779 return files[0] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
780 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
781 def comments_update(self, extra, new_comments, peer_jid): |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
782 """update comments (replace or insert new_comments) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
783 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
784 @param extra(dict): extra data to update |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
785 @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
|
786 @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
|
787 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
788 current_comments = extra.setdefault("comments", []) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
789 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
|
790 updated = [] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
791 # 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
|
792 # exist, in which case we must update |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
793 for idx, comment in enumerate(current_comments): |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
794 comment_id = comment[0] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
795 if comment_id in new_comments_by_id: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
796 # 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
|
797 if peer_jid and comment[1] != peer_jid: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
798 # 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
|
799 raise exceptions.PermissionError |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
800 # we replace old_comment with updated one |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
801 new_comment = new_comments_by_id[comment_id] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
802 current_comments[idx] = new_comment |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
803 updated.append(new_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 # 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
|
806 # the ones to insert |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
807 for comment in updated: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
808 new_comments.remove(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
809 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
810 current_comments.extend(new_comments) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
811 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
812 def comments_delete(self, extra, comments): |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
813 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
814 comments_dict = extra["comments"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
815 except KeyError: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
816 return |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
817 for comment in comments: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
818 try: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
819 comments_dict.remove(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
820 except ValueError: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
821 continue |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
822 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
823 def _get_from(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
|
824 """retrieve publisher of an item |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
825 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
826 @param item_elt(domish.element): <item> element |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
827 @return (unicode): full jid as string |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
828 """ |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
829 iq_elt = item_elt |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
830 while iq_elt.parent != None: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
831 iq_elt = iq_elt.parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
832 return iq_elt["from"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
833 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
834 @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
|
835 async def publish(self, requestor, service, nodeIdentifier, items): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
836 # we retrieve file a first time to check authorisations |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
837 file_data = await self.get_file_data(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
838 file_id = file_data["id"] |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
839 comments = [(item["id"], self._get_from(item), item.toXml()) for item in items] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
840 if requestor.userhostJID() == file_data["owner"]: |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
841 peer_jid = None |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
842 else: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
843 peer_jid = requestor.userhost() |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
844 update_cb = partial(self.comments_update, new_comments=comments, peer_jid=peer_jid) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
845 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
846 await self.host.memory.file_update(file_id, "extra", update_cb) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
847 except exceptions.PermissionError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
848 raise error.StanzaError("not-authorized") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
849 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
850 @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
|
851 async def items(self, requestor, service, nodeIdentifier, maxItems, itemIdentifiers): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
852 file_data = await self.get_file_data(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
853 comments = file_data["extra"].get("comments", []) |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
854 if itemIdentifiers: |
3721
6878745a47e8
component file sharing: fix incorrect use of `returnValue` in `items` async method
Goffi <goffi@goffi.org>
parents:
3709
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3532
diff
changeset
|
859 @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
|
860 async def retract(self, requestor, service, nodeIdentifier, itemIdentifiers): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
861 file_data = await self.get_file_data(requestor, nodeIdentifier) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
862 file_id = file_data["id"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
863 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
864 comments = file_data["extra"]["comments"] |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
865 except KeyError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
866 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
867 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
868 to_remove = [] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
869 for comment in comments: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
870 comment_id = comment[0] |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
871 if comment_id in itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
872 to_remove.append(comment) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
873 itemIdentifiers.remove(comment_id) |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
874 if not itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
875 break |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
876 |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
877 if itemIdentifiers: |
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
878 # 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
|
879 raise error.StanzaError("item-not-found") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
880 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
881 if requestor.userhostJID() != file_data["owner"]: |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
882 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
|
883 raise error.StanzaError("not-authorized") |
2527
a201194fc461
component file sharing: comments handling first draft:
Goffi <goffi@goffi.org>
parents:
2522
diff
changeset
|
884 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
885 remove_cb = partial(self.comments_delete, comments=to_remove) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4021
diff
changeset
|
886 await self.host.memory.file_update(file_id, "extra", remove_cb) |