Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0363.py @ 3771:e597dbfbc4c6
doc (cli/pubsub): document new `--public` flags:
`--public` option is documented for `subscribe`, `subscriptions` and `node subscriptions
get`, with examples. A warning has been added to show explicitely the privacy implication
of using `--public` with `subscribe`.
rel 365
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 13 May 2022 19:32:06 +0200 |
parents | e84ffb48acd4 |
children | 0ff265725489 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
3192
883fb4981958
plugin attach: disable TLS check if "check_certificate" is disabled
Goffi <goffi@goffi.org>
parents:
3182
diff
changeset
|
3 # SàT plugin for HTTP File Upload (XEP-0363) |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
19 import os.path |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
20 import mimetypes |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
21 from typing import NamedTuple, Callable, Optional |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
22 from dataclasses import dataclass |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
23 from urllib import parse |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from wokkel import disco, iwokkel |
3028 | 25 from zope.interface import implementer |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
26 from twisted.words.protocols.jabber import jid, xmlstream, error |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
27 from twisted.words.xish import domish |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.internet import reactor |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from twisted.internet import defer |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from twisted.web import client as http_client |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 from twisted.web import http_headers |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
32 from sat.core.i18n import _ |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
33 from sat.core.xmpp import SatXMPPComponent |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
34 from sat.core.constants import Const as C |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
35 from sat.core.log import getLogger |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
36 from sat.core import exceptions |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
37 from sat.tools import web as sat_web, utils |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
40 log = getLogger(__name__) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
41 |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 PLUGIN_INFO = { |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
43 C.PI_NAME: "HTTP File Upload", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
44 C.PI_IMPORT_NAME: "XEP-0363", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
45 C.PI_TYPE: "XEP", |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
46 C.PI_MODES: C.PLUG_MODE_BOTH, |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
47 C.PI_PROTOCOLS: ["XEP-0363"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
48 C.PI_DEPENDENCIES: ["FILE", "UPLOAD"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
49 C.PI_MAIN: "XEP_0363", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
2144
diff
changeset
|
50 C.PI_HANDLER: "yes", |
3028 | 51 C.PI_DESCRIPTION: _("""Implementation of HTTP File Upload"""), |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 } |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
54 NS_HTTP_UPLOAD = "urn:xmpp:http:upload:0" |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
55 IQ_HTTP_UPLOAD_REQUEST = C.IQ_GET + '/request[@xmlns="' + NS_HTTP_UPLOAD + '"]' |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
56 ALLOWED_HEADERS = ('authorization', 'cookie', 'expires') |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
59 @dataclass |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
60 class Slot: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
61 """Upload slot""" |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
62 put: str |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
63 get: str |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
64 headers: list |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
67 class UploadRequest(NamedTuple): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
68 from_: jid.JID |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
69 filename: str |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
70 size: int |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
71 content_type: Optional[str] |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
72 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
73 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
74 class RequestHandler(NamedTuple): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
75 callback: Callable[[SatXMPPComponent, UploadRequest], Optional[Slot]] |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
76 priority: int |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
77 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
78 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
79 class XEP_0363: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
80 Slot=Slot |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
81 |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 def __init__(self, host): |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 log.info(_("plugin HTTP File Upload initialization")) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 self.host = host |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
85 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
86 "fileHTTPUpload", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
87 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
88 in_sign="sssbs", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
89 out_sign="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
90 method=self._fileHTTPUpload, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
91 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
92 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
93 "fileHTTPUploadGetSlot", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
94 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
95 in_sign="sisss", |
3293
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
96 out_sign="(ssaa{ss})", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
97 method=self._getSlot, |
3028 | 98 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
99 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 host.plugins["UPLOAD"].register( |
3028 | 101 "HTTP Upload", self.getHTTPUploadEntity, self.fileHTTPUpload |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
102 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
103 # list of callbacks used when a request is done to a component |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
104 self.handlers = [] |
3294
6505e5cc6ab9
plugin XEP-0363: register namespace
Goffi <goffi@goffi.org>
parents:
3293
diff
changeset
|
105 # XXX: there is not yet official short name, so we use "http_upload" |
6505e5cc6ab9
plugin XEP-0363: register namespace
Goffi <goffi@goffi.org>
parents:
3293
diff
changeset
|
106 host.registerNamespace("http_upload", NS_HTTP_UPLOAD) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 |
2144
1d3f73e065e1
core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
108 def getHandler(self, client): |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
109 return XEP_0363_handler(self) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
110 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
111 def registerHandler(self, callback, priority=0): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
112 """Register a request handler |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
113 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
114 @param callack: method to call when a request is done |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
115 the callback must return a Slot if the request is handled, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
116 otherwise, other callbacks will be tried. |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
117 If the callback raises a StanzaError, its condition will be used if no other |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
118 callback can handle the request. |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
119 @param priority: handlers with higher priorities will be called first |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
120 """ |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
121 assert callback not in self.handlers |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
122 req_handler = RequestHandler(callback, priority) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
123 self.handlers.append(req_handler) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
124 self.handlers.sort(key=lambda handler: handler.priority, reverse=True) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
126 def getFileTooLargeElt(self, max_size: int) -> domish.Element: |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
127 """Generate <file-too-large> app condition for errors""" |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
128 file_too_large_elt = domish.Element((NS_HTTP_UPLOAD, "file-too-large")) |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
129 file_too_large_elt.addElement("max-file-size", str(max_size)) |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
130 return file_too_large_elt |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
131 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
132 async def getHTTPUploadEntity(self, client, upload_jid=None): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
133 """Get HTTP upload capable entity |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 upload_jid is checked, then its components |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 @param upload_jid(None, jid.JID): entity to check |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 @return(D(jid.JID)): first HTTP upload capable entity |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 @raise exceptions.NotFound: no entity found |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
140 try: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
141 entity = client.http_upload_service |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
142 except AttributeError: |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
143 found_entities = await self.host.findFeaturesSet(client, (NS_HTTP_UPLOAD,)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
144 try: |
3028 | 145 entity = client.http_upload_service = next(iter(found_entities)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
146 except StopIteration: |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
147 entity = client.http_upload_service = None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
148 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
149 if entity is None: |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
150 raise exceptions.NotFound("No HTTP upload entity found") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
151 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
152 return entity |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
154 def _fileHTTPUpload(self, filepath, filename="", upload_jid="", |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
155 ignore_tls_errors=False, profile=C.PROF_KEY_NONE): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 assert os.path.isabs(filepath) and os.path.isfile(filepath) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
157 client = self.host.getClient(profile) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
158 progress_id_d, __ = defer.ensureDeferred(self.fileHTTPUpload( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
159 client, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
160 filepath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
161 filename or None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
162 jid.JID(upload_jid) if upload_jid else None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
163 {"ignore_tls_errors": ignore_tls_errors}, |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
164 )) |
1824
a19161bb3ff7
plugin upload, XEP-0363: splitted fileUpload in fileUpload + upload:
Goffi <goffi@goffi.org>
parents:
1766
diff
changeset
|
165 return progress_id_d |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
167 async def fileHTTPUpload( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
168 self, client, filepath, filename=None, upload_jid=None, options=None): |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
169 """Upload a file through HTTP |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 @param filepath(str): absolute path of the file |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 @param filename(None, unicode): name to use for the upload |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 None to use basename of the path |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 @param upload_jid(jid.JID, None): upload capable entity jid, |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 or None to use autodetected, if possible |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 @param options(dict): options where key can be: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 - ignore_tls_errors(bool): if True, SSL certificate will not be checked |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 @param profile: %(doc_profile)s |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
179 @return (D(tuple[D(unicode), D(unicode)])): progress id and Deferred which fire |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
180 download URL |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 """ |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 if options is None: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 options = {} |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
184 ignore_tls_errors = options.get("ignore_tls_errors", False) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 filename = filename or os.path.basename(filepath) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 size = os.path.getsize(filepath) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
187 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
188 size_adjust = [] |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
189 #: this trigger can be used to modify the requested size, it is notably useful |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
190 #: with encryption. The size_adjust is a list which can be filled by int to add |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
191 #: to the initial size |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
192 self.host.trigger.point( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
193 "XEP-0363_upload_size", client, options, filepath, size, size_adjust, |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
194 triggers_no_cancel=True) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
195 if size_adjust: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
196 size = sum([size, *size_adjust]) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
197 try: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
198 slot = await self.getSlot(client, filename, size, upload_jid=upload_jid) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
199 except Exception as e: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
200 log.warning(_("Can't get upload slot: {reason}").format(reason=e)) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
201 raise e |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
202 else: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
203 log.debug(f"Got upload slot: {slot}") |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
204 sat_file = self.host.plugins["FILE"].File( |
3182
f2bb57348587
plugin attach, XEP-0363: progress id can now be specified:
Goffi <goffi@goffi.org>
parents:
3155
diff
changeset
|
205 self.host, client, filepath, uid=options.get("progress_id"), size=size, |
f2bb57348587
plugin attach, XEP-0363: progress id can now be specified:
Goffi <goffi@goffi.org>
parents:
3155
diff
changeset
|
206 auto_end_signals=False |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
207 ) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
208 progress_id = sat_file.uid |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
210 file_producer = http_client.FileBodyProducer(sat_file) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
211 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
212 if ignore_tls_errors: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
213 agent = http_client.Agent(reactor, sat_web.NoCheckContextFactory()) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
214 else: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
215 agent = http_client.Agent(reactor) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
217 headers = {"User-Agent": [C.APP_NAME.encode("utf-8")]} |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
218 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
219 for name, value in slot.headers: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
220 name = name.encode('utf-8') |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
221 value = value.encode('utf-8') |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
222 headers[name] = value |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
223 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
224 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
225 await self.host.trigger.asyncPoint( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
226 "XEP-0363_upload", client, options, sat_file, file_producer, slot, |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
227 triggers_no_cancel=True) |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
228 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
229 download_d = agent.request( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
230 b"PUT", |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
231 slot.put.encode("utf-8"), |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
232 http_headers.Headers(headers), |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
233 file_producer, |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
234 ) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
235 download_d.addCallbacks( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
236 self._uploadCb, |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
237 self._uploadEb, |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
238 (sat_file, slot), |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
239 None, |
3155
3a8755fdc78d
plugin XEP-0363: fixed errback args in fileHTTPUpload
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
240 (sat_file,), |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
241 ) |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
242 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
243 return progress_id, download_d |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
245 def _uploadCb(self, __, sat_file, slot): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
246 """Called once file is successfully uploaded |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 @param sat_file(SatFile): file used for the upload |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
249 should be closed, but it is needed to send the progressFinished signal |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 @param slot(Slot): put/get urls |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
251 """ |
3223
163014f09bf4
plugin attach: handle large images resizing:
Goffi <goffi@goffi.org>
parents:
3219
diff
changeset
|
252 log.info(f"HTTP upload finished ({slot.get})") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
253 sat_file.progressFinished({"url": slot.get}) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
254 return slot.get |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
256 def _uploadEb(self, failure_, sat_file): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
257 """Called on unsuccessful upload |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
258 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
259 @param sat_file(SatFile): file used for the upload |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 should be closed, be is needed to send the progressError signal |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
261 """ |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 try: |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
263 wrapped_fail = failure_.value.reasons[0] |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
264 except (AttributeError, IndexError) as e: |
3028 | 265 log.warning(_("upload failed: {reason}").format(reason=e)) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
266 sat_file.progressError(str(failure_)) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 else: |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
268 if wrapped_fail.check(sat_web.SSLError): |
3028 | 269 msg = "TLS validation error, can't connect to HTTPS server" |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
270 else: |
3028 | 271 msg = "can't upload file" |
272 log.warning(msg + ": " + str(wrapped_fail.value)) | |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
273 sat_file.progressError(msg) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
274 raise failure_ |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
275 |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
276 def _getSlot(self, filename, size, content_type, upload_jid, |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
277 profile_key=C.PROF_KEY_NONE): |
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
278 """Get an upload slot |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
279 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 This method can be used when uploading is done by the frontend |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
281 @param filename(unicode): name of the file to upload |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 @param size(int): size of the file (must be non null) |
3293
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
283 @param upload_jid(str, ''): HTTP upload capable entity |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
284 @param content_type(unicode, None): MIME type of the content |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 empty string or None to guess automatically |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
286 """ |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
287 client = self.host.getClient(profile_key) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
288 filename = filename.replace("/", "_") |
3293
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
289 d = defer.ensureDeferred(self.getSlot( |
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
290 client, filename, size, content_type or None, jid.JID(upload_jid) or None |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
291 )) |
3293
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
292 d.addCallback(lambda slot: (slot.get, slot.put, slot.headers)) |
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
293 return d |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
294 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
295 async def getSlot(self, client, filename, size, content_type=None, upload_jid=None): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
296 """Get a slot (i.e. download/upload links) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
297 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
298 @param filename(unicode): name to use for the upload |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
299 @param size(int): size of the file to upload (must be >0) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
300 @param content_type(None, unicode): MIME type of the content |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
301 None to autodetect |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 @param upload_jid(jid.JID, None): HTTP upload capable upload_jid |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
303 or None to use the server component (if any) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 @param client: %(doc_client)s |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
305 @return (Slot): the upload (put) and download (get) URLs |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
306 @raise exceptions.NotFound: no HTTP upload capable upload_jid has been found |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
307 """ |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
308 assert filename and size |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
309 if content_type is None: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
310 # TODO: manage python magic for file guessing (in a dedicated plugin ?) |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
311 content_type = mimetypes.guess_type(filename, strict=False)[0] |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
312 |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
313 if upload_jid is None: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
314 try: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
315 upload_jid = client.http_upload_service |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
316 except AttributeError: |
3293
f5a5aa9fa73a
plugin XEP-0363: fixed fileHTTPUploadGetSlot
Goffi <goffi@goffi.org>
parents:
3289
diff
changeset
|
317 found_entity = await self.getHTTPUploadEntity(client) |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
318 return await self.getSlot( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
319 client, filename, size, content_type, found_entity) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
320 else: |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
321 if upload_jid is None: |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
322 raise exceptions.NotFound("No HTTP upload entity found") |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
323 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
324 iq_elt = client.IQ("get") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
325 iq_elt["to"] = upload_jid.full() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
326 request_elt = iq_elt.addElement((NS_HTTP_UPLOAD, "request")) |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
327 request_elt["filename"] = filename |
3028 | 328 request_elt["size"] = str(size) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
329 if content_type is not None: |
2866
8ce5748bfe97
plugin XEP-0363: updated to namespace "urn:xmpp:http:upload:0", handle headers
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
330 request_elt["content-type"] = content_type |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
331 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
332 iq_result_elt = await iq_elt.send() |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
333 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
334 try: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
335 slot_elt = next(iq_result_elt.elements(NS_HTTP_UPLOAD, "slot")) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
336 put_elt = next(slot_elt.elements(NS_HTTP_UPLOAD, "put")) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
337 put_url = put_elt['url'] |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
338 get_elt = next(slot_elt.elements(NS_HTTP_UPLOAD, "get")) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
339 get_url = get_elt['url'] |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
340 except (StopIteration, KeyError): |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
341 raise exceptions.DataError("Incorrect stanza received from server") |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
342 |
3089
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
343 headers = [] |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
344 for header_elt in put_elt.elements(NS_HTTP_UPLOAD, "header"): |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
345 try: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
346 name = header_elt["name"] |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
347 value = str(header_elt) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
348 except KeyError: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
349 log.warning(_("Invalid header element: {xml}").format( |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
350 iq_result_elt.toXml())) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
351 continue |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
352 name = name.replace('\n', '') |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
353 value = value.replace('\n', '') |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
354 if name.lower() not in ALLOWED_HEADERS: |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
355 log.warning(_('Ignoring unauthorised header "{name}": {xml}') |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
356 .format(name=name, xml = iq_result_elt.toXml())) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
357 continue |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
358 headers.append((name, value)) |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
359 |
e75024e41f81
plugin upload, XEP-0363: code modernisation + preparation for extension:
Goffi <goffi@goffi.org>
parents:
3040
diff
changeset
|
360 return Slot(put=put_url, get=get_url, headers=headers) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
361 |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
362 # component |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
363 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
364 def onComponentRequest(self, iq_elt, client): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
365 iq_elt.handled=True |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
366 defer.ensureDeferred(self.handleComponentRequest(client, iq_elt)) |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
367 |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
368 async def handleComponentRequest(self, client, iq_elt): |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
369 try: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
370 request_elt = next(iq_elt.elements(NS_HTTP_UPLOAD, "request")) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
371 request = UploadRequest( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
372 from_=jid.JID(iq_elt['from']), |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
373 filename=parse.quote(request_elt['filename'].replace('/', '_'), safe=''), |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
374 size=int(request_elt['size']), |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
375 content_type=request_elt.getAttribute('content-type') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
376 ) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
377 except (StopIteration, KeyError, ValueError): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
378 client.sendError(iq_elt, "bad-request") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
379 return |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
380 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
381 err = None |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
382 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
383 for handler in self.handlers: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
384 try: |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
385 slot = await utils.asDeferred(handler.callback, client, request) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
386 except error.StanzaError as e: |
3399
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
387 log.warning( |
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
388 "a stanza error has been raised while processing HTTP Upload of " |
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
389 f"request: {e}" |
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
390 ) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
391 if err is None: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
392 # we keep the first error to return its condition later, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
393 # if no other callback handle the request |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
394 err = e |
3399
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
395 else: |
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
396 if slot: |
506fa3d91d3a
plugin XEP-0363: fixed invalid reference to `slot` in catched exception:
Goffi <goffi@goffi.org>
parents:
3294
diff
changeset
|
397 break |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
398 else: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
399 log.warning( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
400 _("no service can handle HTTP Upload request: {elt}") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
401 .format(elt=iq_elt.toXml())) |
3526
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
402 if err is None: |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
403 err = error.StanzaError("feature-not-implemented") |
e84ffb48acd4
plugin XEP-0363: allow async callbacks in handlers + method to generate `file-too-large` element
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
404 client.send(err.toResponse(iq_elt)) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
405 return |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
406 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
407 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
408 slot_elt = iq_result_elt.addElement((NS_HTTP_UPLOAD, 'slot')) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
409 put_elt = slot_elt.addElement('put') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
410 put_elt['url'] = slot.put |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
411 get_elt = slot_elt.addElement('get') |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
412 get_elt['url'] = slot.get |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
413 client.send(iq_result_elt) |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
414 |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
415 |
3028 | 416 @implementer(iwokkel.IDisco) |
3289
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
417 class XEP_0363_handler(xmlstream.XMPPHandler): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
418 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
419 def __init__(self, plugin_parent): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
420 self.plugin_parent = plugin_parent |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
421 |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
422 def connectionInitialized(self): |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
423 if self.parent.is_component: |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
424 self.xmlstream.addObserver( |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
425 IQ_HTTP_UPLOAD_REQUEST, self.plugin_parent.onComponentRequest, |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
426 client=self.parent |
9057713ab124
plugin comp file sharing: files can now be uploaded/downloaded via HTTP:
Goffi <goffi@goffi.org>
parents:
3223
diff
changeset
|
427 ) |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
428 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
429 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
430 return [disco.DiscoFeature(NS_HTTP_UPLOAD)] |
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
431 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
432 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
1640
d470affbe65c
plugin XEP-0363, upload: File upload (through HTTP upload only for now):
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
433 return [] |