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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
9d0df638c8b4 dates update
Goffi <goffi@goffi.org>
parents: 3118
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
63 SINGLE_FILES_DIR = "files"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
64 TYPE_VIRTUAL = "virtual"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
88 if name == "..":
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
209 'parent dir ("..") found in path, hack attempt? path is {path} '
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
210 '[{profile}]').format(path=path, profile=client.profile))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
228 raise exceptions.PermissionError("permission denied")
2503
c0bec8bac2b5 XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff changeset
229
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
371 assert "/" not in name
2503
c0bec8bac2b5 XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff changeset
372
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
413 parent_node = shared_file["parent"]
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
417 "{peer_jid} requested a file (s)he can't access [{profile}]"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
421 size = shared_file["size"]
2503
c0bec8bac2b5 XEP-0329: implementation of File Information Sharing:
Goffi <goffi@goffi.org>
parents:
diff changeset
422
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
423 file_data["size"] = size
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
424 file_elt.addElement("size", content=str(size))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
425 hash_algo = file_data["hash_algo"] = self._h.getDefaultAlgo()
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
607 name = file_data["name"]
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
608 directory_elt = query_elt.addElement("directory")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
650 if file_data['type'] == C.FILE_TYPE_DIRECTORY:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
651 directory_elt = query_elt.addElement("directory")
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
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
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
661 else:
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
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
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
666 )
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3032
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
1059 raise ValueError(_("This path doesn't exist!"))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
1060 if not path or not path.strip(" /"):
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
1085 "A directory with this name is already shared, renamed to {new_name} "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2937
diff changeset
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 []