Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0329.py @ 3330:7b47f48d31f3
plugin XEP-0264: fix orientation of thumbnails:
Rotation of thumbnailis is now modified according to EXIF orientation data. Original image
is not modified as user may want to keep it, and orientation transformation can modify
encoding parameters.
Update `pillow` minimum version to the first one with `exif_transpose` implementation.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 13 Aug 2020 23:46:18 +0200 |
parents | 8bbd2ed924e8 |
children | ac9342f359e9 |
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) |
3136 | 4 # Copyright (C) 2009-2020 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 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
22 from pathlib import Path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
23 from typing import Optional, Dict |
3028 | 24 from zope.interface import implementer |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from twisted.words.protocols.jabber import xmlstream |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from twisted.words.protocols.jabber import jid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 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
|
28 from twisted.internet import defer |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
29 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
|
30 from sat.core.i18n import _ |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
31 from sat.core.xmpp import SatXMPPEntity |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
32 from sat.core import exceptions |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
33 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
|
34 from sat.core.log import getLogger |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
35 from sat.tools import stream |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
36 from sat.tools.common import regex |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
39 log = getLogger(__name__) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
40 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 PLUGIN_INFO = { |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_NAME: "File Information Sharing", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_IMPORT_NAME: "XEP-0329", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_TYPE: "XEP", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 C.PI_MODES: C.PLUG_MODE_BOTH, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 C.PI_PROTOCOLS: ["XEP-0329"], |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
47 C.PI_DEPENDENCIES: ["XEP-0234", "XEP-0300", "XEP-0106"], |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 C.PI_MAIN: "XEP_0329", |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 C.PI_HANDLER: "yes", |
3028 | 50 C.PI_DESCRIPTION: _("""Implementation of File Information Sharing"""), |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 } |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
53 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
|
54 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
|
55 NS_FIS_CONFIGURATION = "org.salut-a-toi.fis-configuration" |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
57 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
|
58 # 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
|
59 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
|
60 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
|
61 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
|
62 IQ_FIS_CONFIGURATION_SET = f'{C.IQ_SET}/configuration[@xmlns="{NS_FIS_CONFIGURATION}"]' |
3028 | 63 SINGLE_FILES_DIR = "files" |
64 TYPE_VIRTUAL = "virtual" | |
65 TYPE_PATH = "path" | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
66 SHARE_TYPES = (TYPE_PATH, TYPE_VIRTUAL) |
3028 | 67 KEY_TYPE = "type" |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
70 class RootPathException(Exception): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
71 """Root path is requested""" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
72 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
73 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 class ShareNode(object): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
75 """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
|
76 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 host = None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 def __init__(self, name, parent, type_, access, path=None): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 assert type_ in SHARE_TYPES |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
81 if name is not None: |
3028 | 82 if name == ".." or "/" in name or "\\" in name: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
83 log.warning( |
3028 | 84 _("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
|
85 name=name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
86 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
87 ) |
3028 | 88 if name == "..": |
89 name = "--" | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 name = regex.pathEscape(name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 self.name = name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 self.children = {} |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 self.type = type_ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 self.access = {} if access is None else access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 assert isinstance(self.access, dict) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 self.parent = None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 if parent is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 assert name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 parent.addChild(self) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 assert name is None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 if path is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 if type_ != TYPE_PATH: |
3028 | 105 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
|
106 self._path = path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 @property |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 def path(self): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 return self._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 def __getitem__(self, key): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 return self.children[key] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 def __contains__(self, item): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 return self.children.__contains__(item) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 def __iter__(self): |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
119 return self.children.__iter__() |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 |
3032
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
121 def items(self): |
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
122 return self.children.items() |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 |
3032
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
124 def values(self): |
95e2fd14a761
plugin XEP-0329: fixed ShareNode item() and values after Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
125 return self.children.values() |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
126 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 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
|
128 """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
|
129 if access is None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 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
|
131 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 return self.children[name] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 node = ShareNode(name, self, type_=type_, access=access) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 return node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 def addChild(self, node): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 if node.parent is not None: |
3028 | 139 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
|
140 node.parent = self |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 self.children[node.name] = node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
143 def removeFromParent(self): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
144 try: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
145 del self.parent.children[self.name] |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
146 except TypeError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
147 raise exceptions.InternalError( |
3028 | 148 "trying to remove a node from inexisting parent" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
149 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
150 except KeyError: |
3028 | 151 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
|
152 self.parent = None |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
153 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 def _checkNodePermission(self, client, node, perms, peer_jid): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 """Check access to this node for peer_jid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
156 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 @param node(SharedNode): node to check access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 @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
|
159 @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
|
160 @return (bool): True if entity can access |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 """ |
3028 | 162 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
|
163 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 self.host.memory.checkFilePermission(file_data, peer_jid, perms) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 except exceptions.PermissionError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 return False |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 return True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
170 def checkPermissions( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
171 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
|
172 ): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
173 """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
|
174 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 @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
|
176 @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
|
177 @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
|
178 checked too |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 @return (bool): True if entity can access this node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 """ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 peer_jid = peer_jid.userhostJID() |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 if peer_jid == client.jid.userhostJID(): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 return True |
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 parent = self |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 while parent != None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 if not self._checkNodePermission(client, parent, perms, peer_jid): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 return False |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 parent = parent.parent |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 return True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 @staticmethod |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 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
|
195 """find node corresponding to a path |
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 @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
|
198 @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
|
199 used to check permission |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 @return (dict, unicode): shared data, remaining path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 @raise exceptions.PermissionError: user can't access this file |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 @raise exceptions.DataError: path is invalid |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 @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
|
204 """ |
3028 | 205 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
|
206 |
3028 | 207 if ".." in path_elts: |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
208 log.warning(_( |
3028 | 209 'parent dir ("..") found in path, hack attempt? path is {path} ' |
210 '[{profile}]').format(path=path, profile=client.profile)) | |
211 raise exceptions.PermissionError("illegal path elements") | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 if not path_elts: |
3028 | 214 raise exceptions.DataError(_("path is invalid: {path}").format(path=path)) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 node = client._XEP_0329_root_node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 while path_elts: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 if node.type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 node = node[path_elts.pop(0)] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 raise exceptions.NotFound |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 elif node.type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 break |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
227 if not node.checkPermissions(client, peer_jid, perms=perms): |
3028 | 228 raise exceptions.PermissionError("permission denied") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 |
3028 | 230 return node, "/".join(path_elts) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
231 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
232 def findByLocalPath(self, path): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
233 """retrieve nodes linking to local path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
234 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
235 @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
|
236 @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
|
237 """ |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
238 shared_paths = self.getSharedPaths() |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
239 try: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
240 return shared_paths[path] |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
241 except KeyError: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
242 raise exceptions.NotFound |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
243 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
244 def _getSharedPaths(self, node, paths): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
245 if node.type == TYPE_VIRTUAL: |
3028 | 246 for node in node.values(): |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
247 self._getSharedPaths(node, paths) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
248 elif node.type == TYPE_PATH: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
249 paths.setdefault(node.path, []).append(node) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
250 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
251 raise exceptions.InternalError( |
3028 | 252 "unknown node type: {type}".format(type=node.type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
253 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
254 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
255 def getSharedPaths(self): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
256 """retrieve nodes by shared path |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
257 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
258 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
|
259 @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
|
260 """ |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
261 if self.type == TYPE_PATH: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
262 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
263 "getSharedPaths must be used on a virtual node" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
264 ) |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
265 paths = {} |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
266 self._getSharedPaths(self, paths) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
267 return paths |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
268 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
269 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 class XEP_0329(object): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 def __init__(self, host): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
272 log.info(_("File Information Sharing initialization")) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
273 self.host = host |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
274 ShareNode.host = host |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
275 self._h = host.plugins["XEP-0300"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
276 self._jf = host.plugins["XEP-0234"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
277 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
278 "FISList", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
279 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
280 in_sign="ssa{ss}s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
281 out_sign="aa{ss}", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
282 method=self._listFiles, |
3028 | 283 async_=True, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
284 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
285 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
286 "FISLocalSharesGet", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
287 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
288 in_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
289 out_sign="as", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
290 method=self._localSharesGet, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
291 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
292 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
293 "FISSharePath", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
294 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
295 in_sign="ssss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
296 out_sign="s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
297 method=self._sharePath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
298 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
299 host.bridge.addMethod( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
300 "FISUnsharePath", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
301 ".plugin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
302 in_sign="ss", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
303 out_sign="", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
304 method=self._unsharePath, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
305 ) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
306 host.bridge.addMethod( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
307 "FISAffiliationsGet", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
308 ".plugin", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
309 in_sign="ssss", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
310 out_sign="a{ss}", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
311 method=self._affiliationsGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
312 async_=True, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
313 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
314 host.bridge.addMethod( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
315 "FISAffiliationsSet", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
316 ".plugin", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
317 in_sign="sssa{ss}s", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
318 out_sign="", |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
319 method=self._affiliationsSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
320 async_=True, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
321 ) |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
322 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
|
323 "FISConfigurationGet", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
324 ".plugin", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 async_=True, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
329 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
330 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
|
331 "FISConfigurationSet", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
332 ".plugin", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
333 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
|
334 out_sign="", |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
335 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
|
336 async_=True, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
337 ) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
338 host.bridge.addSignal("FISSharedPathNew", ".plugin", signature="sss") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
339 host.bridge.addSignal("FISSharedPathRemoved", ".plugin", signature="ss") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
340 host.trigger.add("XEP-0234_fileSendingRequest", self._fileSendingRequestTrigger) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
341 host.registerNamespace("fis", NS_FIS) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
342 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
343 def getHandler(self, client): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
344 return XEP_0329_handler(self) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
345 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
346 def profileConnected(self, client): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
347 if not client.is_component: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
348 client._XEP_0329_root_node = ShareNode( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
349 None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
350 None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
351 TYPE_VIRTUAL, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
352 {C.ACCESS_PERM_READ: {KEY_TYPE: C.ACCESS_TYPE_PUBLIC}}, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
353 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
354 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
|
355 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
356 def _fileSendingRequestTrigger( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
357 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
|
358 ): |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
359 """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
|
360 |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
361 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
|
362 with known names |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
363 """ |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
364 if client.is_component: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
365 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
366 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
367 try: |
3028 | 368 name = file_data["name"] |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
369 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
370 return True, None |
3028 | 371 assert "/" not in name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
372 |
3028 | 373 path = file_data.get("path") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
374 if path is not None: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
375 # 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
|
376 try: |
3028 | 377 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
|
378 except (exceptions.PermissionError, exceptions.NotFound): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
379 # 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
|
380 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
381 except exceptions.DataError: |
3028 | 382 log.warning(_("invalid path: {path}").format(path=path)) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
383 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
384 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
385 if node.type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
386 # 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
|
387 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
388 path = node[name].path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
389 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
390 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
391 elif node.type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
392 # 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
|
393 path = os.path.join(node.path, rem_path, name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
394 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
395 raise exceptions.InternalError( |
3028 | 396 "unknown type: {type}".format(type=node.type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
397 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
398 if not os.path.exists(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
399 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
400 size = os.path.getsize(path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
401 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
402 # 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
|
403 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
404 name_data = client._XEP_0329_names_data[name] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
405 except KeyError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
406 return True, None |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
407 |
3028 | 408 for path, shared_file in name_data.items(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
409 if True: # FIXME: filters are here |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
410 break |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
411 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
412 return True, None |
3028 | 413 parent_node = shared_file["parent"] |
414 if not parent_node.checkPermissions(client, session["peer_jid"]): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
415 log.warning( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
416 _( |
3028 | 417 "{peer_jid} requested a file (s)he can't access [{profile}]" |
418 ).format(peer_jid=session["peer_jid"], profile=client.profile) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
419 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
420 return True, None |
3028 | 421 size = shared_file["size"] |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
422 |
3028 | 423 file_data["size"] = size |
424 file_elt.addElement("size", content=str(size)) | |
425 hash_algo = file_data["hash_algo"] = self._h.getDefaultAlgo() | |
426 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
|
427 file_elt.addChild(self._h.buildHashUsedElt(hash_algo)) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
428 content_data["stream_object"] = stream.FileStreamObject( |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
429 self.host, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
430 client, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
431 path, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
432 uid=self._jf.getProgressId(session, content_name), |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
433 size=size, |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
434 data_cb=lambda data: hasher.update(data), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
435 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
436 return False, True |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
437 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
438 # common methods |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
439 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
440 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
|
441 iq_elt.handled = True |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
442 node = iq_elt.query.getAttribute("node") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
443 if not node: |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
444 d = defer.maybeDeferred(root_nodes_cb, client, iq_elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
445 else: |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
446 d = defer.maybeDeferred(files_from_node_cb, client, iq_elt, node) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
447 d.addErrback( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
448 lambda failure_: log.error( |
3028 | 449 _("error while retrieving files: {msg}").format(msg=failure_) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
450 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
451 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
452 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
453 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
|
454 error_elt = jabber_error.StanzaError(condition).toResponse(iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
455 client.send(error_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
456 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
457 # client |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
458 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
459 def _addPathData(self, client, query_elt, path, parent_node): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
460 """Fill query_elt with files/directories found in path""" |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
461 name = os.path.basename(path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
462 if os.path.isfile(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
463 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
|
464 mime_type = mimetypes.guess_type(path, strict=False)[0] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
465 file_elt = self._jf.buildFileElement( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
466 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
|
467 modified=os.path.getmtime(path) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
468 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
469 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
470 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
|
471 # 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
|
472 # it for all files. |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
473 # 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
|
474 name_data = client._XEP_0329_names_data.setdefault(name, {}) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
475 if path not in name_data: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
476 name_data[path] = { |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
477 "size": size, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
478 "mime_type": mime_type, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
479 "parent": parent_node, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
480 } |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
481 else: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
482 # we have a directory |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
483 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
484 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
485 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
486 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
|
487 """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
|
488 path = os.path.join(node.path, path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
489 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
490 if not os.path.exists(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
491 # 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
|
492 return self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
493 elif os.path.isfile(path): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
494 self._addPathData(client, query_elt, path, node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
495 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
496 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
|
497 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
498 name = name.decode("utf-8", "strict") |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
499 except UnicodeDecodeError as e: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
500 log.warning( |
3028 | 501 _("ignoring invalid unicode name ({name}): {msg}").format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
502 name=name.decode("utf-8", "replace"), msg=e |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
503 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
504 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
505 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
506 full_path = os.path.join(path, name) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
507 self._addPathData(client, query_elt, full_path, node) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
508 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
509 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
|
510 """Fill query_elt for virtual nodes""" |
3028 | 511 for name, child_node in node.items(): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 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
|
513 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
514 node_type = child_node.type |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
515 if node_type == TYPE_VIRTUAL: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
516 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
517 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
518 elif node_type == TYPE_PATH: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
519 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
|
520 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
521 raise exceptions.InternalError( |
3028 | 522 _("unexpected type: {type}").format(type=node_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
523 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
524 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
525 def _getRootNodesCb(self, client, iq_elt): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
526 peer_jid = jid.JID(iq_elt["from"]) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
527 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
528 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 529 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
|
530 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
|
531 continue |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
532 directory_elt = query_elt.addElement("directory") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
533 directory_elt["name"] = name |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
534 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
535 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
536 def _getFilesFromNodeCb(self, client, iq_elt, node_path): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
537 """Main method to retrieve files/directories from a node_path""" |
3028 | 538 peer_jid = jid.JID(iq_elt["from"]) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
539 try: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
540 node, path = ShareNode.find(client, node_path, peer_jid) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
541 except (exceptions.PermissionError, exceptions.NotFound): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
542 return self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
543 except exceptions.DataError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
544 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
|
545 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
546 node_type = node.type |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
547 peer_jid = jid.JID(iq_elt["from"]) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
548 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
549 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 550 query_elt["node"] = node_path |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
551 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
552 # we now fill query_elt according to node_type |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
553 if node_type == TYPE_PATH: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
554 # it's a physical path |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
555 self._pathNodeHandler(client, iq_elt, query_elt, node, path) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
556 elif node_type == TYPE_VIRTUAL: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
557 assert not path |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
558 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
|
559 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
560 raise exceptions.InternalError( |
3028 | 561 _("unknown node type: {type}").format(type=node_type) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
562 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
563 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
564 client.send(iq_result_elt) |
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 def onRequest(self, iq_elt, client): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
567 return self._requestHandler( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
568 client, iq_elt, self._getRootNodesCb, self._getFilesFromNodeCb |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
569 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
570 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
571 # Component |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
572 |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
573 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
|
574 """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
|
575 |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
576 @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
|
577 @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
|
578 """ |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
579 to_jid = jid.JID(iq_elt['to']) |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
580 if to_jid.user: |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
581 user = self.host.plugins['XEP-0106'].unescape(to_jid.user) |
3028 | 582 if '@' in user: |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
583 # a full jid is specified |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
584 owner = jid.JID(user) |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
585 else: |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
586 # only user part is specified, we use our own host to build the full jid |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
587 owner = jid.JID(None, (user, client.host, None)) |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
588 else: |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
589 owner = jid.JID(iq_elt["from"]).userhostJID() |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
590 |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
591 peer_jid = jid.JID(iq_elt["from"]) |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
592 return peer_jid, owner |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
593 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
594 @defer.inlineCallbacks |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
595 def _compGetRootNodesCb(self, client, iq_elt): |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
596 peer_jid, owner = self._compParseJids(client, iq_elt) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
597 files_data = yield self.host.memory.getFiles( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
598 client, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
599 peer_jid=peer_jid, |
3028 | 600 parent="", |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
601 type_=C.FILE_TYPE_DIRECTORY, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
602 owner=owner, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
603 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
604 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
605 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
|
606 for file_data in files_data: |
3028 | 607 name = file_data["name"] |
608 directory_elt = query_elt.addElement("directory") | |
609 directory_elt["name"] = name | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
610 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
611 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
612 @defer.inlineCallbacks |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
613 def _compGetFilesFromNodeCb(self, client, iq_elt, node_path): |
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
614 """Retrieve files from local files repository according to permissions |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
615 |
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
616 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
|
617 @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
|
618 files_data): |
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
619 can be used to add data/elements |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
620 """ |
2923
1fd3ecb3351a
plugin XEP-0329: use local part of jid for components:
Goffi <goffi@goffi.org>
parents:
2909
diff
changeset
|
621 peer_jid, owner = self._compParseJids(client, iq_elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
622 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
623 files_data = yield self.host.memory.getFiles( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
624 client, peer_jid=peer_jid, path=node_path, owner=owner |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
625 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
626 except exceptions.NotFound: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
627 self._iqError(client, iq_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
628 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
|
629 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
|
630 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
|
631 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
|
632 except Exception as e: |
3028 | 633 log.error("internal server error: {e}".format(e=e)) |
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
|
634 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
|
635 return |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
636 iq_result_elt = xmlstream.toResponse(iq_elt, "result") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
637 query_elt = iq_result_elt.addElement((NS_FIS, "query")) |
3028 | 638 query_elt["node"] = node_path |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
639 if not self.host.trigger.point( |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
640 "XEP-0329_compGetFilesFromNode", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
641 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
642 iq_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
643 iq_result_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
644 owner, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
645 node_path, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
646 files_data |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
647 ): |
2528
65e278997715
component file sharing: comments metadata:
Goffi <goffi@goffi.org>
parents:
2527
diff
changeset
|
648 return |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
649 for file_data in files_data: |
3040 | 650 if file_data['type'] == C.FILE_TYPE_DIRECTORY: |
651 directory_elt = query_elt.addElement("directory") | |
652 directory_elt['name'] = file_data['name'] | |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
653 self.host.trigger.point( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
654 "XEP-0329_compGetFilesFromNode_build_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
655 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
656 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
657 directory_elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
658 owner, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
659 node_path, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
660 ) |
3040 | 661 else: |
662 file_elt = self._jf.buildFileElementFromDict( | |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
663 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
664 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
665 modified=file_data.get("modified", file_data["created"]) |
3040 | 666 ) |
667 query_elt.addChild(file_elt) | |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
668 client.send(iq_result_elt) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
669 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
670 def onComponentRequest(self, iq_elt, client): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
671 return self._requestHandler( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
672 client, iq_elt, self._compGetRootNodesCb, self._compGetFilesFromNodeCb |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
673 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
674 |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
675 def _parseResult(self, iq_elt, client): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
676 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
|
677 files = [] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
678 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
679 for elt in query_elt.elements(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
680 if elt.name == "file": |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
681 # we have a file |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
682 try: |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
683 file_data = self._jf.parseFileElement(client, elt) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
684 except exceptions.DataError: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
685 continue |
3028 | 686 file_data["type"] = C.FILE_TYPE_FILE |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
687 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
|
688 # we have a directory |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
689 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
690 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
|
691 self.host.trigger.point( |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
692 "XEP-0329_parseResult_directory", |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
693 client, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
694 elt, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
695 file_data, |
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
696 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
697 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
698 log.warning( |
3040 | 699 _(f"unexpected element, ignoring: {elt.toXml()}") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
700 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
701 continue |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
702 files.append(file_data) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
703 return files |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
704 |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
705 # affiliations # |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
706 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
707 async def _parseElement(self, client, iq_elt, element, namespace): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
708 from_jid = jid.JID(iq_elt['from']) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
709 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
|
710 path = Path("/", elt['path']) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
711 if len(path.parts) < 2: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
712 raise RootPathException |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
713 namespace = elt.getAttribute('namespace') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
714 files_data = await self.host.memory.getFiles( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
715 client, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
716 peer_jid=from_jid, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
717 path=str(path.parent), |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
718 name=path.name, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
719 namespace=namespace, |
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 if len(files_data) != 1: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
722 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
|
723 raise exceptions.CancelError |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
724 file_data = files_data[0] |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
725 return from_jid, elt, path, namespace, file_data |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
726 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
727 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
|
728 client = self.host.getClient(profile) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
729 service = jid.JID(service_jid_s) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
730 d = defer.ensureDeferred(self.affiliationsGet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
731 client, service, namespace or None, path)) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
732 d.addCallback( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
733 lambda affiliations: { |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
734 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
|
735 } |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
736 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
737 return d |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
738 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
739 async def affiliationsGet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
740 self, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
741 client: SatXMPPEntity, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
742 service: jid.JID, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
743 namespace: Optional[str], |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
744 path: str |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
745 ) -> Dict[jid.JID, str]: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
746 if not path: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
747 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
|
748 iq_elt = client.IQ("get") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
749 iq_elt['to'] = service.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
750 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
|
751 if namespace: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
752 affiliations_elt["namespace"] = namespace |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
753 affiliations_elt["path"] = path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
754 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
|
755 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
756 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
|
757 except StopIteration: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
758 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
|
759 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
760 affiliations = {} |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
761 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
|
762 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
763 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
|
764 except (KeyError, RuntimeError): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
765 raise exceptions.DataError( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
766 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
|
767 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
768 return affiliations |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
769 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
770 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
|
771 client = self.host.getClient(profile) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
772 service = jid.JID(service_jid_s) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
773 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
|
774 return defer.ensureDeferred(self.affiliationsSet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
775 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
|
776 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
777 async def affiliationsSet( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
778 self, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
779 client: SatXMPPEntity, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
780 service: jid.JID, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
781 namespace: Optional[str], |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
782 path: str, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
783 affiliations: Dict[jid.JID, str], |
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 if not path: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
786 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
|
787 iq_elt = client.IQ("set") |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
788 iq_elt['to'] = service.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
789 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
|
790 if namespace: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
791 affiliations_elt["namespace"] = namespace |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
792 affiliations_elt["path"] = path |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
793 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
|
794 affiliation_elt = affiliations_elt.addElement('affiliation') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
795 affiliation_elt['jid'] = entity_jid.full() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
796 affiliation_elt['affiliation'] = affiliation |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
797 await iq_elt.send() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
798 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
799 def _onComponentAffiliationsGet(self, iq_elt, client): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
800 iq_elt.handled = True |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
801 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
|
802 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
803 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
|
804 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
805 ( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
806 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
|
807 ) = 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
|
808 except exceptions.CancelError: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
809 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
810 except RootPathException: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
811 # if root path is requested, we only get owner affiliation |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
812 peer_jid, owner = self._compParseJids(client, iq_elt) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
813 is_owner = peer_jid.userhostJID() == owner |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
814 affiliations = {owner: 'owner'} |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
815 else: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
816 from_jid_bare = from_jid.userhostJID() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
817 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
|
818 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
|
819 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
|
820 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
|
821 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
|
822 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
|
823 # only onwer can get all affiliations |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
824 continue |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
825 affiliation_elt = affiliations_elt.addElement('affiliation') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
826 affiliation_elt['jid'] = entity_jid.userhost() |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
827 affiliation_elt['affiliation'] = affiliation |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
828 client.send(iq_result_elt) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
829 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
830 def _onComponentAffiliationsSet(self, iq_elt, client): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
831 iq_elt.handled = True |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
832 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
|
833 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
834 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
|
835 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
836 ( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
837 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
|
838 ) = 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
|
839 except exceptions.CancelError: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
840 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
841 except RootPathException: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
842 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
|
843 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
844 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
845 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
|
846 log.warning( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
847 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
|
848 f"{file_data['owner']}" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
849 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
850 client.sendError(iq_elt, 'forbidden') |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
851 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
852 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
853 try: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
854 affiliations = { |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
855 jid.JID(e['jid']): e['affiliation'] |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
856 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
|
857 } |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
858 except (KeyError, RuntimeError): |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
859 log.warning( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
860 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
|
861 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
862 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
|
863 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
864 except Exception as e: |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
865 log.error( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
866 f"unexepected exception while setting affiliation element: {e}\n" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
867 f"{affiliations_elt.toXml()}" |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
868 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
869 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
|
870 return |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
871 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
872 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
|
873 |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
874 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
|
875 client.send(iq_result_elt) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
876 |
3321
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
877 # configuration |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
878 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
879 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
|
880 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
|
881 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
|
882 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
|
883 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
|
884 d.addCallback( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
885 lambda configuration: { |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
886 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
|
887 } |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
888 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
889 return d |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
890 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
891 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
|
892 self, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
893 client: SatXMPPEntity, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
894 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
|
895 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
|
896 path: str |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
897 ) -> 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
|
898 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
|
899 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
|
900 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
|
901 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
|
902 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
|
903 if namespace: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
904 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
|
905 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
|
906 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
|
907 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
908 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
|
909 except StopIteration: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
910 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
|
911 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
912 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
|
913 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
|
914 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
915 return configuration |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
916 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
917 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
|
918 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
|
919 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
|
920 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
|
921 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
|
922 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
923 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
|
924 self, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
925 client: SatXMPPEntity, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
926 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
|
927 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
|
928 path: str, |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
929 configuration: Dict[jid.JID, str], |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
930 ): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
931 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
|
932 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
|
933 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
|
934 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
|
935 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
|
936 if namespace: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
937 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
|
938 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
|
939 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
|
940 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
|
941 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
|
942 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
|
943 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
944 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
|
945 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
|
946 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
|
947 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
948 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
|
949 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
950 ( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
951 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
|
952 ) = 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
|
953 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
|
954 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
955 except RootPathException: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
956 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
|
957 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
958 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
959 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
|
960 except KeyError: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
961 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
|
962 else: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
963 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
|
964 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
965 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
|
966 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
|
967 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
|
968 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
|
969 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
|
970 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
|
971 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
972 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
|
973 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
|
974 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
|
975 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
976 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
|
977 try: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
978 ( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
979 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
|
980 ) = 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
|
981 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
|
982 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
983 except RootPathException: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
984 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
|
985 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
986 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
987 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
|
988 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
|
989 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
|
990 log.warning( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
991 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
|
992 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
|
993 ) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
994 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
|
995 return |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
996 |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
997 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
|
998 for name, value in form.items(): |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
999 if name == 'access_model': |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1000 await self.host.memory.setFileAccessModel(client, file_data, value) |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1001 else: |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1002 # TODO: send a IQ error? |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1003 log.warning( |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1004 f"Trying to set a not implemented configuration option: {name}") |
8bbd2ed924e8
plugin XEP-0329: added way to change `access_model` using PubSub-like configuration:
Goffi <goffi@goffi.org>
parents:
3320
diff
changeset
|
1005 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
|
1006 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
|
1007 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1008 # file methods # |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1009 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1010 def _serializeData(self, files_data): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1011 for file_data in files_data: |
3028 | 1012 for key, value in file_data.items(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1013 file_data[key] = ( |
3028 | 1014 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
|
1015 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1016 return files_data |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1017 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1018 def _listFiles(self, target_jid, path, extra, profile): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1019 client = self.host.getClient(profile) |
3040 | 1020 target_jid = client.jid if not target_jid else jid.JID(target_jid) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1021 d = self.listFiles(client, target_jid, path or None) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1022 d.addCallback(self._serializeData) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1023 return d |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1024 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1025 def listFiles(self, client, target_jid, path=None, extra=None): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1026 """List file shared by an entity |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1027 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1028 @param target_jid(jid.JID): jid of the sharing entity |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1029 @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
|
1030 None to get root directories |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1031 @param extra(dict, None): extra data |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1032 @return list(dict): shared files |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1033 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1034 iq_elt = client.IQ("get") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1035 iq_elt["to"] = target_jid.full() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1036 query_elt = iq_elt.addElement((NS_FIS, "query")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1037 if path: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1038 query_elt["node"] = path |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1039 d = iq_elt.send() |
3314
5887fb414758
component file sharing: add/parse affiliation when possible
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
1040 d.addCallback(self._parseResult, client) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1041 return d |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1042 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1043 def _localSharesGet(self, profile): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1044 client = self.host.getClient(profile) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1045 return self.localSharesGet(client) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1046 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1047 def localSharesGet(self, client): |
3028 | 1048 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
|
1049 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1050 def _sharePath(self, name, path, access, profile): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1051 client = self.host.getClient(profile) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1052 access = json.loads(access) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1053 return self.sharePath(client, name or None, path, access) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1054 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1055 def sharePath(self, client, name, path, access): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1056 if client.is_component: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1057 raise exceptions.ClientTypeError |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1058 if not os.path.exists(path): |
3028 | 1059 raise ValueError(_("This path doesn't exist!")) |
1060 if not path or not path.strip(" /"): | |
1061 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
|
1062 if not isinstance(access, dict): |
3028 | 1063 raise ValueError(_("access must be a dict")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1064 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1065 node = client._XEP_0329_root_node |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1066 node_type = TYPE_PATH |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1067 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
|
1068 # 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
|
1069 # files in the same dir |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1070 node = node.getOrCreate(SINGLE_FILES_DIR) |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1071 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1072 if not name: |
3028 | 1073 name = os.path.basename(path.rstrip(" /")) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1074 if not name: |
3028 | 1075 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
|
1076 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1077 if name in node or name == SINGLE_FILES_DIR: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1078 idx = 1 |
3028 | 1079 new_name = name + "_" + str(idx) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1080 while new_name in node: |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1081 idx += 1 |
3028 | 1082 new_name = name + "_" + str(idx) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1083 name = new_name |
2909
90146552cde5
core (memory), plugin XEP-0329, plugin invitation: minor style improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1084 log.info(_( |
3028 | 1085 "A directory with this name is already shared, renamed to {new_name} " |
1086 "[{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
|
1087 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1088 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
|
1089 self.host.bridge.FISSharedPathNew(path, name, client.profile) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1090 return name |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1091 |
2589
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1092 def _unsharePath(self, path, profile): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1093 client = self.host.getClient(profile) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1094 return self.unsharePath(client, path) |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1095 |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1096 def unsharePath(self, client, path): |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1097 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
|
1098 for node in nodes: |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1099 node.removeFromParent() |
282d1314d574
plugin XEP-0329: new methods/signals to handle shares:
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1100 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
|
1101 |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1102 |
3028 | 1103 @implementer(iwokkel.IDisco) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1104 class XEP_0329_handler(xmlstream.XMPPHandler): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1105 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1106 def __init__(self, plugin_parent): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1107 self.plugin_parent = plugin_parent |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1108 self.host = plugin_parent.host |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1109 |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1110 def connectionInitialized(self): |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1111 if self.parent.is_component: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1112 self.xmlstream.addObserver( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1113 IQ_FIS_REQUEST, self.plugin_parent.onComponentRequest, client=self.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1114 ) |
3320
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1115 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1116 IQ_FIS_AFFILIATION_GET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1117 self.plugin_parent._onComponentAffiliationsGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1118 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1119 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1120 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1121 IQ_FIS_AFFILIATION_SET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1122 self.plugin_parent._onComponentAffiliationsSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1123 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1124 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1125 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1126 IQ_FIS_CONFIGURATION_GET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1127 self.plugin_parent._onComponentConfigurationGet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1128 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1129 ) |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1130 self.xmlstream.addObserver( |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1131 IQ_FIS_CONFIGURATION_SET, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1132 self.plugin_parent._onComponentConfigurationSet, |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1133 client=self.parent |
bb92085720c8
plugin XEP-0329: implemented ways to get/set affiliations:
Goffi <goffi@goffi.org>
parents:
3314
diff
changeset
|
1134 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1135 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1136 self.xmlstream.addObserver( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1137 IQ_FIS_REQUEST, self.plugin_parent.onRequest, client=self.parent |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1138 ) |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1139 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1140 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1141 return [disco.DiscoFeature(NS_FIS)] |
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1142 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2589
diff
changeset
|
1143 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
2503
c0bec8bac2b5
XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1144 return [] |