Mercurial > libervia-backend
annotate libervia/backend/plugins/plugin_xep_0215.py @ 4100:810921c33a47
tools (common/template): add filter to get media types:
Add 2 filters to get main type and subtype of media type. Jinja2 and Nunjucks don't handle
slices in the same way (Python way for Jinja2, JS way for Nunjucks), making it difficult
to retrieve main type of a media from media type. Thoses filters work in both cases.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 22 Jun 2023 15:49:06 +0200 |
parents | 4b842c1fb686 |
children | 9658c534287e |
rev | line source |
---|---|
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python3 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # Libervia plugin |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 from typing import Dict, Final, List, Optional, Optional |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 from twisted.internet import defer |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from twisted.words.protocols.jabber import error, jid |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from twisted.words.protocols.jabber.xmlstream import XMPPHandler |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 from twisted.words.xish import domish |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from wokkel import data_form, disco, iwokkel |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from zope.interface import implementer |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
28 from libervia.backend.core import exceptions |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
29 from libervia.backend.core.constants import Const as C |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
30 from libervia.backend.core.core_types import SatXMPPEntity |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
31 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
32 from libervia.backend.core.log import getLogger |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
33 from libervia.backend.tools import xml_tools |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
34 from libervia.backend.tools import utils |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4044
diff
changeset
|
35 from libervia.backend.tools.common import data_format |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 log = getLogger(__name__) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 PLUGIN_INFO = { |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 C.PI_NAME: "External Service Discovery", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 C.PI_IMPORT_NAME: "XEP-0215", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 C.PI_TYPE: "XEP", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 C.PI_MODES: C.PLUG_MODE_BOTH, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 C.PI_PROTOCOLS: [], |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 C.PI_DEPENDENCIES: [], |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 C.PI_RECOMMENDATIONS: [], |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 C.PI_MAIN: "XEP_0215", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 C.PI_HANDLER: "yes", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 C.PI_DESCRIPTION: _("""Discover services external to the XMPP network"""), |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 } |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 NS_EXTDISCO: Final = "urn:xmpp:extdisco:2" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 IQ_PUSH: Final = f'{C.IQ_SET}/services[@xmlns="{NS_EXTDISCO}"]' |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 class XEP_0215: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 def __init__(self, host): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 log.info(_("External Service Discovery plugin initialization")) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 self.host = host |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
61 host.bridge.add_method( |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 "external_disco_get", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 ".plugin", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 in_sign="ss", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 out_sign="s", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 method=self._external_disco_get, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 async_=True, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
69 host.bridge.add_method( |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 "external_disco_credentials_get", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 ".plugin", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 in_sign="ssis", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 out_sign="s", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 method=self._external_disco_credentials_get, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
75 async_=True, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
76 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
77 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
78 def get_handler(self, client): |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
79 return XEP_0215_handler(self) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
80 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
81 async def profile_connecting(self, client: SatXMPPEntity) -> None: |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
82 client._xep_0215_services = {} |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
83 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 def parse_services( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 self, element: domish.Element, parent_elt_name: str = "services" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 ) -> List[dict]: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
87 """Retrieve services from element |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
89 @param element: <[parent_elt_name]/> element or its parent |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
90 @param parent_elt_name: name of the parent element |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
91 can be "services" or "credentials" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
92 @return: list of parsed services |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 """ |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 if parent_elt_name not in ("services", "credentials"): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 raise exceptions.InternalError( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 f"invalid parent_elt_name: {parent_elt_name!r}" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
98 if element.name == parent_elt_name and element.uri == NS_EXTDISCO: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
99 services_elt = element |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
100 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
101 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
102 services_elt = next(element.elements(NS_EXTDISCO, parent_elt_name)) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
103 except StopIteration: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
104 raise exceptions.DataError( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
105 f"XEP-0215 response is missing <{parent_elt_name}> element" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
107 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
108 services = [] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
109 for service_elt in services_elt.elements(NS_EXTDISCO, "service"): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
110 service = {} |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
111 for key in [ |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
112 "action", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
113 "expires", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
114 "host", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
115 "name", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
116 "password", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 "port", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
118 "restricted", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 "transport", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 "type", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 "username", |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 ]: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 value = service_elt.getAttribute(key) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 if value is not None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 if key == "expires": |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
126 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
127 service[key] = utils.parse_xmpp_date(value) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
128 except ValueError: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
129 log.warning(f"invalid expiration date: {value!r}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
130 continue |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 elif key == "port": |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 service[key] = int(value) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 except ValueError: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 log.warning(f"invalid port: {value!r}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 continue |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 elif key == "restricted": |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 service[key] = C.bool(value) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 service[key] = value |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 if not {"host", "type"}.issubset(service): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 log.warning( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 'mandatory "host" or "type" are missing in service, ignoring it: ' |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 "{service_elt.toXml()}" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 continue |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
147 for x_elt in service_elt.elements(data_form.NS_X_DATA, "x"): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
148 form = data_form.Form.fromElement(x_elt) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 extended = service.setdefault("extended", []) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
150 extended.append(xml_tools.data_form_2_data_dict(form)) |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
151 services.append(service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
152 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
153 return services |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
154 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
155 def _external_disco_get(self, entity: str, profile_key: str) -> defer.Deferred: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
156 client = self.host.get_client(profile_key) |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
157 d = defer.ensureDeferred( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
158 self.get_external_services(client, jid.JID(entity) if entity else None) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
159 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
160 d.addCallback(data_format.serialise) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
161 return d |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
162 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 async def get_external_services( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 self, client: SatXMPPEntity, entity: Optional[jid.JID] = None |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
165 ) -> List[Dict]: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 """Get non XMPP service proposed by the entity |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
167 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
168 Response is cached after first query |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
169 |
4044
3900626bc100
plugin XEP-0166: refactoring, and various improvments:
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
170 @param entity: XMPP entity to query. Default to our own server |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
171 @return: found services |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
172 """ |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
173 if entity is None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
174 entity = client.server_jid |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
175 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 if entity.resource: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
177 raise exceptions.DataError("A bare jid was expected for target entity") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
178 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
179 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
180 cached_services = client._xep_0215_services[entity] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
181 except KeyError: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
182 if not self.host.hasFeature(client, NS_EXTDISCO, entity): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
183 cached_services = client._xep_0215_services[entity] = None |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
184 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
185 iq_elt = client.IQ("get") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
186 iq_elt["to"] = entity.full() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
187 iq_elt.addElement((NS_EXTDISCO, "services")) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 iq_result_elt = await iq_elt.send() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 except error.StanzaError as e: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 log.warning(f"Can't get external services: {e}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 cached_services = client._xep_0215_services[entity] = None |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 cached_services = self.parse_services(iq_result_elt) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
195 client._xep_0215_services[entity] = cached_services |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
197 return cached_services or [] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
198 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
199 def _external_disco_credentials_get( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 self, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
201 entity: str, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
202 host: str, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
203 type_: str, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 port: int = 0, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
205 profile_key=C.PROF_KEY_NONE, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
206 ) -> defer.Deferred: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4033
diff
changeset
|
207 client = self.host.get_client(profile_key) |
4033
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
208 d = defer.ensureDeferred( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
209 self.request_credentials( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
210 client, host, type_, port or None, jid.JID(entity) if entity else None |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
211 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
213 d.addCallback(data_format.serialise) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
214 return d |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
215 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 async def request_credentials( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
217 self, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
218 client: SatXMPPEntity, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
219 host: str, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 type_: str, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
221 port: Optional[int] = None, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
222 entity: Optional[jid.JID] = None, |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
223 ) -> List[dict]: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
224 """Request credentials for specified service(s) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
225 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
226 While usually a single service is expected, several may be returned if the same |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
227 service is launched on several ports (cf. XEP-0215 §3.3) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 @param entity: XMPP entity to query. Defaut to our own server |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
229 @param host: service host |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
230 @param type_: service type |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
231 @param port: service port (to be used when several services have same host and |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
232 type but on different ports) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 @return: matching services with filled credentials |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
234 """ |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
235 if entity is None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
236 entity = client.server_jid |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
237 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
238 iq_elt = client.IQ("get") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
239 iq_elt["to"] = entity.full() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
240 iq_elt.addElement((NS_EXTDISCO, "credentials")) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
241 iq_result_elt = await iq_elt.send() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
242 return self.parse_services(iq_result_elt, parent_elt_name="credentials") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
243 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 def get_matching_service( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
245 self, services: List[dict], host: str, type_: str, port: Optional[int] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
246 ) -> Optional[dict]: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
247 """Retrieve service data from its characteristics""" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
248 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
249 return next( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
250 s |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
251 for s in services |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
252 if ( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
253 s["host"] == host |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
254 and s["type"] == type_ |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
255 and (port is None or s.get("port") == port) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
256 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
257 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
258 except StopIteration: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
259 return None |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
260 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
261 def on_services_push(self, iq_elt: domish.Element, client: SatXMPPEntity) -> None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
262 iq_elt.handled = True |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
263 entity = jid.JID(iq_elt["from"]).userhostJID() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
264 cached_services = client._xep_0215_services.get(entity) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
265 if cached_services is None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
266 log.info(f"ignoring services push for uncached entity {entity}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
267 return |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
268 try: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
269 services = self.parse_services(iq_elt) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
270 except Exception: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
271 log.exception(f"Can't parse services push: {iq_elt.toXml()}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
272 return |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
273 for service in services: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
274 host = service["host"] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
275 type_ = service["type"] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
276 port = service.get("port") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
277 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
278 action = service.pop("action", None) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
279 if action is None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
280 # action is not specified, we first check if the service exists |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
281 found_service = self.get_matching_service( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
282 cached_services, host, type_, port |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
283 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
284 if found_service is not None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
285 # existing service, we replace by the new one |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
286 found_service.clear() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
287 found_service.update(service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
288 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
289 # new service |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
290 cached_services.append(service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
291 elif action == "add": |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
292 cached_services.append(service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
293 elif action in ("modify", "delete"): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
294 found_service = self.get_matching_service( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
295 cached_services, host, type_, port |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
296 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
297 if found_service is None: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
298 log.warning( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
299 f"{entity} want to {action} an unknow service, we ask for the " |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
300 "full list again" |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
301 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 # we delete cache and request a fresh list to make a new one |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
303 del client._xep_0215_services[entity] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 defer.ensureDeferred(self.get_external_services(client, entity)) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
305 elif action == "modify": |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
306 found_service.clear() |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
307 found_service.update(service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
308 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
309 cached_services.remove(found_service) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
310 else: |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
311 log.warning(f"unknown action for services push, ignoring: {action!r}") |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
312 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
313 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
314 @implementer(iwokkel.IDisco) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
315 class XEP_0215_handler(XMPPHandler): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
316 def __init__(self, plugin_parent): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
317 self.plugin_parent = plugin_parent |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
318 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
319 def connectionInitialized(self): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
320 self.xmlstream.addObserver( |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
321 IQ_PUSH, self.plugin_parent.on_services_push, client=self.parent |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
322 ) |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
323 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
324 def getDiscoInfo(self, requestor, target, nodeIdentifier=""): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
325 return [disco.DiscoFeature(NS_EXTDISCO)] |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
326 |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
327 def getDiscoItems(self, requestor, target, nodeIdentifier=""): |
5a42c7842556
core (plugins): implementation of XEP-0215 "External Service Discovery":
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
328 return [] |