Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0329.py @ 3913:944f51f9c2b4
core (xmpp): make `send` a blocking method, fix `sendMessageData` calls:
original `send` method is blocking, and it is used as such by Wokkel and thus can't be
changed to an async method easily. However, an Async method is necessary to have an async
trigger at the very end of the send workflow for end-to-end encryption. To workaround
that, `send` is an async method which call `a_send`, an async method which actually does
the sending. This way legacy method can still call `send` while `a_send` can be await
otherwise.
Fix calls to `sendMessageData`: the method now being an `async` one, `ensureDeferred` had
to be used in some calls.
author | Goffi <goffi@goffi.org> |
---|---|
date | Sat, 24 Sep 2022 16:31:39 +0200 |
parents | 813595f88612 |
children | 524856bd7b19 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # SAT plugin for File Information Sharing (XEP-0329) |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
19 import mimetypes |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
20 import json |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
21 import os |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
22 import traceback |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
23 from pathlib import Path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
24 from typing import Optional, Dict |
3028 | 25 from zope.interface import implementer |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from twisted.words.protocols.jabber import xmlstream |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from twisted.words.protocols.jabber import jid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 from twisted.words.protocols.jabber import error as jabber_error |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from twisted.internet import defer |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
30 from wokkel import disco, iwokkel, data_form |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
31 from sat.core.i18n import _ |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
32 from sat.core.xmpp import SatXMPPEntity |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
33 from sat.core import exceptions |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
34 from sat.core.constants import Const as C |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
35 from sat.core.log import getLogger |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
36 from sat.tools import stream |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
37 from sat.tools import utils |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
38 from sat.tools.common import regex |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
41 log = getLogger(__name__) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
42 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 PLUGIN_INFO = { |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_NAME: "File Information Sharing", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 C.PI_IMPORT_NAME: "XEP-0329", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 C.PI_TYPE: "XEP", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 C.PI_MODES: C.PLUG_MODE_BOTH, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 C.PI_PROTOCOLS: ["XEP-0329"], |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
49 C.PI_DEPENDENCIES: ["XEP-0231", "XEP-0234", "XEP-0300", "XEP-0106"], |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 C.PI_MAIN: "XEP_0329", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 C.PI_HANDLER: "yes", |
3028 | 52 C.PI_DESCRIPTION: _("""Implementation of File Information Sharing"""), |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 } |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
55 NS_FIS = "urn:xmpp:fis:0" |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
56 NS_FIS_AFFILIATION = "org.salut-a-toi.fis-affiliation" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
57 NS_FIS_CONFIGURATION = "org.salut-a-toi.fis-configuration" |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
58 NS_FIS_CREATE = "org.salut-a-toi.fis-create" |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
60 IQ_FIS_REQUEST = f'{C.IQ_GET}/query[@xmlns="{NS_FIS}"]' |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
61 # not in the standard, but needed, and it's handy to keep it here |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
62 IQ_FIS_AFFILIATION_GET = f'{C.IQ_GET}/affiliations[@xmlns="{NS_FIS_AFFILIATION}"]' |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
63 IQ_FIS_AFFILIATION_SET = f'{C.IQ_SET}/affiliations[@xmlns="{NS_FIS_AFFILIATION}"]' |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
64 IQ_FIS_CONFIGURATION_GET = f'{C.IQ_GET}/configuration[@xmlns="{NS_FIS_CONFIGURATION}"]' |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
65 IQ_FIS_CONFIGURATION_SET = f'{C.IQ_SET}/configuration[@xmlns="{NS_FIS_CONFIGURATION}"]' |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
66 IQ_FIS_CREATE_DIR = f'{C.IQ_SET}/dir[@xmlns="{NS_FIS_CREATE}"]' |
3028 | 67 SINGLE_FILES_DIR = "files" |
68 TYPE_VIRTUAL = "virtual" | |
69 TYPE_PATH = "path" | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
70 SHARE_TYPES = (TYPE_PATH, TYPE_VIRTUAL) |
3028 | 71 KEY_TYPE = "type" |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
74 class RootPathException(Exception): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
75 """Root path is requested""" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
76 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
77 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 class ShareNode(object): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
79 """Node containing directory or files to share, virtual or real""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
80 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 host = None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 def __init__(self, name, parent, type_, access, path=None): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 assert type_ in SHARE_TYPES |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 if name is not None: |
3028 | 86 if name == ".." or "/" in name or "\\" in name: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
87 log.warning( |
3028 | 88 _("path change chars found in name [{name}], hack attempt?").format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
89 name=name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
90 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
91 ) |
3028 | 92 if name == "..": |
93 name = "--" | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 name = regex.pathEscape(name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 self.name = name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 self.children = {} |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 self.type = type_ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 self.access = {} if access is None else access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 assert isinstance(self.access, dict) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 self.parent = None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 if parent is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 assert name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 parent.addChild(self) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 assert name is None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 if path is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 if type_ != TYPE_PATH: |
3028 | 109 raise exceptions.InternalError(_("path can only be set on path nodes")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 self._path = path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 @property |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 def path(self): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 return self._path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 def __getitem__(self, key): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 return self.children[key] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 def __contains__(self, item): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 return self.children.__contains__(item) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 def __iter__(self): |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
123 return self.children.__iter__() |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 |
3032
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
125 def items(self): |
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
126 return self.children.items() |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 |
3032
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
128 def values(self): |
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
129 return self.children.values() |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
130 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 def getOrCreate(self, name, type_=TYPE_VIRTUAL, access=None): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
132 """Get a node or create a virtual node and return it""" |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 if access is None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 access = {C.ACCESS_PERM_READ: {KEY_TYPE: C.ACCESS_TYPE_PUBLIC}} |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 return self.children[name] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 node = ShareNode(name, self, type_=type_, access=access) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 return node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 def addChild(self, node): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 if node.parent is not None: |
3028 | 143 raise exceptions.ConflictError(_("a node can't have several parents")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 node.parent = self |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 self.children[node.name] = node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
147 def removeFromParent(self): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
148 try: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
149 del self.parent.children[self.name] |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
150 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
151 raise exceptions.InternalError( |
3028 | 152 "trying to remove a node from inexisting parent" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
153 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
154 except KeyError: |
3028 | 155 raise exceptions.InternalError("node not found in parent's children") |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
156 self.parent = None |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
157 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 def _checkNodePermission(self, client, node, perms, peer_jid): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 """Check access to this node for peer_jid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 @param node(SharedNode): node to check access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 @param perms(unicode): permissions to check, iterable of C.ACCESS_PERM_* |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 @param peer_jid(jid.JID): entity which try to access the node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 @return (bool): True if entity can access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 """ |
3028 | 166 file_data = {"access": self.access, "owner": client.jid.userhostJID()} |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 self.host.memory.checkFilePermission(file_data, peer_jid, perms) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 except exceptions.PermissionError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
170 return False |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 return True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
174 def checkPermissions( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
175 self, client, peer_jid, perms=(C.ACCESS_PERM_READ,), check_parents=True |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
176 ): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
177 """Check that peer_jid can access this node and all its parents |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 @param peer_jid(jid.JID): entrity trying to access the node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 @param perms(unicode): permissions to check, iterable of C.ACCESS_PERM_* |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
181 @param check_parents(bool): if True, access of all parents of this node will be |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
182 checked too |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 @return (bool): True if entity can access this node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 """ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 peer_jid = peer_jid.userhostJID() |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 if peer_jid == client.jid.userhostJID(): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 return True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 parent = self |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 while parent != None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 if not self._checkNodePermission(client, parent, perms, peer_jid): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 return False |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 parent = parent.parent |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 return True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 @staticmethod |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 def find(client, path, peer_jid, perms=(C.ACCESS_PERM_READ,)): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 """find node corresponding to a path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 @param path(unicode): path to the requested file or directory |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 @param peer_jid(jid.JID): entity trying to find the node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 used to check permission |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 @return (dict, unicode): shared data, remaining path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 @raise exceptions.PermissionError: user can't access this file |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 @raise exceptions.DataError: path is invalid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
207 @raise NotFound: path lead to a non existing file/directory |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 """ |
3028 | 209 path_elts = [_f for _f in path.split("/") if _f] |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 |
3028 | 211 if ".." in path_elts: |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
212 log.warning(_( |
3028 | 213 'parent dir ("..") found in path, hack attempt? path is {path} ' |
214 '[{profile}]').format(path=path, profile=client.profile)) | |
215 raise exceptions.PermissionError("illegal path elements") | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 node = client._XEP_0329_root_node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 while path_elts: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 if node.type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 node = node[path_elts.pop(0)] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 raise exceptions.NotFound |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 elif node.type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 break |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
228 if not node.checkPermissions(client, peer_jid, perms=perms): |
3028 | 229 raise exceptions.PermissionError("permission denied") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 |
3028 | 231 return node, "/".join(path_elts) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
232 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
233 def findByLocalPath(self, path): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
234 """retrieve nodes linking to local path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
235 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
236 @return (list[ShareNode]): found nodes associated to path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
237 @raise exceptions.NotFound: no node has been found with this path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
238 """ |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
239 shared_paths = self.getSharedPaths() |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
240 try: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
241 return shared_paths[path] |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
242 except KeyError: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
243 raise exceptions.NotFound |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
244 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
245 def _getSharedPaths(self, node, paths): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
246 if node.type == TYPE_VIRTUAL: |
3028 | 247 for node in node.values(): |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
248 self._getSharedPaths(node, paths) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
249 elif node.type == TYPE_PATH: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
250 paths.setdefault(node.path, []).append(node) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
251 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
252 raise exceptions.InternalError( |
3028 | 253 "unknown node type: {type}".format(type=node.type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
254 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
255 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
256 def getSharedPaths(self): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
257 """retrieve nodes by shared path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
258 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
259 this method will retrieve recursively shared path in children of this node |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
260 @return (dict): map from shared path to list of nodes |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
261 """ |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
262 if self.type == TYPE_PATH: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
263 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
264 "getSharedPaths must be used on a virtual node" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
265 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
266 paths = {} |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
267 self._getSharedPaths(self, paths) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
268 return paths |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
269 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 class XEP_0329(object): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
272 def __init__(self, host): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
273 log.info(_("File Information Sharing initialization")) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
274 self.host = host |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
275 ShareNode.host = host |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
276 self._b = host.plugins["XEP-0231"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
277 self._h = host.plugins["XEP-0300"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
278 self._jf = host.plugins["XEP-0234"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
279 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
280 "FISList", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
281 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
282 in_sign="ssa{ss}s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
283 out_sign="aa{ss}", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
284 method=self._listFiles, |
3028 | 285 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
286 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
287 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
288 "FISLocalSharesGet", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
289 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
290 in_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
291 out_sign="as", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
292 method=self._localSharesGet, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
293 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
294 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
295 "FISSharePath", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
296 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
297 in_sign="ssss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
298 out_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
299 method=self._sharePath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
300 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
301 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
302 "FISUnsharePath", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
303 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
304 in_sign="ss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
305 out_sign="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
306 method=self._unsharePath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
307 ) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
308 host.bridge.addMethod( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
309 "FISAffiliationsGet", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
310 ".plugin", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
311 in_sign="ssss", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
312 out_sign="a{ss}", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
313 method=self._affiliationsGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
314 async_=True, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
315 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
316 host.bridge.addMethod( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
317 "FISAffiliationsSet", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
318 ".plugin", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
319 in_sign="sssa{ss}s", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
320 out_sign="", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
321 method=self._affiliationsSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
322 async_=True, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
323 ) |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
324 host.bridge.addMethod( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
325 "FISConfigurationGet", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
326 ".plugin", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
327 in_sign="ssss", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
328 out_sign="a{ss}", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
329 method=self._configurationGet, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
330 async_=True, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
331 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
332 host.bridge.addMethod( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
333 "FISConfigurationSet", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
334 ".plugin", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
335 in_sign="sssa{ss}s", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
336 out_sign="", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
337 method=self._configurationSet, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
338 async_=True, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
339 ) |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
340 host.bridge.addMethod( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
341 "FISCreateDir", |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
342 ".plugin", |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
343 in_sign="sssa{ss}s", |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
344 out_sign="", |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
345 method=self._createDir, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
346 async_=True, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
347 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
348 host.bridge.addSignal("FISSharedPathNew", ".plugin", signature="sss") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
349 host.bridge.addSignal("FISSharedPathRemoved", ".plugin", signature="ss") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
350 host.trigger.add("XEP-0234_fileSendingRequest", self._fileSendingRequestTrigger) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
351 host.registerNamespace("fis", NS_FIS) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
352 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
353 def getHandler(self, client): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
354 return XEP_0329_handler(self) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
355 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
356 def profileConnected(self, client): |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
357 if client.is_component: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
358 client._file_sharing_allowed_hosts = self.host.memory.getConfig( |
3402
08a3e34aead1
plugin XEP-0329: minor reformatting
Goffi <goffi@goffi.org>
parents:
3366
diff
changeset
|
359 'component file_sharing', |
08a3e34aead1
plugin XEP-0329: minor reformatting
Goffi <goffi@goffi.org>
parents:
3366
diff
changeset
|
360 'http_upload_allowed_hosts_list') or [client.host] |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
361 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
362 client._XEP_0329_root_node = ShareNode( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
363 None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
364 None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
365 TYPE_VIRTUAL, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
366 {C.ACCESS_PERM_READ: {KEY_TYPE: C.ACCESS_TYPE_PUBLIC}}, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
367 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
368 client._XEP_0329_names_data = {} # name to share map |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
369 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
370 def _fileSendingRequestTrigger( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
371 self, client, session, content_data, content_name, file_data, file_elt |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
372 ): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
373 """This trigger check that a requested file is available, and fill suitable data |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
374 |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
375 Path and name are used to retrieve the file. If path is missing, we try our luck |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
376 with known names |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
377 """ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
378 if client.is_component: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
379 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
380 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
381 try: |
3028 | 382 name = file_data["name"] |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
383 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
384 return True, None |
3028 | 385 assert "/" not in name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
386 |
3028 | 387 path = file_data.get("path") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
388 if path is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
389 # we have a path, we can follow it to find node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
390 try: |
3028 | 391 node, rem_path = ShareNode.find(client, path, session["peer_jid"]) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
392 except (exceptions.PermissionError, exceptions.NotFound): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
393 # no file, or file not allowed, we continue normal workflow |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
394 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
395 except exceptions.DataError: |
3028 | 396 log.warning(_("invalid path: {path}").format(path=path)) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
397 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
398 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
399 if node.type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
400 # we have a virtual node, so name must link to a path node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
401 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
402 path = node[name].path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
403 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
404 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
405 elif node.type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
406 # we have a path node, so we can retrieve the full path now |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
407 path = os.path.join(node.path, rem_path, name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
408 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
409 raise exceptions.InternalError( |
3028 | 410 "unknown type: {type}".format(type=node.type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
411 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
412 if not os.path.exists(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
413 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
414 size = os.path.getsize(path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
415 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
416 # we don't have the path, we try to find the file by its name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
417 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
418 name_data = client._XEP_0329_names_data[name] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
419 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
420 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
421 |
3028 | 422 for path, shared_file in name_data.items(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
423 if True: # FIXME: filters are here |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
424 break |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
425 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
426 return True, None |
3028 | 427 parent_node = shared_file["parent"] |
428 if not parent_node.checkPermissions(client, session["peer_jid"]): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
429 log.warning( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
430 _( |
3028 | 431 "{peer_jid} requested a file (s)he can't access [{profile}]" |
432 ).format(peer_jid=session["peer_jid"], profile=client.profile) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
433 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
434 return True, None |
3028 | 435 size = shared_file["size"] |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
436 |
3028 | 437 file_data["size"] = size |
438 file_elt.addElement("size", content=str(size)) | |
439 hash_algo = file_data["hash_algo"] = self._h.getDefaultAlgo() | |
440 hasher = file_data["hash_hasher"] = self._h.getHasher(hash_algo) | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
441 file_elt.addChild(self._h.buildHashUsedElt(hash_algo)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
442 content_data["stream_object"] = stream.FileStreamObject( |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
443 self.host, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
444 client, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
445 path, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
446 uid=self._jf.getProgressId(session, content_name), |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
447 size=size, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
448 data_cb=lambda data: hasher.update(data), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
449 ) |
3516
e47aa1fb7b24
plugin XEP-0329: fix root node retrieval and `_fileSendingRequestTrigger` return value
Goffi <goffi@goffi.org>
parents:
3500
diff
changeset
|
450 return False, defer.succeed(True) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
451 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
452 # common methods |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
453 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
454 def _requestHandler(self, client, iq_elt, root_nodes_cb, files_from_node_cb): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
455 iq_elt.handled = True |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
456 node = iq_elt.query.getAttribute("node") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
457 if not node: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
458 d = utils.asDeferred(root_nodes_cb, client, iq_elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
459 else: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
460 d = utils.asDeferred(files_from_node_cb, client, iq_elt, node) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
461 d.addErrback( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
462 lambda failure_: log.error( |
3028 | 463 _("error while retrieving files: {msg}").format(msg=failure_) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
464 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
465 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
466 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
467 def _iqError(self, client, iq_elt, condition="item-not-found"): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
468 error_elt = jabber_error.StanzaError(condition).toResponse(iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
469 client.send(error_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
470 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
471 # client |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
472 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
473 def _addPathData(self, client, query_elt, path, parent_node): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
474 """Fill query_elt with files/directories found in path""" |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
475 name = os.path.basename(path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
476 if os.path.isfile(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
477 size = os.path.getsize(path) |
2512
025afb04c10b
plugin XEP-0234: some cleaning + added triggers to allow plugins to change parsing/generation of <file> element
Goffi <goffi@goffi.org>
parents:
2503
diff
changeset
|
478 mime_type = mimetypes.guess_type(path, strict=False)[0] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
479 file_elt = self._jf.buildFileElement( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
480 client=client, name=name, size=size, mime_type=mime_type, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
481 modified=os.path.getmtime(path) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
482 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
483 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
484 query_elt.addChild(file_elt) |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
485 # we don't specify hash as it would be too resource intensive to calculate |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
486 # it for all files. |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
487 # we add file to name_data, so users can request it later |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
488 name_data = client._XEP_0329_names_data.setdefault(name, {}) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
489 if path not in name_data: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
490 name_data[path] = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
491 "size": size, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
492 "mime_type": mime_type, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
493 "parent": parent_node, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
494 } |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
495 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
496 # we have a directory |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
497 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
498 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
499 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
500 def _pathNodeHandler(self, client, iq_elt, query_elt, node, path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
501 """Fill query_elt for path nodes, i.e. physical directories""" |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
502 path = os.path.join(node.path, path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
503 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
504 if not os.path.exists(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
505 # path may have been moved since it has been shared |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
506 return self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
507 elif os.path.isfile(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
508 self._addPathData(client, query_elt, path, node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
509 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
510 for name in sorted(os.listdir(path.encode("utf-8")), key=lambda n: n.lower()): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
511 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
512 name = name.decode("utf-8", "strict") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
513 except UnicodeDecodeError as e: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
514 log.warning( |
3028 | 515 _("ignoring invalid unicode name ({name}): {msg}").format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
516 name=name.decode("utf-8", "replace"), msg=e |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
517 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
518 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
519 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
520 full_path = os.path.join(path, name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
521 self._addPathData(client, query_elt, full_path, node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
522 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
523 def _virtualNodeHandler(self, client, peer_jid, iq_elt, query_elt, node): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
524 """Fill query_elt for virtual nodes""" |
3028 | 525 for name, child_node in node.items(): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
526 if not child_node.checkPermissions(client, peer_jid, check_parents=False): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
527 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
528 node_type = child_node.type |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
529 if node_type == TYPE_VIRTUAL: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
530 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
531 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
532 elif node_type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
533 self._addPathData(client, query_elt, child_node.path, child_node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
534 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
535 raise exceptions.InternalError( |
3028 | 536 _("unexpected type: {type}").format(type=node_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
537 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
538 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
539 def _getRootNodesCb(self, client, iq_elt): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
540 peer_jid = jid.JID(iq_elt["from"]) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
541 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
542 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 543 for name, node in client._XEP_0329_root_node.items(): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
544 if not node.checkPermissions(client, peer_jid, check_parents=False): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
545 continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
546 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
547 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
548 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
549 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
550 def _getFilesFromNodeCb(self, client, iq_elt, node_path): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
551 """Main method to retrieve files/directories from a node_path""" |
3028 | 552 peer_jid = jid.JID(iq_elt["from"]) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
553 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
554 node, path = ShareNode.find(client, node_path, peer_jid) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
555 except (exceptions.PermissionError, exceptions.NotFound): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
556 return self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
557 except exceptions.DataError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
558 return self._iqError(client, iq_elt, condition="not-acceptable") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
559 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
560 node_type = node.type |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
561 peer_jid = jid.JID(iq_elt["from"]) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
562 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
563 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 564 query_elt["node"] = node_path |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
565 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
566 # we now fill query_elt according to node_type |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
567 if node_type == TYPE_PATH: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
568 # it's a physical path |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
569 self._pathNodeHandler(client, iq_elt, query_elt, node, path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
570 elif node_type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
571 assert not path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
572 self._virtualNodeHandler(client, peer_jid, iq_elt, query_elt, node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
573 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
574 raise exceptions.InternalError( |
3028 | 575 _("unknown node type: {type}").format(type=node_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
576 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
577 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
578 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
579 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
580 def onRequest(self, iq_elt, client): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
581 return self._requestHandler( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
582 client, iq_elt, self._getRootNodesCb, self._getFilesFromNodeCb |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
583 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
584 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
585 # Component |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
586 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
587 def _compParseJids(self, client, iq_elt): |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
588 """Retrieve peer_jid and owner to use from IQ stanza |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
589 |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
590 @param iq_elt(domish.Element): IQ stanza of the FIS request |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
591 @return (tuple[jid.JID, jid.JID]): peer_jid and owner |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
592 """ |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
593 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
594 async def _compGetRootNodesCb(self, client, iq_elt): |
3366
e09cb08166a3
plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`:
Goffi <goffi@goffi.org>
parents:
3365
diff
changeset
|
595 peer_jid, owner = client.getOwnerAndPeer(iq_elt) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
596 files_data = await self.host.memory.getFiles( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
597 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
598 peer_jid=peer_jid, |
3028 | 599 parent="", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
600 type_=C.FILE_TYPE_DIRECTORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
601 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
602 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
603 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
604 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
605 for file_data in files_data: |
3028 | 606 name = file_data["name"] |
607 directory_elt = query_elt.addElement("directory") | |
608 directory_elt["name"] = name | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
609 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
610 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
611 async def _compGetFilesFromNodeCb(self, client, iq_elt, node_path): |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
612 """Retrieve files from local files repository according to permissions |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
613 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
614 result stanza is then built and sent to requestor |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
615 @trigger XEP-0329_compGetFilesFromNode(client, iq_elt, owner, node_path, |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
616 files_data): |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
617 can be used to add data/elements |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
618 """ |
3366
e09cb08166a3
plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`:
Goffi <goffi@goffi.org>
parents:
3365
diff
changeset
|
619 peer_jid, owner = client.getOwnerAndPeer(iq_elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
620 try: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
621 files_data = await self.host.memory.getFiles( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
622 client, peer_jid=peer_jid, path=node_path, owner=owner |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
623 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
624 except exceptions.NotFound: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
625 self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
626 return |
2937
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
627 except exceptions.PermissionError: |
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
628 self._iqError(client, iq_elt, condition='not-allowed') |
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
629 return |
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
630 except Exception as e: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
631 tb = traceback.format_tb(e.__traceback__) |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
632 log.error(f"internal server error: {e}\n{''.join(tb)}") |
2937
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
633 self._iqError(client, iq_elt, condition='internal-server-error') |
db0890c9c7db
plugin XEP-0329: correctly handle error if something is wrong when getting file from component.
Goffi <goffi@goffi.org>
parents:
2923
diff
changeset
|
634 return |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
635 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
636 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 637 query_elt["node"] = node_path |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
638 if not self.host.trigger.point( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
639 "XEP-0329_compGetFilesFromNode", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
640 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
641 iq_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
642 iq_result_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
643 owner, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
644 node_path, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
645 files_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
646 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
647 return |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
648 for file_data in files_data: |
3040 | 649 if file_data['type'] == C.FILE_TYPE_DIRECTORY: |
650 directory_elt = query_elt.addElement("directory") | |
651 directory_elt['name'] = file_data['name'] | |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
652 self.host.trigger.point( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
653 "XEP-0329_compGetFilesFromNode_build_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
654 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
655 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
656 directory_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
657 owner, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
658 node_path, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
659 ) |
3040 | 660 else: |
661 file_elt = self._jf.buildFileElementFromDict( | |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
662 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
663 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
664 modified=file_data.get("modified", file_data["created"]) |
3040 | 665 ) |
666 query_elt.addChild(file_elt) | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
667 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
668 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
669 def onComponentRequest(self, iq_elt, client): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
670 return self._requestHandler( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
671 client, iq_elt, self._compGetRootNodesCb, self._compGetFilesFromNodeCb |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
672 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
673 |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
674 async def _parseResult(self, client, peer_jid, iq_elt): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
675 query_elt = next(iq_elt.elements(NS_FIS, "query")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
676 files = [] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
677 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
678 for elt in query_elt.elements(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
679 if elt.name == "file": |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
680 # we have a file |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
681 try: |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
682 file_data = await self._jf.parseFileElement(client, elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
683 except exceptions.DataError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
684 continue |
3028 | 685 file_data["type"] = C.FILE_TYPE_FILE |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
686 try: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
687 thumbs = file_data['extra'][C.KEY_THUMBNAILS] |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
688 except KeyError: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
689 log.debug(f"No thumbnail found for {file_data}") |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
690 else: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
691 for thumb in thumbs: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
692 if 'url' not in thumb and "id" in thumb: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
693 try: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
694 file_path = await self._b.getFile(client, peer_jid, thumb['id']) |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
695 except Exception as e: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
696 log.warning(f"Can't get thumbnail {thumb['id']!r} for {file_data}: {e}") |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
697 else: |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
698 thumb['filename'] = file_path.name |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
699 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
700 elif elt.name == "directory" and elt.uri == NS_FIS: |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
701 # we have a directory |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
702 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
703 file_data = {"name": elt["name"], "type": C.FILE_TYPE_DIRECTORY} |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
704 self.host.trigger.point( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
705 "XEP-0329_parseResult_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
706 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
707 elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
708 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
709 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
710 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
711 log.warning( |
3568
04283582966f
core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
712 _("unexpected element, ignoring: {elt}") |
04283582966f
core, frontends: fix invalid translatable strings.
Goffi <goffi@goffi.org>
parents:
3516
diff
changeset
|
713 .format(elt=elt.toXml()) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
714 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
715 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
716 files.append(file_data) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
717 return files |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
718 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
719 # affiliations # |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
720 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
721 async def _parseElement(self, client, iq_elt, element, namespace): |
3366
e09cb08166a3
plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`:
Goffi <goffi@goffi.org>
parents:
3365
diff
changeset
|
722 peer_jid, owner = client.getOwnerAndPeer(iq_elt) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
723 elt = next(iq_elt.elements(namespace, element)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
724 path = Path("/", elt['path']) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
725 if len(path.parts) < 2: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
726 raise RootPathException |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
727 namespace = elt.getAttribute('namespace') |
3360 | 728 files_data = await self.host.memory.getFiles( |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
729 client, |
3365
626046010a2d
plugin XEP-0329: fix filtering by owner on components
Goffi <goffi@goffi.org>
parents:
3362
diff
changeset
|
730 peer_jid=peer_jid, |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
731 path=str(path.parent), |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
732 name=path.name, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
733 namespace=namespace, |
3365
626046010a2d
plugin XEP-0329: fix filtering by owner on components
Goffi <goffi@goffi.org>
parents:
3362
diff
changeset
|
734 owner=owner, |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
735 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
736 if len(files_data) != 1: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
737 client.sendError(iq_elt, 'item-not-found') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
738 raise exceptions.CancelError |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
739 file_data = files_data[0] |
3365
626046010a2d
plugin XEP-0329: fix filtering by owner on components
Goffi <goffi@goffi.org>
parents:
3362
diff
changeset
|
740 return peer_jid, elt, path, namespace, file_data |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
741 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
742 def _affiliationsGet(self, service_jid_s, namespace, path, profile): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
743 client = self.host.getClient(profile) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
744 service = jid.JID(service_jid_s) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
745 d = defer.ensureDeferred(self.affiliationsGet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
746 client, service, namespace or None, path)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
747 d.addCallback( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
748 lambda affiliations: { |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
749 str(entity): affiliation for entity, affiliation in affiliations.items() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
750 } |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
751 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
752 return d |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
753 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
754 async def affiliationsGet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
755 self, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
756 client: SatXMPPEntity, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
757 service: jid.JID, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
758 namespace: Optional[str], |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
759 path: str |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
760 ) -> Dict[jid.JID, str]: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
761 if not path: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
762 raise ValueError(f"invalid path: {path!r}") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
763 iq_elt = client.IQ("get") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
764 iq_elt['to'] = service.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
765 affiliations_elt = iq_elt.addElement((NS_FIS_AFFILIATION, "affiliations")) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
766 if namespace: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
767 affiliations_elt["namespace"] = namespace |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
768 affiliations_elt["path"] = path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
769 iq_result_elt = await iq_elt.send() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
770 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
771 affiliations_elt = next(iq_result_elt.elements(NS_FIS_AFFILIATION, "affiliations")) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
772 except StopIteration: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
773 raise exceptions.DataError(f"Invalid result to affiliations request: {iq_result_elt.toXml()}") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
774 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
775 affiliations = {} |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
776 for affiliation_elt in affiliations_elt.elements(NS_FIS_AFFILIATION, 'affiliation'): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
777 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
778 affiliations[jid.JID(affiliation_elt['jid'])] = affiliation_elt['affiliation'] |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
779 except (KeyError, RuntimeError): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
780 raise exceptions.DataError( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
781 f"invalid affiliation element: {affiliation_elt.toXml()}") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
782 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
783 return affiliations |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
784 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
785 def _affiliationsSet(self, service_jid_s, namespace, path, affiliations, profile): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
786 client = self.host.getClient(profile) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
787 service = jid.JID(service_jid_s) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
788 affiliations = {jid.JID(e): a for e, a in affiliations.items()} |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
789 return defer.ensureDeferred(self.affiliationsSet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
790 client, service, namespace or None, path, affiliations)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
791 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
792 async def affiliationsSet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
793 self, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
794 client: SatXMPPEntity, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
795 service: jid.JID, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
796 namespace: Optional[str], |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
797 path: str, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
798 affiliations: Dict[jid.JID, str], |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
799 ): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
800 if not path: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
801 raise ValueError(f"invalid path: {path!r}") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
802 iq_elt = client.IQ("set") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
803 iq_elt['to'] = service.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
804 affiliations_elt = iq_elt.addElement((NS_FIS_AFFILIATION, "affiliations")) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
805 if namespace: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
806 affiliations_elt["namespace"] = namespace |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
807 affiliations_elt["path"] = path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
808 for entity_jid, affiliation in affiliations.items(): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
809 affiliation_elt = affiliations_elt.addElement('affiliation') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
810 affiliation_elt['jid'] = entity_jid.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
811 affiliation_elt['affiliation'] = affiliation |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
812 await iq_elt.send() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
813 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
814 def _onComponentAffiliationsGet(self, iq_elt, client): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
815 iq_elt.handled = True |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
816 defer.ensureDeferred(self.onComponentAffiliationsGet(client, iq_elt)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
817 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
818 async def onComponentAffiliationsGet(self, client, iq_elt): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
819 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
820 ( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
821 from_jid, affiliations_elt, path, namespace, file_data |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
822 ) = await self._parseElement(client, iq_elt, "affiliations", NS_FIS_AFFILIATION) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
823 except exceptions.CancelError: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
824 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
825 except RootPathException: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
826 # if root path is requested, we only get owner affiliation |
3366
e09cb08166a3
plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`:
Goffi <goffi@goffi.org>
parents:
3365
diff
changeset
|
827 peer_jid, owner = client.getOwnerAndPeer(iq_elt) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
828 is_owner = peer_jid.userhostJID() == owner |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
829 affiliations = {owner: 'owner'} |
3355
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
830 except exceptions.NotFound: |
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
831 client.sendError(iq_elt, "item-not-found") |
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
832 return |
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
833 except Exception as e: |
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
834 client.sendError(iq_elt, "internal-server-error", str(e)) |
33d9b38b5890
plugin XEP-0329: better error handling in `onComponentAffiliationsGet`
Goffi <goffi@goffi.org>
parents:
3333
diff
changeset
|
835 return |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
836 else: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
837 from_jid_bare = from_jid.userhostJID() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
838 is_owner = from_jid_bare == file_data.get('owner') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
839 affiliations = self.host.memory.getFileAffiliations(file_data) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
840 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
841 affiliations_elt = iq_result_elt.addElement((NS_FIS_AFFILIATION, 'affiliations')) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
842 for entity_jid, affiliation in affiliations.items(): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
843 if not is_owner and entity_jid.userhostJID() != from_jid_bare: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
844 # only onwer can get all affiliations |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
845 continue |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
846 affiliation_elt = affiliations_elt.addElement('affiliation') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
847 affiliation_elt['jid'] = entity_jid.userhost() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
848 affiliation_elt['affiliation'] = affiliation |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
849 client.send(iq_result_elt) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
850 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
851 def _onComponentAffiliationsSet(self, iq_elt, client): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
852 iq_elt.handled = True |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
853 defer.ensureDeferred(self.onComponentAffiliationsSet(client, iq_elt)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
854 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
855 async def onComponentAffiliationsSet(self, client, iq_elt): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
856 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
857 ( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
858 from_jid, affiliations_elt, path, namespace, file_data |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
859 ) = await self._parseElement(client, iq_elt, "affiliations", NS_FIS_AFFILIATION) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
860 except exceptions.CancelError: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
861 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
862 except RootPathException: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
863 client.sendError(iq_elt, 'bad-request', "Root path can't be used") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
864 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
865 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
866 if from_jid.userhostJID() != file_data['owner']: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
867 log.warning( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
868 f"{from_jid} tried to modify {path} affiliations while the owner is " |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
869 f"{file_data['owner']}" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
870 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
871 client.sendError(iq_elt, 'forbidden') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
872 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
873 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
874 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
875 affiliations = { |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
876 jid.JID(e['jid']): e['affiliation'] |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
877 for e in affiliations_elt.elements(NS_FIS_AFFILIATION, 'affiliation') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
878 } |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
879 except (KeyError, RuntimeError): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
880 log.warning( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
881 f"invalid affiliation element: {affiliations_elt.toXml()}" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
882 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
883 client.sendError(iq_elt, 'bad-request', "invalid affiliation element") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
884 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
885 except Exception as e: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
886 log.error( |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
887 f"unexepected exception while setting affiliation element: {e}\n" |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
888 f"{affiliations_elt.toXml()}" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
889 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
890 client.sendError(iq_elt, 'internal-server-error', f"{e}") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
891 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
892 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
893 await self.host.memory.setFileAffiliations(client, file_data, affiliations) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
894 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
895 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
896 client.send(iq_result_elt) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
897 |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
898 # configuration |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
899 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
900 def _configurationGet(self, service_jid_s, namespace, path, profile): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
901 client = self.host.getClient(profile) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
902 service = jid.JID(service_jid_s) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
903 d = defer.ensureDeferred(self.configurationGet( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
904 client, service, namespace or None, path)) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
905 d.addCallback( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
906 lambda configuration: { |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
907 str(entity): affiliation for entity, affiliation in configuration.items() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
908 } |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
909 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
910 return d |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
911 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
912 async def configurationGet( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
913 self, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
914 client: SatXMPPEntity, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
915 service: jid.JID, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
916 namespace: Optional[str], |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
917 path: str |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
918 ) -> Dict[str, str]: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
919 if not path: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
920 raise ValueError(f"invalid path: {path!r}") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
921 iq_elt = client.IQ("get") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
922 iq_elt['to'] = service.full() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
923 configuration_elt = iq_elt.addElement((NS_FIS_CONFIGURATION, "configuration")) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
924 if namespace: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
925 configuration_elt["namespace"] = namespace |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
926 configuration_elt["path"] = path |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
927 iq_result_elt = await iq_elt.send() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
928 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
929 configuration_elt = next(iq_result_elt.elements(NS_FIS_CONFIGURATION, "configuration")) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
930 except StopIteration: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
931 raise exceptions.DataError(f"Invalid result to configuration request: {iq_result_elt.toXml()}") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
932 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
933 form = data_form.findForm(configuration_elt, NS_FIS_CONFIGURATION) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
934 configuration = {f.var: f.value for f in form.fields.values()} |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
935 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
936 return configuration |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
937 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
938 def _configurationSet(self, service_jid_s, namespace, path, configuration, profile): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
939 client = self.host.getClient(profile) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
940 service = jid.JID(service_jid_s) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
941 return defer.ensureDeferred(self.configurationSet( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
942 client, service, namespace or None, path, configuration)) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
943 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
944 async def configurationSet( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
945 self, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
946 client: SatXMPPEntity, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
947 service: jid.JID, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
948 namespace: Optional[str], |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
949 path: str, |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
950 configuration: Dict[str, str], |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
951 ): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
952 if not path: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
953 raise ValueError(f"invalid path: {path!r}") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
954 iq_elt = client.IQ("set") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
955 iq_elt['to'] = service.full() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
956 configuration_elt = iq_elt.addElement((NS_FIS_CONFIGURATION, "configuration")) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
957 if namespace: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
958 configuration_elt["namespace"] = namespace |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
959 configuration_elt["path"] = path |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
960 form = data_form.Form(formType="submit", formNamespace=NS_FIS_CONFIGURATION) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
961 form.makeFields(configuration) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
962 configuration_elt.addChild(form.toElement()) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
963 await iq_elt.send() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
964 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
965 def _onComponentConfigurationGet(self, iq_elt, client): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
966 iq_elt.handled = True |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
967 defer.ensureDeferred(self.onComponentConfigurationGet(client, iq_elt)) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
968 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
969 async def onComponentConfigurationGet(self, client, iq_elt): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
970 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
971 ( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
972 from_jid, configuration_elt, path, namespace, file_data |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
973 ) = await self._parseElement(client, iq_elt, "configuration", NS_FIS_CONFIGURATION) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
974 except exceptions.CancelError: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
975 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
976 except RootPathException: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
977 client.sendError(iq_elt, 'bad-request', "Root path can't be used") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
978 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
979 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
980 access_type = file_data['access'][C.ACCESS_PERM_READ]['type'] |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
981 except KeyError: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
982 access_model = 'whitelist' |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
983 else: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
984 access_model = 'open' if access_type == C.ACCESS_TYPE_PUBLIC else 'whitelist' |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
985 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
986 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
987 configuration_elt = iq_result_elt.addElement((NS_FIS_CONFIGURATION, 'configuration')) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
988 form = data_form.Form(formType="form", formNamespace=NS_FIS_CONFIGURATION) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
989 form.makeFields({'access_model': access_model}) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
990 configuration_elt.addChild(form.toElement()) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
991 client.send(iq_result_elt) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
992 |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
993 async def _setConfiguration(self, client, configuration_elt, file_data): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
994 form = data_form.findForm(configuration_elt, NS_FIS_CONFIGURATION) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
995 for name, value in form.items(): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
996 if name == 'access_model': |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
997 await self.host.memory.setFileAccessModel(client, file_data, value) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
998 else: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
999 # TODO: send a IQ error? |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1000 log.warning( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1001 f"Trying to set a not implemented configuration option: {name}") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1002 |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1003 def _onComponentConfigurationSet(self, iq_elt, client): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1004 iq_elt.handled = True |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1005 defer.ensureDeferred(self.onComponentConfigurationSet(client, iq_elt)) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1006 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1007 async def onComponentConfigurationSet(self, client, iq_elt): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1008 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1009 ( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1010 from_jid, configuration_elt, path, namespace, file_data |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1011 ) = await self._parseElement(client, iq_elt, "configuration", NS_FIS_CONFIGURATION) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1012 except exceptions.CancelError: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1013 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1014 except RootPathException: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1015 client.sendError(iq_elt, 'bad-request', "Root path can't be used") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1016 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1017 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1018 from_jid_bare = from_jid.userhostJID() |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1019 is_owner = from_jid_bare == file_data.get('owner') |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1020 if not is_owner: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1021 log.warning( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1022 f"{from_jid} tried to modify {path} configuration while the owner is " |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1023 f"{file_data['owner']}" |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1024 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1025 client.sendError(iq_elt, 'forbidden') |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1026 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1027 |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1028 await self._setConfiguration(client, configuration_elt, file_data) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1029 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1030 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1031 client.send(iq_result_elt) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1032 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1033 # directory creation |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1034 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1035 def _createDir(self, service_jid_s, namespace, path, configuration, profile): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1036 client = self.host.getClient(profile) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1037 service = jid.JID(service_jid_s) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1038 return defer.ensureDeferred(self.createDir( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1039 client, service, namespace or None, path, configuration or None)) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1040 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1041 async def createDir( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1042 self, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1043 client: SatXMPPEntity, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1044 service: jid.JID, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1045 namespace: Optional[str], |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1046 path: str, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1047 configuration: Optional[Dict[str, str]], |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1048 ): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1049 if not path: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1050 raise ValueError(f"invalid path: {path!r}") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1051 iq_elt = client.IQ("set") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1052 iq_elt['to'] = service.full() |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1053 create_dir_elt = iq_elt.addElement((NS_FIS_CREATE, "dir")) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1054 if namespace: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1055 create_dir_elt["namespace"] = namespace |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1056 create_dir_elt["path"] = path |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1057 if configuration: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1058 configuration_elt = create_dir_elt.addElement((NS_FIS_CONFIGURATION, "configuration")) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1059 form = data_form.Form(formType="submit", formNamespace=NS_FIS_CONFIGURATION) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1060 form.makeFields(configuration) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1061 configuration_elt.addChild(form.toElement()) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1062 await iq_elt.send() |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1063 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1064 def _onComponentCreateDir(self, iq_elt, client): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1065 iq_elt.handled = True |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1066 defer.ensureDeferred(self.onComponentCreateDir(client, iq_elt)) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1067 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1068 async def onComponentCreateDir(self, client, iq_elt): |
3366
e09cb08166a3
plugin XEP-0329, core(xmpp): moved `_compParseJids` to `SatXMPPComponent`:
Goffi <goffi@goffi.org>
parents:
3365
diff
changeset
|
1069 peer_jid, owner = client.getOwnerAndPeer(iq_elt) |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1070 if peer_jid.host not in client._file_sharing_allowed_hosts: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1071 client.sendError(iq_elt, 'forbidden') |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1072 return |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1073 create_dir_elt = next(iq_elt.elements(NS_FIS_CREATE, "dir")) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1074 namespace = create_dir_elt.getAttribute('namespace') |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1075 path = Path("/", create_dir_elt['path']) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1076 if len(path.parts) < 2: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1077 client.sendError(iq_elt, 'bad-request', "Root path can't be used") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1078 return |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1079 # for root directories, we check permission here |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1080 if len(path.parts) == 2 and owner != peer_jid.userhostJID(): |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1081 log.warning( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1082 f"{peer_jid} is trying to create a dir at {owner}'s repository:\n" |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1083 f"path: {path}\nnamespace: {namespace!r}" |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1084 ) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1085 client.sendError(iq_elt, 'forbidden', "You can't create a directory there") |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1086 return |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1087 # when going further into the path, the permissions will be checked by getFiles |
3500
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1088 files_data = await self.host.memory.getFiles( |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1089 client, |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1090 peer_jid=peer_jid, |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1091 path=path.parent, |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1092 namespace=namespace, |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1093 owner=owner, |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1094 ) |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1095 if path.name in [d['name'] for d in files_data]: |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1096 log.warning( |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1097 f"Conflict when trying to create a directory (from: {peer_jid} " |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1098 f"namespace: {namespace!r} path: {path!r})" |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1099 ) |
3500
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1100 client.sendError( |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1101 iq_elt, 'conflict', "there is already a file or dir at this path") |
73b8a8d938be
plugin XEP-0329: check files conflict also for root files
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1102 return |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1103 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1104 try: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1105 configuration_elt = next( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1106 create_dir_elt.elements(NS_FIS_CONFIGURATION, 'configuration')) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1107 except StopIteration: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1108 configuration_elt = None |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1109 |
3362
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1110 await self.host.memory.setFile( |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1111 client, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1112 path.name, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1113 path=path.parent, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1114 type_=C.FILE_TYPE_DIRECTORY, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1115 namespace=namespace, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1116 owner=owner, |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1117 peer_jid=peer_jid |
02583a401e51
plugin XEP-0329: fix conflict check + directory creation in `onComponentCreateDir`
Goffi <goffi@goffi.org>
parents:
3360
diff
changeset
|
1118 ) |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1119 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1120 if configuration_elt is not None: |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1121 file_data = (await self.host.memory.getFiles( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1122 client, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1123 peer_jid=peer_jid, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1124 path=path.parent, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1125 name=path.name, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1126 namespace=namespace, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1127 owner=owner, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1128 ))[0] |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1129 |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1130 await self._setConfiguration(client, configuration_elt, file_data) |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1131 |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1132 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1133 client.send(iq_result_elt) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1134 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1135 # file methods # |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1136 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1137 def _serializeData(self, files_data): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1138 for file_data in files_data: |
3028 | 1139 for key, value in file_data.items(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1140 file_data[key] = ( |
3028 | 1141 json.dumps(value) if key in ("extra",) else str(value) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1142 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1143 return files_data |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1144 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1145 def _listFiles(self, target_jid, path, extra, profile): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1146 client = self.host.getClient(profile) |
3040 | 1147 target_jid = client.jid if not target_jid else jid.JID(target_jid) |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1148 d = defer.ensureDeferred(self.listFiles(client, target_jid, path or None)) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1149 d.addCallback(self._serializeData) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1150 return d |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1151 |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1152 async def listFiles(self, client, peer_jid, path=None, extra=None): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1153 """List file shared by an entity |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1154 |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1155 @param peer_jid(jid.JID): jid of the sharing entity |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1156 @param path(unicode, None): path to the directory containing shared files |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1157 None to get root directories |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1158 @param extra(dict, None): extra data |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1159 @return list(dict): shared files |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1160 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1161 iq_elt = client.IQ("get") |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1162 iq_elt["to"] = peer_jid.full() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1163 query_elt = iq_elt.addElement((NS_FIS, "query")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1164 if path: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1165 query_elt["node"] = path |
3333
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1166 iq_result_elt = await iq_elt.send() |
ac9342f359e9
plugin XEP-0329: download thumbnails:
Goffi <goffi@goffi.org>
parents:
3321
diff
changeset
|
1167 return await self._parseResult(client, peer_jid, iq_result_elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1168 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1169 def _localSharesGet(self, profile): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1170 client = self.host.getClient(profile) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1171 return self.localSharesGet(client) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1172 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1173 def localSharesGet(self, client): |
3028 | 1174 return list(client._XEP_0329_root_node.getSharedPaths().keys()) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1175 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1176 def _sharePath(self, name, path, access, profile): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1177 client = self.host.getClient(profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1178 access = json.loads(access) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1179 return self.sharePath(client, name or None, path, access) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1180 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1181 def sharePath(self, client, name, path, access): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1182 if client.is_component: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1183 raise exceptions.ClientTypeError |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1184 if not os.path.exists(path): |
3028 | 1185 raise ValueError(_("This path doesn't exist!")) |
1186 if not path or not path.strip(" /"): | |
1187 raise ValueError(_("A path need to be specified")) | |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1188 if not isinstance(access, dict): |
3028 | 1189 raise ValueError(_("access must be a dict")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1190 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1191 node = client._XEP_0329_root_node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1192 node_type = TYPE_PATH |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1193 if os.path.isfile(path): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1194 # we have a single file, the workflow is diferrent as we store all single |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1195 # files in the same dir |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1196 node = node.getOrCreate(SINGLE_FILES_DIR) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1197 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1198 if not name: |
3028 | 1199 name = os.path.basename(path.rstrip(" /")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1200 if not name: |
3028 | 1201 raise exceptions.InternalError(_("Can't find a proper name")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1202 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1203 if name in node or name == SINGLE_FILES_DIR: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1204 idx = 1 |
3028 | 1205 new_name = name + "_" + str(idx) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1206 while new_name in node: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1207 idx += 1 |
3028 | 1208 new_name = name + "_" + str(idx) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1209 name = new_name |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1210 log.info(_( |
3028 | 1211 "A directory with this name is already shared, renamed to {new_name} " |
1212 "[{profile}]".format( new_name=new_name, profile=client.profile))) | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1213 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1214 ShareNode(name=name, parent=node, type_=node_type, access=access, path=path) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1215 self.host.bridge.FISSharedPathNew(path, name, client.profile) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1216 return name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1217 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1218 def _unsharePath(self, path, profile): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1219 client = self.host.getClient(profile) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1220 return self.unsharePath(client, path) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1221 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1222 def unsharePath(self, client, path): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1223 nodes = client._XEP_0329_root_node.findByLocalPath(path) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1224 for node in nodes: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1225 node.removeFromParent() |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1226 self.host.bridge.FISSharedPathRemoved(path, client.profile) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1227 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1228 |
3028 | 1229 @implementer(iwokkel.IDisco) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1230 class XEP_0329_handler(xmlstream.XMPPHandler): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1231 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1232 def __init__(self, plugin_parent): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1233 self.plugin_parent = plugin_parent |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1234 self.host = plugin_parent.host |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1235 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1236 def connectionInitialized(self): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1237 if self.parent.is_component: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1238 self.xmlstream.addObserver( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1239 IQ_FIS_REQUEST, self.plugin_parent.onComponentRequest, client=self.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1240 ) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1241 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1242 IQ_FIS_AFFILIATION_GET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1243 self.plugin_parent._onComponentAffiliationsGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1244 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1245 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1246 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1247 IQ_FIS_AFFILIATION_SET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1248 self.plugin_parent._onComponentAffiliationsSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1249 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1250 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1251 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1252 IQ_FIS_CONFIGURATION_GET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1253 self.plugin_parent._onComponentConfigurationGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1254 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1255 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1256 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1257 IQ_FIS_CONFIGURATION_SET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1258 self.plugin_parent._onComponentConfigurationSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1259 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1260 ) |
3359
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1261 self.xmlstream.addObserver( |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1262 IQ_FIS_CREATE_DIR, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1263 self.plugin_parent._onComponentCreateDir, |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1264 client=self.parent |
000b6722bd35
plugin XEP-0329: added `FISCreateDir` method:
Goffi <goffi@goffi.org>
parents:
3355
diff
changeset
|
1265 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1266 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1267 self.xmlstream.addObserver( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1268 IQ_FIS_REQUEST, self.plugin_parent.onRequest, client=self.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1269 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1270 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1271 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1272 return [disco.DiscoFeature(NS_FIS)] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1273 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1274 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1275 return [] |