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