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