annotate libervia/backend/plugins/plugin_xep_0329.py @ 4226:3f7ca590a5da

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