Mercurial > libervia-backend
annotate sat/plugins/plugin_comp_file_sharing_management.py @ 3219:2ba602aef90e
plugin attach, aesgcm: attachments refactoring:
attachment handling has been simplified, and now use a "register" method similar as the
ones used for download or upload.
A default method (for unencrypted messages) will try a simple upload and will copy the
links to body.
AESGCM plugin has been adapted to be used for encrypted files. If more than one file is
sent with AESGCM plugin, they will be split in several messages as current de-facto
standard (OMEMO media sharing) doesn't support several files per message.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 18 Mar 2020 20:25:02 +0100 |
parents | 559a625a236b |
children | 780fb8dd07ef |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT plugin to detect language (experimental) |
3136 | 5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 import os.path |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from functools import partial |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from sat.core.i18n import _, D_ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from sat.core import exceptions |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from sat.core.constants import Const as C |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from sat.core.log import getLogger |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from wokkel import data_form |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from twisted.internet import defer |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.words.protocols.jabber import jid |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 log = getLogger(__name__) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
33 PLUGIN_INFO = { |
3028 | 34 C.PI_NAME: "File Sharing Management", |
35 C.PI_IMPORT_NAME: "FILE_SHARING_MANAGEMENT", | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 C.PI_MODES: [C.PLUG_MODE_COMPONENT], |
3028 | 37 C.PI_TYPE: "EXP", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 C.PI_PROTOCOLS: [], |
3028 | 39 C.PI_DEPENDENCIES: ["XEP-0050", "XEP-0264"], |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 C.PI_RECOMMENDATIONS: [], |
3028 | 41 C.PI_MAIN: "FileSharingManagement", |
42 C.PI_HANDLER: "no", | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_DESCRIPTION: _( |
3028 | 44 "Experimental handling of file management for file sharing. This plugins allows " |
45 "to change permissions of stored files/directories or remove them." | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 ), |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 } |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 |
3028 | 49 NS_FILE_MANAGEMENT = "https://salut-a-toi.org/protocol/file-management:0" |
50 NS_FILE_MANAGEMENT_PERM = "https://salut-a-toi.org/protocol/file-management:0#perm" | |
51 NS_FILE_MANAGEMENT_DELETE = "https://salut-a-toi.org/protocol/file-management:0#delete" | |
52 NS_FILE_MANAGEMENT_THUMB = "https://salut-a-toi.org/protocol/file-management:0#thumb" | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 class WorkflowError(Exception): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 """Raised when workflow can't be completed""" |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 def __init__(self, err_args): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 """ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 @param err_args(tuple): arguments to return to finish the command workflow |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 """ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 Exception.__init__(self) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 self.err_args = err_args |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 class FileSharingManagement(object): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 # This is a temporary way (Q&D) to handle stored files, a better way (using pubsub |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 # syntax?) should be elaborated and proposed as a standard. |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 def __init__(self, host): |
3028 | 71 log.info(_("File Sharing Management plugin initialization")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 self.host = host |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 self._c = host.plugins["XEP-0050"] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 self._t = host.plugins["XEP-0264"] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 self.files_path = host.getLocalPath(None, C.FILES_DIR, profile=False) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 def profileConnected(self, client): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 self._c.addAdHocCommand( |
3028 | 79 client, self._onChangeFile, "Change Permissions of File(s)", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 node=NS_FILE_MANAGEMENT_PERM, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 allowed_magics=C.ENTITY_ALL, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 self._c.addAdHocCommand( |
3028 | 84 client, self._onDeleteFile, "Delete File(s)", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 node=NS_FILE_MANAGEMENT_DELETE, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 allowed_magics=C.ENTITY_ALL, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 self._c.addAdHocCommand( |
3028 | 89 client, self._onGenThumbnails, "Generate Thumbnails", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 node=NS_FILE_MANAGEMENT_THUMB, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 allowed_magics=C.ENTITY_ALL, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 def _err(self, reason): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 """Helper method to get argument to return for error |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 workflow will be interrupted with an error note |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 @param reason(unicode): reason of the error |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 @return (tuple): arguments to use in defer.returnValue |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 """ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 status = self._c.STATUS.COMPLETED |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 payload = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 note = (self._c.NOTE.ERROR, reason) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 return payload, status, None, note |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 def _getRootArgs(self): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 """Create the form to select the file to use |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 @return (tuple): arguments to use in defer.returnValue |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 """ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 status = self._c.STATUS.EXECUTING |
3028 | 112 form = data_form.Form("form", title="File Management", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 formNamespace=NS_FILE_MANAGEMENT) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 field = data_form.Field( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 "text-single", "path", required=True |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 form.addField(field) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 field = data_form.Field( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 "text-single", "namespace", required=False |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 form.addField(field) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 payload = form.toElement() |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 return payload, status, None, None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 def _getFileData(self, client, session_data, command_form): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 """Retrieve field requested in root form |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 "found_file" will also be set in session_data |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 @param command_form(data_form.Form): response to root form |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 @return (D(dict)): found file data |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 @raise WorkflowError: something is wrong |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 """ |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 fields = command_form.fields |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 try: |
3028 | 139 path = fields['path'].value.strip() |
140 namespace = fields['namespace'].value or None | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 except KeyError: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 if not path: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 |
3028 | 147 requestor = session_data['requestor'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 requestor_bare = requestor.userhostJID() |
3028 | 149 path = path.rstrip('/') |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
150 parent_path, basename = os.path.split(path) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 # TODO: if parent_path and basename are empty, we ask for root directory |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 # this must be managed |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 found_files = yield self.host.memory.getFiles( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 client, requestor_bare, path=parent_path, name=basename, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 namespace=namespace) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 found_file = found_files[0] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 except (exceptions.NotFound, IndexError): |
3028 | 161 raise WorkflowError(self._err(_("file not found"))) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 except exceptions.PermissionError: |
3028 | 163 raise WorkflowError(self._err(_("forbidden"))) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 if found_file['owner'] != requestor_bare: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 # only owner can manage files |
3028 | 167 log.warning(_("Only owner can manage files")) |
168 raise WorkflowError(self._err(_("forbidden"))) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 |
3028 | 170 session_data['found_file'] = found_file |
171 session_data['namespace'] = namespace | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 defer.returnValue(found_file) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 def _updateReadPermission(self, access, allowed_jids): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 if not allowed_jids: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 if C.ACCESS_PERM_READ in access: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 del access[C.ACCESS_PERM_READ] |
3028 | 178 elif allowed_jids == 'PUBLIC': |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 access[C.ACCESS_PERM_READ] = { |
3028 | 180 "type": C.ACCESS_TYPE_PUBLIC |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 } |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 access[C.ACCESS_PERM_READ] = { |
3028 | 184 "type": C.ACCESS_TYPE_WHITELIST, |
185 "jids": [j.full() for j in allowed_jids] | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 } |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 def _updateDir(self, client, requestor, namespace, file_data, allowed_jids): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 """Recursively update permission of a directory and all subdirectories |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 @param file_data(dict): metadata of the file |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 @param allowed_jids(list[jid.JID]): list of entities allowed to read the file |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 """ |
3028 | 195 assert file_data['type'] == C.FILE_TYPE_DIRECTORY |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 files_data = yield self.host.memory.getFiles( |
3028 | 197 client, requestor, parent=file_data['id'], namespace=namespace) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 for file_data in files_data: |
3028 | 200 if not file_data['access'].get(C.ACCESS_PERM_READ, {}): |
201 log.debug("setting {perm} read permission for {name}".format( | |
202 perm=allowed_jids, name=file_data['name'])) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 yield self.host.memory.fileUpdate( |
3028 | 204 file_data['id'], 'access', |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 partial(self._updateReadPermission, allowed_jids=allowed_jids)) |
3028 | 206 if file_data['type'] == C.FILE_TYPE_DIRECTORY: |
207 yield self._updateDir(client, requestor, namespace, file_data, 'PUBLIC') | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 def _onChangeFile(self, client, command_elt, session_data, action, node): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
211 try: |
3028 | 212 x_elt = next(command_elt.elements(data_form.NS_X_DATA, "x")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 command_form = data_form.Form.fromElement(x_elt) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 except StopIteration: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 command_form = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 found_file = session_data.get('found_file') |
3028 | 218 requestor = session_data['requestor'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 requestor_bare = requestor.userhostJID() |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 if command_form is None or len(command_form.fields) == 0: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 # root request |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 defer.returnValue(self._getRootArgs()) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 elif found_file is None: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 # file selected, we retrieve it and ask for permissions |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 found_file = yield self._getFileData(client, session_data, command_form) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 except WorkflowError as e: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 defer.returnValue(e.err_args) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
231 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
232 # management request |
3028 | 233 if found_file['type'] == C.FILE_TYPE_DIRECTORY: |
234 instructions = D_("Please select permissions for this directory") | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
235 else: |
3028 | 236 instructions = D_("Please select permissions for this file") |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
237 |
3028 | 238 form = data_form.Form("form", title="File Management", |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
239 instructions=[instructions], |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
240 formNamespace=NS_FILE_MANAGEMENT) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
241 field = data_form.Field( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
242 "text-multi", "read_allowed", required=False, |
3028 | 243 desc='list of jids allowed to read this file (beside yourself), or ' |
244 '"PUBLIC" to let a public access' | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
245 ) |
3028 | 246 read_access = found_file["access"].get(C.ACCESS_PERM_READ, {}) |
247 access_type = read_access.get('type', C.ACCESS_TYPE_WHITELIST) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 if access_type == C.ACCESS_TYPE_PUBLIC: |
3028 | 249 field.values = ['PUBLIC'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
251 field.values = read_access.get('jids', []) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
252 form.addField(field) |
3028 | 253 if found_file['type'] == C.FILE_TYPE_DIRECTORY: |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
254 field = data_form.Field( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 "boolean", "recursive", value=False, required=False, |
3028 | 256 desc="Files under it will be made public to follow this dir " |
257 "permission (only if they don't have already a permission set)." | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
258 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
259 form.addField(field) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
261 status = self._c.STATUS.EXECUTING |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 payload = form.toElement() |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
263 defer.returnValue((payload, status, None, None)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
264 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
265 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
266 # final phase, we'll do permission change here |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
268 read_allowed = command_form.fields['read_allowed'] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
269 except KeyError: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 |
3028 | 272 if read_allowed.value == 'PUBLIC': |
273 allowed_jids = 'PUBLIC' | |
274 elif read_allowed.value.strip() == '': | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
275 allowed_jids = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
276 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
277 try: |
2934
0bafdbda7f5f
plugin file sharing management: filter out empty values in allowed_jids
Goffi <goffi@goffi.org>
parents:
2929
diff
changeset
|
278 allowed_jids = [jid.JID(v.strip()) for v in read_allowed.values |
0bafdbda7f5f
plugin file sharing management: filter out empty values in allowed_jids
Goffi <goffi@goffi.org>
parents:
2929
diff
changeset
|
279 if v.strip()] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 except RuntimeError as e: |
3028 | 281 log.warning(_("Can't use read_allowed values: {reason}").format( |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 reason=e)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
283 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
284 |
3028 | 285 if found_file['type'] == C.FILE_TYPE_FILE: |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
286 yield self.host.memory.fileUpdate( |
3028 | 287 found_file['id'], 'access', |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
288 partial(self._updateReadPermission, allowed_jids=allowed_jids)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
289 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
290 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
291 recursive = command_form.fields['recursive'] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
292 except KeyError: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
293 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
294 yield self.host.memory.fileUpdate( |
3028 | 295 found_file['id'], 'access', |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
296 partial(self._updateReadPermission, allowed_jids=allowed_jids)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
297 if recursive: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
298 # we set all file under the directory as public (if they haven't |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
299 # already a permission set), so allowed entities of root directory |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
300 # can read them. |
3028 | 301 namespace = session_data['namespace'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 yield self._updateDir( |
3028 | 303 client, requestor_bare, namespace, found_file, 'PUBLIC') |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
305 # job done, we can end the session |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
306 status = self._c.STATUS.COMPLETED |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
307 payload = None |
3028 | 308 note = (self._c.NOTE.INFO, _("management session done")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
309 defer.returnValue((payload, status, None, note)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
310 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
311 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
312 def _onDeleteFile(self, client, command_elt, session_data, action, node): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
313 try: |
3028 | 314 x_elt = next(command_elt.elements(data_form.NS_X_DATA, "x")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
315 command_form = data_form.Form.fromElement(x_elt) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
316 except StopIteration: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
317 command_form = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
318 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
319 found_file = session_data.get('found_file') |
3028 | 320 requestor = session_data['requestor'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
321 requestor_bare = requestor.userhostJID() |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
322 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
323 if command_form is None or len(command_form.fields) == 0: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
324 # root request |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
325 defer.returnValue(self._getRootArgs()) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
326 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
327 elif found_file is None: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
328 # file selected, we need confirmation before actually deleting |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
329 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
330 found_file = yield self._getFileData(client, session_data, command_form) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
331 except WorkflowError as e: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
332 defer.returnValue(e.err_args) |
3028 | 333 if found_file['type'] == C.FILE_TYPE_DIRECTORY: |
334 msg = D_("Are you sure to delete directory {name} and all files and " | |
335 "directories under it?").format(name=found_file['name']) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
336 else: |
3028 | 337 msg = D_("Are you sure to delete file {name}?" |
338 .format(name=found_file['name'])) | |
339 form = data_form.Form("form", title="File Management", | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
340 instructions = [msg], |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
341 formNamespace=NS_FILE_MANAGEMENT) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
342 field = data_form.Field( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
343 "boolean", "confirm", value=False, required=True, |
3028 | 344 desc="check this box to confirm" |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
345 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
346 form.addField(field) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
347 status = self._c.STATUS.EXECUTING |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
348 payload = form.toElement() |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
349 defer.returnValue((payload, status, None, None)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
350 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
351 else: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
352 # final phase, we'll do deletion here |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
353 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
354 confirmed = command_form.fields['confirm'] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
355 except KeyError: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
356 self._c.adHocError(self._c.ERROR.BAD_PAYLOAD) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
357 if not confirmed: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
358 note = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
359 else: |
3028 | 360 recursive = found_file['type'] == C.FILE_TYPE_DIRECTORY |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
361 yield self.host.memory.fileDelete( |
3028 | 362 client, requestor_bare, found_file['id'], recursive) |
363 note = (self._c.NOTE.INFO, _("file deleted")) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
364 status = self._c.STATUS.COMPLETED |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
365 payload = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
366 defer.returnValue((payload, status, None, note)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
367 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
368 def _updateThumbs(self, extra, thumbnails): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
369 extra[C.KEY_THUMBNAILS] = thumbnails |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
370 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
371 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
372 def _genThumbs(self, client, requestor, namespace, file_data): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
373 """Recursively generate thumbnails |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
374 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
375 @param file_data(dict): metadata of the file |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
376 """ |
3028 | 377 if file_data['type'] == C.FILE_TYPE_DIRECTORY: |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
378 sub_files_data = yield self.host.memory.getFiles( |
3028 | 379 client, requestor, parent=file_data['id'], namespace=namespace) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
380 for sub_file_data in sub_files_data: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
381 yield self._genThumbs(client, requestor, namespace, sub_file_data) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
382 |
3028 | 383 elif file_data['type'] == C.FILE_TYPE_FILE: |
384 mime_type = file_data['mime_type'] | |
385 file_path = os.path.join(self.files_path, file_data['file_hash']) | |
386 if mime_type is not None and mime_type.startswith("image"): | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
387 thumbnails = [] |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
388 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
389 for max_thumb_size in (self._t.SIZE_SMALL, self._t.SIZE_MEDIUM): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
390 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
391 thumb_size, thumb_id = yield self._t.generateThumbnail( |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
392 file_path, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
393 max_thumb_size, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
394 # we keep thumbnails for 6 months |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
395 60 * 60 * 24 * 31 * 6, |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
396 ) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
397 except Exception as e: |
3028 | 398 log.warning(_("Can't create thumbnail: {reason}") |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
399 .format(reason=e)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
400 break |
3028 | 401 thumbnails.append({"id": thumb_id, "size": thumb_size}) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
402 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
403 yield self.host.memory.fileUpdate( |
3028 | 404 file_data['id'], 'extra', |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
405 partial(self._updateThumbs, thumbnails=thumbnails)) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
406 |
3028 | 407 log.info("thumbnails for [{file_name}] generated" |
408 .format(file_name=file_data['name'])) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
409 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 else: |
3028 | 411 log.warning("unmanaged file type: {type_}".format(type_=file_data['type'])) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
412 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
413 @defer.inlineCallbacks |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
414 def _onGenThumbnails(self, client, command_elt, session_data, action, node): |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
415 try: |
3028 | 416 x_elt = next(command_elt.elements(data_form.NS_X_DATA, "x")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
417 command_form = data_form.Form.fromElement(x_elt) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
418 except StopIteration: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
419 command_form = None |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
420 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
421 found_file = session_data.get('found_file') |
3028 | 422 requestor = session_data['requestor'] |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
423 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
424 if command_form is None or len(command_form.fields) == 0: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
425 # root request |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
426 defer.returnValue(self._getRootArgs()) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
427 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
428 elif found_file is None: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
429 # file selected, we retrieve it and ask for permissions |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
430 try: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
431 found_file = yield self._getFileData(client, session_data, command_form) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
432 except WorkflowError as e: |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
433 defer.returnValue(e.err_args) |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
434 |
3028 | 435 log.info("Generating thumbnails as requested") |
436 yield self._genThumbs(client, requestor, found_file['namespace'], found_file) | |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
437 |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
438 # job done, we can end the session |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
439 status = self._c.STATUS.COMPLETED |
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
440 payload = None |
3028 | 441 note = (self._c.NOTE.INFO, _("thumbnails generated")) |
2929
e0429ff7f6b6
plugin comp file sharing: file sharing management first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
442 defer.returnValue((payload, status, None, note)) |